From ae3406297f95c4e7d02cebe58f17084b5d6fd5d6 Mon Sep 17 00:00:00 2001 From: Darren Satkunas Date: Wed, 1 Nov 2023 11:59:49 -0700 Subject: [PATCH 01/91] initial commit --- .../components/new/BaseFormGroupSwitch.vue | 1 + .../components/new/BaseFormGroupTextarea.vue | 1 + .../src/components/new/BaseInputSwitch.vue | 1 + t/html/pfappserver/config/base/index.js | 3 + .../pfappserver/config/collections/domains.js | 5 - .../pfappserver/config/collections/index.js | 4 +- .../config/collections/modules/domains.js | 14 + .../config/collections/modules/roles.js | 9 + .../pfappserver/config/collections/roles.js | 5 - t/html/pfappserver/config/index.js | 9 + t/html/pfappserver/config/resources/index.js | 5 + .../config/resources/modules/fingerbank.js | 46 + .../cypress/config/cypress.config-views.js | 14 + ...on-fingerbank-device-change-detection.json | 7 + ...iguration-fingerbank-general-settings.json | 4 + .../pfappserver/cypress/support/commands.js | 29 +- t/html/pfappserver/package-lock.json | 3323 +++-------------- t/html/pfappserver/package.json | 2 +- t/html/pfappserver/webpack.config.js | 3 +- 19 files changed, 653 insertions(+), 2832 deletions(-) create mode 100644 t/html/pfappserver/config/base/index.js delete mode 100644 t/html/pfappserver/config/collections/domains.js create mode 100644 t/html/pfappserver/config/collections/modules/domains.js create mode 100644 t/html/pfappserver/config/collections/modules/roles.js delete mode 100644 t/html/pfappserver/config/collections/roles.js create mode 100644 t/html/pfappserver/config/index.js create mode 100644 t/html/pfappserver/config/resources/index.js create mode 100644 t/html/pfappserver/config/resources/modules/fingerbank.js create mode 100644 t/html/pfappserver/cypress/config/cypress.config-views.js create mode 100644 t/html/pfappserver/cypress/fixtures/configuration-fingerbank-device-change-detection.json create mode 100644 t/html/pfappserver/cypress/fixtures/configuration-fingerbank-general-settings.json diff --git a/html/pfappserver/root/src/components/new/BaseFormGroupSwitch.vue b/html/pfappserver/root/src/components/new/BaseFormGroupSwitch.vue index 49576d186534..5d1d799ea61d 100644 --- a/html/pfappserver/root/src/components/new/BaseFormGroupSwitch.vue +++ b/html/pfappserver/root/src/components/new/BaseFormGroupSwitch.vue @@ -19,6 +19,7 @@ :valid-feedback="inputValidFeedback" > { + const fixtureByType = splitKeys(fixture) + if (type in fixtureByType) { + Object.keys(fixtureByType[type]).forEach(key => { + expect(req.body).to.have.property(key) + expect(req.body[key]).to.equal(fixtureByType[type][key]) + }) + } +} + +module.exports = { + id: 'configuration-fingerbank-general-settings', + description: 'Configuration - Fingerbank', + tests: [ + { + description: 'General Settings - Update Form', + url: '/configuration/fingerbank/general_settings', + form: { + fixture: 'configuration-fingerbank-general-settings.json', + }, + interceptors: [ + { method: '+(PATCH|PUT)', url: '/api/**/config/fingerbank_setting/collector', timeout: 1234, 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 - Update Form', + url: '/configuration/fingerbank/device_change_detection', + form: { + fixture: 'configuration-fingerbank-device-change-detection.json', + }, + interceptors: [ + { 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.equal(fixture[key]) + }) + } }, + ] + }, + ] +}; \ No newline at end of file diff --git a/t/html/pfappserver/cypress/config/cypress.config-views.js b/t/html/pfappserver/cypress/config/cypress.config-views.js new file mode 100644 index 000000000000..b5ab1462a3ce --- /dev/null +++ b/t/html/pfappserver/cypress/config/cypress.config-views.js @@ -0,0 +1,14 @@ +const config = require('./cypress.config.js'); + +module.exports = { + ...config, + + e2e: { + ...config.e2e, + + specPattern: [ + 'cypress/specs/e2e/*-views/*.cy.{js,jsx,ts,tsx}', + 'cypress/specs/e2e/*-views/**/*.cy.{js,jsx,ts,tsx}', + ], + } +}; diff --git a/t/html/pfappserver/cypress/fixtures/configuration-fingerbank-device-change-detection.json b/t/html/pfappserver/cypress/fixtures/configuration-fingerbank-device-change-detection.json new file mode 100644 index 000000000000..f2d45d843474 --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/configuration-fingerbank-device-change-detection.json @@ -0,0 +1,7 @@ +{ + "id": "fingerbank_device_change", + "device_class_whitelist": "", + "enable": "disabled", + "trigger_on_device_class_change": "enabled", + "triggers": "" +} diff --git a/t/html/pfappserver/cypress/fixtures/configuration-fingerbank-general-settings.json b/t/html/pfappserver/cypress/fixtures/configuration-fingerbank-general-settings.json new file mode 100644 index 000000000000..62e90c6dd51b --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/configuration-fingerbank-general-settings.json @@ -0,0 +1,4 @@ +{ + "upstream.api_key": "foo", + "collector.additional_env": "bar" +} \ 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..1f451d01b7f7 100644 --- a/t/html/pfappserver/cypress/support/commands.js +++ b/t/html/pfappserver/cypress/support/commands.js @@ -54,20 +54,25 @@ Cypress.Commands.add('pfConfiguratorDisable', () => { }) }) -Cypress.Commands.add('formFillNamespace', (selector, data) => { - cy.get(selector).then($ => { +Cypress.Commands.add('formFillNamespace', (data, element) => { + (element || cy.get('form').first()).within($ => { 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}"`) - } - }) + const selector = `*[data-namespace="${namespace}"]:not([disabled])` + if ($.find(selector).length) { + cy.get(selector) + .then(el => { + const tagName = Cypress.$(el)[0].tagName.toLowerCase() + switch (tagName) { + case "input": + case "textarea": + cy.get(el).type(`{selectAll}{del}${value}`) + break + default: + throw new Error(`unhandled form tagName "${tagName}"`) + } + }) + } } }) }) diff --git a/t/html/pfappserver/package-lock.json b/t/html/pfappserver/package-lock.json index de4f85f396d9..4c08b20c40ba 100644 --- a/t/html/pfappserver/package-lock.json +++ b/t/html/pfappserver/package-lock.json @@ -1,16 +1,16 @@ { "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", "webpack": "^5.91.0" } @@ -28,11 +28,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 +40,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 +77,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 +104,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 +141,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 +163,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 +179,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 +194,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 +265,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 +300,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 +316,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 +412,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 +423,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 +438,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 +452,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 +468,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 +552,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 +566,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 +711,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 +725,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 +742,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 +758,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 +772,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 +786,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 +801,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 +817,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 +838,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 +853,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 +867,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 +882,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 +896,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 +911,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 +926,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 +941,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 +956,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 +972,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 +987,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 +1001,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 +1016,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 +1030,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 +1045,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 +1061,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 +1078,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 +1093,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 +1108,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 +1122,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 +1137,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 +1152,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 +1169,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 +1184,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 +1199,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 +1215,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 +1229,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 +1244,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 +1261,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 +1275,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 +1290,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 +1304,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 +1318,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 +1333,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 +1347,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 +1361,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 +1375,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 +1389,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 +1404,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 +1419,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 +1434,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 +1465,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 +1546,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 +1557,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 +1590,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 +1603,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 +1948,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 +1973,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 +2025,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 +2056,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 +2093,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 +2104,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", @@ -2151,17 +2121,9 @@ } }, "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==", - "engines": { - "node": ">= 4" - } + "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", @@ -2291,19 +2253,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "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==", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", @@ -2357,11 +2306,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", @@ -2445,17 +2389,6 @@ "node": ">=6" } }, - "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, "node_modules/loader-runner": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", @@ -2464,19 +2397,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 +2429,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", @@ -2823,9 +2733,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", @@ -2966,14 +2876,6 @@ "node": ">=4" } }, - "node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "engines": { - "node": ">= 10.0.0" - } - }, "node_modules/update-browserslist-db": { "version": "1.0.13", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", @@ -3077,11 +2979,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", @@ -3143,2191 +3040,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..5df2bcc94fcc 100644 --- a/t/html/pfappserver/package.json +++ b/t/html/pfappserver/package.json @@ -5,7 +5,7 @@ "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", "webpack": "^5.91.0" } 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 From 78f1725d72ef72e7b807ae47c8c7e695424ebbdb Mon Sep 17 00:00:00 2001 From: Darren Satkunas Date: Fri, 3 Nov 2023 08:09:55 -0700 Subject: [PATCH 02/91] working resources --- t/html/pfappserver/config/resources/index.js | 38 +++++++++++ .../resources/modules/access_durations.js | 22 +++++++ .../config/resources/modules/active_active.js | 22 +++++++ .../config/resources/modules/admin_login.js | 22 +++++++ .../config/resources/modules/advanced.js | 22 +++++++ .../config/resources/modules/alerting.js | 22 +++++++ .../resources/modules/captive_portal.js | 22 +++++++ .../resources/modules/database_advanced.js | 22 +++++++ .../resources/modules/database_general.js | 22 +++++++ .../resources/modules/database_proxysql.js | 22 +++++++ .../resources/modules/dns_configuration.js | 22 +++++++ .../config/resources/modules/fingerbank.js | 29 ++++----- .../config/resources/modules/general.js | 22 +++++++ .../config/resources/modules/monit.js | 22 +++++++ .../resources/modules/networks_fencing.js | 22 +++++++ .../resources/modules/networks_inline.js | 22 +++++++ .../resources/modules/networks_network.js | 22 +++++++ .../resources/modules/networks_parking.js | 22 +++++++ .../config/resources/modules/services.js | 22 +++++++ .../config/resources/modules/snmp_traps.js | 22 +++++++ .../config/resources/modules/webservices.js | 22 +++++++ .../cypress/config/cypress.config.js | 10 ++- ...on-fingerbank-device-change-detection.json | 7 -- ...iguration-fingerbank-general-settings.json | 4 -- .../specs/e2e/50-views/20-resources.cy.js | 65 +++++++++++++++++++ .../pfappserver/cypress/support/commands.js | 18 +++-- t/html/pfappserver/utils/index.js | 12 ++++ 27 files changed, 566 insertions(+), 35 deletions(-) create mode 100644 t/html/pfappserver/config/resources/modules/access_durations.js create mode 100644 t/html/pfappserver/config/resources/modules/active_active.js create mode 100644 t/html/pfappserver/config/resources/modules/admin_login.js create mode 100644 t/html/pfappserver/config/resources/modules/advanced.js create mode 100644 t/html/pfappserver/config/resources/modules/alerting.js create mode 100644 t/html/pfappserver/config/resources/modules/captive_portal.js create mode 100644 t/html/pfappserver/config/resources/modules/database_advanced.js create mode 100644 t/html/pfappserver/config/resources/modules/database_general.js create mode 100644 t/html/pfappserver/config/resources/modules/database_proxysql.js create mode 100644 t/html/pfappserver/config/resources/modules/dns_configuration.js create mode 100644 t/html/pfappserver/config/resources/modules/general.js create mode 100644 t/html/pfappserver/config/resources/modules/monit.js create mode 100644 t/html/pfappserver/config/resources/modules/networks_fencing.js create mode 100644 t/html/pfappserver/config/resources/modules/networks_inline.js create mode 100644 t/html/pfappserver/config/resources/modules/networks_network.js create mode 100644 t/html/pfappserver/config/resources/modules/networks_parking.js create mode 100644 t/html/pfappserver/config/resources/modules/services.js create mode 100644 t/html/pfappserver/config/resources/modules/snmp_traps.js create mode 100644 t/html/pfappserver/config/resources/modules/webservices.js delete mode 100644 t/html/pfappserver/cypress/fixtures/configuration-fingerbank-device-change-detection.json delete mode 100644 t/html/pfappserver/cypress/fixtures/configuration-fingerbank-general-settings.json create mode 100644 t/html/pfappserver/cypress/specs/e2e/50-views/20-resources.cy.js create mode 100644 t/html/pfappserver/utils/index.js diff --git a/t/html/pfappserver/config/resources/index.js b/t/html/pfappserver/config/resources/index.js index 099b5b1b8f3e..1251884eaa63 100644 --- a/t/html/pfappserver/config/resources/index.js +++ b/t/html/pfappserver/config/resources/index.js @@ -1,5 +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/resources/modules/access_durations.js b/t/html/pfappserver/config/resources/modules/access_durations.js new file mode 100644 index 000000000000..c318febb7417 --- /dev/null +++ b/t/html/pfappserver/config/resources/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: (r) => r.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/resources/modules/active_active.js b/t/html/pfappserver/config/resources/modules/active_active.js new file mode 100644 index 000000000000..241f47b28a56 --- /dev/null +++ b/t/html/pfappserver/config/resources/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: (r) => r.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/resources/modules/admin_login.js b/t/html/pfappserver/config/resources/modules/admin_login.js new file mode 100644 index 000000000000..7995bd4b1f79 --- /dev/null +++ b/t/html/pfappserver/config/resources/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: (r) => r.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/resources/modules/advanced.js b/t/html/pfappserver/config/resources/modules/advanced.js new file mode 100644 index 000000000000..3f21da4ab973 --- /dev/null +++ b/t/html/pfappserver/config/resources/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: (r) => r.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/resources/modules/alerting.js b/t/html/pfappserver/config/resources/modules/alerting.js new file mode 100644 index 000000000000..197c6e479c4a --- /dev/null +++ b/t/html/pfappserver/config/resources/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: (r) => r.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/resources/modules/captive_portal.js b/t/html/pfappserver/config/resources/modules/captive_portal.js new file mode 100644 index 000000000000..1eb165dbe8f5 --- /dev/null +++ b/t/html/pfappserver/config/resources/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: (r) => r.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/resources/modules/database_advanced.js b/t/html/pfappserver/config/resources/modules/database_advanced.js new file mode 100644 index 000000000000..f4c124ff601a --- /dev/null +++ b/t/html/pfappserver/config/resources/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: (r) => r.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/resources/modules/database_general.js b/t/html/pfappserver/config/resources/modules/database_general.js new file mode 100644 index 000000000000..de98ad47b321 --- /dev/null +++ b/t/html/pfappserver/config/resources/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: (r) => r.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/resources/modules/database_proxysql.js b/t/html/pfappserver/config/resources/modules/database_proxysql.js new file mode 100644 index 000000000000..09331d39120c --- /dev/null +++ b/t/html/pfappserver/config/resources/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: (r) => r.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/resources/modules/dns_configuration.js b/t/html/pfappserver/config/resources/modules/dns_configuration.js new file mode 100644 index 000000000000..e68d791546b8 --- /dev/null +++ b/t/html/pfappserver/config/resources/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: (r) => r.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/resources/modules/fingerbank.js b/t/html/pfappserver/config/resources/modules/fingerbank.js index 0757a44788f4..72fc8897cbd5 100644 --- a/t/html/pfappserver/config/resources/modules/fingerbank.js +++ b/t/html/pfappserver/config/resources/modules/fingerbank.js @@ -1,43 +1,38 @@ -const { splitKeys } = require('utils') - const expectByType = (type, req, fixture) => { - const fixtureByType = splitKeys(fixture) - if (type in fixtureByType) { - Object.keys(fixtureByType[type]).forEach(key => { + if (type in fixture) { + Object.keys(fixture[type]).forEach(key => { expect(req.body).to.have.property(key) - expect(req.body[key]).to.equal(fixtureByType[type][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 - Update Form', + description: 'General Settings - Passthrough Form', url: '/configuration/fingerbank/general_settings', - form: { - fixture: 'configuration-fingerbank-general-settings.json', - }, interceptors: [ - { method: '+(PATCH|PUT)', url: '/api/**/config/fingerbank_setting/collector', timeout: 1234, expect: (req, fixture) => expectByType('collector', req, fixture) }, + { method: 'GET', url: '/api/**/config/fingerbank_settings?*', fixture: (r) => r.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 - Update Form', + description: 'Device Change Detection - Passthrough Form', url: '/configuration/fingerbank/device_change_detection', - form: { - fixture: 'configuration-fingerbank-device-change-detection.json', - }, interceptors: [ + { method: 'GET', url: '/api/**/config/base/fingerbank_device_change', fixture: (r) => r.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.equal(fixture[key]) + expect(req.body[key]).to.deep.equal(fixture[key], key) }) } }, ] diff --git a/t/html/pfappserver/config/resources/modules/general.js b/t/html/pfappserver/config/resources/modules/general.js new file mode 100644 index 000000000000..57e1d44f316b --- /dev/null +++ b/t/html/pfappserver/config/resources/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: (r) => r.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/resources/modules/monit.js b/t/html/pfappserver/config/resources/modules/monit.js new file mode 100644 index 000000000000..8da42df0aeb2 --- /dev/null +++ b/t/html/pfappserver/config/resources/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: (r) => r.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/resources/modules/networks_fencing.js b/t/html/pfappserver/config/resources/modules/networks_fencing.js new file mode 100644 index 000000000000..0f751765867c --- /dev/null +++ b/t/html/pfappserver/config/resources/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: (r) => r.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/resources/modules/networks_inline.js b/t/html/pfappserver/config/resources/modules/networks_inline.js new file mode 100644 index 000000000000..3776e2dcddc5 --- /dev/null +++ b/t/html/pfappserver/config/resources/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: (r) => r.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/resources/modules/networks_network.js b/t/html/pfappserver/config/resources/modules/networks_network.js new file mode 100644 index 000000000000..65429c2d7842 --- /dev/null +++ b/t/html/pfappserver/config/resources/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: (r) => r.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/resources/modules/networks_parking.js b/t/html/pfappserver/config/resources/modules/networks_parking.js new file mode 100644 index 000000000000..42bef7459577 --- /dev/null +++ b/t/html/pfappserver/config/resources/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: (r) => r.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/resources/modules/services.js b/t/html/pfappserver/config/resources/modules/services.js new file mode 100644 index 000000000000..50be92fb7248 --- /dev/null +++ b/t/html/pfappserver/config/resources/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: (r) => r.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/resources/modules/snmp_traps.js b/t/html/pfappserver/config/resources/modules/snmp_traps.js new file mode 100644 index 000000000000..0441d51c9434 --- /dev/null +++ b/t/html/pfappserver/config/resources/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: (r) => r.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/resources/modules/webservices.js b/t/html/pfappserver/config/resources/modules/webservices.js new file mode 100644 index 000000000000..1a718a75741a --- /dev/null +++ b/t/html/pfappserver/config/resources/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: (r) => r.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/cypress/config/cypress.config.js b/t/html/pfappserver/cypress/config/cypress.config.js index 9b34a3665ac9..e228dd826c31 100644 --- a/t/html/pfappserver/cypress/config/cypress.config.js +++ b/t/html/pfappserver/cypress/config/cypress.config.js @@ -28,10 +28,16 @@ module.exports = { }); 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; }, specPattern: [ diff --git a/t/html/pfappserver/cypress/fixtures/configuration-fingerbank-device-change-detection.json b/t/html/pfappserver/cypress/fixtures/configuration-fingerbank-device-change-detection.json deleted file mode 100644 index f2d45d843474..000000000000 --- a/t/html/pfappserver/cypress/fixtures/configuration-fingerbank-device-change-detection.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "id": "fingerbank_device_change", - "device_class_whitelist": "", - "enable": "disabled", - "trigger_on_device_class_change": "enabled", - "triggers": "" -} diff --git a/t/html/pfappserver/cypress/fixtures/configuration-fingerbank-general-settings.json b/t/html/pfappserver/cypress/fixtures/configuration-fingerbank-general-settings.json deleted file mode 100644 index 62e90c6dd51b..000000000000 --- a/t/html/pfappserver/cypress/fixtures/configuration-fingerbank-general-settings.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "upstream.api_key": "foo", - "collector.additional_env": "bar" -} \ No newline at end of file diff --git a/t/html/pfappserver/cypress/specs/e2e/50-views/20-resources.cy.js b/t/html/pfappserver/cypress/specs/e2e/50-views/20-resources.cy.js new file mode 100644 index 000000000000..33f65a3015cb --- /dev/null +++ b/t/html/pfappserver/cypress/specs/e2e/50-views/20-resources.cy.js @@ -0,0 +1,65 @@ +const { base, resources } = require('config'); + +describe('Resources', () => { + Object.values(resources).forEach(resource => { + context(`Resource - ${resource.description}`, () => { + beforeEach('Login and visit URL', () => { + cy.pfSystemLogin() + }) + resource.tests.forEach(test => { + const { description, url, interceptors, form: { buttonSelector = 'button[type="submit"]' } = {} } = test + it(description, () => { + + // 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) { + cy.window().then(() => { + expect(req, cache) // block + }) + } + else { + req.continue() // passthrough + } + }).as(`interceptor${i}`) + }) + + // load page + cy.visit(`${base.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() + + // wait API interceptors + /* + interceptors.forEach(async (interceptor, i) => { + const { timeout = 3E3 } = interceptor + await cy.wait(`@interceptor${i}`, { timeout }) + }) + */ + + + }) + }) + }) + }) +}); \ 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 1f451d01b7f7..b2448fd18bb3 100644 --- a/t/html/pfappserver/cypress/support/commands.js +++ b/t/html/pfappserver/cypress/support/commands.js @@ -62,17 +62,25 @@ Cypress.Commands.add('formFillNamespace', (data, element) => { if ($.find(selector).length) { cy.get(selector) .then(el => { - const tagName = Cypress.$(el)[0].tagName.toLowerCase() - switch (tagName) { - case "input": - case "textarea": + const e = Cypress.$(el)[0] + const tagName = e.tagName.toLowerCase() + const type = e.getAttribute('type') + switch (true) { + case tagName === 'input' && ['text', 'password'].includes(type): + case tagName === 'textarea': cy.get(el).type(`{selectAll}{del}${value}`) break + case tagName === 'input' && ['range'].includes(type): + // TODO + break default: - throw new Error(`unhandled form tagName "${tagName}"`) + throw new Error(`unhandled element <${tagName} type="${type||''}" data-namespace="${namespace}" />`) } }) } + else { + cy.task('error', `empty selector ${selector}`) + } } }) }) diff --git a/t/html/pfappserver/utils/index.js b/t/html/pfappserver/utils/index.js new file mode 100644 index 000000000000..f3a1e9f3828c --- /dev/null +++ b/t/html/pfappserver/utils/index.js @@ -0,0 +1,12 @@ +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 + }, {}) +}; + +module.exports = { + splitKeys +}; \ No newline at end of file From 7b94531c17a7f2549555002191204dddd7297933 Mon Sep 17 00:00:00 2001 From: Darren Satkunas Date: Fri, 3 Nov 2023 08:17:03 -0700 Subject: [PATCH 03/91] rename --- .../pfappserver/config/{resources => bases}/index.js | 0 .../{resources => bases}/modules/access_durations.js | 0 .../{resources => bases}/modules/active_active.js | 0 .../{resources => bases}/modules/admin_login.js | 0 .../config/{resources => bases}/modules/advanced.js | 0 .../config/{resources => bases}/modules/alerting.js | 0 .../{resources => bases}/modules/captive_portal.js | 0 .../modules/database_advanced.js | 0 .../{resources => bases}/modules/database_general.js | 0 .../modules/database_proxysql.js | 0 .../modules/dns_configuration.js | 0 .../{resources => bases}/modules/fingerbank.js | 0 .../config/{resources => bases}/modules/general.js | 0 .../config/{resources => bases}/modules/monit.js | 0 .../{resources => bases}/modules/networks_fencing.js | 0 .../{resources => bases}/modules/networks_inline.js | 0 .../{resources => bases}/modules/networks_network.js | 0 .../{resources => bases}/modules/networks_parking.js | 0 .../config/{resources => bases}/modules/services.js | 0 .../{resources => bases}/modules/snmp_traps.js | 0 .../{resources => bases}/modules/webservices.js | 0 t/html/pfappserver/config/{base => global}/index.js | 0 t/html/pfappserver/config/index.js | 10 +++++----- .../50-views/{20-resources.cy.js => 20-bases.cy.js} | 12 ++++++------ 24 files changed, 11 insertions(+), 11 deletions(-) rename t/html/pfappserver/config/{resources => bases}/index.js (100%) rename t/html/pfappserver/config/{resources => bases}/modules/access_durations.js (100%) rename t/html/pfappserver/config/{resources => bases}/modules/active_active.js (100%) rename t/html/pfappserver/config/{resources => bases}/modules/admin_login.js (100%) rename t/html/pfappserver/config/{resources => bases}/modules/advanced.js (100%) rename t/html/pfappserver/config/{resources => bases}/modules/alerting.js (100%) rename t/html/pfappserver/config/{resources => bases}/modules/captive_portal.js (100%) rename t/html/pfappserver/config/{resources => bases}/modules/database_advanced.js (100%) rename t/html/pfappserver/config/{resources => bases}/modules/database_general.js (100%) rename t/html/pfappserver/config/{resources => bases}/modules/database_proxysql.js (100%) rename t/html/pfappserver/config/{resources => bases}/modules/dns_configuration.js (100%) rename t/html/pfappserver/config/{resources => bases}/modules/fingerbank.js (100%) rename t/html/pfappserver/config/{resources => bases}/modules/general.js (100%) rename t/html/pfappserver/config/{resources => bases}/modules/monit.js (100%) rename t/html/pfappserver/config/{resources => bases}/modules/networks_fencing.js (100%) rename t/html/pfappserver/config/{resources => bases}/modules/networks_inline.js (100%) rename t/html/pfappserver/config/{resources => bases}/modules/networks_network.js (100%) rename t/html/pfappserver/config/{resources => bases}/modules/networks_parking.js (100%) rename t/html/pfappserver/config/{resources => bases}/modules/services.js (100%) rename t/html/pfappserver/config/{resources => bases}/modules/snmp_traps.js (100%) rename t/html/pfappserver/config/{resources => bases}/modules/webservices.js (100%) rename t/html/pfappserver/config/{base => global}/index.js (100%) rename t/html/pfappserver/cypress/specs/e2e/50-views/{20-resources.cy.js => 20-bases.cy.js} (87%) diff --git a/t/html/pfappserver/config/resources/index.js b/t/html/pfappserver/config/bases/index.js similarity index 100% rename from t/html/pfappserver/config/resources/index.js rename to t/html/pfappserver/config/bases/index.js diff --git a/t/html/pfappserver/config/resources/modules/access_durations.js b/t/html/pfappserver/config/bases/modules/access_durations.js similarity index 100% rename from t/html/pfappserver/config/resources/modules/access_durations.js rename to t/html/pfappserver/config/bases/modules/access_durations.js diff --git a/t/html/pfappserver/config/resources/modules/active_active.js b/t/html/pfappserver/config/bases/modules/active_active.js similarity index 100% rename from t/html/pfappserver/config/resources/modules/active_active.js rename to t/html/pfappserver/config/bases/modules/active_active.js diff --git a/t/html/pfappserver/config/resources/modules/admin_login.js b/t/html/pfappserver/config/bases/modules/admin_login.js similarity index 100% rename from t/html/pfappserver/config/resources/modules/admin_login.js rename to t/html/pfappserver/config/bases/modules/admin_login.js diff --git a/t/html/pfappserver/config/resources/modules/advanced.js b/t/html/pfappserver/config/bases/modules/advanced.js similarity index 100% rename from t/html/pfappserver/config/resources/modules/advanced.js rename to t/html/pfappserver/config/bases/modules/advanced.js diff --git a/t/html/pfappserver/config/resources/modules/alerting.js b/t/html/pfappserver/config/bases/modules/alerting.js similarity index 100% rename from t/html/pfappserver/config/resources/modules/alerting.js rename to t/html/pfappserver/config/bases/modules/alerting.js diff --git a/t/html/pfappserver/config/resources/modules/captive_portal.js b/t/html/pfappserver/config/bases/modules/captive_portal.js similarity index 100% rename from t/html/pfappserver/config/resources/modules/captive_portal.js rename to t/html/pfappserver/config/bases/modules/captive_portal.js diff --git a/t/html/pfappserver/config/resources/modules/database_advanced.js b/t/html/pfappserver/config/bases/modules/database_advanced.js similarity index 100% rename from t/html/pfappserver/config/resources/modules/database_advanced.js rename to t/html/pfappserver/config/bases/modules/database_advanced.js diff --git a/t/html/pfappserver/config/resources/modules/database_general.js b/t/html/pfappserver/config/bases/modules/database_general.js similarity index 100% rename from t/html/pfappserver/config/resources/modules/database_general.js rename to t/html/pfappserver/config/bases/modules/database_general.js diff --git a/t/html/pfappserver/config/resources/modules/database_proxysql.js b/t/html/pfappserver/config/bases/modules/database_proxysql.js similarity index 100% rename from t/html/pfappserver/config/resources/modules/database_proxysql.js rename to t/html/pfappserver/config/bases/modules/database_proxysql.js diff --git a/t/html/pfappserver/config/resources/modules/dns_configuration.js b/t/html/pfappserver/config/bases/modules/dns_configuration.js similarity index 100% rename from t/html/pfappserver/config/resources/modules/dns_configuration.js rename to t/html/pfappserver/config/bases/modules/dns_configuration.js diff --git a/t/html/pfappserver/config/resources/modules/fingerbank.js b/t/html/pfappserver/config/bases/modules/fingerbank.js similarity index 100% rename from t/html/pfappserver/config/resources/modules/fingerbank.js rename to t/html/pfappserver/config/bases/modules/fingerbank.js diff --git a/t/html/pfappserver/config/resources/modules/general.js b/t/html/pfappserver/config/bases/modules/general.js similarity index 100% rename from t/html/pfappserver/config/resources/modules/general.js rename to t/html/pfappserver/config/bases/modules/general.js diff --git a/t/html/pfappserver/config/resources/modules/monit.js b/t/html/pfappserver/config/bases/modules/monit.js similarity index 100% rename from t/html/pfappserver/config/resources/modules/monit.js rename to t/html/pfappserver/config/bases/modules/monit.js diff --git a/t/html/pfappserver/config/resources/modules/networks_fencing.js b/t/html/pfappserver/config/bases/modules/networks_fencing.js similarity index 100% rename from t/html/pfappserver/config/resources/modules/networks_fencing.js rename to t/html/pfappserver/config/bases/modules/networks_fencing.js diff --git a/t/html/pfappserver/config/resources/modules/networks_inline.js b/t/html/pfappserver/config/bases/modules/networks_inline.js similarity index 100% rename from t/html/pfappserver/config/resources/modules/networks_inline.js rename to t/html/pfappserver/config/bases/modules/networks_inline.js diff --git a/t/html/pfappserver/config/resources/modules/networks_network.js b/t/html/pfappserver/config/bases/modules/networks_network.js similarity index 100% rename from t/html/pfappserver/config/resources/modules/networks_network.js rename to t/html/pfappserver/config/bases/modules/networks_network.js diff --git a/t/html/pfappserver/config/resources/modules/networks_parking.js b/t/html/pfappserver/config/bases/modules/networks_parking.js similarity index 100% rename from t/html/pfappserver/config/resources/modules/networks_parking.js rename to t/html/pfappserver/config/bases/modules/networks_parking.js diff --git a/t/html/pfappserver/config/resources/modules/services.js b/t/html/pfappserver/config/bases/modules/services.js similarity index 100% rename from t/html/pfappserver/config/resources/modules/services.js rename to t/html/pfappserver/config/bases/modules/services.js diff --git a/t/html/pfappserver/config/resources/modules/snmp_traps.js b/t/html/pfappserver/config/bases/modules/snmp_traps.js similarity index 100% rename from t/html/pfappserver/config/resources/modules/snmp_traps.js rename to t/html/pfappserver/config/bases/modules/snmp_traps.js diff --git a/t/html/pfappserver/config/resources/modules/webservices.js b/t/html/pfappserver/config/bases/modules/webservices.js similarity index 100% rename from t/html/pfappserver/config/resources/modules/webservices.js rename to t/html/pfappserver/config/bases/modules/webservices.js diff --git a/t/html/pfappserver/config/base/index.js b/t/html/pfappserver/config/global/index.js similarity index 100% rename from t/html/pfappserver/config/base/index.js rename to t/html/pfappserver/config/global/index.js diff --git a/t/html/pfappserver/config/index.js b/t/html/pfappserver/config/index.js index eb0b7f2eb0aa..6506dd727c29 100644 --- a/t/html/pfappserver/config/index.js +++ b/t/html/pfappserver/config/index.js @@ -1,9 +1,9 @@ -const base = require('./base') +const global = require('./global') +const bases = require('./bases') const collections = require('./collections') -const resources = require('./resources') module.exports = { - base, - collections, - resources, + global, + bases, + collections } \ No newline at end of file diff --git a/t/html/pfappserver/cypress/specs/e2e/50-views/20-resources.cy.js b/t/html/pfappserver/cypress/specs/e2e/50-views/20-bases.cy.js similarity index 87% rename from t/html/pfappserver/cypress/specs/e2e/50-views/20-resources.cy.js rename to t/html/pfappserver/cypress/specs/e2e/50-views/20-bases.cy.js index 33f65a3015cb..05768c09641f 100644 --- a/t/html/pfappserver/cypress/specs/e2e/50-views/20-resources.cy.js +++ b/t/html/pfappserver/cypress/specs/e2e/50-views/20-bases.cy.js @@ -1,12 +1,12 @@ -const { base, resources } = require('config'); +const { global, bases } = require('config'); -describe('Resources', () => { - Object.values(resources).forEach(resource => { - context(`Resource - ${resource.description}`, () => { +describe('Bases', () => { + Object.values(bases).forEach(base => { + context(`Base - ${base.description}`, () => { beforeEach('Login and visit URL', () => { cy.pfSystemLogin() }) - resource.tests.forEach(test => { + base.tests.forEach(test => { const { description, url, interceptors, form: { buttonSelector = 'button[type="submit"]' } = {} } = test it(description, () => { @@ -29,7 +29,7 @@ describe('Resources', () => { }) // load page - cy.visit(`${base.url}${url}`) + cy.visit(`${global.url}${url}`) interceptors.forEach(async (interceptor, i) => { const { url, fixture, timeout = 10E3 } = interceptor From 94d6dcbff2fa8ac72c7d25855506e2866c7d7d61 Mon Sep 17 00:00:00 2001 From: Darren Satkunas Date: Fri, 3 Nov 2023 08:38:27 -0700 Subject: [PATCH 04/91] cleanup --- .../config/bases/modules/access_durations.js | 2 +- .../config/bases/modules/active_active.js | 2 +- .../pfappserver/config/bases/modules/admin_login.js | 2 +- t/html/pfappserver/config/bases/modules/advanced.js | 2 +- t/html/pfappserver/config/bases/modules/alerting.js | 2 +- .../config/bases/modules/captive_portal.js | 2 +- .../config/bases/modules/database_advanced.js | 2 +- .../config/bases/modules/database_general.js | 2 +- .../config/bases/modules/database_proxysql.js | 2 +- .../config/bases/modules/dns_configuration.js | 2 +- .../pfappserver/config/bases/modules/fingerbank.js | 4 ++-- t/html/pfappserver/config/bases/modules/general.js | 2 +- t/html/pfappserver/config/bases/modules/monit.js | 2 +- .../config/bases/modules/networks_fencing.js | 2 +- .../config/bases/modules/networks_inline.js | 2 +- .../config/bases/modules/networks_network.js | 2 +- .../config/bases/modules/networks_parking.js | 2 +- t/html/pfappserver/config/bases/modules/services.js | 2 +- .../pfappserver/config/bases/modules/snmp_traps.js | 2 +- .../pfappserver/config/bases/modules/webservices.js | 2 +- .../cypress/specs/e2e/50-views/20-bases.cy.js | 12 +----------- 21 files changed, 22 insertions(+), 32 deletions(-) diff --git a/t/html/pfappserver/config/bases/modules/access_durations.js b/t/html/pfappserver/config/bases/modules/access_durations.js index c318febb7417..045cffcbec83 100644 --- a/t/html/pfappserver/config/bases/modules/access_durations.js +++ b/t/html/pfappserver/config/bases/modules/access_durations.js @@ -8,7 +8,7 @@ module.exports = { description: 'Access durations - Passthrough Form', url: '/configuration/access_duration', interceptors: [ - { method: 'GET', url, fixture: (r) => r.body.item }, + { method: 'GET', url, fixture: res => res.body.item }, { method: '+(PATCH|PUT)', url, expect: (req, fixture) => { Object.keys(fixture).forEach(key => { diff --git a/t/html/pfappserver/config/bases/modules/active_active.js b/t/html/pfappserver/config/bases/modules/active_active.js index 241f47b28a56..36ce1127d096 100644 --- a/t/html/pfappserver/config/bases/modules/active_active.js +++ b/t/html/pfappserver/config/bases/modules/active_active.js @@ -8,7 +8,7 @@ module.exports = { description: 'Active active - Passthrough Form', url: '/configuration/active_active', interceptors: [ - { method: 'GET', url, fixture: (r) => r.body.item }, + { method: 'GET', url, fixture: res => res.body.item }, { method: '+(PATCH|PUT)', url, expect: (req, fixture) => { Object.keys(fixture).forEach(key => { diff --git a/t/html/pfappserver/config/bases/modules/admin_login.js b/t/html/pfappserver/config/bases/modules/admin_login.js index 7995bd4b1f79..a196a132e35b 100644 --- a/t/html/pfappserver/config/bases/modules/admin_login.js +++ b/t/html/pfappserver/config/bases/modules/admin_login.js @@ -8,7 +8,7 @@ module.exports = { description: 'Admin login - Passthrough Form', url: '/configuration/admin_login', interceptors: [ - { method: 'GET', url, fixture: (r) => r.body.item }, + { method: 'GET', url, fixture: res => res.body.item }, { method: '+(PATCH|PUT)', url, expect: (req, fixture) => { Object.keys(fixture).forEach(key => { diff --git a/t/html/pfappserver/config/bases/modules/advanced.js b/t/html/pfappserver/config/bases/modules/advanced.js index 3f21da4ab973..9ffc1126f725 100644 --- a/t/html/pfappserver/config/bases/modules/advanced.js +++ b/t/html/pfappserver/config/bases/modules/advanced.js @@ -8,7 +8,7 @@ module.exports = { description: 'Advanced - Passthrough Form', url: '/configuration/advanced', interceptors: [ - { method: 'GET', url, fixture: (r) => r.body.item }, + { method: 'GET', url, fixture: res => res.body.item }, { method: '+(PATCH|PUT)', url, expect: (req, fixture) => { Object.keys(fixture).forEach(key => { diff --git a/t/html/pfappserver/config/bases/modules/alerting.js b/t/html/pfappserver/config/bases/modules/alerting.js index 197c6e479c4a..757fa04ede01 100644 --- a/t/html/pfappserver/config/bases/modules/alerting.js +++ b/t/html/pfappserver/config/bases/modules/alerting.js @@ -8,7 +8,7 @@ module.exports = { description: 'Alerting - Passthrough Form', url: '/configuration/alerting', interceptors: [ - { method: 'GET', url, fixture: (r) => r.body.item }, + { method: 'GET', url, fixture: res => res.body.item }, { method: '+(PATCH|PUT)', url, expect: (req, fixture) => { Object.keys(fixture).forEach(key => { diff --git a/t/html/pfappserver/config/bases/modules/captive_portal.js b/t/html/pfappserver/config/bases/modules/captive_portal.js index 1eb165dbe8f5..eb9de4e7642a 100644 --- a/t/html/pfappserver/config/bases/modules/captive_portal.js +++ b/t/html/pfappserver/config/bases/modules/captive_portal.js @@ -8,7 +8,7 @@ module.exports = { description: 'Captive Portal - Passthrough Form', url: '/configuration/captive_portal', interceptors: [ - { method: 'GET', url, fixture: (r) => r.body.item }, + { method: 'GET', url, fixture: res => res.body.item }, { method: '+(PATCH|PUT)', url, expect: (req, fixture) => { Object.keys(fixture).forEach(key => { diff --git a/t/html/pfappserver/config/bases/modules/database_advanced.js b/t/html/pfappserver/config/bases/modules/database_advanced.js index f4c124ff601a..02ff05a4532e 100644 --- a/t/html/pfappserver/config/bases/modules/database_advanced.js +++ b/t/html/pfappserver/config/bases/modules/database_advanced.js @@ -8,7 +8,7 @@ module.exports = { description: 'Database advanced - Passthrough Form', url: '/configuration/database_advanced', interceptors: [ - { method: 'GET', url, fixture: (r) => r.body.item }, + { method: 'GET', url, fixture: res => res.body.item }, { method: '+(PATCH|PUT)', url, expect: (req, fixture) => { Object.keys(fixture).forEach(key => { diff --git a/t/html/pfappserver/config/bases/modules/database_general.js b/t/html/pfappserver/config/bases/modules/database_general.js index de98ad47b321..a6b04612ae58 100644 --- a/t/html/pfappserver/config/bases/modules/database_general.js +++ b/t/html/pfappserver/config/bases/modules/database_general.js @@ -8,7 +8,7 @@ module.exports = { description: 'Database general - Passthrough Form', url: '/configuration/database_general', interceptors: [ - { method: 'GET', url, fixture: (r) => r.body.item }, + { method: 'GET', url, fixture: res => res.body.item }, { method: '+(PATCH|PUT)', url, expect: (req, fixture) => { Object.keys(fixture).forEach(key => { diff --git a/t/html/pfappserver/config/bases/modules/database_proxysql.js b/t/html/pfappserver/config/bases/modules/database_proxysql.js index 09331d39120c..144a6ac8fcf5 100644 --- a/t/html/pfappserver/config/bases/modules/database_proxysql.js +++ b/t/html/pfappserver/config/bases/modules/database_proxysql.js @@ -8,7 +8,7 @@ module.exports = { description: 'Database ProxySQL - Passthrough Form', url: '/configuration/database_proxysql', interceptors: [ - { method: 'GET', url, fixture: (r) => r.body.item }, + { method: 'GET', url, fixture: res => res.body.item }, { method: '+(PATCH|PUT)', url, expect: (req, fixture) => { Object.keys(fixture).forEach(key => { diff --git a/t/html/pfappserver/config/bases/modules/dns_configuration.js b/t/html/pfappserver/config/bases/modules/dns_configuration.js index e68d791546b8..20eb527c3e54 100644 --- a/t/html/pfappserver/config/bases/modules/dns_configuration.js +++ b/t/html/pfappserver/config/bases/modules/dns_configuration.js @@ -8,7 +8,7 @@ module.exports = { description: 'DNS configuration - Passthrough Form', url: '/configuration/dns', interceptors: [ - { method: 'GET', url, fixture: (r) => r.body.item }, + { method: 'GET', url, fixture: res => res.body.item }, { method: '+(PATCH|PUT)', url, expect: (req, fixture) => { Object.keys(fixture).forEach(key => { diff --git a/t/html/pfappserver/config/bases/modules/fingerbank.js b/t/html/pfappserver/config/bases/modules/fingerbank.js index 72fc8897cbd5..0ad2deedcf78 100644 --- a/t/html/pfappserver/config/bases/modules/fingerbank.js +++ b/t/html/pfappserver/config/bases/modules/fingerbank.js @@ -15,7 +15,7 @@ module.exports = { description: 'General Settings - Passthrough Form', url: '/configuration/fingerbank/general_settings', interceptors: [ - { method: 'GET', url: '/api/**/config/fingerbank_settings?*', fixture: (r) => r.body.items.reduce((fixture, { id, ...rest }) => ({ ...fixture, [id]: { id, ...rest } }), {}) }, + { 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) }, @@ -27,7 +27,7 @@ module.exports = { description: 'Device Change Detection - Passthrough Form', url: '/configuration/fingerbank/device_change_detection', interceptors: [ - { method: 'GET', url: '/api/**/config/base/fingerbank_device_change', fixture: (r) => r.body.item }, + { 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 => { diff --git a/t/html/pfappserver/config/bases/modules/general.js b/t/html/pfappserver/config/bases/modules/general.js index 57e1d44f316b..bce3051966d2 100644 --- a/t/html/pfappserver/config/bases/modules/general.js +++ b/t/html/pfappserver/config/bases/modules/general.js @@ -8,7 +8,7 @@ module.exports = { description: 'General - Passthrough Form', url: '/configuration/general', interceptors: [ - { method: 'GET', url, fixture: (r) => r.body.item }, + { method: 'GET', url, fixture: res => res.body.item }, { method: '+(PATCH|PUT)', url, expect: (req, fixture) => { Object.keys(fixture).forEach(key => { diff --git a/t/html/pfappserver/config/bases/modules/monit.js b/t/html/pfappserver/config/bases/modules/monit.js index 8da42df0aeb2..4b351edfee12 100644 --- a/t/html/pfappserver/config/bases/modules/monit.js +++ b/t/html/pfappserver/config/bases/modules/monit.js @@ -8,7 +8,7 @@ module.exports = { description: 'Monit - Passthrough Form', url: '/configuration/monit', interceptors: [ - { method: 'GET', url, fixture: (r) => r.body.item }, + { method: 'GET', url, fixture: res => res.body.item }, { method: '+(PATCH|PUT)', url, expect: (req, fixture) => { Object.keys(fixture).forEach(key => { diff --git a/t/html/pfappserver/config/bases/modules/networks_fencing.js b/t/html/pfappserver/config/bases/modules/networks_fencing.js index 0f751765867c..367da2bf2485 100644 --- a/t/html/pfappserver/config/bases/modules/networks_fencing.js +++ b/t/html/pfappserver/config/bases/modules/networks_fencing.js @@ -8,7 +8,7 @@ module.exports = { description: 'Networks fencing - Passthrough Form', url: '/configuration/fencing', interceptors: [ - { method: 'GET', url, fixture: (r) => r.body.item }, + { method: 'GET', url, fixture: res => res.body.item }, { method: '+(PATCH|PUT)', url, expect: (req, fixture) => { Object.keys(fixture).forEach(key => { diff --git a/t/html/pfappserver/config/bases/modules/networks_inline.js b/t/html/pfappserver/config/bases/modules/networks_inline.js index 3776e2dcddc5..cab406b95f3b 100644 --- a/t/html/pfappserver/config/bases/modules/networks_inline.js +++ b/t/html/pfappserver/config/bases/modules/networks_inline.js @@ -8,7 +8,7 @@ module.exports = { description: 'Networks inline - Passthrough Form', url: '/configuration/inline', interceptors: [ - { method: 'GET', url, fixture: (r) => r.body.item }, + { method: 'GET', url, fixture: res => res.body.item }, { method: '+(PATCH|PUT)', url, expect: (req, fixture) => { Object.keys(fixture).forEach(key => { diff --git a/t/html/pfappserver/config/bases/modules/networks_network.js b/t/html/pfappserver/config/bases/modules/networks_network.js index 65429c2d7842..d513e8b4dcfd 100644 --- a/t/html/pfappserver/config/bases/modules/networks_network.js +++ b/t/html/pfappserver/config/bases/modules/networks_network.js @@ -8,7 +8,7 @@ module.exports = { description: 'Networks network - Passthrough Form', url: '/configuration/network', interceptors: [ - { method: 'GET', url, fixture: (r) => r.body.item }, + { method: 'GET', url, fixture: res => res.body.item }, { method: '+(PATCH|PUT)', url, expect: (req, fixture) => { Object.keys(fixture).forEach(key => { diff --git a/t/html/pfappserver/config/bases/modules/networks_parking.js b/t/html/pfappserver/config/bases/modules/networks_parking.js index 42bef7459577..1fbee320c7a7 100644 --- a/t/html/pfappserver/config/bases/modules/networks_parking.js +++ b/t/html/pfappserver/config/bases/modules/networks_parking.js @@ -8,7 +8,7 @@ module.exports = { description: 'Networks parking - Passthrough Form', url: '/configuration/parking', interceptors: [ - { method: 'GET', url, fixture: (r) => r.body.item }, + { method: 'GET', url, fixture: res => res.body.item }, { method: '+(PATCH|PUT)', url, expect: (req, fixture) => { Object.keys(fixture).forEach(key => { diff --git a/t/html/pfappserver/config/bases/modules/services.js b/t/html/pfappserver/config/bases/modules/services.js index 50be92fb7248..f5476b601d29 100644 --- a/t/html/pfappserver/config/bases/modules/services.js +++ b/t/html/pfappserver/config/bases/modules/services.js @@ -8,7 +8,7 @@ module.exports = { description: 'Services - Passthrough Form', url: '/configuration/services', interceptors: [ - { method: 'GET', url, fixture: (r) => r.body.item }, + { method: 'GET', url, fixture: res => res.body.item }, { method: '+(PATCH|PUT)', url, expect: (req, fixture) => { Object.keys(fixture).forEach(key => { diff --git a/t/html/pfappserver/config/bases/modules/snmp_traps.js b/t/html/pfappserver/config/bases/modules/snmp_traps.js index 0441d51c9434..15948516d18e 100644 --- a/t/html/pfappserver/config/bases/modules/snmp_traps.js +++ b/t/html/pfappserver/config/bases/modules/snmp_traps.js @@ -8,7 +8,7 @@ module.exports = { description: 'SNMP Traps - Passthrough Form', url: '/configuration/snmp_traps', interceptors: [ - { method: 'GET', url, fixture: (r) => r.body.item }, + { method: 'GET', url, fixture: res => res.body.item }, { method: '+(PATCH|PUT)', url, expect: (req, fixture) => { Object.keys(fixture).forEach(key => { diff --git a/t/html/pfappserver/config/bases/modules/webservices.js b/t/html/pfappserver/config/bases/modules/webservices.js index 1a718a75741a..13d7c865f048 100644 --- a/t/html/pfappserver/config/bases/modules/webservices.js +++ b/t/html/pfappserver/config/bases/modules/webservices.js @@ -8,7 +8,7 @@ module.exports = { description: 'Webservices - Passthrough Form', url: '/configuration/webservices', interceptors: [ - { method: 'GET', url, fixture: (r) => r.body.item }, + { method: 'GET', url, fixture: res => res.body.item }, { method: '+(PATCH|PUT)', url, expect: (req, fixture) => { Object.keys(fixture).forEach(key => { diff --git a/t/html/pfappserver/cypress/specs/e2e/50-views/20-bases.cy.js b/t/html/pfappserver/cypress/specs/e2e/50-views/20-bases.cy.js index 05768c09641f..1fa84fef1638 100644 --- a/t/html/pfappserver/cypress/specs/e2e/50-views/20-bases.cy.js +++ b/t/html/pfappserver/cypress/specs/e2e/50-views/20-bases.cy.js @@ -3,7 +3,7 @@ const { global, bases } = require('config'); describe('Bases', () => { Object.values(bases).forEach(base => { context(`Base - ${base.description}`, () => { - beforeEach('Login and visit URL', () => { + beforeEach('Login as system', () => { cy.pfSystemLogin() }) base.tests.forEach(test => { @@ -48,16 +48,6 @@ describe('Bases', () => { .should('not.have.class', 'disabled') .and('not.have.disabled', 'disabled') .click() - - // wait API interceptors - /* - interceptors.forEach(async (interceptor, i) => { - const { timeout = 3E3 } = interceptor - await cy.wait(`@interceptor${i}`, { timeout }) - }) - */ - - }) }) }) From e63a901a784cdb6134a9b7adf70a6d5cc72465d2 Mon Sep 17 00:00:00 2001 From: Darren Satkunas Date: Thu, 9 Nov 2023 12:33:29 -0800 Subject: [PATCH 05/91] working collections --- .../pfappserver/config/collections/config.js | 9 ++ .../config/collections/modules/domains.js | 27 +++-- .../config/collections/modules/roles.js | 22 ++++- .../cypress/config/cypress.config-views.js | 4 +- .../cypress/config/cypress.config.js | 4 +- .../cypress/fixtures/collections/domain.json | 7 ++ .../cypress/fixtures/collections/role.json | 3 + .../cypress/fixtures/configurator.js | 11 --- .../pfappserver/cypress/fixtures/empty.json | 1 + .../{20-bases.cy.js => 10-bases.cy.js} | 11 ++- .../specs/e2e/50-views/20-collections.cy.js | 99 +++++++++++++++++++ 11 files changed, 172 insertions(+), 26 deletions(-) create mode 100644 t/html/pfappserver/config/collections/config.js create mode 100644 t/html/pfappserver/cypress/fixtures/collections/domain.json create mode 100644 t/html/pfappserver/cypress/fixtures/collections/role.json delete mode 100644 t/html/pfappserver/cypress/fixtures/configurator.js create mode 100644 t/html/pfappserver/cypress/fixtures/empty.json rename t/html/pfappserver/cypress/specs/e2e/50-views/{20-bases.cy.js => 10-bases.cy.js} (84%) create mode 100644 t/html/pfappserver/cypress/specs/e2e/50-views/20-collections.cy.js 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/modules/domains.js b/t/html/pfappserver/config/collections/modules/domains.js index dfe79fa58918..0925fa220f40 100644 --- a/t/html/pfappserver/config/collections/modules/domains.js +++ b/t/html/pfappserver/config/collections/modules/domains.js @@ -1,14 +1,27 @@ +const { SCOPE_INSERT } = require('../config'); +const url = '/configuration/domains'; + module.exports = { id: 'domains', - name: 'Domains', + description: 'Domains', tests: [ { - url: '/configuration/domains', - tabIndex: 0 - }, - { - url: '/configuration/domains/new', - tabIndex: 0 + description: 'Domains - Add New', + scope: SCOPE_INSERT, + url, + form: { + fixture: 'collections/domain.json' + }, + interceptors: [ + { + method: 'POST', url: '/api/**/config/domains', 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/modules/roles.js b/t/html/pfappserver/config/collections/modules/roles.js index b48c32f1b974..e7dc6245aacd 100644 --- a/t/html/pfappserver/config/collections/modules/roles.js +++ b/t/html/pfappserver/config/collections/modules/roles.js @@ -1,9 +1,27 @@ +const { SCOPE_INSERT } = require('../config'); +const url = '/configuration/roles'; + module.exports = { id: 'roles', - name: 'Roles', + description: 'Roles', tests: [ { - url: '/configuration/roles', + description: 'Roles - Add New', + scope: SCOPE_INSERT, + url, + form: { + fixture: 'collections/role.json' + }, + interceptors: [ + { + method: 'POST', url: '/api/**/config/roles', 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/cypress/config/cypress.config-views.js b/t/html/pfappserver/cypress/config/cypress.config-views.js index b5ab1462a3ce..de6872999158 100644 --- a/t/html/pfappserver/cypress/config/cypress.config-views.js +++ b/t/html/pfappserver/cypress/config/cypress.config-views.js @@ -7,8 +7,8 @@ module.exports = { ...config.e2e, specPattern: [ - 'cypress/specs/e2e/*-views/*.cy.{js,jsx,ts,tsx}', - 'cypress/specs/e2e/*-views/**/*.cy.{js,jsx,ts,tsx}', + 'cypress/specs/e2e/*-views/20*.cy.{js,jsx,ts,tsx}', +// 'cypress/specs/e2e/*-views/**/*.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 e228dd826c31..c44defd95219 100644 --- a/t/html/pfappserver/cypress/config/cypress.config.js +++ b/t/html/pfappserver/cypress/config/cypress.config.js @@ -49,8 +49,8 @@ module.exports = { screenshotsFolder: 'cypress/results/screenshots', video: false, videosFolder: 'cypress/results/videos', - viewportWidth: 1280, - viewportHeight: 1024, + viewportWidth: 2560, + viewportHeight: 2048, // 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. 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..93684be00aa8 --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/collections/domain.json @@ -0,0 +1,7 @@ +{ + "id": "test", + "workgroup": "test", + "dns_name": "test.local", + "ad_server": "1.2.3.4", + "dns_servers": "1.2.3.4, 3.4.5.6" +} \ 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/configurator.js b/t/html/pfappserver/cypress/fixtures/configurator.js deleted file mode 100644 index 9fdf85d3c6b8..000000000000 --- a/t/html/pfappserver/cypress/fixtures/configurator.js +++ /dev/null @@ -1,11 +0,0 @@ -{ - network: { - hostname: 'packetfence.demo' - }, - administrator: { - password: 'admin' - }, - 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/specs/e2e/50-views/20-bases.cy.js b/t/html/pfappserver/cypress/specs/e2e/50-views/10-bases.cy.js similarity index 84% rename from t/html/pfappserver/cypress/specs/e2e/50-views/20-bases.cy.js rename to t/html/pfappserver/cypress/specs/e2e/50-views/10-bases.cy.js index 1fa84fef1638..9c02f8aece36 100644 --- a/t/html/pfappserver/cypress/specs/e2e/50-views/20-bases.cy.js +++ b/t/html/pfappserver/cypress/specs/e2e/50-views/10-bases.cy.js @@ -1,3 +1,5 @@ +/// + const { global, bases } = require('config'); describe('Bases', () => { @@ -7,7 +9,11 @@ describe('Bases', () => { cy.pfSystemLogin() }) base.tests.forEach(test => { - const { description, url, interceptors, form: { buttonSelector = 'button[type="submit"]' } = {} } = test + const { description, url, interceptors = [], selectors } = test + const { + buttonSelector = 'button[type="submit"]' + } = selectors || [] + it(description, () => { // storage from getter (fixture) to setter (expect) @@ -18,8 +24,9 @@ describe('Bases', () => { const { method, url, expect, timeout = 3E3 } = interceptor cy.intercept({ method, url }, (req) => { if (expect) { + req.destroy() // block cy.window().then(() => { - expect(req, cache) // block + expect(req, cache) // expect }) } else { diff --git a/t/html/pfappserver/cypress/specs/e2e/50-views/20-collections.cy.js b/t/html/pfappserver/cypress/specs/e2e/50-views/20-collections.cy.js new file mode 100644 index 000000000000..99bf82fa72ea --- /dev/null +++ b/t/html/pfappserver/cypress/specs/e2e/50-views/20-collections.cy.js @@ -0,0 +1,99 @@ +/// + +const { global, collections } = require('config'); +const { SCOPE_INSERT, SCOPE_UPDATE, SCOPE_DELETE } = require('config/collections/config'); + +describe('Collections', () => { + Object.values(collections).forEach(collection => { + context(`Collection - ${collection.description}`, () => { + beforeEach('Login as system', () => { + cy.pfSystemLogin() + }) + collection.tests.forEach(test => { + const { description, scope, url, expect, form, interceptors = [], selectors } = test + const { fixture = 'empty.json' } = form || {} + const { + buttonNewSelector = 'button[type="button"]:contains(New)', + buttonCreateSelector = 'button[type="submit"]:contains(Create)', + tabSelector = 'div.tabs a[role="tab"]', + } = selectors || {} + + it(description, () => { + + // load page + cy.visit(`${global.url}${url}`) + + switch (scope) { + case SCOPE_INSERT: + + // click "New" button + cy.get(buttonNewSelector).first().as('buttonNew') + cy.get('@buttonNew') + .should('not.have.class', 'disabled') + .and('not.have.disabled', 'disabled') + .click({ log: true }) + + // expect url changed + cy.url().should('include', `${url}/new`) + + // fill form with fixture + cy.fixture(fixture).then(data => { + + // 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, data) // expect + }) + } + else { + req.continue() // passthrough + } + }).as(`interceptor${i}`) + }) + + if (Cypress.$(tabSelector).length) { + // iterate tabs (optional) + cy.get(tabSelector).each(async (tab, t, tabs) => { + if (tabs.length > 1) { + // click tab + await cy.get(tab, { timeout: 10E3 }) + .click({ log: true }) + .invoke('attr', 'aria-selected') + .should('eq', 'true') + } + // fill form + await cy.formFillNamespace(data) + }) + } + else { + // fill form + cy.formFillNamespace(data) + } + + // click "Create" button + cy.window().then(() => { + cy.get(buttonCreateSelector).first().as('buttonCreate') + cy.get('@buttonCreate') + .should('not.have.class', 'disabled') + .and('not.have.disabled', 'disabled') + .click({ log: true }) + + }) + }) + break + + case SCOPE_UPDATE: + case SCOPE_DELETE: + default: + cy.task('error', `Unhandled scope '${scope || 'unknown'}'`) + } + + }) + }) + }) + }) +}) \ No newline at end of file From 2990d79d14aeb77fc1a43087e2a88e615f794643 Mon Sep 17 00:00:00 2001 From: Darren Satkunas Date: Fri, 10 Nov 2023 07:08:58 -0800 Subject: [PATCH 06/91] add realms --- .../pfappserver/config/collections/index.js | 2 ++ .../config/collections/modules/realms.js | 27 +++++++++++++++++++ 2 files changed, 29 insertions(+) create mode 100644 t/html/pfappserver/config/collections/modules/realms.js diff --git a/t/html/pfappserver/config/collections/index.js b/t/html/pfappserver/config/collections/index.js index afcb9c880104..c8c0b43e6669 100644 --- a/t/html/pfappserver/config/collections/index.js +++ b/t/html/pfappserver/config/collections/index.js @@ -1,7 +1,9 @@ const domains = require('./modules/domains') +const realms = require('./modules/realms') const roles = require('./modules/roles') module.exports = { domains, + realms, roles } \ 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..04d798ea06c0 --- /dev/null +++ b/t/html/pfappserver/config/collections/modules/realms.js @@ -0,0 +1,27 @@ +const { SCOPE_INSERT } = require('../config'); +const url = '/configuration/realms'; + +module.exports = { + id: 'realms', + description: 'Realms', + tests: [ + { + description: 'Realms - Add New', + scope: SCOPE_INSERT, + url, + form: { + fixture: 'collections/realm.json' + }, + interceptors: [ + { + method: 'POST', url: '/api/**/config/realms', 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 From a90a24fd2db863bb6ab853abe7db7bc7b3989ac1 Mon Sep 17 00:00:00 2001 From: Darren Satkunas Date: Fri, 10 Nov 2023 07:11:11 -0800 Subject: [PATCH 07/91] adjust async --- .../pfappserver/cypress/fixtures/collections/realm.json | 3 +++ .../cypress/specs/e2e/50-views/20-collections.cy.js | 8 ++++---- t/html/pfappserver/cypress/support/commands.js | 6 +++--- 3 files changed, 10 insertions(+), 7 deletions(-) create mode 100644 t/html/pfappserver/cypress/fixtures/collections/realm.json 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/specs/e2e/50-views/20-collections.cy.js b/t/html/pfappserver/cypress/specs/e2e/50-views/20-collections.cy.js index 99bf82fa72ea..4dd85f4db281 100644 --- a/t/html/pfappserver/cypress/specs/e2e/50-views/20-collections.cy.js +++ b/t/html/pfappserver/cypress/specs/e2e/50-views/20-collections.cy.js @@ -37,7 +37,7 @@ describe('Collections', () => { cy.url().should('include', `${url}/new`) // fill form with fixture - cy.fixture(fixture).then(data => { + cy.fixture(fixture).then(async (data) => { // setup API interceptors interceptors.forEach((interceptor, i) => { @@ -55,12 +55,12 @@ describe('Collections', () => { }).as(`interceptor${i}`) }) + // iterate tabs (optional) if (Cypress.$(tabSelector).length) { - // iterate tabs (optional) cy.get(tabSelector).each(async (tab, t, tabs) => { if (tabs.length > 1) { // click tab - await cy.get(tab, { timeout: 10E3 }) + cy.get(tab, { timeout: 10E3 }) .click({ log: true }) .invoke('attr', 'aria-selected') .should('eq', 'true') @@ -71,7 +71,7 @@ describe('Collections', () => { } else { // fill form - cy.formFillNamespace(data) + await cy.formFillNamespace(data) } // click "Create" button diff --git a/t/html/pfappserver/cypress/support/commands.js b/t/html/pfappserver/cypress/support/commands.js index b2448fd18bb3..2211c679c0b4 100644 --- a/t/html/pfappserver/cypress/support/commands.js +++ b/t/html/pfappserver/cypress/support/commands.js @@ -54,8 +54,8 @@ Cypress.Commands.add('pfConfiguratorDisable', () => { }) }) -Cypress.Commands.add('formFillNamespace', (data, element) => { - (element || cy.get('form').first()).within($ => { +Cypress.Commands.add('formFillNamespace', (data, selector = 'form > div.base-form') => { + return cy.get(selector).first().within($ => { for (let entry of Object.entries(data)) { const [namespace, value] = entry const selector = `*[data-namespace="${namespace}"]:not([disabled])` @@ -68,7 +68,7 @@ Cypress.Commands.add('formFillNamespace', (data, element) => { switch (true) { case tagName === 'input' && ['text', 'password'].includes(type): case tagName === 'textarea': - cy.get(el).type(`{selectAll}{del}${value}`) + cy.get(el).type(`{selectAll}{del}${value}`, { log: true, force: true }) break case tagName === 'input' && ['range'].includes(type): // TODO From 3c3310fd9145d57246179fa1bbf157532cc9b2ab Mon Sep 17 00:00:00 2001 From: Darren Satkunas Date: Wed, 22 Nov 2023 06:26:23 -0800 Subject: [PATCH 08/91] working collection CRUD --- .../pfappserver/config/collections/index.js | 4 +- .../config/collections/modules/domains.js | 7 +- .../config/collections/modules/realms.js | 27 ++- .../config/collections/modules/roles.js | 52 ++++- t/html/pfappserver/config/global/index.js | 6 +- t/html/pfappserver/config/index.js | 8 +- .../specs/e2e/50-views/20-collections.cy.js | 178 +++++++++++++----- 7 files changed, 215 insertions(+), 67 deletions(-) diff --git a/t/html/pfappserver/config/collections/index.js b/t/html/pfappserver/config/collections/index.js index c8c0b43e6669..5383cf78fa5e 100644 --- a/t/html/pfappserver/config/collections/index.js +++ b/t/html/pfappserver/config/collections/index.js @@ -3,7 +3,7 @@ const realms = require('./modules/realms') const roles = require('./modules/roles') module.exports = { - domains, - realms, +// domains, +// realms, roles } \ 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 index 0925fa220f40..34fb90dee2c3 100644 --- a/t/html/pfappserver/config/collections/modules/domains.js +++ b/t/html/pfappserver/config/collections/modules/domains.js @@ -1,4 +1,5 @@ const { SCOPE_INSERT } = require('../config'); + const url = '/configuration/domains'; module.exports = { @@ -8,13 +9,11 @@ module.exports = { { description: 'Domains - Add New', scope: SCOPE_INSERT, + fixture: 'collections/domain.json', url, - form: { - fixture: 'collections/domain.json' - }, interceptors: [ { - method: 'POST', url: '/api/**/config/domains', expect: (req, fixture) => { + method: 'POST', url: '/api/**/config/domains', expectRequest: (req, fixture) => { Object.keys(fixture).forEach(key => { expect(req.body).to.have.property(key) expect(req.body[key]).to.deep.equal(fixture[key], key) diff --git a/t/html/pfappserver/config/collections/modules/realms.js b/t/html/pfappserver/config/collections/modules/realms.js index 04d798ea06c0..be85e4c4f98a 100644 --- a/t/html/pfappserver/config/collections/modules/realms.js +++ b/t/html/pfappserver/config/collections/modules/realms.js @@ -1,5 +1,7 @@ -const { SCOPE_INSERT } = require('../config'); -const url = '/configuration/realms'; +const { SCOPE_INSERT, 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', @@ -8,13 +10,11 @@ module.exports = { { description: 'Realms - Add New', scope: SCOPE_INSERT, - url, - form: { - fixture: 'collections/realm.json' - }, + url: collection_url, + fixture, interceptors: [ { - method: 'POST', url: '/api/**/config/realms', expect: (req, fixture) => { + method: 'POST', url: '/api/**/config/realms', expectRequest: (req, fixture) => { Object.keys(fixture).forEach(key => { expect(req.body).to.have.property(key) expect(req.body[key]).to.deep.equal(fixture[key], key) @@ -23,5 +23,18 @@ module.exports = { } ] }, + { + 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 index e7dc6245aacd..78cb11adc17f 100644 --- a/t/html/pfappserver/config/collections/modules/roles.js +++ b/t/html/pfappserver/config/collections/modules/roles.js @@ -1,5 +1,7 @@ -const { SCOPE_INSERT } = require('../config'); -const url = '/configuration/roles'; +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', @@ -8,20 +10,52 @@ module.exports = { { description: 'Roles - Add New', scope: SCOPE_INSERT, - url, - form: { - fixture: 'collections/role.json' - }, + url: collection_url, + fixture, interceptors: [ { - method: 'POST', url: '/api/**/config/roles', expect: (req, fixture) => { + method: 'POST', url: '/api/**/config/roles', expectRequest: (request, fixture) => { Object.keys(fixture).forEach(key => { - expect(req.body).to.have.property(key) - expect(req.body[key]).to.deep.equal(fixture[key], 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/global/index.js b/t/html/pfappserver/config/global/index.js index 32fe9ef41149..3f0a1fbf37eb 100644 --- a/t/html/pfappserver/config/global/index.js +++ b/t/html/pfappserver/config/global/index.js @@ -1,3 +1,7 @@ +const url = '/admin#'; +const interceptorTimeoutMs = 3E3; + module.exports = { - url: '/admin#', + url, + interceptorTimeoutMs } \ No newline at end of file diff --git a/t/html/pfappserver/config/index.js b/t/html/pfappserver/config/index.js index 6506dd727c29..219ec0416c40 100644 --- a/t/html/pfappserver/config/index.js +++ b/t/html/pfappserver/config/index.js @@ -2,8 +2,14 @@ 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 + collections, + + latencyInterceptor, } \ No newline at end of file diff --git a/t/html/pfappserver/cypress/specs/e2e/50-views/20-collections.cy.js b/t/html/pfappserver/cypress/specs/e2e/50-views/20-collections.cy.js index 4dd85f4db281..79daa230ebcd 100644 --- a/t/html/pfappserver/cypress/specs/e2e/50-views/20-collections.cy.js +++ b/t/html/pfappserver/cypress/specs/e2e/50-views/20-collections.cy.js @@ -10,47 +10,54 @@ describe('Collections', () => { cy.pfSystemLogin() }) collection.tests.forEach(test => { - const { description, scope, url, expect, form, interceptors = [], selectors } = test - const { fixture = 'empty.json' } = form || {} + const { description, fixture = 'emtpy.json', scope, url, interceptors = [], selectors, + idFromFixture = ({ id }) => id, + } = test const { - buttonNewSelector = 'button[type="button"]:contains(New)', + 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"]', - } = selectors || {} - + } = selectors || {}; it(description, () => { + cy.fixture(fixture).then(async (data) => { + const resourceId = idFromFixture(data) + const resourceUrl = (url.constructor == Function) ? url(resourceId) : url + switch (scope) { - // load page - cy.visit(`${global.url}${url}`) - - switch (scope) { - case SCOPE_INSERT: - // click "New" button - cy.get(buttonNewSelector).first().as('buttonNew') - cy.get('@buttonNew') - .should('not.have.class', 'disabled') - .and('not.have.disabled', 'disabled') - .click({ log: true }) + /** + * SCOPE_INSERT + */ + case SCOPE_INSERT: + cy.visit(`${global.url}${url}`) - // expect url changed - cy.url().should('include', `${url}/new`) + // click "New" button(s) + buttonNewSelectors.forEach((buttonNewSelector, n) => { + cy.get(buttonNewSelector).first().as(`buttonNew${n}`) + cy.get(`@buttonNew${n}`) + .should('not.have.class', 'disabled') + .and('not.have.disabled', 'disabled') + .click({ log: true }) + }) - // fill form with fixture - cy.fixture(fixture).then(async (data) => { + // expect url changed + cy.url().should('include', `${url}/new`) // 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, data) // expect - }) + const { method, url, expectRequest, timeout = global.interceptorTimeoutMs, block } = interceptor + cy.intercept({ method, url }, (request) => { + if (block) { + request.destroy() // block } else { - req.continue() // passthrough + request.continue() // passthrough + } + if (expectRequest) { + expectRequest(request, data) // expect } }).as(`interceptor${i}`) }) @@ -62,8 +69,7 @@ describe('Collections', () => { // click tab cy.get(tab, { timeout: 10E3 }) .click({ log: true }) - .invoke('attr', 'aria-selected') - .should('eq', 'true') + .invoke('attr', 'aria-selected').should('eq', 'true') } // fill form await cy.formFillNamespace(data) @@ -75,23 +81,109 @@ describe('Collections', () => { } // click "Create" button - cy.window().then(() => { - cy.get(buttonCreateSelector).first().as('buttonCreate') - cy.get('@buttonCreate') - .should('not.have.class', 'disabled') - .and('not.have.disabled', 'disabled') - .click({ log: true }) + cy.get(buttonCreateSelector).first().as('buttonCreate') + cy.get('@buttonCreate') + .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(response => { + if (expectResponse) { + expectResponse(response, data) + } + }) }) - }) - break + break; + + + /** + * SCOPE_UPDATE + */ + case SCOPE_UPDATE: - case SCOPE_UPDATE: - case SCOPE_DELETE: - default: - cy.task('error', `Unhandled scope '${scope || 'unknown'}'`) - } + // setup API interceptors + interceptors.forEach((interceptor, i) => { + const { method, url, timeout = global.interceptorTimeoutMs, block } = interceptor + cy.intercept({ method, url }, (req) => { + if (block) { + req.destroy() // block + } + else { + req.continue() // passthrough + } + }).as(`interceptor${i}`) + }) + + cy.visit(`${global.url}${resourceUrl}`) + + // click "Save" button + cy.get(buttonSaveSelector).first().as('buttonSave') + cy.get('@buttonSave') + .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) { + expectResponse(response, data) + } + }) + }) + 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 }, (req) => { + if (block) { + req.destroy() // block + } + else { + req.continue() // passthrough + } + }).as(`interceptor${i}`) + }) + + cy.visit(`${global.url}${resourceUrl}`) + + // click "Delete" button + cy.get(buttonDeleteSelector).first().as('buttonDelete') + cy.get('@buttonDelete') + .should('not.have.class', 'disabled') + .and('not.have.disabled', 'disabled') + .click({ log: true }) + + // click "Delete" button again (confirm) + cy.get(buttonDeleteConfirmSelector).first().as('buttonDeleteConfirm') + cy.get('@buttonDeleteConfirm') + .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) { + expectResponse(response, data) + } + }) + }) + break; + default: + cy.task('error', `Unhandled scope '${scope || 'unknown'}'`) + } + }) }) }) }) From d92d6f0d40b31b674ae3d1624b798b7f3136d4fe Mon Sep 17 00:00:00 2001 From: Darren Satkunas Date: Thu, 23 Nov 2023 10:42:53 -0800 Subject: [PATCH 09/91] add decorations --- html/pfappserver/root/src/App.vue | 2 +- html/pfappserver/root/src/components/new/BaseButtonConfirm.vue | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/html/pfappserver/root/src/App.vue b/html/pfappserver/root/src/App.vue index f625af383e74..b9da8a5f043d 100644 --- a/html/pfappserver/root/src/App.vue +++ b/html/pfappserver/root/src/App.vue @@ -67,7 +67,7 @@ {{ hostname }} - + 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 @@ Date: Thu, 23 Nov 2023 10:45:12 -0800 Subject: [PATCH 10/91] fix CRUD --- t/html/pfappserver/config/global/index.js | 2 +- .../specs/e2e/50-views/20-collections.cy.js | 126 +++++++++++------- .../pfappserver/cypress/support/commands.js | 54 ++++---- 3 files changed, 102 insertions(+), 80 deletions(-) diff --git a/t/html/pfappserver/config/global/index.js b/t/html/pfappserver/config/global/index.js index 3f0a1fbf37eb..20ed0c798cee 100644 --- a/t/html/pfappserver/config/global/index.js +++ b/t/html/pfappserver/config/global/index.js @@ -1,5 +1,5 @@ const url = '/admin#'; -const interceptorTimeoutMs = 3E3; +const interceptorTimeoutMs = 5E3; module.exports = { url, diff --git a/t/html/pfappserver/cypress/specs/e2e/50-views/20-collections.cy.js b/t/html/pfappserver/cypress/specs/e2e/50-views/20-collections.cy.js index 79daa230ebcd..46927a29750b 100644 --- a/t/html/pfappserver/cypress/specs/e2e/50-views/20-collections.cy.js +++ b/t/html/pfappserver/cypress/specs/e2e/50-views/20-collections.cy.js @@ -1,5 +1,4 @@ /// - const { global, collections } = require('config'); const { SCOPE_INSERT, SCOPE_UPDATE, SCOPE_DELETE } = require('config/collections/config'); @@ -10,10 +9,11 @@ describe('Collections', () => { cy.pfSystemLogin() }) collection.tests.forEach(test => { - const { description, fixture = 'emtpy.json', scope, url, interceptors = [], selectors, + const { description, fixture = 'emtpy.json', scope, url, interceptors = [], selectors, timeout, idFromFixture = ({ id }) => id, } = 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)', @@ -21,8 +21,10 @@ describe('Collections', () => { buttonSaveSelector = 'button[type="submit"]:contains(Save)', tabSelector = 'div.tabs a[role="tab"]', } = selectors || {}; + const selectorOptions = { timeout } + it(description, () => { - cy.fixture(fixture).then(async (data) => { + cy.fixture(fixture).then((data) => { const resourceId = idFromFixture(data) const resourceUrl = (url.constructor == Function) ? url(resourceId) : url switch (scope) { @@ -36,11 +38,11 @@ describe('Collections', () => { // click "New" button(s) buttonNewSelectors.forEach((buttonNewSelector, n) => { - cy.get(buttonNewSelector).first().as(`buttonNew${n}`) - cy.get(`@buttonNew${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 }) + .click({ log: true, force: true }) }) // expect url changed @@ -62,27 +64,39 @@ describe('Collections', () => { }).as(`interceptor${i}`) }) - // iterate tabs (optional) - if (Cypress.$(tabSelector).length) { - cy.get(tabSelector).each(async (tab, t, tabs) => { - if (tabs.length > 1) { + cy.get(containerSelector, selectorOptions).then($body => { // DOM ready + // wait for progress + cy.get('div.progress[style*="display: none"]', selectorOptions).should('exist') + + // iterate tabs (optional) + if ($body.find(tabSelector).length) { + cy.get(tabSelector, selectorOptions).each((tab, n) => { // click tab - cy.get(tab, { timeout: 10E3 }) + 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') + + // fill form + cy.formFillNamespace(data, `@tab${n}`) + }) + // click first tab + cy.get(tabSelector, selectorOptions).first() + .click({ log: true }) + .invoke('attr', 'aria-selected').should('eq', 'true') + } + else { // fill form - await cy.formFillNamespace(data) - }) - } - else { - // fill form - await cy.formFillNamespace(data) - } + cy.formFillNamespace(data, 'form > div.base-form') + } + }) // click "Create" button - cy.get(buttonCreateSelector).first().as('buttonCreate') - cy.get('@buttonCreate') + cy.get(buttonCreateSelector, selectorOptions).first().as('buttonCreate') + cy.get('@buttonCreate', selectorOptions) .should('not.have.class', 'disabled') .and('not.have.disabled', 'disabled') .click({ log: true }) @@ -119,20 +133,25 @@ describe('Collections', () => { cy.visit(`${global.url}${resourceUrl}`) - // click "Save" button - cy.get(buttonSaveSelector).first().as('buttonSave') - cy.get('@buttonSave') - .should('not.have.class', 'disabled') - .and('not.have.disabled', 'disabled') - .click({ log: true }) + cy.get(containerSelector, selectorOptions).then($body => { // DOM ready + // wait for progress + cy.get('div.progress[style*="display: none"]', selectorOptions).should('exist') - // 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) { - expectResponse(response, data) - } + // 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) { + expectResponse(response, data) + } + }) }) }) break; @@ -157,25 +176,30 @@ describe('Collections', () => { cy.visit(`${global.url}${resourceUrl}`) - // click "Delete" button - cy.get(buttonDeleteSelector).first().as('buttonDelete') - cy.get('@buttonDelete') - .should('not.have.class', 'disabled') - .and('not.have.disabled', 'disabled') - .click({ log: true }) + cy.get(containerSelector, selectorOptions).then($body => { // DOM ready + // wait for progress + cy.get('div.progress[style*="display: none"]', selectorOptions).should('exist') - // click "Delete" button again (confirm) - cy.get(buttonDeleteConfirmSelector).first().as('buttonDeleteConfirm') - cy.get('@buttonDeleteConfirm') - .click({ log: true }) + // 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 }) - // 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) { - expectResponse(response, data) - } + // 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) { + expectResponse(response, data) + } + }) }) }) break; diff --git a/t/html/pfappserver/cypress/support/commands.js b/t/html/pfappserver/cypress/support/commands.js index 2211c679c0b4..724dc62756c4 100644 --- a/t/html/pfappserver/cypress/support/commands.js +++ b/t/html/pfappserver/cypress/support/commands.js @@ -54,33 +54,31 @@ Cypress.Commands.add('pfConfiguratorDisable', () => { }) }) -Cypress.Commands.add('formFillNamespace', (data, selector = 'form > div.base-form') => { - return cy.get(selector).first().within($ => { - for (let entry of Object.entries(data)) { - const [namespace, value] = entry - const selector = `*[data-namespace="${namespace}"]:not([disabled])` - if ($.find(selector).length) { - cy.get(selector) - .then(el => { - const e = Cypress.$(el)[0] - const tagName = e.tagName.toLowerCase() - const type = e.getAttribute('type') - switch (true) { - case tagName === 'input' && ['text', 'password'].includes(type): - case tagName === 'textarea': - cy.get(el).type(`{selectAll}{del}${value}`, { log: true, force: true }) - break - case tagName === 'input' && ['range'].includes(type): - // TODO - break - default: - throw new Error(`unhandled element <${tagName} type="${type||''}" data-namespace="${namespace}" />`) - } - }) +Cypress.Commands.add('formFillNamespace', (data, selector = 'body') => { + return cy.get(selector) + .get('*[data-namespace]:not([disabled])') + .should("have.length.gte", 0) + .then(element => { + const namespace = element.attr('data-namespace') + 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'].includes(type): + case tagName === 'textarea': + cy.get(e) + .should('be.visible') + .clear({ log: true, force: true }) + .type(value, { log: true, force: true }) + break + case tagName === 'input' && ['range'].includes(type): + // TODO + break + default: + throw new Error(`unhandled element <${tagName} type="${type || ''}" data-namespace="${namespace}" />`) + } } - else { - cy.task('error', `empty selector ${selector}`) - } - } - }) + }) }) From 5bbc302da12efaf04c083d3205ff667482cd3acf Mon Sep 17 00:00:00 2001 From: Darren Satkunas Date: Thu, 23 Nov 2023 10:46:00 -0800 Subject: [PATCH 11/91] cleanup --- t/html/pfappserver/Makefile | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/t/html/pfappserver/Makefile b/t/html/pfappserver/Makefile index 34f5ee441796..f59ce8cf74bc 100644 --- a/t/html/pfappserver/Makefile +++ b/t/html/pfappserver/Makefile @@ -44,27 +44,27 @@ install-debian: apt-get install -y firefox-esr install: - npm install -g npm + npm install -g npm npm install cypress -g --allow-root --unsafe-perm=true 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) \ + npx cypress run --browser $(BROWSER) --config-file $(CONFIG_FILE) --config $(CONFIG) --e2e --env tags=[$(TAGS)] ; \ 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) \ + 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) From 45cbe6ba25f626f8e178b53abe042b6e34c3c940 Mon Sep 17 00:00:00 2001 From: Darren Satkunas Date: Fri, 24 Nov 2023 09:25:40 -0800 Subject: [PATCH 12/91] add decorations --- .../components/new/BaseFormGroupChosen.vue | 1 + .../src/components/new/BaseInputChosen.vue | 1 + .../pfappserver/cypress/support/commands.js | 22 ++++++++++++++----- 3 files changed, 19 insertions(+), 5 deletions(-) diff --git a/html/pfappserver/root/src/components/new/BaseFormGroupChosen.vue b/html/pfappserver/root/src/components/new/BaseFormGroupChosen.vue index 4f0b936debaf..cde648c62bb0 100644 --- a/html/pfappserver/root/src/components/new/BaseFormGroupChosen.vue +++ b/html/pfappserver/root/src/components/new/BaseFormGroupChosen.vue @@ -35,6 +35,7 @@ 'size-lg': size === 'lg' }" :data-namespace="namespace" + :data-chosen="true" :value="inputValue" :placeholder="inputPlaceholder" diff --git a/html/pfappserver/root/src/components/new/BaseInputChosen.vue b/html/pfappserver/root/src/components/new/BaseInputChosen.vue index 2369ca080c94..7ceac75286ae 100644 --- a/html/pfappserver/root/src/components/new/BaseInputChosen.vue +++ b/html/pfappserver/root/src/components/new/BaseInputChosen.vue @@ -13,6 +13,7 @@ 'size-lg': size === 'lg' }" :data-namespace="namespace" + :data-chosen="true" :value="inputValue" :placeholder="inputPlaceholder" diff --git a/t/html/pfappserver/cypress/support/commands.js b/t/html/pfappserver/cypress/support/commands.js index 724dc62756c4..b80ff282cb81 100644 --- a/t/html/pfappserver/cypress/support/commands.js +++ b/t/html/pfappserver/cypress/support/commands.js @@ -56,10 +56,11 @@ Cypress.Commands.add('pfConfiguratorDisable', () => { Cypress.Commands.add('formFillNamespace', (data, selector = 'body') => { return cy.get(selector) - .get('*[data-namespace]:not([disabled])') + .get('*[data-namespace]') .should("have.length.gte", 0) - .then(element => { + .each(element => { 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') @@ -68,16 +69,27 @@ Cypress.Commands.add('formFillNamespace', (data, selector = 'body') => { switch (true) { case tagName === 'input' && ['text', 'password'].includes(type): case tagName === 'textarea': - cy.get(e) - .should('be.visible') + cy.get(e).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(e).within(() => { + const values = ((Array.isArray(value)) ? value : [value]).reduce((values, _value) => { + return `${values}${_value}{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-namespace="${namespace}" />`) + throw new Error(`unhandled element <${tagName} type="${type || ''}" data-chosen="${chosen}" data-namespace="${namespace}" />`) } } }) From b0f4f0329932f8a2c4aa751026941a9380277c54 Mon Sep 17 00:00:00 2001 From: Darren Satkunas Date: Fri, 24 Nov 2023 09:27:19 -0800 Subject: [PATCH 13/91] add sources --- .../pfappserver/config/collections/index.js | 6 +- .../config/collections/modules/domains.js | 60 ++++++-- .../config/collections/modules/realms.js | 31 ++++- .../config/collections/modules/roles.js | 2 +- .../config/collections/modules/sources.js | 129 ++++++++++++++++++ .../config/collections/modules/switches.js | 71 ++++++++++ t/html/pfappserver/config/global/index.js | 2 +- .../cypress/config/cypress.config.js | 1 + .../cypress/fixtures/collections/domain.json | 2 +- .../fixtures/collections/source/ad.json | 9 ++ .../collections/source/adminproxy.json | 7 + .../collections/source/authorization.json | 4 + .../fixtures/collections/source/azuread.json | 7 + .../collections/source/blackhole.json | 4 + .../collections/source/clickatell.json | 5 + .../fixtures/collections/source/eaptls.json | 4 + .../fixtures/collections/source/edir.json | 10 ++ .../fixtures/collections/source/eduroam.json | 4 + .../fixtures/collections/source/email.json | 4 + .../fixtures/collections/source/facebook.json | 6 + .../fixtures/collections/source/github.json | 6 + .../fixtures/collections/source/google.json | 6 + .../source/googleworkspaceldap.json | 12 ++ .../fixtures/collections/source/htpasswd.json | 5 + .../fixtures/collections/source/http.json | 6 + .../fixtures/collections/source/kerberos.json | 6 + .../fixtures/collections/source/kickbox.json | 5 + .../fixtures/collections/source/ldap.json | 10 ++ .../fixtures/collections/source/linkedin.json | 6 + .../fixtures/collections/source/null.json | 4 + .../fixtures/collections/source/openid.json | 11 ++ .../fixtures/collections/source/paypal.json | 10 ++ .../fixtures/collections/source/potd.json | 5 + .../fixtures/collections/source/radius.json | 5 + .../fixtures/collections/source/saml.json | 12 ++ .../fixtures/collections/source/sms.json | 4 + .../collections/source/sponsoremail.json | 4 + .../fixtures/collections/source/stripe.json | 6 + .../fixtures/collections/source/twilio.json | 7 + .../collections/source/windowslive.json | 6 + .../cypress/fixtures/collections/switch.json | 3 + .../specs/e2e/50-views/20-collections.cy.js | 4 +- 42 files changed, 491 insertions(+), 20 deletions(-) create mode 100644 t/html/pfappserver/config/collections/modules/sources.js create mode 100644 t/html/pfappserver/config/collections/modules/switches.js create mode 100644 t/html/pfappserver/cypress/fixtures/collections/source/ad.json create mode 100644 t/html/pfappserver/cypress/fixtures/collections/source/adminproxy.json create mode 100644 t/html/pfappserver/cypress/fixtures/collections/source/authorization.json create mode 100644 t/html/pfappserver/cypress/fixtures/collections/source/azuread.json create mode 100644 t/html/pfappserver/cypress/fixtures/collections/source/blackhole.json create mode 100644 t/html/pfappserver/cypress/fixtures/collections/source/clickatell.json create mode 100644 t/html/pfappserver/cypress/fixtures/collections/source/eaptls.json create mode 100644 t/html/pfappserver/cypress/fixtures/collections/source/edir.json create mode 100644 t/html/pfappserver/cypress/fixtures/collections/source/eduroam.json create mode 100644 t/html/pfappserver/cypress/fixtures/collections/source/email.json create mode 100644 t/html/pfappserver/cypress/fixtures/collections/source/facebook.json create mode 100644 t/html/pfappserver/cypress/fixtures/collections/source/github.json create mode 100644 t/html/pfappserver/cypress/fixtures/collections/source/google.json create mode 100644 t/html/pfappserver/cypress/fixtures/collections/source/googleworkspaceldap.json create mode 100644 t/html/pfappserver/cypress/fixtures/collections/source/htpasswd.json create mode 100644 t/html/pfappserver/cypress/fixtures/collections/source/http.json create mode 100644 t/html/pfappserver/cypress/fixtures/collections/source/kerberos.json create mode 100644 t/html/pfappserver/cypress/fixtures/collections/source/kickbox.json create mode 100644 t/html/pfappserver/cypress/fixtures/collections/source/ldap.json create mode 100644 t/html/pfappserver/cypress/fixtures/collections/source/linkedin.json create mode 100644 t/html/pfappserver/cypress/fixtures/collections/source/null.json create mode 100644 t/html/pfappserver/cypress/fixtures/collections/source/openid.json create mode 100644 t/html/pfappserver/cypress/fixtures/collections/source/paypal.json create mode 100644 t/html/pfappserver/cypress/fixtures/collections/source/potd.json create mode 100644 t/html/pfappserver/cypress/fixtures/collections/source/radius.json create mode 100644 t/html/pfappserver/cypress/fixtures/collections/source/saml.json create mode 100644 t/html/pfappserver/cypress/fixtures/collections/source/sms.json create mode 100644 t/html/pfappserver/cypress/fixtures/collections/source/sponsoremail.json create mode 100644 t/html/pfappserver/cypress/fixtures/collections/source/stripe.json create mode 100644 t/html/pfappserver/cypress/fixtures/collections/source/twilio.json create mode 100644 t/html/pfappserver/cypress/fixtures/collections/source/windowslive.json create mode 100644 t/html/pfappserver/cypress/fixtures/collections/switch.json diff --git a/t/html/pfappserver/config/collections/index.js b/t/html/pfappserver/config/collections/index.js index 5383cf78fa5e..f8165d2051fc 100644 --- a/t/html/pfappserver/config/collections/index.js +++ b/t/html/pfappserver/config/collections/index.js @@ -1,9 +1,13 @@ const domains = require('./modules/domains') const realms = require('./modules/realms') const roles = require('./modules/roles') +const sources = require('./modules/sources') +const switches = require('./modules/switches') module.exports = { // domains, // realms, - roles +// roles, + sources, +// switches } \ 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 index 34fb90dee2c3..aa20593f655e 100644 --- a/t/html/pfappserver/config/collections/modules/domains.js +++ b/t/html/pfappserver/config/collections/modules/domains.js @@ -1,26 +1,68 @@ -const { SCOPE_INSERT } = require('../config'); - -const url = '/configuration/domains'; +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 timeout = 10E3; module.exports = { id: 'domains', description: 'Domains', + timeout, tests: [ { - description: 'Domains - Add New', + description: 'Domains - Create New', scope: SCOPE_INSERT, - fixture: 'collections/domain.json', - url, + 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) + }) + }, + expectResponse: (response, fixture) => { + expect(response.statusCode).to.equal(201) + } + } + ] + }, + { + description: 'Domains - Update Existing', + scope: SCOPE_UPDATE, + fixture, + url: resource_url, interceptors: [ { - method: 'POST', url: '/api/**/config/domains', expectRequest: (req, fixture) => { + method: '+(PATCH|PUT)', + url: '/api/**/config/domain/**', + expectRequest: (request, fixture) => { Object.keys(fixture).forEach(key => { - expect(req.body).to.have.property(key) - expect(req.body[key]).to.deep.equal(fixture[key], 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: '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/realms.js b/t/html/pfappserver/config/collections/modules/realms.js index be85e4c4f98a..3a98f157eb15 100644 --- a/t/html/pfappserver/config/collections/modules/realms.js +++ b/t/html/pfappserver/config/collections/modules/realms.js @@ -1,4 +1,4 @@ -const { SCOPE_INSERT, SCOPE_DELETE } = require('../config'); +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'; @@ -8,21 +8,42 @@ module.exports = { description: 'Realms', tests: [ { - description: 'Realms - Add New', + description: 'Realms - Create New', scope: SCOPE_INSERT, url: collection_url, fixture, interceptors: [ { - method: 'POST', url: '/api/**/config/realms', expectRequest: (req, fixture) => { + method: 'POST', url: '/api/**/config/realms', expectRequest: (request, fixture) => { Object.keys(fixture).forEach(key => { - expect(req.body).to.have.property(key) - expect(req.body[key]).to.deep.equal(fixture[key], 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, diff --git a/t/html/pfappserver/config/collections/modules/roles.js b/t/html/pfappserver/config/collections/modules/roles.js index 78cb11adc17f..3610adc21b6d 100644 --- a/t/html/pfappserver/config/collections/modules/roles.js +++ b/t/html/pfappserver/config/collections/modules/roles.js @@ -8,7 +8,7 @@ module.exports = { description: 'Roles', tests: [ { - description: 'Roles - Add New', + description: 'Roles - Create New', scope: SCOPE_INSERT, url: collection_url, fixture, 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..db0994bacdec --- /dev/null +++ b/t/html/pfappserver/config/collections/modules/sources.js @@ -0,0 +1,129 @@ +const { SCOPE_INSERT, SCOPE_UPDATE, SCOPE_DELETE } = require('../config'); +const timeout = 10E3; + +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', + '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', + timeout, + tests +}; \ 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..e3d5f4b05592 --- /dev/null +++ b/t/html/pfappserver/config/collections/modules/switches.js @@ -0,0 +1,71 @@ +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'; +const timeout = 10E3; + +module.exports = { + id: 'switches', + description: 'Switches', + timeout, + 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/global/index.js b/t/html/pfappserver/config/global/index.js index 20ed0c798cee..255e6ba766dd 100644 --- a/t/html/pfappserver/config/global/index.js +++ b/t/html/pfappserver/config/global/index.js @@ -1,5 +1,5 @@ const url = '/admin#'; -const interceptorTimeoutMs = 5E3; +const interceptorTimeoutMs = 10E3; module.exports = { url, diff --git a/t/html/pfappserver/cypress/config/cypress.config.js b/t/html/pfappserver/cypress/config/cypress.config.js index c44defd95219..e5d562c98410 100644 --- a/t/html/pfappserver/cypress/config/cypress.config.js +++ b/t/html/pfappserver/cypress/config/cypress.config.js @@ -18,6 +18,7 @@ module.exports = { on('before:browser:launch', (browser = {}, launchOptions) => { switch (browser.name) { case 'chrome': + case 'chromium': launchOptions.args.push('--disable-gpu'); // headless break; case 'firefox': diff --git a/t/html/pfappserver/cypress/fixtures/collections/domain.json b/t/html/pfappserver/cypress/fixtures/collections/domain.json index 93684be00aa8..05d513fc4022 100644 --- a/t/html/pfappserver/cypress/fixtures/collections/domain.json +++ b/t/html/pfappserver/cypress/fixtures/collections/domain.json @@ -3,5 +3,5 @@ "workgroup": "test", "dns_name": "test.local", "ad_server": "1.2.3.4", - "dns_servers": "1.2.3.4, 3.4.5.6" + "dns_servers": "8.8.8.8" } \ 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..7bcbe7180f94 --- /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": "/dev/null", + "client_key_file": "/dev/null" +} \ 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..53e3045c567e --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/collections/switch.json @@ -0,0 +1,3 @@ +{ + "id": "1.2.3.4" +} \ No newline at end of file diff --git a/t/html/pfappserver/cypress/specs/e2e/50-views/20-collections.cy.js b/t/html/pfappserver/cypress/specs/e2e/50-views/20-collections.cy.js index 46927a29750b..f43fad9e6f3a 100644 --- a/t/html/pfappserver/cypress/specs/e2e/50-views/20-collections.cy.js +++ b/t/html/pfappserver/cypress/specs/e2e/50-views/20-collections.cy.js @@ -90,7 +90,7 @@ describe('Collections', () => { } else { // fill form - cy.formFillNamespace(data, 'form > div.base-form') + cy.formFillNamespace(data, 'form div.base-form') } }) @@ -104,7 +104,7 @@ describe('Collections', () => { // wait, expect response interceptors.forEach(async (interceptor, i) => { const { url, expectResponse, timeout = global.interceptorTimeoutMs } = interceptor - await cy.wait(`@interceptor${i}`, { timeout }).then(response => { + await cy.wait(`@interceptor${i}`, { timeout }).then(({ request, response }) => { if (expectResponse) { expectResponse(response, data) } From 047646d18be7854bec0b2109fe65eadbb97cdd14 Mon Sep 17 00:00:00 2001 From: Darren Satkunas Date: Mon, 27 Nov 2023 11:34:22 -0800 Subject: [PATCH 14/91] fix sources --- t/html/pfappserver/config/collections/modules/sources.js | 4 +++- .../fixtures/collections/source/googleworkspaceldap.json | 4 ++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/t/html/pfappserver/config/collections/modules/sources.js b/t/html/pfappserver/config/collections/modules/sources.js index db0994bacdec..28ba03a796d7 100644 --- a/t/html/pfappserver/config/collections/modules/sources.js +++ b/t/html/pfappserver/config/collections/modules/sources.js @@ -20,7 +20,7 @@ const typesByCategory = { 'HTTP', 'Kerberos', 'LDAP', - 'Potd', +// 'Potd', // Issue #TODO 'RADIUS', 'SAML' ], @@ -59,10 +59,12 @@ const tests = types.reduce((tests, 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, + timeout, url: collection_url, fixture, selectors: { diff --git a/t/html/pfappserver/cypress/fixtures/collections/source/googleworkspaceldap.json b/t/html/pfappserver/cypress/fixtures/collections/source/googleworkspaceldap.json index 7bcbe7180f94..c91b8d1326b7 100644 --- a/t/html/pfappserver/cypress/fixtures/collections/source/googleworkspaceldap.json +++ b/t/html/pfappserver/cypress/fixtures/collections/source/googleworkspaceldap.json @@ -7,6 +7,6 @@ ], "basedn": "baz", "usernameattribute": "cn", - "client_cert_file": "/dev/null", - "client_key_file": "/dev/null" + "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 From 80fbe8171609218cb6012cfdd943c812aa696dd3 Mon Sep 17 00:00:00 2001 From: Darren Satkunas Date: Mon, 27 Nov 2023 11:35:18 -0800 Subject: [PATCH 15/91] add scan engines --- .../pfappserver/config/collections/index.js | 4 +- .../config/collections/modules/scanEngines.js | 84 +++++++++++++++++++ .../collections/scanEngine/nessus.json | 6 ++ .../collections/scanEngine/nessus6.json | 6 ++ .../collections/scanEngine/openvas.json | 6 ++ .../collections/scanEngine/rapid7.json | 6 ++ 6 files changed, 111 insertions(+), 1 deletion(-) create mode 100644 t/html/pfappserver/config/collections/modules/scanEngines.js create mode 100644 t/html/pfappserver/cypress/fixtures/collections/scanEngine/nessus.json create mode 100644 t/html/pfappserver/cypress/fixtures/collections/scanEngine/nessus6.json create mode 100644 t/html/pfappserver/cypress/fixtures/collections/scanEngine/openvas.json create mode 100644 t/html/pfappserver/cypress/fixtures/collections/scanEngine/rapid7.json diff --git a/t/html/pfappserver/config/collections/index.js b/t/html/pfappserver/config/collections/index.js index f8165d2051fc..c0fc6109d252 100644 --- a/t/html/pfappserver/config/collections/index.js +++ b/t/html/pfappserver/config/collections/index.js @@ -1,6 +1,7 @@ const domains = require('./modules/domains') const realms = require('./modules/realms') const roles = require('./modules/roles') +const scanEngines = require('./modules/scanEngines') const sources = require('./modules/sources') const switches = require('./modules/switches') @@ -8,6 +9,7 @@ module.exports = { // domains, // realms, // roles, - sources, + scanEngines, +// sources, // switches } \ 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..52688e846efa --- /dev/null +++ b/t/html/pfappserver/config/collections/modules/scanEngines.js @@ -0,0 +1,84 @@ +const { SCOPE_INSERT, SCOPE_UPDATE, SCOPE_DELETE } = require('../config'); +const timeout = 10E3; + +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, + timeout, + 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', + timeout, + tests +}; \ 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 From 8e22929535f0f295890c32f987b635c738af394a Mon Sep 17 00:00:00 2001 From: Darren Satkunas Date: Mon, 27 Nov 2023 11:42:33 -0800 Subject: [PATCH 16/91] add clouds --- .../pfappserver/config/collections/index.js | 4 +- .../config/collections/modules/clouds.js | 81 +++++++++++++++++++ .../fixtures/collections/cloud/intune.json | 6 ++ 3 files changed, 90 insertions(+), 1 deletion(-) create mode 100644 t/html/pfappserver/config/collections/modules/clouds.js create mode 100644 t/html/pfappserver/cypress/fixtures/collections/cloud/intune.json diff --git a/t/html/pfappserver/config/collections/index.js b/t/html/pfappserver/config/collections/index.js index c0fc6109d252..7498007a4c84 100644 --- a/t/html/pfappserver/config/collections/index.js +++ b/t/html/pfappserver/config/collections/index.js @@ -1,3 +1,4 @@ +const clouds = require('./modules/clouds') const domains = require('./modules/domains') const realms = require('./modules/realms') const roles = require('./modules/roles') @@ -6,10 +7,11 @@ const sources = require('./modules/sources') const switches = require('./modules/switches') module.exports = { + clouds, // domains, // realms, // roles, - scanEngines, +// scanEngines, // sources, // switches } \ 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..e223a415fb3a --- /dev/null +++ b/t/html/pfappserver/config/collections/modules/clouds.js @@ -0,0 +1,81 @@ +const { SCOPE_INSERT, SCOPE_UPDATE, SCOPE_DELETE } = require('../config'); +const timeout = 10E3; + +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, + timeout, + 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', + timeout, + tests +}; \ 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 From b22328c81c6861ff03e2cd8dd72c7be1de24e150 Mon Sep 17 00:00:00 2001 From: Darren Satkunas Date: Mon, 27 Nov 2023 12:12:33 -0800 Subject: [PATCH 17/91] add firewalls --- .../pfappserver/config/collections/index.js | 4 +- .../config/collections/modules/firewalls.js | 93 +++++++++++++++++++ .../collections/firewall/barracudang.json | 5 + .../collections/firewall/checkpoint.json | 4 + .../collections/firewall/ciscoisepic.json | 3 + .../collections/firewall/contentkeeper.json | 4 + .../collections/firewall/familyzone.json | 3 + .../collections/firewall/fortigate.json | 4 + .../fixtures/collections/firewall/iboss.json | 3 + .../collections/firewall/jsonrpc.json | 5 + .../collections/firewall/junipersrx.json | 5 + .../firewall/lightspeedrocket.json | 4 + .../collections/firewall/paloalto.json | 3 + .../collections/firewall/smoothwall.json | 4 + .../collections/firewall/watchguard.json | 4 + 15 files changed, 147 insertions(+), 1 deletion(-) create mode 100644 t/html/pfappserver/config/collections/modules/firewalls.js create mode 100644 t/html/pfappserver/cypress/fixtures/collections/firewall/barracudang.json create mode 100644 t/html/pfappserver/cypress/fixtures/collections/firewall/checkpoint.json create mode 100644 t/html/pfappserver/cypress/fixtures/collections/firewall/ciscoisepic.json create mode 100644 t/html/pfappserver/cypress/fixtures/collections/firewall/contentkeeper.json create mode 100644 t/html/pfappserver/cypress/fixtures/collections/firewall/familyzone.json create mode 100644 t/html/pfappserver/cypress/fixtures/collections/firewall/fortigate.json create mode 100644 t/html/pfappserver/cypress/fixtures/collections/firewall/iboss.json create mode 100644 t/html/pfappserver/cypress/fixtures/collections/firewall/jsonrpc.json create mode 100644 t/html/pfappserver/cypress/fixtures/collections/firewall/junipersrx.json create mode 100644 t/html/pfappserver/cypress/fixtures/collections/firewall/lightspeedrocket.json create mode 100644 t/html/pfappserver/cypress/fixtures/collections/firewall/paloalto.json create mode 100644 t/html/pfappserver/cypress/fixtures/collections/firewall/smoothwall.json create mode 100644 t/html/pfappserver/cypress/fixtures/collections/firewall/watchguard.json diff --git a/t/html/pfappserver/config/collections/index.js b/t/html/pfappserver/config/collections/index.js index 7498007a4c84..5b39fd1b05ee 100644 --- a/t/html/pfappserver/config/collections/index.js +++ b/t/html/pfappserver/config/collections/index.js @@ -1,5 +1,6 @@ const clouds = require('./modules/clouds') const domains = require('./modules/domains') +const firewalls = require('./modules/firewalls') const realms = require('./modules/realms') const roles = require('./modules/roles') const scanEngines = require('./modules/scanEngines') @@ -7,8 +8,9 @@ const sources = require('./modules/sources') const switches = require('./modules/switches') module.exports = { - clouds, +// clouds, // domains, + firewalls, // realms, // roles, // scanEngines, 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..f1f12e8fc174 --- /dev/null +++ b/t/html/pfappserver/config/collections/modules/firewalls.js @@ -0,0 +1,93 @@ +const { SCOPE_INSERT, SCOPE_UPDATE, SCOPE_DELETE } = require('../config'); +const timeout = 15E3; + +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, + timeout, + 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', + timeout, + tests +}; \ 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 From 2d88462edd41e65ef7873dcfd198a011cf686e69 Mon Sep 17 00:00:00 2001 From: Darren Satkunas Date: Mon, 27 Nov 2023 12:36:08 -0800 Subject: [PATCH 18/91] add syslog parsers --- .../pfappserver/config/collections/index.js | 6 +- .../config/collections/modules/clouds.js | 3 - .../config/collections/modules/firewalls.js | 1 - .../config/collections/modules/scanEngines.js | 3 - .../collections/modules/syslogParsers.js | 86 +++++++++++++++++++ .../collections/syslogParser/dhcp.json | 4 + .../syslogParser/fortianalyser.json | 4 + .../collections/syslogParser/nexpose.json | 4 + .../collections/syslogParser/regex.json | 4 + .../syslogParser/security_onion.json | 4 + .../collections/syslogParser/snort.json | 4 + .../collections/syslogParser/suricata.json | 4 + .../syslogParser/suricata_md5.json | 4 + 13 files changed, 122 insertions(+), 9 deletions(-) create mode 100644 t/html/pfappserver/config/collections/modules/syslogParsers.js create mode 100644 t/html/pfappserver/cypress/fixtures/collections/syslogParser/dhcp.json create mode 100644 t/html/pfappserver/cypress/fixtures/collections/syslogParser/fortianalyser.json create mode 100644 t/html/pfappserver/cypress/fixtures/collections/syslogParser/nexpose.json create mode 100644 t/html/pfappserver/cypress/fixtures/collections/syslogParser/regex.json create mode 100644 t/html/pfappserver/cypress/fixtures/collections/syslogParser/security_onion.json create mode 100644 t/html/pfappserver/cypress/fixtures/collections/syslogParser/snort.json create mode 100644 t/html/pfappserver/cypress/fixtures/collections/syslogParser/suricata.json create mode 100644 t/html/pfappserver/cypress/fixtures/collections/syslogParser/suricata_md5.json diff --git a/t/html/pfappserver/config/collections/index.js b/t/html/pfappserver/config/collections/index.js index 5b39fd1b05ee..39e6a154a2c5 100644 --- a/t/html/pfappserver/config/collections/index.js +++ b/t/html/pfappserver/config/collections/index.js @@ -6,14 +6,16 @@ const roles = require('./modules/roles') const scanEngines = require('./modules/scanEngines') const sources = require('./modules/sources') const switches = require('./modules/switches') +const syslogParsers = require('./modules/syslogParsers') module.exports = { // clouds, // domains, - firewalls, +// firewalls, // realms, // roles, // scanEngines, // sources, -// switches +// switches, + syslogParsers } \ 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 index e223a415fb3a..959d81b6b655 100644 --- a/t/html/pfappserver/config/collections/modules/clouds.js +++ b/t/html/pfappserver/config/collections/modules/clouds.js @@ -1,5 +1,4 @@ const { SCOPE_INSERT, SCOPE_UPDATE, SCOPE_DELETE } = require('../config'); -const timeout = 10E3; const types = { intune: 'Intune' @@ -14,7 +13,6 @@ const tests = Object.entries(types).reduce((tests, [type, name]) => { { description: `Clouds (${name}) - Create New`, scope: SCOPE_INSERT, - timeout, url: collection_url, fixture, selectors: { @@ -76,6 +74,5 @@ const tests = Object.entries(types).reduce((tests, [type, name]) => { module.exports = { id: 'clouds', description: 'Clouds', - timeout, tests }; \ 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 index f1f12e8fc174..383b14cb36cf 100644 --- a/t/html/pfappserver/config/collections/modules/firewalls.js +++ b/t/html/pfappserver/config/collections/modules/firewalls.js @@ -26,7 +26,6 @@ const tests = Object.entries(types).reduce((tests, [type, name]) => { { description: `Firewalls (${name}) - Create New`, scope: SCOPE_INSERT, - timeout, url: collection_url, fixture, selectors: { diff --git a/t/html/pfappserver/config/collections/modules/scanEngines.js b/t/html/pfappserver/config/collections/modules/scanEngines.js index 52688e846efa..3de890edc7c3 100644 --- a/t/html/pfappserver/config/collections/modules/scanEngines.js +++ b/t/html/pfappserver/config/collections/modules/scanEngines.js @@ -1,5 +1,4 @@ const { SCOPE_INSERT, SCOPE_UPDATE, SCOPE_DELETE } = require('../config'); -const timeout = 10E3; const types = { nessus: 'Nessus', @@ -17,7 +16,6 @@ const tests = Object.entries(types).reduce((tests, [type, name]) => { { description: `ScanEngines (${name}) - Create New`, scope: SCOPE_INSERT, - timeout, url: collection_url, fixture, selectors: { @@ -79,6 +77,5 @@ const tests = Object.entries(types).reduce((tests, [type, name]) => { module.exports = { id: 'scans', description: 'Scan Engines', - timeout, tests }; \ 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/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 From fdf22bcf1654741645b58483b049dec8be5c7449 Mon Sep 17 00:00:00 2001 From: Darren Satkunas Date: Mon, 27 Nov 2023 12:42:40 -0800 Subject: [PATCH 19/91] add event loggers --- .../pfappserver/config/collections/index.js | 4 +- .../collections/modules/eventLoggers.js | 79 +++++++++++++++++++ .../collections/eventLogger/syslog.json | 6 ++ 3 files changed, 88 insertions(+), 1 deletion(-) create mode 100644 t/html/pfappserver/config/collections/modules/eventLoggers.js create mode 100644 t/html/pfappserver/cypress/fixtures/collections/eventLogger/syslog.json diff --git a/t/html/pfappserver/config/collections/index.js b/t/html/pfappserver/config/collections/index.js index 39e6a154a2c5..176789d8f542 100644 --- a/t/html/pfappserver/config/collections/index.js +++ b/t/html/pfappserver/config/collections/index.js @@ -1,5 +1,6 @@ const clouds = require('./modules/clouds') const domains = require('./modules/domains') +const eventLoggers = require('./modules/eventLoggers') const firewalls = require('./modules/firewalls') const realms = require('./modules/realms') const roles = require('./modules/roles') @@ -11,11 +12,12 @@ const syslogParsers = require('./modules/syslogParsers') module.exports = { // clouds, // domains, + eventLoggers, // firewalls, // realms, // roles, // scanEngines, // sources, // switches, - syslogParsers +// syslogParsers } \ 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/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 From 6b59aa8f0b7b0645026120af4ca0db975dded2ab Mon Sep 17 00:00:00 2001 From: Darren Satkunas Date: Mon, 27 Nov 2023 12:49:48 -0800 Subject: [PATCH 20/91] add mfas --- .../pfappserver/config/collections/index.js | 4 +- .../config/collections/modules/mfas.js | 79 +++++++++++++++++++ .../fixtures/collections/mfa/akamai.json | 6 ++ .../fixtures/collections/mfa/totp.json | 3 + 4 files changed, 91 insertions(+), 1 deletion(-) create mode 100644 t/html/pfappserver/config/collections/modules/mfas.js create mode 100644 t/html/pfappserver/cypress/fixtures/collections/mfa/akamai.json create mode 100644 t/html/pfappserver/cypress/fixtures/collections/mfa/totp.json diff --git a/t/html/pfappserver/config/collections/index.js b/t/html/pfappserver/config/collections/index.js index 176789d8f542..a74e35413697 100644 --- a/t/html/pfappserver/config/collections/index.js +++ b/t/html/pfappserver/config/collections/index.js @@ -2,6 +2,7 @@ const clouds = require('./modules/clouds') const domains = require('./modules/domains') const eventLoggers = require('./modules/eventLoggers') const firewalls = require('./modules/firewalls') +const mfas = require('./modules/mfas') const realms = require('./modules/realms') const roles = require('./modules/roles') const scanEngines = require('./modules/scanEngines') @@ -12,8 +13,9 @@ const syslogParsers = require('./modules/syslogParsers') module.exports = { // clouds, // domains, - eventLoggers, +// eventLoggers, // firewalls, + mfas, // realms, // roles, // scanEngines, 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/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 From f79090cbab690dc1544657ffc26bd158225b1077 Mon Sep 17 00:00:00 2001 From: Darren Satkunas Date: Mon, 27 Nov 2023 13:10:10 -0800 Subject: [PATCH 21/91] add pki providers --- .../pfappserver/config/collections/index.js | 4 +- .../collections/modules/pkiProviders.js | 80 +++++++++++++++++++ .../pkiProvider/packetfence_local.json | 7 ++ .../pkiProvider/packetfence_pki.json | 5 ++ .../collections/pkiProvider/scep.json | 5 ++ 5 files changed, 100 insertions(+), 1 deletion(-) create mode 100644 t/html/pfappserver/config/collections/modules/pkiProviders.js create mode 100644 t/html/pfappserver/cypress/fixtures/collections/pkiProvider/packetfence_local.json create mode 100644 t/html/pfappserver/cypress/fixtures/collections/pkiProvider/packetfence_pki.json create mode 100644 t/html/pfappserver/cypress/fixtures/collections/pkiProvider/scep.json diff --git a/t/html/pfappserver/config/collections/index.js b/t/html/pfappserver/config/collections/index.js index a74e35413697..ac2712e31140 100644 --- a/t/html/pfappserver/config/collections/index.js +++ b/t/html/pfappserver/config/collections/index.js @@ -3,6 +3,7 @@ const domains = require('./modules/domains') const eventLoggers = require('./modules/eventLoggers') const firewalls = require('./modules/firewalls') const mfas = require('./modules/mfas') +const pkiProviders = require('./modules/pkiProviders') const realms = require('./modules/realms') const roles = require('./modules/roles') const scanEngines = require('./modules/scanEngines') @@ -15,7 +16,8 @@ module.exports = { // domains, // eventLoggers, // firewalls, - mfas, +// mfas, + pkiProviders, // realms, // roles, // scanEngines, 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/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 From 03116adc80dd58bde6a340d2994b0f8b8b89d832 Mon Sep 17 00:00:00 2001 From: Darren Satkunas Date: Tue, 28 Nov 2023 05:54:45 -0800 Subject: [PATCH 22/91] reuse session between tests --- t/html/pfappserver/cypress/specs/e2e/50-views/10-bases.cy.js | 4 +++- .../cypress/specs/e2e/50-views/20-collections.cy.js | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/t/html/pfappserver/cypress/specs/e2e/50-views/10-bases.cy.js b/t/html/pfappserver/cypress/specs/e2e/50-views/10-bases.cy.js index 9c02f8aece36..a76400d4ea2f 100644 --- a/t/html/pfappserver/cypress/specs/e2e/50-views/10-bases.cy.js +++ b/t/html/pfappserver/cypress/specs/e2e/50-views/10-bases.cy.js @@ -6,7 +6,9 @@ describe('Bases', () => { Object.values(bases).forEach(base => { context(`Base - ${base.description}`, () => { beforeEach('Login as system', () => { - cy.pfSystemLogin() + cy.session('system', () => { + cy.pfSystemLogin() + }) }) base.tests.forEach(test => { const { description, url, interceptors = [], selectors } = test diff --git a/t/html/pfappserver/cypress/specs/e2e/50-views/20-collections.cy.js b/t/html/pfappserver/cypress/specs/e2e/50-views/20-collections.cy.js index f43fad9e6f3a..efe58cca40a8 100644 --- a/t/html/pfappserver/cypress/specs/e2e/50-views/20-collections.cy.js +++ b/t/html/pfappserver/cypress/specs/e2e/50-views/20-collections.cy.js @@ -6,7 +6,9 @@ describe('Collections', () => { Object.values(collections).forEach(collection => { context(`Collection - ${collection.description}`, () => { beforeEach('Login as system', () => { - cy.pfSystemLogin() + cy.session('system', () => { + cy.pfSystemLogin() + }) }) collection.tests.forEach(test => { const { description, fixture = 'emtpy.json', scope, url, interceptors = [], selectors, timeout, From 023e8137e25ac782aa60de654730a7dd12df4877 Mon Sep 17 00:00:00 2001 From: Darren Satkunas Date: Wed, 29 Nov 2023 14:09:11 -0800 Subject: [PATCH 23/91] upscale results resolution --- .../cypress/config/cypress.config.js | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/t/html/pfappserver/cypress/config/cypress.config.js b/t/html/pfappserver/cypress/config/cypress.config.js index e5d562c98410..66a40c40f242 100644 --- a/t/html/pfappserver/cypress/config/cypress.config.js +++ b/t/html/pfappserver/cypress/config/cypress.config.js @@ -4,6 +4,10 @@ const webpackOptions = { watchOptions: {} } +// screenshot and video resolution +const width = 3840 // 4k +const height = 2160 // 4k + // see https://docs.cypress.io/guides/references/configuration#Global module.exports = { @@ -18,11 +22,20 @@ 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; @@ -50,8 +63,8 @@ module.exports = { screenshotsFolder: 'cypress/results/screenshots', video: false, videosFolder: 'cypress/results/videos', - viewportWidth: 2560, - viewportHeight: 2048, + 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. From b3ad37f06dd98becd1fb277de4030c12328be2f8 Mon Sep 17 00:00:00 2001 From: Darren Satkunas Date: Wed, 29 Nov 2023 14:10:09 -0800 Subject: [PATCH 24/91] add provisioning --- .../pfappserver/config/collections/index.js | 4 +- .../collections/modules/provisionings.js | 94 +++++++++++++++++++ .../config/collections/modules/switches.js | 2 - .../collections/provisioning/accept.json | 3 + .../collections/provisioning/airwatch.json | 6 ++ .../collections/provisioning/android.json | 4 + .../collections/provisioning/deny.json | 3 + .../collections/provisioning/dpsk.json | 3 + .../google_workspace_chromebook.json | 5 + .../collections/provisioning/intune.json | 6 ++ .../collections/provisioning/jamf.json | 5 + .../collections/provisioning/kandji.json | 5 + .../provisioning/mobileconfig.json | 4 + .../collections/provisioning/mobileiron.json | 11 +++ .../collections/provisioning/sentinelone.json | 7 ++ .../collections/provisioning/windows.json | 4 + 16 files changed, 163 insertions(+), 3 deletions(-) create mode 100644 t/html/pfappserver/config/collections/modules/provisionings.js create mode 100644 t/html/pfappserver/cypress/fixtures/collections/provisioning/accept.json create mode 100644 t/html/pfappserver/cypress/fixtures/collections/provisioning/airwatch.json create mode 100644 t/html/pfappserver/cypress/fixtures/collections/provisioning/android.json create mode 100644 t/html/pfappserver/cypress/fixtures/collections/provisioning/deny.json create mode 100644 t/html/pfappserver/cypress/fixtures/collections/provisioning/dpsk.json create mode 100644 t/html/pfappserver/cypress/fixtures/collections/provisioning/google_workspace_chromebook.json create mode 100644 t/html/pfappserver/cypress/fixtures/collections/provisioning/intune.json create mode 100644 t/html/pfappserver/cypress/fixtures/collections/provisioning/jamf.json create mode 100644 t/html/pfappserver/cypress/fixtures/collections/provisioning/kandji.json create mode 100644 t/html/pfappserver/cypress/fixtures/collections/provisioning/mobileconfig.json create mode 100644 t/html/pfappserver/cypress/fixtures/collections/provisioning/mobileiron.json create mode 100644 t/html/pfappserver/cypress/fixtures/collections/provisioning/sentinelone.json create mode 100644 t/html/pfappserver/cypress/fixtures/collections/provisioning/windows.json diff --git a/t/html/pfappserver/config/collections/index.js b/t/html/pfappserver/config/collections/index.js index ac2712e31140..def8a5840d49 100644 --- a/t/html/pfappserver/config/collections/index.js +++ b/t/html/pfappserver/config/collections/index.js @@ -4,6 +4,7 @@ const eventLoggers = require('./modules/eventLoggers') const firewalls = require('./modules/firewalls') const mfas = require('./modules/mfas') const pkiProviders = require('./modules/pkiProviders') +const provisionings = require('./modules/provisionings') const realms = require('./modules/realms') const roles = require('./modules/roles') const scanEngines = require('./modules/scanEngines') @@ -17,7 +18,8 @@ module.exports = { // eventLoggers, // firewalls, // mfas, - pkiProviders, +// pkiProviders, + provisionings, // realms, // roles, // scanEngines, 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..d5c384b28e04 --- /dev/null +++ b/t/html/pfappserver/config/collections/modules/provisionings.js @@ -0,0 +1,94 @@ +const { SCOPE_INSERT, SCOPE_UPDATE, SCOPE_DELETE } = require('../config'); +const timeout = 15E3; + +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}"]`], + }, + timeout, + 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/switches.js b/t/html/pfappserver/config/collections/modules/switches.js index e3d5f4b05592..24c7f2d29987 100644 --- a/t/html/pfappserver/config/collections/modules/switches.js +++ b/t/html/pfappserver/config/collections/modules/switches.js @@ -2,12 +2,10 @@ 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'; -const timeout = 10E3; module.exports = { id: 'switches', description: 'Switches', - timeout, tests: [ { description: 'Switches - Create New', 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 From bc314564aadff361036212aac9162ead94ba7ac4 Mon Sep 17 00:00:00 2001 From: Darren Satkunas Date: Fri, 8 Dec 2023 04:52:30 -0800 Subject: [PATCH 25/91] adjust timeouts --- t/html/pfappserver/config/collections/modules/domains.js | 4 +++- .../pfappserver/config/collections/modules/provisionings.js | 6 +++--- t/html/pfappserver/cypress/fixtures/runtime/.gitignore | 2 ++ 3 files changed, 8 insertions(+), 4 deletions(-) create mode 100644 t/html/pfappserver/cypress/fixtures/runtime/.gitignore diff --git a/t/html/pfappserver/config/collections/modules/domains.js b/t/html/pfappserver/config/collections/modules/domains.js index aa20593f655e..eafecac381b6 100644 --- a/t/html/pfappserver/config/collections/modules/domains.js +++ b/t/html/pfappserver/config/collections/modules/domains.js @@ -7,12 +7,12 @@ const timeout = 10E3; module.exports = { id: 'domains', description: 'Domains', - timeout, tests: [ { description: 'Domains - Create New', scope: SCOPE_INSERT, fixture, + timeout, url: collection_url, interceptors: [ { @@ -34,6 +34,7 @@ module.exports = { description: 'Domains - Update Existing', scope: SCOPE_UPDATE, fixture, + timeout, url: resource_url, interceptors: [ { @@ -55,6 +56,7 @@ module.exports = { description: 'Domains - Delete Existing', scope: SCOPE_DELETE, fixture, + timeout, url: resource_url, interceptors: [ { diff --git a/t/html/pfappserver/config/collections/modules/provisionings.js b/t/html/pfappserver/config/collections/modules/provisionings.js index d5c384b28e04..47c76b557079 100644 --- a/t/html/pfappserver/config/collections/modules/provisionings.js +++ b/t/html/pfappserver/config/collections/modules/provisionings.js @@ -3,7 +3,6 @@ const timeout = 15E3; const types = { accept: 'Accept', - /* airwatch: 'Airwatch', android: 'Android', deny: 'Deny', @@ -16,7 +15,6 @@ const types = { windows: 'Windows', intune: 'Microsoft Intune', google_workspace_chromebook: 'Google Workspace Chromebook' - */ }; const tests = Object.entries(types).reduce((tests, [type, name]) => { @@ -30,10 +28,10 @@ const tests = Object.entries(types).reduce((tests, [type, name]) => { scope: SCOPE_INSERT, url: collection_url, fixture, + timeout, selectors: { buttonNewSelectors: [`button[type="button"]:contains(New Provisioner)`, `ul li a[href$="/new/${type}"]`], }, - timeout, interceptors: [ { method: 'POST', @@ -54,6 +52,7 @@ const tests = Object.entries(types).reduce((tests, [type, name]) => { description: `Provisionings (${name}) - Update Existing`, scope: SCOPE_UPDATE, fixture, + timeout, url: resource_url, interceptors: [ { @@ -75,6 +74,7 @@ const tests = Object.entries(types).reduce((tests, [type, name]) => { description: `Provisionings (${name}) - Delete Existing`, scope: SCOPE_DELETE, fixture, + timeout, url: resource_url, interceptors: [ { 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 From 56c41985fdd1c52e90b2117916293800b107b883 Mon Sep 17 00:00:00 2001 From: Darren Satkunas Date: Fri, 8 Dec 2023 04:52:59 -0800 Subject: [PATCH 26/91] add runtime fixtures to iterate static collections --- .../cypress/config/cypress.config-views.js | 34 +++++++++++++++++-- 1 file changed, 31 insertions(+), 3 deletions(-) diff --git a/t/html/pfappserver/cypress/config/cypress.config-views.js b/t/html/pfappserver/cypress/config/cypress.config-views.js index de6872999158..9e8f76a02d99 100644 --- a/t/html/pfappserver/cypress/config/cypress.config-views.js +++ b/t/html/pfappserver/cypress/config/cypress.config-views.js @@ -1,10 +1,38 @@ -const config = require('./cypress.config.js'); +const fs = require('fs-extra'); +const fetch = require('node-fetch'); +const base = require('./cypress.config.js'); + + + 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('https://localhost:1443/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('https://localhost:1443/api/v1/config/maintenance_tasks?limit=1000', { method: 'GET', headers }); + body = await response.text(); + let { items = [] } = JSON.parse(body); + await fs.writeFile('../fixtures/runtime/maintenanceTasks.json', JSON.stringify(items.map(item => item.id), null, 2)); + await items.forEach(async item => { + await fs.writeFile(`../fixtures/runtime/maintenanceTask-${item.id}.json`, JSON.stringify(item, null, 2)); + }) + }) + }); + return base.e2e.setupNodeEvents(on, config); + }, specPattern: [ 'cypress/specs/e2e/*-views/20*.cy.{js,jsx,ts,tsx}', From d40dfa8aae7a8c49ed5828587bd93f64163b5e2e Mon Sep 17 00:00:00 2001 From: Darren Satkunas Date: Fri, 8 Dec 2023 04:54:06 -0800 Subject: [PATCH 27/91] fixes --- .../cypress/specs/e2e/50-views/20-collections.cy.js | 5 +++-- t/html/pfappserver/cypress/support/commands.js | 3 ++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/t/html/pfappserver/cypress/specs/e2e/50-views/20-collections.cy.js b/t/html/pfappserver/cypress/specs/e2e/50-views/20-collections.cy.js index efe58cca40a8..ecfb119970a0 100644 --- a/t/html/pfappserver/cypress/specs/e2e/50-views/20-collections.cy.js +++ b/t/html/pfappserver/cypress/specs/e2e/50-views/20-collections.cy.js @@ -29,6 +29,7 @@ describe('Collections', () => { cy.fixture(fixture).then((data) => { const resourceId = idFromFixture(data) const resourceUrl = (url.constructor == Function) ? url(resourceId) : url + switch (scope) { @@ -83,7 +84,7 @@ describe('Collections', () => { .invoke('attr', 'aria-hidden').should('eq', 'false') // fill form - cy.formFillNamespace(data, `@tab${n}`) + cy.formFillNamespace(data, `@tab${n} form div.base-form`) }) // click first tab cy.get(tabSelector, selectorOptions).first() @@ -92,7 +93,7 @@ describe('Collections', () => { } else { // fill form - cy.formFillNamespace(data, 'form div.base-form') + cy.formFillNamespace(data, `${containerSelector} form div.base-form`) } }) diff --git a/t/html/pfappserver/cypress/support/commands.js b/t/html/pfappserver/cypress/support/commands.js index b80ff282cb81..092fb0a5fbdf 100644 --- a/t/html/pfappserver/cypress/support/commands.js +++ b/t/html/pfappserver/cypress/support/commands.js @@ -56,6 +56,7 @@ Cypress.Commands.add('pfConfiguratorDisable', () => { Cypress.Commands.add('formFillNamespace', (data, selector = 'body') => { return cy.get(selector) + .should('exist') .get('*[data-namespace]') .should("have.length.gte", 0) .each(element => { @@ -67,7 +68,7 @@ Cypress.Commands.add('formFillNamespace', (data, selector = 'body') => { const e = Cypress.$(element)[0] const tagName = e.tagName.toLowerCase() switch (true) { - case tagName === 'input' && ['text', 'password'].includes(type): + case tagName === 'input' && ['text', 'password', 'number'].includes(type): case tagName === 'textarea': cy.get(e).as(namespace) cy.get(`@${namespace}`) From 0b1d2864ddb119d67730164f5c983cc9211a7775 Mon Sep 17 00:00:00 2001 From: Darren Satkunas Date: Fri, 8 Dec 2023 04:55:06 -0800 Subject: [PATCH 28/91] add maintenance tasks --- .../pfappserver/config/collections/index.js | 4 ++- .../collections/modules/maintenanceTasks.js | 35 +++++++++++++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 t/html/pfappserver/config/collections/modules/maintenanceTasks.js diff --git a/t/html/pfappserver/config/collections/index.js b/t/html/pfappserver/config/collections/index.js index def8a5840d49..6027adf2b059 100644 --- a/t/html/pfappserver/config/collections/index.js +++ b/t/html/pfappserver/config/collections/index.js @@ -2,6 +2,7 @@ const clouds = require('./modules/clouds') const domains = require('./modules/domains') const eventLoggers = require('./modules/eventLoggers') const firewalls = require('./modules/firewalls') +const maintenaceTasks = require('./modules/maintenanceTasks') const mfas = require('./modules/mfas') const pkiProviders = require('./modules/pkiProviders') const provisionings = require('./modules/provisionings') @@ -17,9 +18,10 @@ module.exports = { // domains, // eventLoggers, // firewalls, + maintenaceTasks, // mfas, // pkiProviders, - provisionings, +// provisionings, // realms, // roles, // scanEngines, 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..e4f4d0e02d57 --- /dev/null +++ b/t/html/pfappserver/config/collections/modules/maintenanceTasks.js @@ -0,0 +1,35 @@ +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}`; +const timeout = 10E3; + +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`, + timeout, + 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 From 9dc87a1be6fc71589486150bdc7fb91a81948e27 Mon Sep 17 00:00:00 2001 From: Darren Satkunas Date: Fri, 8 Dec 2023 04:55:37 -0800 Subject: [PATCH 29/91] add node-fetch@2 --- t/html/pfappserver/package-lock.json | 39 ++++++++++++++++++++++++++++ t/html/pfappserver/package.json | 1 + 2 files changed, 40 insertions(+) diff --git a/t/html/pfappserver/package-lock.json b/t/html/pfappserver/package-lock.json index 4c08b20c40ba..e1cd522cca74 100644 --- a/t/html/pfappserver/package-lock.json +++ b/t/html/pfappserver/package-lock.json @@ -12,6 +12,7 @@ "@babel/preset-env": "^7.24.5", "@cypress/webpack-preprocessor": "^6.0.0", "babel-loader": "^9.1.3", + "node-fetch": "^2.7.0", "webpack": "^5.91.0" } }, @@ -2463,6 +2464,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", @@ -2835,6 +2855,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", @@ -2925,6 +2950,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", @@ -3024,6 +3054,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", diff --git a/t/html/pfappserver/package.json b/t/html/pfappserver/package.json index 5df2bcc94fcc..071b72597320 100644 --- a/t/html/pfappserver/package.json +++ b/t/html/pfappserver/package.json @@ -7,6 +7,7 @@ "@babel/preset-env": "^7.24.5", "@cypress/webpack-preprocessor": "^6.0.0", "babel-loader": "^9.1.3", + "node-fetch": "^2.7.0", "webpack": "^5.91.0" } } From 54b86f7b4ccf79326e5544cef8abb167948bae24 Mon Sep 17 00:00:00 2001 From: Darren Satkunas Date: Fri, 8 Dec 2023 05:31:22 -0800 Subject: [PATCH 30/91] add switch groups --- .../pfappserver/config/collections/index.js | 4 +- .../collections/modules/switchGroups.js | 69 +++++++++++++++++++ .../cypress/config/cypress.config-views.js | 7 +- .../cypress/fixtures/collections/switch.json | 3 +- .../fixtures/collections/switchGroup.json | 4 ++ .../specs/e2e/50-views/20-collections.cy.js | 4 +- 6 files changed, 82 insertions(+), 9 deletions(-) create mode 100644 t/html/pfappserver/config/collections/modules/switchGroups.js create mode 100644 t/html/pfappserver/cypress/fixtures/collections/switchGroup.json diff --git a/t/html/pfappserver/config/collections/index.js b/t/html/pfappserver/config/collections/index.js index 6027adf2b059..dcd0de6139d5 100644 --- a/t/html/pfappserver/config/collections/index.js +++ b/t/html/pfappserver/config/collections/index.js @@ -11,6 +11,7 @@ const roles = require('./modules/roles') const scanEngines = require('./modules/scanEngines') const sources = require('./modules/sources') const switches = require('./modules/switches') +const switchGroups = require('./modules/switchGroups') const syslogParsers = require('./modules/syslogParsers') module.exports = { @@ -18,7 +19,7 @@ module.exports = { // domains, // eventLoggers, // firewalls, - maintenaceTasks, +// maintenaceTasks, // mfas, // pkiProviders, // provisionings, @@ -27,5 +28,6 @@ module.exports = { // scanEngines, // sources, // switches, + switchGroups, // syslogParsers } \ 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/cypress/config/cypress.config-views.js b/t/html/pfappserver/cypress/config/cypress.config-views.js index 9e8f76a02d99..2dd7c48cc451 100644 --- a/t/html/pfappserver/cypress/config/cypress.config-views.js +++ b/t/html/pfappserver/cypress/config/cypress.config-views.js @@ -2,9 +2,6 @@ const fs = require('fs-extra'); const fetch = require('node-fetch'); const base = require('./cypress.config.js'); - - - module.exports = { ...base, @@ -16,13 +13,13 @@ module.exports = { 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('https://localhost:1443/api/v1/login', { method: 'POST', body: request }); + 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('https://localhost:1443/api/v1/config/maintenance_tasks?limit=1000', { method: 'GET', headers }); + 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.writeFile('../fixtures/runtime/maintenanceTasks.json', JSON.stringify(items.map(item => item.id), null, 2)); diff --git a/t/html/pfappserver/cypress/fixtures/collections/switch.json b/t/html/pfappserver/cypress/fixtures/collections/switch.json index 53e3045c567e..9ed1646004ca 100644 --- a/t/html/pfappserver/cypress/fixtures/collections/switch.json +++ b/t/html/pfappserver/cypress/fixtures/collections/switch.json @@ -1,3 +1,4 @@ { - "id": "1.2.3.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/specs/e2e/50-views/20-collections.cy.js b/t/html/pfappserver/cypress/specs/e2e/50-views/20-collections.cy.js index ecfb119970a0..4887b94c8da8 100644 --- a/t/html/pfappserver/cypress/specs/e2e/50-views/20-collections.cy.js +++ b/t/html/pfappserver/cypress/specs/e2e/50-views/20-collections.cy.js @@ -84,7 +84,7 @@ describe('Collections', () => { .invoke('attr', 'aria-hidden').should('eq', 'false') // fill form - cy.formFillNamespace(data, `@tab${n} form div.base-form`) + cy.formFillNamespace(data, `@tab${n}`) }) // click first tab cy.get(tabSelector, selectorOptions).first() @@ -93,7 +93,7 @@ describe('Collections', () => { } else { // fill form - cy.formFillNamespace(data, `${containerSelector} form div.base-form`) + cy.formFillNamespace(data, containerSelector) } }) From 8be83e05f75406ec425809a3a197a8c498015f4f Mon Sep 17 00:00:00 2001 From: Darren Satkunas Date: Fri, 8 Dec 2023 09:33:22 -0800 Subject: [PATCH 31/91] add connection profiles, improve form entry --- .../_components/BaseFilter.vue | 2 +- .../pfappserver/config/collections/index.js | 4 +- .../collections/modules/connectionProfiles.js | 81 +++++++++++++++++++ .../collections/connectionProfile.json | 9 +++ .../specs/e2e/50-views/20-collections.cy.js | 12 +++ .../pfappserver/cypress/support/commands.js | 63 ++++++++------- t/html/pfappserver/utils/index.js | 24 +++++- 7 files changed, 163 insertions(+), 32 deletions(-) create mode 100644 t/html/pfappserver/config/collections/modules/connectionProfiles.js create mode 100644 t/html/pfappserver/cypress/fixtures/collections/connectionProfile.json 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/t/html/pfappserver/config/collections/index.js b/t/html/pfappserver/config/collections/index.js index dcd0de6139d5..30092e7fd31c 100644 --- a/t/html/pfappserver/config/collections/index.js +++ b/t/html/pfappserver/config/collections/index.js @@ -1,4 +1,5 @@ const clouds = require('./modules/clouds') +const connectionProfiles = require('./modules/connectionProfiles') const domains = require('./modules/domains') const eventLoggers = require('./modules/eventLoggers') const firewalls = require('./modules/firewalls') @@ -16,6 +17,7 @@ const syslogParsers = require('./modules/syslogParsers') module.exports = { // clouds, + connectionProfiles, // domains, // eventLoggers, // firewalls, @@ -28,6 +30,6 @@ module.exports = { // scanEngines, // sources, // switches, - switchGroups, +// switchGroups, // syslogParsers } \ 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..d33d03b469b5 --- /dev/null +++ b/t/html/pfappserver/config/collections/modules/connectionProfiles.js @@ -0,0 +1,81 @@ +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'; + +module.exports = { + id: 'connectionProfiles', + description: 'Connection Profiles', + tests: [ + { + description: 'Connection Profiles - Create New', + scope: SCOPE_INSERT, + url: collection_url, + fixture, + 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, + 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, + 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/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/specs/e2e/50-views/20-collections.cy.js b/t/html/pfappserver/cypress/specs/e2e/50-views/20-collections.cy.js index 4887b94c8da8..0c4234736eb6 100644 --- a/t/html/pfappserver/cypress/specs/e2e/50-views/20-collections.cy.js +++ b/t/html/pfappserver/cypress/specs/e2e/50-views/20-collections.cy.js @@ -13,6 +13,7 @@ describe('Collections', () => { collection.tests.forEach(test => { const { description, fixture = 'emtpy.json', scope, url, interceptors = [], selectors, timeout, idFromFixture = ({ id }) => id, + beforeFormFill, } = test const { containerSelector = 'div[data-router-view] > div > div.card', @@ -83,15 +84,26 @@ describe('Collections', () => { 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(data, `@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(`@tab${n}`, selectorOptions) + } + // fill form cy.formFillNamespace(data, containerSelector) } diff --git a/t/html/pfappserver/cypress/support/commands.js b/t/html/pfappserver/cypress/support/commands.js index 092fb0a5fbdf..3fcda49818ff 100644 --- a/t/html/pfappserver/cypress/support/commands.js +++ b/t/html/pfappserver/cypress/support/commands.js @@ -1,3 +1,5 @@ +const { flatten } = require('utils') + Cypress.Commands.add('pfSystemLogin', () => { /* cy.visit('https://localhost:1443/admin#/login').then(() => { @@ -55,42 +57,45 @@ Cypress.Commands.add('pfConfiguratorDisable', () => { }) Cypress.Commands.add('formFillNamespace', (data, selector = 'body') => { + const flat = flatten(data) return cy.get(selector) .should('exist') .get('*[data-namespace]') .should("have.length.gte", 0) .each(element => { - 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(e).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(e).within(() => { - const values = ((Array.isArray(value)) ? value : [value]).reduce((values, _value) => { - return `${values}${_value}{enter}` - }, '') - cy.get('input.multiselect__input').as(namespace) + if (element.is(':visible')) { + const namespace = element.attr('data-namespace') + const chosen = element.attr('data-chosen') + if (namespace in flat && flat[namespace]) { + const value = flat[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(values, { log: true, force: true }) - }) - break - default: - throw new Error(`unhandled element <${tagName} type="${type || ''}" data-chosen="${chosen}" data-namespace="${namespace}" />`) + .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) => { + return `${values}${_value}{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/utils/index.js b/t/html/pfappserver/utils/index.js index f3a1e9f3828c..9afdc17de291 100644 --- a/t/html/pfappserver/utils/index.js +++ b/t/html/pfappserver/utils/index.js @@ -7,6 +7,28 @@ const splitKeys = (o, s='.') => { }, {}) }; +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 + splitKeys, + flatten }; \ No newline at end of file From c2f89f3da59008ff4c8a81845ae558c232740585 Mon Sep 17 00:00:00 2001 From: Darren Satkunas Date: Fri, 8 Dec 2023 10:42:38 -0800 Subject: [PATCH 32/91] add billing tiers, add form remap function --- .../Configuration/billingTiers/schema.js | 10 ++- .../pfappserver/config/collections/index.js | 4 +- .../collections/modules/billingTiers.js | 82 +++++++++++++++++++ .../config/collections/modules/domains.js | 2 +- .../fixtures/collections/billingTier.json | 11 +++ .../specs/e2e/50-views/20-collections.cy.js | 10 ++- .../pfappserver/cypress/support/commands.js | 7 +- 7 files changed, 114 insertions(+), 12 deletions(-) create mode 100644 t/html/pfappserver/config/collections/modules/billingTiers.js create mode 100644 t/html/pfappserver/cypress/fixtures/collections/billingTier.json 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/t/html/pfappserver/config/collections/index.js b/t/html/pfappserver/config/collections/index.js index 30092e7fd31c..b3c80015d4fd 100644 --- a/t/html/pfappserver/config/collections/index.js +++ b/t/html/pfappserver/config/collections/index.js @@ -1,3 +1,4 @@ +const billingTiers = require('./modules/billingTiers') const clouds = require('./modules/clouds') const connectionProfiles = require('./modules/connectionProfiles') const domains = require('./modules/domains') @@ -16,8 +17,9 @@ const switchGroups = require('./modules/switchGroups') const syslogParsers = require('./modules/syslogParsers') module.exports = { + billingTiers, // clouds, - connectionProfiles, +// connectionProfiles, // domains, // eventLoggers, // firewalls, 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..221f724d5a7c --- /dev/null +++ b/t/html/pfappserver/config/collections/modules/billingTiers.js @@ -0,0 +1,82 @@ +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 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, + 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, + 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, + 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/domains.js b/t/html/pfappserver/config/collections/modules/domains.js index eafecac381b6..f967c25a7555 100644 --- a/t/html/pfappserver/config/collections/modules/domains.js +++ b/t/html/pfappserver/config/collections/modules/domains.js @@ -2,7 +2,7 @@ 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 timeout = 10E3; +const timeout = 15E3; module.exports = { id: 'domains', 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/specs/e2e/50-views/20-collections.cy.js b/t/html/pfappserver/cypress/specs/e2e/50-views/20-collections.cy.js index 0c4234736eb6..939e355e7121 100644 --- a/t/html/pfappserver/cypress/specs/e2e/50-views/20-collections.cy.js +++ b/t/html/pfappserver/cypress/specs/e2e/50-views/20-collections.cy.js @@ -1,5 +1,6 @@ /// const { global, collections } = require('config'); +const { flatten } = require('utils') const { SCOPE_INSERT, SCOPE_UPDATE, SCOPE_DELETE } = require('config/collections/config'); describe('Collections', () => { @@ -14,6 +15,7 @@ describe('Collections', () => { const { description, fixture = 'emtpy.json', scope, url, interceptors = [], selectors, timeout, idFromFixture = ({ id }) => id, beforeFormFill, + map = (v) => v, } = test const { containerSelector = 'div[data-router-view] > div > div.card', @@ -28,6 +30,10 @@ describe('Collections', () => { it(description, () => { cy.fixture(fixture).then((data) => { + const associative = flatten(data) + const form = Object.entries(associative).reduce((items, [k, v]) => { + return { ...items, [k]: map(v, k) } + }, {}) const resourceId = idFromFixture(data) const resourceUrl = (url.constructor == Function) ? url(resourceId) : url @@ -90,7 +96,7 @@ describe('Collections', () => { } // fill form - cy.formFillNamespace(data, `@tab${n}`) + cy.formFillNamespace(form, `@tab${n}`) }) // click first tab @@ -105,7 +111,7 @@ describe('Collections', () => { } // fill form - cy.formFillNamespace(data, containerSelector) + cy.formFillNamespace(form, containerSelector) } }) diff --git a/t/html/pfappserver/cypress/support/commands.js b/t/html/pfappserver/cypress/support/commands.js index 3fcda49818ff..c99999e42569 100644 --- a/t/html/pfappserver/cypress/support/commands.js +++ b/t/html/pfappserver/cypress/support/commands.js @@ -1,5 +1,3 @@ -const { flatten } = require('utils') - Cypress.Commands.add('pfSystemLogin', () => { /* cy.visit('https://localhost:1443/admin#/login').then(() => { @@ -57,7 +55,6 @@ Cypress.Commands.add('pfConfiguratorDisable', () => { }) Cypress.Commands.add('formFillNamespace', (data, selector = 'body') => { - const flat = flatten(data) return cy.get(selector) .should('exist') .get('*[data-namespace]') @@ -66,8 +63,8 @@ Cypress.Commands.add('formFillNamespace', (data, selector = 'body') => { if (element.is(':visible')) { const namespace = element.attr('data-namespace') const chosen = element.attr('data-chosen') - if (namespace in flat && flat[namespace]) { - const value = flat[namespace] + 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() From 7fa391a009c368391e96c56cceacf8e7ae60fc87 Mon Sep 17 00:00:00 2001 From: Darren Satkunas Date: Mon, 11 Dec 2023 09:01:41 -0800 Subject: [PATCH 33/91] add security events, allow identifier to be undefined in fixture using cache from INSERT response body --- .../pfappserver/config/collections/index.js | 4 +- .../config/collections/modules/domains.js | 2 +- .../collections/modules/securityEvents.js | 77 +++++++++++++++++++ .../fixtures/collections/securityEvent.json | 3 + .../specs/e2e/50-views/20-collections.cy.js | 24 ++++-- 5 files changed, 101 insertions(+), 9 deletions(-) create mode 100644 t/html/pfappserver/config/collections/modules/securityEvents.js create mode 100644 t/html/pfappserver/cypress/fixtures/collections/securityEvent.json diff --git a/t/html/pfappserver/config/collections/index.js b/t/html/pfappserver/config/collections/index.js index b3c80015d4fd..81983eae269e 100644 --- a/t/html/pfappserver/config/collections/index.js +++ b/t/html/pfappserver/config/collections/index.js @@ -11,13 +11,14 @@ const provisionings = require('./modules/provisionings') const realms = require('./modules/realms') const roles = require('./modules/roles') const scanEngines = require('./modules/scanEngines') +const securityEvents = require('./modules/securityEvents') const sources = require('./modules/sources') const switches = require('./modules/switches') const switchGroups = require('./modules/switchGroups') const syslogParsers = require('./modules/syslogParsers') module.exports = { - billingTiers, +// billingTiers, // clouds, // connectionProfiles, // domains, @@ -30,6 +31,7 @@ module.exports = { // realms, // roles, // scanEngines, + securityEvents, // sources, // switches, // switchGroups, diff --git a/t/html/pfappserver/config/collections/modules/domains.js b/t/html/pfappserver/config/collections/modules/domains.js index f967c25a7555..9f34f9d63414 100644 --- a/t/html/pfappserver/config/collections/modules/domains.js +++ b/t/html/pfappserver/config/collections/modules/domains.js @@ -2,7 +2,7 @@ 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 timeout = 15E3; +const timeout = 60E3; module.exports = { id: 'domains', 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..8c5c0b38e896 --- /dev/null +++ b/t/html/pfappserver/config/collections/modules/securityEvents.js @@ -0,0 +1,77 @@ +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'; +const timeout = 10E3; + +module.exports = { + id: 'securityEvents', + description: 'Security Events', + tests: [ + { + description: 'Security Events - Create New', + scope: SCOPE_INSERT, + url: collection_url, + fixture, + timeout, + 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, + idFrom: (_, cache) => cache.id, + fixture, + timeout, + url: resource_url, + 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, + idFrom: (_, cache) => cache.id, + fixture, + timeout, + url: resource_url, + 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/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/specs/e2e/50-views/20-collections.cy.js b/t/html/pfappserver/cypress/specs/e2e/50-views/20-collections.cy.js index 939e355e7121..999dfe86f65b 100644 --- a/t/html/pfappserver/cypress/specs/e2e/50-views/20-collections.cy.js +++ b/t/html/pfappserver/cypress/specs/e2e/50-views/20-collections.cy.js @@ -11,9 +11,10 @@ describe('Collections', () => { cy.pfSystemLogin() }) }) + let cache = {}; collection.tests.forEach(test => { - const { description, fixture = 'emtpy.json', scope, url, interceptors = [], selectors, timeout, - idFromFixture = ({ id }) => id, + const { description, fixture = 'empty.json', scope, url, interceptors = [], selectors, timeout, + idFrom = ({ id }) => id, beforeFormFill, map = (v) => v, } = test @@ -34,7 +35,7 @@ describe('Collections', () => { const form = Object.entries(associative).reduce((items, [k, v]) => { return { ...items, [k]: map(v, k) } }, {}) - const resourceId = idFromFixture(data) + const resourceId = idFrom(data, cache) // `id` may only be available post-create const resourceUrl = (url.constructor == Function) ? url(resourceId) : url switch (scope) { @@ -69,7 +70,7 @@ describe('Collections', () => { request.continue() // passthrough } if (expectRequest) { - expectRequest(request, data) // expect + expectRequest(request, data, cache) // expect } }).as(`interceptor${i}`) }) @@ -127,7 +128,10 @@ describe('Collections', () => { const { url, expectResponse, timeout = global.interceptorTimeoutMs } = interceptor await cy.wait(`@interceptor${i}`, { timeout }).then(({ request, response }) => { if (expectResponse) { - expectResponse(response, data) + let retVal = expectResponse(response, data, cache) + if (retVal) { + cache = { ...cache, ...retVal } + } } }) }) @@ -170,7 +174,10 @@ describe('Collections', () => { const { url, expectResponse, timeout = global.interceptorTimeoutMs } = interceptor await cy.wait(`@interceptor${i}`, { timeout }).then(({ request, response }) => { if (expectResponse) { - expectResponse(response, data) + let retVal = expectResponse(response, data, cache) + if (retVal) { + cache = { ...cache, ...retVal } + } } }) }) @@ -218,7 +225,10 @@ describe('Collections', () => { const { url, expectResponse, timeout = global.interceptorTimeoutMs } = interceptor await cy.wait(`@interceptor${i}`, { timeout }).then(({ request, response }) => { if (expectResponse) { - expectResponse(response, data) + let retVal = expectResponse(response, data, cache) + if (retVal) { + cache = { ...cache, ...retVal } + } } }) }) From 03d12ba1904ddf2613b2b967f6ad0a214b3f2ce5 Mon Sep 17 00:00:00 2001 From: Darren Satkunas Date: Mon, 11 Dec 2023 10:35:23 -0800 Subject: [PATCH 34/91] add required fields --- .../root/src/views/Configuration/connectors/schema.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) 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.')) }) } From 272af163ee97e4cbacadc4fcc71b9ca95bd200b9 Mon Sep 17 00:00:00 2001 From: Darren Satkunas Date: Mon, 11 Dec 2023 10:35:52 -0800 Subject: [PATCH 35/91] add connectors --- .../pfappserver/config/collections/index.js | 4 +- .../config/collections/modules/connectors.js | 71 +++++++++++++++++++ .../fixtures/collections/connector.json | 5 ++ 3 files changed, 79 insertions(+), 1 deletion(-) create mode 100644 t/html/pfappserver/config/collections/modules/connectors.js create mode 100644 t/html/pfappserver/cypress/fixtures/collections/connector.json diff --git a/t/html/pfappserver/config/collections/index.js b/t/html/pfappserver/config/collections/index.js index 81983eae269e..58c3c41c3e49 100644 --- a/t/html/pfappserver/config/collections/index.js +++ b/t/html/pfappserver/config/collections/index.js @@ -1,6 +1,7 @@ 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 firewalls = require('./modules/firewalls') @@ -21,6 +22,7 @@ module.exports = { // billingTiers, // clouds, // connectionProfiles, + connectors, // domains, // eventLoggers, // firewalls, @@ -31,7 +33,7 @@ module.exports = { // realms, // roles, // scanEngines, - securityEvents, +// securityEvents, // sources, // switches, // switchGroups, 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/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 From 252e00153f62544e09c3b7c0abe189a11a1b118d Mon Sep 17 00:00:00 2001 From: Darren Satkunas Date: Tue, 12 Dec 2023 09:10:22 -0800 Subject: [PATCH 36/91] add radius profiles and SSL certs --- .../pfappserver/config/collections/index.js | 8 +- .../collections/modules/connectionProfiles.js | 9 ++ .../collections/modules/filterEngines.js | 84 ++++++++++++++++++ .../collections/modules/radiusProfiles.js | 87 +++++++++++++++++++ .../modules/radiusSslCertificates.js | 69 +++++++++++++++ .../collections/filterEngine/dhcp_filter.json | 7 ++ .../collections/filterEngine/dns_filter.json | 7 ++ .../filterEngine/radius_filter.json | 7 ++ .../filterEngine/switch_filter.json | 7 ++ .../collections/filterEngine/vlan_filter.json | 7 ++ .../fixtures/collections/radius/eap.json | 3 + .../fixtures/collections/radius/fast.json | 3 + .../fixtures/collections/radius/ocsp.json | 3 + .../fixtures/collections/radius/ssl.json | 6 ++ .../fixtures/collections/radius/tls.json | 3 + .../specs/e2e/50-views/20-collections.cy.js | 10 ++- .../pfappserver/cypress/support/commands.js | 3 +- 17 files changed, 317 insertions(+), 6 deletions(-) create mode 100644 t/html/pfappserver/config/collections/modules/filterEngines.js create mode 100644 t/html/pfappserver/config/collections/modules/radiusProfiles.js create mode 100644 t/html/pfappserver/config/collections/modules/radiusSslCertificates.js create mode 100644 t/html/pfappserver/cypress/fixtures/collections/filterEngine/dhcp_filter.json create mode 100644 t/html/pfappserver/cypress/fixtures/collections/filterEngine/dns_filter.json create mode 100644 t/html/pfappserver/cypress/fixtures/collections/filterEngine/radius_filter.json create mode 100644 t/html/pfappserver/cypress/fixtures/collections/filterEngine/switch_filter.json create mode 100644 t/html/pfappserver/cypress/fixtures/collections/filterEngine/vlan_filter.json create mode 100644 t/html/pfappserver/cypress/fixtures/collections/radius/eap.json create mode 100644 t/html/pfappserver/cypress/fixtures/collections/radius/fast.json create mode 100644 t/html/pfappserver/cypress/fixtures/collections/radius/ocsp.json create mode 100644 t/html/pfappserver/cypress/fixtures/collections/radius/ssl.json create mode 100644 t/html/pfappserver/cypress/fixtures/collections/radius/tls.json diff --git a/t/html/pfappserver/config/collections/index.js b/t/html/pfappserver/config/collections/index.js index 58c3c41c3e49..b59c583381c8 100644 --- a/t/html/pfappserver/config/collections/index.js +++ b/t/html/pfappserver/config/collections/index.js @@ -4,11 +4,14 @@ 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 firewalls = require('./modules/firewalls') const maintenaceTasks = require('./modules/maintenanceTasks') const mfas = require('./modules/mfas') 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') @@ -22,14 +25,17 @@ module.exports = { // billingTiers, // clouds, // connectionProfiles, - connectors, +// connectors, // domains, // eventLoggers, +// filterEngines, // issue(s) // firewalls, // maintenaceTasks, // mfas, // pkiProviders, // provisionings, + radiusProfiles, + radiusSslCertificates, // realms, // roles, // scanEngines, diff --git a/t/html/pfappserver/config/collections/modules/connectionProfiles.js b/t/html/pfappserver/config/collections/modules/connectionProfiles.js index d33d03b469b5..43526a3767a2 100644 --- a/t/html/pfappserver/config/collections/modules/connectionProfiles.js +++ b/t/html/pfappserver/config/collections/modules/connectionProfiles.js @@ -1,7 +1,10 @@ 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; +const timeout = 10E3; module.exports = { id: 'connectionProfiles', @@ -12,6 +15,8 @@ module.exports = { scope: SCOPE_INSERT, url: collection_url, fixture, + flatten, + timeout, selectors: { buttonNewSelectors: ['button[type="button"]:contains(New Connection Profile)'], }, @@ -47,6 +52,8 @@ module.exports = { description: 'Connection Profiles - Update Existing', scope: SCOPE_UPDATE, fixture, + flatten, + timeout, url: resource_url, interceptors: [ { @@ -68,6 +75,8 @@ module.exports = { description: 'Connection Profiles - Delete Existing', scope: SCOPE_DELETE, fixture, + flatten, + timeout, url: resource_url, interceptors: [ { 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/radiusProfiles.js b/t/html/pfappserver/config/collections/modules/radiusProfiles.js new file mode 100644 index 000000000000..c7a937d0d8bd --- /dev/null +++ b/t/html/pfappserver/config/collections/modules/radiusProfiles.js @@ -0,0 +1,87 @@ +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 timeout = 10E3; + + +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, + timeout, + 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, + timeout, + 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, + timeout, + 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/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/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/specs/e2e/50-views/20-collections.cy.js b/t/html/pfappserver/cypress/specs/e2e/50-views/20-collections.cy.js index 999dfe86f65b..8aab1b3f2b30 100644 --- a/t/html/pfappserver/cypress/specs/e2e/50-views/20-collections.cy.js +++ b/t/html/pfappserver/cypress/specs/e2e/50-views/20-collections.cy.js @@ -13,7 +13,7 @@ describe('Collections', () => { }) let cache = {}; collection.tests.forEach(test => { - const { description, fixture = 'empty.json', scope, url, interceptors = [], selectors, timeout, + const { description, fixture = 'empty.json', flatten: flattenFixture, scope, url, interceptors = [], selectors, timeout, idFrom = ({ id }) => id, beforeFormFill, map = (v) => v, @@ -31,7 +31,7 @@ describe('Collections', () => { it(description, () => { cy.fixture(fixture).then((data) => { - const associative = flatten(data) + const associative = (flattenFixture) ? flatten(data): data const form = Object.entries(associative).reduce((items, [k, v]) => { return { ...items, [k]: map(v, k) } }, {}) @@ -56,8 +56,10 @@ describe('Collections', () => { .click({ log: true, force: true }) }) - // expect url changed - cy.url().should('include', `${url}/new`) + // expect similar url + cy.url() + .should('include', url) + .should('not.equal', url) // setup API interceptors interceptors.forEach((interceptor, i) => { diff --git a/t/html/pfappserver/cypress/support/commands.js b/t/html/pfappserver/cypress/support/commands.js index c99999e42569..d7755ecd079e 100644 --- a/t/html/pfappserver/cypress/support/commands.js +++ b/t/html/pfappserver/cypress/support/commands.js @@ -55,9 +55,10 @@ Cypress.Commands.add('pfConfiguratorDisable', () => { }) Cypress.Commands.add('formFillNamespace', (data, selector = 'body') => { + let list = Object.keys(data).map(key => `*[data-namespace="${key}"]`).join(','); return cy.get(selector) .should('exist') - .get('*[data-namespace]') + .get(list) .should("have.length.gte", 0) .each(element => { if (element.is(':visible')) { From 8e70df9cf8b626ee75cd389a163a200548531336 Mon Sep 17 00:00:00 2001 From: Darren Satkunas Date: Tue, 12 Dec 2023 10:42:23 -0800 Subject: [PATCH 37/91] add wrix locations --- .../pfappserver/config/collections/index.js | 10 ++- .../collections/modules/wrixLocations.js | 69 ++++++++++++++++ .../cypress/fixtures/collections/wrix.json | 15 ++++ .../pfappserver/cypress/support/commands.js | 82 ++++++++++--------- 4 files changed, 132 insertions(+), 44 deletions(-) create mode 100644 t/html/pfappserver/config/collections/modules/wrixLocations.js create mode 100644 t/html/pfappserver/cypress/fixtures/collections/wrix.json diff --git a/t/html/pfappserver/config/collections/index.js b/t/html/pfappserver/config/collections/index.js index b59c583381c8..a87a87df3ce4 100644 --- a/t/html/pfappserver/config/collections/index.js +++ b/t/html/pfappserver/config/collections/index.js @@ -20,6 +20,7 @@ const sources = require('./modules/sources') const switches = require('./modules/switches') const switchGroups = require('./modules/switchGroups') const syslogParsers = require('./modules/syslogParsers') +const wrixLocations = require('./modules/wrixLocations') module.exports = { // billingTiers, @@ -34,14 +35,15 @@ module.exports = { // mfas, // pkiProviders, // provisionings, - radiusProfiles, - radiusSslCertificates, +// radiusProfiles, +// radiusSslCertificates, // realms, // roles, // scanEngines, // securityEvents, // sources, -// switches, + switches, // switchGroups, -// syslogParsers +// syslogParsers, + wrixLocations } \ 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/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/support/commands.js b/t/html/pfappserver/cypress/support/commands.js index d7755ecd079e..ad9fcb6d9a42 100644 --- a/t/html/pfappserver/cypress/support/commands.js +++ b/t/html/pfappserver/cypress/support/commands.js @@ -55,46 +55,48 @@ Cypress.Commands.add('pfConfiguratorDisable', () => { }) Cypress.Commands.add('formFillNamespace', (data, selector = 'body') => { - let list = Object.keys(data).map(key => `*[data-namespace="${key}"]`).join(','); return cy.get(selector) .should('exist') - .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) => { - return `${values}${_value}{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}" />`) - } - } - } - }) + .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) => { + return `${values}${_value}{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}" />`) + } + } +// } + }) + }) }) From 8a747c21680b1b7497b60ff4fc781106d2297f08 Mon Sep 17 00:00:00 2001 From: Darren Satkunas Date: Tue, 12 Dec 2023 10:53:14 -0800 Subject: [PATCH 38/91] add switch templates --- .../pfappserver/config/collections/index.js | 6 +- .../collections/modules/switchTemplates.js | 69 +++++++++++++++++++ .../fixtures/collections/switchTemplate.json | 4 ++ .../specs/e2e/50-views/20-collections.cy.js | 6 +- 4 files changed, 79 insertions(+), 6 deletions(-) create mode 100644 t/html/pfappserver/config/collections/modules/switchTemplates.js create mode 100644 t/html/pfappserver/cypress/fixtures/collections/switchTemplate.json diff --git a/t/html/pfappserver/config/collections/index.js b/t/html/pfappserver/config/collections/index.js index a87a87df3ce4..0f3f98f42223 100644 --- a/t/html/pfappserver/config/collections/index.js +++ b/t/html/pfappserver/config/collections/index.js @@ -19,6 +19,7 @@ const securityEvents = require('./modules/securityEvents') const sources = require('./modules/sources') const switches = require('./modules/switches') const switchGroups = require('./modules/switchGroups') +const switchTemplates = require('./modules/switchTemplates') const syslogParsers = require('./modules/syslogParsers') const wrixLocations = require('./modules/wrixLocations') @@ -42,8 +43,9 @@ module.exports = { // scanEngines, // securityEvents, // sources, - switches, +// switches, // switchGroups, + switchTemplates, // syslogParsers, - wrixLocations +// wrixLocations } \ 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/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/specs/e2e/50-views/20-collections.cy.js b/t/html/pfappserver/cypress/specs/e2e/50-views/20-collections.cy.js index 8aab1b3f2b30..16070fe07638 100644 --- a/t/html/pfappserver/cypress/specs/e2e/50-views/20-collections.cy.js +++ b/t/html/pfappserver/cypress/specs/e2e/50-views/20-collections.cy.js @@ -56,10 +56,8 @@ describe('Collections', () => { .click({ log: true, force: true }) }) - // expect similar url - cy.url() - .should('include', url) - .should('not.equal', url) + // expect new url + cy.url().should('not.equal', url) // setup API interceptors interceptors.forEach((interceptor, i) => { From 04d022b9b39f8002eacd7ef90671b22305e9ce97 Mon Sep 17 00:00:00 2001 From: Darren Satkunas Date: Tue, 12 Dec 2023 12:44:05 -0800 Subject: [PATCH 39/91] add network behavior policies --- .../pfappserver/config/collections/index.js | 4 +- .../modules/networkBehaviorPolicies.js | 69 +++++++++++++++++++ .../collections/networkBehaviorPolicy.json | 3 + 3 files changed, 75 insertions(+), 1 deletion(-) create mode 100644 t/html/pfappserver/config/collections/modules/networkBehaviorPolicies.js create mode 100644 t/html/pfappserver/cypress/fixtures/collections/networkBehaviorPolicy.json diff --git a/t/html/pfappserver/config/collections/index.js b/t/html/pfappserver/config/collections/index.js index 0f3f98f42223..b24ec5769452 100644 --- a/t/html/pfappserver/config/collections/index.js +++ b/t/html/pfappserver/config/collections/index.js @@ -8,6 +8,7 @@ const filterEngines = require('./modules/filterEngines') const firewalls = require('./modules/firewalls') const maintenaceTasks = require('./modules/maintenanceTasks') const mfas = require('./modules/mfas') +const networkBehaviorPolicies = require('./modules/networkBehaviorPolicies') const pkiProviders = require('./modules/pkiProviders') const provisionings = require('./modules/provisionings') const radiusProfiles = require('./modules/radiusProfiles') @@ -32,6 +33,7 @@ module.exports = { // eventLoggers, // filterEngines, // issue(s) // firewalls, + networkBehaviorPolicies, // maintenaceTasks, // mfas, // pkiProviders, @@ -45,7 +47,7 @@ module.exports = { // sources, // switches, // switchGroups, - switchTemplates, +// switchTemplates, // syslogParsers, // wrixLocations } \ 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/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 From 3038a0d4f450d0c83a40bfecea2d8d8a80ecb7ea Mon Sep 17 00:00:00 2001 From: Darren Satkunas Date: Wed, 13 Dec 2023 07:04:35 -0800 Subject: [PATCH 40/91] add admin roles --- .../pfappserver/config/collections/index.js | 8 +- .../config/collections/modules/adminRoles.js | 78 +++++++++++++++++++ .../cypress/config/cypress.config-views.js | 12 +++ .../fixtures/collections/adminRole.json | 10 +++ .../pfappserver/cypress/support/commands.js | 4 +- 5 files changed, 106 insertions(+), 6 deletions(-) create mode 100644 t/html/pfappserver/config/collections/modules/adminRoles.js create mode 100644 t/html/pfappserver/cypress/fixtures/collections/adminRole.json diff --git a/t/html/pfappserver/config/collections/index.js b/t/html/pfappserver/config/collections/index.js index b24ec5769452..ae8c0cfa78e6 100644 --- a/t/html/pfappserver/config/collections/index.js +++ b/t/html/pfappserver/config/collections/index.js @@ -1,3 +1,4 @@ +const adminRoles = require('./modules/adminRoles') const billingTiers = require('./modules/billingTiers') const clouds = require('./modules/clouds') const connectionProfiles = require('./modules/connectionProfiles') @@ -25,15 +26,16 @@ const syslogParsers = require('./modules/syslogParsers') const wrixLocations = require('./modules/wrixLocations') module.exports = { + adminRoles, // billingTiers, // clouds, -// connectionProfiles, -// connectors, + connectionProfiles, + connectors, // domains, // eventLoggers, // filterEngines, // issue(s) // firewalls, - networkBehaviorPolicies, +// networkBehaviorPolicies, // maintenaceTasks, // mfas, // pkiProviders, 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..7a3bf530e221 --- /dev/null +++ b/t/html/pfappserver/config/collections/modules/adminRoles.js @@ -0,0 +1,78 @@ +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/cypress/config/cypress.config-views.js b/t/html/pfappserver/cypress/config/cypress.config-views.js index 2dd7c48cc451..787280d72b27 100644 --- a/t/html/pfappserver/cypress/config/cypress.config-views.js +++ b/t/html/pfappserver/cypress/config/cypress.config-views.js @@ -26,6 +26,18 @@ module.exports = { await items.forEach(async item => { await fs.writeFile(`../fixtures/runtime/maintenanceTask-${item.id}.json`, JSON.stringify(item, null, 2)); }) + + // 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.writeFile('../fixtures/runtime/acls.json', JSON.stringify(acls, null, 2)); }) }); return base.e2e.setupNodeEvents(on, config); 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/support/commands.js b/t/html/pfappserver/cypress/support/commands.js index ad9fcb6d9a42..96f87b120c4f 100644 --- a/t/html/pfappserver/cypress/support/commands.js +++ b/t/html/pfappserver/cypress/support/commands.js @@ -83,9 +83,7 @@ Cypress.Commands.add('formFillNamespace', (data, selector = 'body') => { break case tagName === 'div' && !!chosen: cy.get(`*[data-namespace="${namespace}"]`).within(() => { - const values = ((Array.isArray(value)) ? value : [value]).reduce((values, _value) => { - return `${values}${_value}{enter}` - }, '') + 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 }) From e5ec2ce1d3b34bcb33f52f7dae744b2eefa0d9d8 Mon Sep 17 00:00:00 2001 From: Darren Satkunas Date: Wed, 13 Dec 2023 07:18:49 -0800 Subject: [PATCH 41/91] add self services --- .../pfappserver/config/collections/index.js | 8 ++- .../collections/modules/selfServices.js | 69 +++++++++++++++++++ .../fixtures/collections/selfService.json | 3 + 3 files changed, 77 insertions(+), 3 deletions(-) create mode 100644 t/html/pfappserver/config/collections/modules/selfServices.js create mode 100644 t/html/pfappserver/cypress/fixtures/collections/selfService.json diff --git a/t/html/pfappserver/config/collections/index.js b/t/html/pfappserver/config/collections/index.js index ae8c0cfa78e6..50bdea5b0f51 100644 --- a/t/html/pfappserver/config/collections/index.js +++ b/t/html/pfappserver/config/collections/index.js @@ -18,6 +18,7 @@ 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') @@ -26,11 +27,11 @@ const syslogParsers = require('./modules/syslogParsers') const wrixLocations = require('./modules/wrixLocations') module.exports = { - adminRoles, +// adminRoles, // billingTiers, // clouds, - connectionProfiles, - connectors, +// connectionProfiles, +// connectors, // domains, // eventLoggers, // filterEngines, // issue(s) @@ -46,6 +47,7 @@ module.exports = { // roles, // scanEngines, // securityEvents, + selfServices, // sources, // switches, // switchGroups, 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/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 From 5777e492debcadf3fa5b1057b6266509002ffa0d Mon Sep 17 00:00:00 2001 From: Darren Satkunas Date: Wed, 13 Dec 2023 07:28:48 -0800 Subject: [PATCH 42/91] add required fields --- .../root/src/views/Configuration/floatingDevices/schema.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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') }) } From e590768f63b1107624f54a8e55d8d83c511ebadc Mon Sep 17 00:00:00 2001 From: Darren Satkunas Date: Wed, 13 Dec 2023 07:29:18 -0800 Subject: [PATCH 43/91] add floating devices --- .../pfappserver/config/collections/index.js | 4 +- .../collections/modules/floatingDevices.js | 69 +++++++++++++++++++ .../fixtures/collections/floatingDevice.json | 4 ++ 3 files changed, 76 insertions(+), 1 deletion(-) create mode 100644 t/html/pfappserver/config/collections/modules/floatingDevices.js create mode 100644 t/html/pfappserver/cypress/fixtures/collections/floatingDevice.json diff --git a/t/html/pfappserver/config/collections/index.js b/t/html/pfappserver/config/collections/index.js index 50bdea5b0f51..54b2fb969489 100644 --- a/t/html/pfappserver/config/collections/index.js +++ b/t/html/pfappserver/config/collections/index.js @@ -7,6 +7,7 @@ const domains = require('./modules/domains') const eventLoggers = require('./modules/eventLoggers') const filterEngines = require('./modules/filterEngines') 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') @@ -36,6 +37,7 @@ module.exports = { // eventLoggers, // filterEngines, // issue(s) // firewalls, + floatingDevices, // networkBehaviorPolicies, // maintenaceTasks, // mfas, @@ -47,7 +49,7 @@ module.exports = { // roles, // scanEngines, // securityEvents, - selfServices, +// selfServices, // sources, // switches, // switchGroups, 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/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 From 14625145ab16fea646a6fb865b24e93292558b18 Mon Sep 17 00:00:00 2001 From: Darren Satkunas Date: Wed, 13 Dec 2023 07:34:48 -0800 Subject: [PATCH 44/91] add syslog forwarders --- .../pfappserver/config/collections/index.js | 4 +- .../collections/modules/syslogForwarders.js | 69 +++++++++++++++++++ .../fixtures/collections/syslogForwarder.json | 5 ++ 3 files changed, 77 insertions(+), 1 deletion(-) create mode 100644 t/html/pfappserver/config/collections/modules/syslogForwarders.js create mode 100644 t/html/pfappserver/cypress/fixtures/collections/syslogForwarder.json diff --git a/t/html/pfappserver/config/collections/index.js b/t/html/pfappserver/config/collections/index.js index 54b2fb969489..b4ba67647675 100644 --- a/t/html/pfappserver/config/collections/index.js +++ b/t/html/pfappserver/config/collections/index.js @@ -24,6 +24,7 @@ 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') @@ -37,7 +38,7 @@ module.exports = { // eventLoggers, // filterEngines, // issue(s) // firewalls, - floatingDevices, +// floatingDevices, // networkBehaviorPolicies, // maintenaceTasks, // mfas, @@ -54,6 +55,7 @@ module.exports = { // switches, // switchGroups, // switchTemplates, + syslogForwarders, // syslogParsers, // wrixLocations } \ 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/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 From cb5663e68e3fe05455500f75aeaf54774c382501 Mon Sep 17 00:00:00 2001 From: Darren Satkunas Date: Wed, 13 Dec 2023 14:05:15 -0800 Subject: [PATCH 45/91] abstract pki base configuration --- html/pfappserver/root/src/globals/pki.js | 74 ++++++++++++++++++ .../src/views/Configuration/pki/config.js | 76 ++++--------------- t/html/pfappserver/config/global/countries.js | 1 + 3 files changed, 88 insertions(+), 63 deletions(-) create mode 100644 html/pfappserver/root/src/globals/pki.js create mode 120000 t/html/pfappserver/config/global/countries.js diff --git a/html/pfappserver/root/src/globals/pki.js b/html/pfappserver/root/src/globals/pki.js new file mode 100644 index 000000000000..aa24e5b9bdf5 --- /dev/null +++ b/html/pfappserver/root/src/globals/pki.js @@ -0,0 +1,74 @@ +export const digests = { + 0: 'UnknownSignatureAlgorithm', + 1: 'MD2WithRSA', + 2: 'MD5WithRSA', + 3: 'SHA1WithRSA', + 4: 'SHA256WithRSA', + 5: 'SHA384WithRSA', + 6: 'SHA512WithRSA', + 7: 'DSAWithSHA1', + 8: 'DSAWithSHA256', + 9: 'ECDSAWithSHA1', + 10: 'ECDSAWithSHA256', + 11: 'ECDSAWithSHA384', + 12: 'ECDSAWithSHA512', + 13: 'SHA256WithRSAPSS', + 14: 'SHA384WithRSAPSS', + 15: 'SHA512WithRSAPSS', + 16: 'PureEd25519' +} + +export const keyTypes = { + 0: ['KEY_ECDSA', [256, 384, 521]], + 1: ['KEY_RSA', [2048, 4096]], + 2: ['KEY_DSA', [1024, 2048, 3071]] +} + +export const keyUsages = { + 1: 'DigitalSignature', + 2: 'ContentCommitment', + 4: 'KeyEncipherment', + 8: 'DataEncipherment', + 16: 'KeyAgreement', + 32: 'CertSign', + 64: 'CRLSign', + 128: 'EncipherOnly', + 256: 'DecipherOnly' +} + +export const extendedKeyUsages = { + 0: 'Any', + 1: 'ServerAuth', + 2: 'ClientAuth', + 3: 'CodeSigning', + 4: 'EmailProtection', + 5: 'IPSECEndSystem', + 6: 'IPSECTunnel', + 7: 'IPSECUser', + 8: 'TimeStamping', + 9: 'OCSPSigning', + 10: 'MicrosoftServerGatedCrypto', + 11: 'NetscapeServerGatedCrypto', + 12: 'MicrosoftCommercialCodeSigning', + 13: 'MicrosoftKernelCodeSigning' +} + +export const revokeReasons = { + 0: 'Unspecified', + 1: 'KeyCompromise', + 2: 'CACompromise', + 3: 'AffiliationChanged', + 4: 'Superseded', + 5: 'CessationOfOperation', + 6: 'CertificateHold', + 8: 'RemoveFromCRL', + 9: 'PrivilegeWithdrawn', + 10: 'AACompromise' +} + +export default { + digests, + keyUsages, + extendedKeyUsages, + revokeReasons +} \ No newline at end of file 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/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 From 26bc9052784ed16e18b35ca08479bb90402ed99e Mon Sep 17 00:00:00 2001 From: Darren Satkunas Date: Wed, 13 Dec 2023 14:06:44 -0800 Subject: [PATCH 46/91] add pki cas --- .../pfappserver/config/collections/index.js | 4 +- .../config/collections/modules/pkiCas.js | 83 +++++++++++++++++++ .../collections/modules/securityEvents.js | 4 +- t/html/pfappserver/config/global/index.js | 2 + t/html/pfappserver/config/global/pki.js | 1 + .../cypress/fixtures/collections/pki/ca.json | 12 +++ .../specs/e2e/50-views/20-collections.cy.js | 13 +-- 7 files changed, 110 insertions(+), 9 deletions(-) create mode 100644 t/html/pfappserver/config/collections/modules/pkiCas.js create mode 120000 t/html/pfappserver/config/global/pki.js create mode 100644 t/html/pfappserver/cypress/fixtures/collections/pki/ca.json diff --git a/t/html/pfappserver/config/collections/index.js b/t/html/pfappserver/config/collections/index.js index b4ba67647675..5139c2bad996 100644 --- a/t/html/pfappserver/config/collections/index.js +++ b/t/html/pfappserver/config/collections/index.js @@ -11,6 +11,7 @@ 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') @@ -42,6 +43,7 @@ module.exports = { // networkBehaviorPolicies, // maintenaceTasks, // mfas, + pkiCas, // pkiProviders, // provisionings, // radiusProfiles, @@ -55,7 +57,7 @@ module.exports = { // switches, // switchGroups, // switchTemplates, - syslogForwarders, +// syslogForwarders, // syslogParsers, // wrixLocations } \ 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..cd4e5d013be9 --- /dev/null +++ b/t/html/pfappserver/config/collections/modules/pkiCas.js @@ -0,0 +1,83 @@ +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 timeout = 10E3; + +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, + timeout, + 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, + timeout, + 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/securityEvents.js b/t/html/pfappserver/config/collections/modules/securityEvents.js index 8c5c0b38e896..40f1110f5356 100644 --- a/t/html/pfappserver/config/collections/modules/securityEvents.js +++ b/t/html/pfappserver/config/collections/modules/securityEvents.js @@ -38,10 +38,10 @@ module.exports = { { description: 'Security Events - Update Existing', scope: SCOPE_UPDATE, - idFrom: (_, cache) => cache.id, fixture, timeout, url: resource_url, + idFrom: (_, cache) => cache.id, interceptors: [ { method: '+(PATCH|PUT)', @@ -61,10 +61,10 @@ module.exports = { { description: 'Security Events - Delete Existing', scope: SCOPE_DELETE, - idFrom: (_, cache) => cache.id, fixture, timeout, url: resource_url, + idFrom: (_, cache) => cache.id, interceptors: [ { method: 'DELETE', url: '/api/**/config/security_event/**', expectResponse: (response, fixture) => { diff --git a/t/html/pfappserver/config/global/index.js b/t/html/pfappserver/config/global/index.js index 255e6ba766dd..3cfab565247f 100644 --- a/t/html/pfappserver/config/global/index.js +++ b/t/html/pfappserver/config/global/index.js @@ -1,7 +1,9 @@ +const countries = require('./countries'); const url = '/admin#'; const interceptorTimeoutMs = 10E3; 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/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/specs/e2e/50-views/20-collections.cy.js b/t/html/pfappserver/cypress/specs/e2e/50-views/20-collections.cy.js index 16070fe07638..a398e3e56304 100644 --- a/t/html/pfappserver/cypress/specs/e2e/50-views/20-collections.cy.js +++ b/t/html/pfappserver/cypress/specs/e2e/50-views/20-collections.cy.js @@ -75,13 +75,14 @@ describe('Collections', () => { }).as(`interceptor${i}`) }) - cy.get(containerSelector, selectorOptions).then($body => { // DOM ready - // wait for progress - cy.get('div.progress[style*="display: none"]', selectorOptions).should('exist') + // 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).each((tab, n) => { + cy.get(tabSelector, selectorOptions).should("have.length.gte", 0).then((tab, n) => { // click tab cy.get(tab, selectorOptions) .click({ log: true }) @@ -108,11 +109,11 @@ describe('Collections', () => { else { // before form fill if (beforeFormFill) { - beforeFormFill(`@tab${n}`, selectorOptions) + beforeFormFill($body, selectorOptions) } // fill form - cy.formFillNamespace(form, containerSelector) + cy.formFillNamespace(form, $body) } }) From 5a691beafd9fd50cd7838d73a9ee3866dbaedc01 Mon Sep 17 00:00:00 2001 From: Darren Satkunas Date: Thu, 14 Dec 2023 10:49:50 -0800 Subject: [PATCH 47/91] abstract fingerbank oses --- html/pfappserver/root/src/globals/fingerbank.js | 13 +++++++++++++ .../_components/new/BaseFormGroupOses.js | 11 ++--------- 2 files changed, 15 insertions(+), 9 deletions(-) create mode 100644 html/pfappserver/root/src/globals/fingerbank.js diff --git a/html/pfappserver/root/src/globals/fingerbank.js b/html/pfappserver/root/src/globals/fingerbank.js new file mode 100644 index 000000000000..46d8ef7f8a2f --- /dev/null +++ b/html/pfappserver/root/src/globals/fingerbank.js @@ -0,0 +1,13 @@ +export const oses = { // uses natural order + 33507: 'Windows Phone OS', + 2: 'Mac OS X or macOS', + 33453: 'Android OS', + 1: 'Windows OS', + 33471: 'BlackBerry OS', + 33450: 'iOS', + 5: 'Linux OS' +} + +export default { + oses +} \ No newline at end of file diff --git a/html/pfappserver/root/src/views/Configuration/_components/new/BaseFormGroupOses.js b/html/pfappserver/root/src/views/Configuration/_components/new/BaseFormGroupOses.js index fe41d4f95ed9..d5188bf8f652 100644 --- a/html/pfappserver/root/src/views/Configuration/_components/new/BaseFormGroupOses.js +++ b/html/pfappserver/root/src/views/Configuration/_components/new/BaseFormGroupOses.js @@ -1,3 +1,4 @@ +import { oses } from '@/globals/fingerbank' import { BaseFormGroupChosenMultipleSearchable, BaseFormGroupChosenMultipleSearchableProps } from '@/components/new/' export const props = { @@ -6,15 +7,7 @@ export const props = { // overload :options default options: { type: Array, - default: () => ([ - { 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 })) } } From da88ab9bcc16abf08237665349dc60fcb7c42c69 Mon Sep 17 00:00:00 2001 From: Darren Satkunas Date: Thu, 14 Dec 2023 10:50:50 -0800 Subject: [PATCH 48/91] add fingerbank combinations --- .../pfappserver/config/collections/index.js | 4 +- .../modules/fingerbankCombinations.js | 82 +++++++++++++++++++ .../pfappserver/config/global/fingerbank.js | 1 + .../collections/fingerbank/combination.json | 3 + 4 files changed, 89 insertions(+), 1 deletion(-) create mode 100644 t/html/pfappserver/config/collections/modules/fingerbankCombinations.js create mode 120000 t/html/pfappserver/config/global/fingerbank.js create mode 100644 t/html/pfappserver/cypress/fixtures/collections/fingerbank/combination.json diff --git a/t/html/pfappserver/config/collections/index.js b/t/html/pfappserver/config/collections/index.js index 5139c2bad996..abd079ff457b 100644 --- a/t/html/pfappserver/config/collections/index.js +++ b/t/html/pfappserver/config/collections/index.js @@ -6,6 +6,7 @@ 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 firewalls = require('./modules/firewalls') const floatingDevices = require('./modules/floatingDevices') const maintenaceTasks = require('./modules/maintenanceTasks') @@ -38,12 +39,13 @@ module.exports = { // domains, // eventLoggers, // filterEngines, // issue(s) + fingerbankCombinations, // firewalls, // floatingDevices, // networkBehaviorPolicies, // maintenaceTasks, // mfas, - pkiCas, +// pkiCas, // incomplete // pkiProviders, // provisionings, // radiusProfiles, 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/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/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 From 98189838b74b6247540f923b9b0360b3e2fa11dc Mon Sep 17 00:00:00 2001 From: Darren Satkunas Date: Thu, 14 Dec 2023 10:57:59 -0800 Subject: [PATCH 49/91] add fingerbank devices --- .../pfappserver/config/collections/index.js | 4 +- .../collections/modules/fingerbankDevices.js | 73 +++++++++++++++++++ .../collections/fingerbank/device.json | 3 + 3 files changed, 79 insertions(+), 1 deletion(-) create mode 100644 t/html/pfappserver/config/collections/modules/fingerbankDevices.js create mode 100644 t/html/pfappserver/cypress/fixtures/collections/fingerbank/device.json diff --git a/t/html/pfappserver/config/collections/index.js b/t/html/pfappserver/config/collections/index.js index abd079ff457b..bab147c235df 100644 --- a/t/html/pfappserver/config/collections/index.js +++ b/t/html/pfappserver/config/collections/index.js @@ -7,6 +7,7 @@ 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 firewalls = require('./modules/firewalls') const floatingDevices = require('./modules/floatingDevices') const maintenaceTasks = require('./modules/maintenanceTasks') @@ -39,7 +40,8 @@ module.exports = { // domains, // eventLoggers, // filterEngines, // issue(s) - fingerbankCombinations, +// fingerbankCombinations, + fingerbankDevices, // firewalls, // floatingDevices, // networkBehaviorPolicies, 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/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 From 29d4ba6bc2d025b6ae5917be7dac7b13310f739a Mon Sep 17 00:00:00 2001 From: Darren Satkunas Date: Thu, 14 Dec 2023 11:03:27 -0800 Subject: [PATCH 50/91] add fingerbank DHCP fingerprints --- .../pfappserver/config/collections/index.js | 4 +- .../modules/fingerbankDhcpFingerprints.js | 73 +++++++++++++++++++ .../fingerbank/dhcpFingerprint.json | 3 + 3 files changed, 79 insertions(+), 1 deletion(-) create mode 100644 t/html/pfappserver/config/collections/modules/fingerbankDhcpFingerprints.js create mode 100644 t/html/pfappserver/cypress/fixtures/collections/fingerbank/dhcpFingerprint.json diff --git a/t/html/pfappserver/config/collections/index.js b/t/html/pfappserver/config/collections/index.js index bab147c235df..52d73f536772 100644 --- a/t/html/pfappserver/config/collections/index.js +++ b/t/html/pfappserver/config/collections/index.js @@ -7,6 +7,7 @@ const domains = require('./modules/domains') const eventLoggers = require('./modules/eventLoggers') const filterEngines = require('./modules/filterEngines') const fingerbankCombinations = require('./modules/fingerbankCombinations') +const fingerbankDhcpFingerprints = require('./modules/fingerbankDhcpFingerprints') const fingerbankDevices = require('./modules/fingerbankDevices') const firewalls = require('./modules/firewalls') const floatingDevices = require('./modules/floatingDevices') @@ -41,7 +42,8 @@ module.exports = { // eventLoggers, // filterEngines, // issue(s) // fingerbankCombinations, - fingerbankDevices, +// fingerbankDevices, + fingerbankDhcpFingerprints, // firewalls, // floatingDevices, // networkBehaviorPolicies, 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/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 From ae136b4e6943f8f42d5dff4e513986b79c8b4a30 Mon Sep 17 00:00:00 2001 From: Darren Satkunas Date: Thu, 14 Dec 2023 11:24:29 -0800 Subject: [PATCH 51/91] add fingerbank DHCP vendors --- .../pfappserver/config/collections/index.js | 4 +- .../modules/fingerbankDhcpVendors.js | 73 +++++++++++++++++++ .../collections/fingerbank/dhcpVendor.json | 3 + 3 files changed, 79 insertions(+), 1 deletion(-) create mode 100644 t/html/pfappserver/config/collections/modules/fingerbankDhcpVendors.js create mode 100644 t/html/pfappserver/cypress/fixtures/collections/fingerbank/dhcpVendor.json diff --git a/t/html/pfappserver/config/collections/index.js b/t/html/pfappserver/config/collections/index.js index 52d73f536772..ff5ce17ba0c5 100644 --- a/t/html/pfappserver/config/collections/index.js +++ b/t/html/pfappserver/config/collections/index.js @@ -8,6 +8,7 @@ const eventLoggers = require('./modules/eventLoggers') const filterEngines = require('./modules/filterEngines') const fingerbankCombinations = require('./modules/fingerbankCombinations') const fingerbankDhcpFingerprints = require('./modules/fingerbankDhcpFingerprints') +const fingerbankDhcpVendors = require('./modules/fingerbankDhcpVendors') const fingerbankDevices = require('./modules/fingerbankDevices') const firewalls = require('./modules/firewalls') const floatingDevices = require('./modules/floatingDevices') @@ -43,7 +44,8 @@ module.exports = { // filterEngines, // issue(s) // fingerbankCombinations, // fingerbankDevices, - fingerbankDhcpFingerprints, +// fingerbankDhcpFingerprints, + fingerbankDhcpVendors, // firewalls, // floatingDevices, // networkBehaviorPolicies, 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/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 From 4c3c6bf427758df3911aa1ca28899d83d0e7d84c Mon Sep 17 00:00:00 2001 From: Darren Satkunas Date: Thu, 14 Dec 2023 11:29:43 -0800 Subject: [PATCH 52/91] add fingerbank DHCP6 fingerprints --- .../pfappserver/config/collections/index.js | 4 +- .../modules/fingerbankDhcpv6Fingerprints.js | 73 +++++++++++++++++++ .../fingerbank/dhcpv6Fingerprint.json | 3 + 3 files changed, 79 insertions(+), 1 deletion(-) create mode 100644 t/html/pfappserver/config/collections/modules/fingerbankDhcpv6Fingerprints.js create mode 100644 t/html/pfappserver/cypress/fixtures/collections/fingerbank/dhcpv6Fingerprint.json diff --git a/t/html/pfappserver/config/collections/index.js b/t/html/pfappserver/config/collections/index.js index ff5ce17ba0c5..2039614999a5 100644 --- a/t/html/pfappserver/config/collections/index.js +++ b/t/html/pfappserver/config/collections/index.js @@ -8,6 +8,7 @@ const eventLoggers = require('./modules/eventLoggers') const filterEngines = require('./modules/filterEngines') const fingerbankCombinations = require('./modules/fingerbankCombinations') const fingerbankDhcpFingerprints = require('./modules/fingerbankDhcpFingerprints') +const fingerbankDhcpv6Fingerprints = require('./modules/fingerbankDhcpv6Fingerprints') const fingerbankDhcpVendors = require('./modules/fingerbankDhcpVendors') const fingerbankDevices = require('./modules/fingerbankDevices') const firewalls = require('./modules/firewalls') @@ -45,7 +46,8 @@ module.exports = { // fingerbankCombinations, // fingerbankDevices, // fingerbankDhcpFingerprints, - fingerbankDhcpVendors, + fingerbankDhcpv6Fingerprints, +// fingerbankDhcpVendors, // firewalls, // floatingDevices, // networkBehaviorPolicies, 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..6d31e536ddc3 --- /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/dhcpFingerprint.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/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 From 63d1254dc6d34bc750d7efa07933ef10fcdc4951 Mon Sep 17 00:00:00 2001 From: Darren Satkunas Date: Thu, 14 Dec 2023 11:34:52 -0800 Subject: [PATCH 53/91] add fingerbank DHCP6 enterprises --- .../pfappserver/config/collections/index.js | 2 + .../modules/fingerbankDhcpv6Enterprises.js | 73 +++++++++++++++++++ .../modules/fingerbankDhcpv6Fingerprints.js | 2 +- .../fingerbank/dhcpv6Enterprise.json | 3 + 4 files changed, 79 insertions(+), 1 deletion(-) create mode 100644 t/html/pfappserver/config/collections/modules/fingerbankDhcpv6Enterprises.js create mode 100644 t/html/pfappserver/cypress/fixtures/collections/fingerbank/dhcpv6Enterprise.json diff --git a/t/html/pfappserver/config/collections/index.js b/t/html/pfappserver/config/collections/index.js index 2039614999a5..e95ad35bb3f9 100644 --- a/t/html/pfappserver/config/collections/index.js +++ b/t/html/pfappserver/config/collections/index.js @@ -8,6 +8,7 @@ const eventLoggers = require('./modules/eventLoggers') const filterEngines = require('./modules/filterEngines') const fingerbankCombinations = require('./modules/fingerbankCombinations') const fingerbankDhcpFingerprints = require('./modules/fingerbankDhcpFingerprints') +const fingerbankDhcpv6Enterprises = require('./modules/fingerbankDhcpv6Enterprises') const fingerbankDhcpv6Fingerprints = require('./modules/fingerbankDhcpv6Fingerprints') const fingerbankDhcpVendors = require('./modules/fingerbankDhcpVendors') const fingerbankDevices = require('./modules/fingerbankDevices') @@ -46,6 +47,7 @@ module.exports = { // fingerbankCombinations, // fingerbankDevices, // fingerbankDhcpFingerprints, + fingerbankDhcpv6Enterprises, fingerbankDhcpv6Fingerprints, // fingerbankDhcpVendors, // firewalls, 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 index 6d31e536ddc3..36b4e2ed11ac 100644 --- a/t/html/pfappserver/config/collections/modules/fingerbankDhcpv6Fingerprints.js +++ b/t/html/pfappserver/config/collections/modules/fingerbankDhcpv6Fingerprints.js @@ -2,7 +2,7 @@ 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/dhcpFingerprint.json'; +const fixture = 'collections/fingerbank/dhcpv6Fingerprint.json'; module.exports = { id: 'fingerbankDhcpv6Fingerprints', 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 From 6c382147d14f0a8206ba0c79084322e0fac53def Mon Sep 17 00:00:00 2001 From: Darren Satkunas Date: Thu, 14 Dec 2023 11:53:38 -0800 Subject: [PATCH 54/91] add fingerbank MAC vendors --- .../pfappserver/config/collections/index.js | 6 +- .../modules/fingerbankMacVendors.js | 73 +++++++++++++++++++ .../collections/fingerbank/macVendor.json | 4 + 3 files changed, 81 insertions(+), 2 deletions(-) create mode 100644 t/html/pfappserver/config/collections/modules/fingerbankMacVendors.js create mode 100644 t/html/pfappserver/cypress/fixtures/collections/fingerbank/macVendor.json diff --git a/t/html/pfappserver/config/collections/index.js b/t/html/pfappserver/config/collections/index.js index e95ad35bb3f9..82c60a9ee74a 100644 --- a/t/html/pfappserver/config/collections/index.js +++ b/t/html/pfappserver/config/collections/index.js @@ -11,6 +11,7 @@ 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 fingerbankDevices = require('./modules/fingerbankDevices') const firewalls = require('./modules/firewalls') const floatingDevices = require('./modules/floatingDevices') @@ -47,9 +48,10 @@ module.exports = { // fingerbankCombinations, // fingerbankDevices, // fingerbankDhcpFingerprints, - fingerbankDhcpv6Enterprises, - fingerbankDhcpv6Fingerprints, +// fingerbankDhcpv6Enterprises, +// fingerbankDhcpv6Fingerprints, // fingerbankDhcpVendors, + fingerbankMacVendors, // firewalls, // floatingDevices, // networkBehaviorPolicies, 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/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 From 13003c754b0e55de4b3e73c5a31a636c0987d8b3 Mon Sep 17 00:00:00 2001 From: Darren Satkunas Date: Thu, 14 Dec 2023 12:11:20 -0800 Subject: [PATCH 55/91] add fingerbank user agents --- .../pfappserver/config/collections/index.js | 6 +- .../modules/fingerbankUserAgents.js | 73 +++++++++++++++++++ .../collections/fingerbank/userAgent.json | 3 + 3 files changed, 80 insertions(+), 2 deletions(-) create mode 100644 t/html/pfappserver/config/collections/modules/fingerbankUserAgents.js create mode 100644 t/html/pfappserver/cypress/fixtures/collections/fingerbank/userAgent.json diff --git a/t/html/pfappserver/config/collections/index.js b/t/html/pfappserver/config/collections/index.js index 82c60a9ee74a..c36371d73189 100644 --- a/t/html/pfappserver/config/collections/index.js +++ b/t/html/pfappserver/config/collections/index.js @@ -7,12 +7,13 @@ 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 fingerbankDevices = require('./modules/fingerbankDevices') +const fingerbankUserAgents = require('./modules/fingerbankUserAgents') const firewalls = require('./modules/firewalls') const floatingDevices = require('./modules/floatingDevices') const maintenaceTasks = require('./modules/maintenanceTasks') @@ -51,7 +52,8 @@ module.exports = { // fingerbankDhcpv6Enterprises, // fingerbankDhcpv6Fingerprints, // fingerbankDhcpVendors, - fingerbankMacVendors, +// fingerbankMacVendors, + fingerbankUserAgents, // firewalls, // floatingDevices, // networkBehaviorPolicies, 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/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 From 030248830f66854bb97f15a6c7c308745ec13f4e Mon Sep 17 00:00:00 2001 From: Darren Satkunas Date: Thu, 14 Dec 2023 13:49:21 -0800 Subject: [PATCH 56/91] wait for tab to be visible --- .../pfappserver/cypress/specs/e2e/50-views/20-collections.cy.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/t/html/pfappserver/cypress/specs/e2e/50-views/20-collections.cy.js b/t/html/pfappserver/cypress/specs/e2e/50-views/20-collections.cy.js index a398e3e56304..cf4a89b3ed7a 100644 --- a/t/html/pfappserver/cypress/specs/e2e/50-views/20-collections.cy.js +++ b/t/html/pfappserver/cypress/specs/e2e/50-views/20-collections.cy.js @@ -25,7 +25,7 @@ describe('Collections', () => { 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"]', + tabSelector = 'div.tabs a[role="tab"]:is(:visible)', } = selectors || {}; const selectorOptions = { timeout } From bc7dde072a50fe7abb0bc6fa727bec7a61767458 Mon Sep 17 00:00:00 2001 From: Darren Satkunas Date: Thu, 14 Dec 2023 13:50:19 -0800 Subject: [PATCH 57/91] increase timeout --- .../pfappserver/config/collections/modules/adminRoles.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/t/html/pfappserver/config/collections/modules/adminRoles.js b/t/html/pfappserver/config/collections/modules/adminRoles.js index 7a3bf530e221..39b9394fda78 100644 --- a/t/html/pfappserver/config/collections/modules/adminRoles.js +++ b/t/html/pfappserver/config/collections/modules/adminRoles.js @@ -1,9 +1,11 @@ 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 timeout = 10E3; +const acls = require('../../../cypress/fixtures/runtime/acls.json'); const map = (value, namespace = '') => { if (namespace === 'actions') { // re-map actions return value.map(v => acls[v]) @@ -19,6 +21,7 @@ module.exports = { description: 'Admin Roles - Create New', scope: SCOPE_INSERT, fixture, + timeout, map, url: collection_url, selectors: { @@ -44,6 +47,7 @@ module.exports = { description: 'Admin Roles - Update Existing', scope: SCOPE_UPDATE, fixture, + timeout, url: resource_url, interceptors: [ { @@ -65,6 +69,7 @@ module.exports = { description: 'Admin Roles - Delete Existing', scope: SCOPE_DELETE, fixture, + timeout, url: resource_url, interceptors: [ { From 0d0c1a9081218bb903aa9d78b3e66807596944e8 Mon Sep 17 00:00:00 2001 From: Darren Satkunas Date: Thu, 14 Dec 2023 13:50:30 -0800 Subject: [PATCH 58/91] flatten billingTiers fixture --- .../pfappserver/config/collections/modules/billingTiers.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/t/html/pfappserver/config/collections/modules/billingTiers.js b/t/html/pfappserver/config/collections/modules/billingTiers.js index 221f724d5a7c..b4a4d93722ab 100644 --- a/t/html/pfappserver/config/collections/modules/billingTiers.js +++ b/t/html/pfappserver/config/collections/modules/billingTiers.js @@ -1,7 +1,9 @@ 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 @@ -26,6 +28,7 @@ module.exports = { description: 'Billing Tiers - Create New', scope: SCOPE_INSERT, fixture, + flatten, map, url: collection_url, interceptors: [ @@ -48,6 +51,7 @@ module.exports = { description: 'Billing Tiers - Update Existing', scope: SCOPE_UPDATE, fixture, + flatten, url: resource_url, interceptors: [ { @@ -69,6 +73,7 @@ module.exports = { description: 'Billing Tiers - Delete Existing', scope: SCOPE_DELETE, fixture, + flatten, url: resource_url, interceptors: [ { From e9dfa85e87845e2b9130d2e57d1a86e1b3842410 Mon Sep 17 00:00:00 2001 From: Darren Satkunas Date: Fri, 15 Dec 2023 08:45:41 -0800 Subject: [PATCH 59/91] add scaling, allow bases and collections to be run in parallel using PARALLEL and SLICE --- .../pfappserver/config/collections/index.js | 70 +++++++++---------- .../cypress/config/cypress.config-views.js | 4 +- .../cypress/config/cypress.config.js | 6 ++ .../cypress/specs/e2e/50-views/10-bases.cy.js | 14 +++- .../specs/e2e/50-views/20-collections.cy.js | 20 +++++- t/html/pfappserver/package-lock.json | 12 ++++ t/html/pfappserver/package.json | 1 + 7 files changed, 84 insertions(+), 43 deletions(-) diff --git a/t/html/pfappserver/config/collections/index.js b/t/html/pfappserver/config/collections/index.js index c36371d73189..821d08314fbc 100644 --- a/t/html/pfappserver/config/collections/index.js +++ b/t/html/pfappserver/config/collections/index.js @@ -38,42 +38,42 @@ const syslogParsers = require('./modules/syslogParsers') const wrixLocations = require('./modules/wrixLocations') module.exports = { -// adminRoles, -// billingTiers, -// clouds, -// connectionProfiles, -// connectors, -// domains, -// eventLoggers, + adminRoles, + billingTiers, + clouds, + connectionProfiles, + connectors, + domains, + eventLoggers, // filterEngines, // issue(s) -// fingerbankCombinations, -// fingerbankDevices, -// fingerbankDhcpFingerprints, -// fingerbankDhcpv6Enterprises, -// fingerbankDhcpv6Fingerprints, -// fingerbankDhcpVendors, -// fingerbankMacVendors, + fingerbankCombinations, + fingerbankDevices, + fingerbankDhcpFingerprints, + fingerbankDhcpv6Enterprises, + fingerbankDhcpv6Fingerprints, + fingerbankDhcpVendors, + fingerbankMacVendors, fingerbankUserAgents, -// firewalls, -// floatingDevices, -// networkBehaviorPolicies, -// maintenaceTasks, -// mfas, + firewalls, + floatingDevices, + networkBehaviorPolicies, + maintenaceTasks, + mfas, // pkiCas, // incomplete -// pkiProviders, -// provisionings, -// radiusProfiles, -// radiusSslCertificates, -// realms, -// roles, -// scanEngines, -// securityEvents, -// selfServices, -// sources, -// switches, -// switchGroups, -// switchTemplates, -// syslogForwarders, -// syslogParsers, -// wrixLocations + 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/cypress/config/cypress.config-views.js b/t/html/pfappserver/cypress/config/cypress.config-views.js index 787280d72b27..ea5e307ce592 100644 --- a/t/html/pfappserver/cypress/config/cypress.config-views.js +++ b/t/html/pfappserver/cypress/config/cypress.config-views.js @@ -44,8 +44,8 @@ module.exports = { }, specPattern: [ - 'cypress/specs/e2e/*-views/20*.cy.{js,jsx,ts,tsx}', -// 'cypress/specs/e2e/*-views/**/*.cy.{js,jsx,ts,tsx}', +// 'cypress/specs/e2e/*-views/10*.cy.{js,jsx,ts,tsx}', + 'cypress/specs/e2e/*-views/**/*.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 66a40c40f242..e3fac9aebece 100644 --- a/t/html/pfappserver/cypress/config/cypress.config.js +++ b/t/html/pfappserver/cypress/config/cypress.config.js @@ -4,6 +4,8 @@ const webpackOptions = { watchOptions: {} } +require('dotenv').config() + // screenshot and video resolution const width = 3840 // 4k const height = 2160 // 4k @@ -54,6 +56,10 @@ module.exports = { }); return config; }, + env: { + PARALLEL: process.env.PARALLEL, + SLICE: process.env.SLICE, + }, specPattern: [ 'cypress/specs/e2e/*.cy.{js,jsx,ts,tsx}', ], diff --git a/t/html/pfappserver/cypress/specs/e2e/50-views/10-bases.cy.js b/t/html/pfappserver/cypress/specs/e2e/50-views/10-bases.cy.js index a76400d4ea2f..852fbacfdf25 100644 --- a/t/html/pfappserver/cypress/specs/e2e/50-views/10-bases.cy.js +++ b/t/html/pfappserver/cypress/specs/e2e/50-views/10-bases.cy.js @@ -2,8 +2,11 @@ const { global, bases } = require('config'); +const PARALLEL = +Cypress.env('PARALLEL') || 1 +const SLICE = +Cypress.env('SLICE') || 0 + describe('Bases', () => { - Object.values(bases).forEach(base => { + Object.values(bases).forEach((base, b) => { context(`Base - ${base.description}`, () => { beforeEach('Login as system', () => { cy.session('system', () => { @@ -16,7 +19,7 @@ describe('Bases', () => { buttonSelector = 'button[type="submit"]' } = selectors || [] - it(description, () => { + const unit = () => { // storage from getter (fixture) to setter (expect) let cache = {} @@ -57,7 +60,12 @@ describe('Bases', () => { .should('not.have.class', 'disabled') .and('not.have.disabled', 'disabled') .click() - }) + } + if (PARALLEL > 1 && ((b % PARALLEL) !== SLICE)) { + // parallel processing, skip slice + return it.skip(`[skipped ${SLICE+1}/${PARALLEL}] ${description}`, unit) + } + it(description, unit) }) }) }) diff --git a/t/html/pfappserver/cypress/specs/e2e/50-views/20-collections.cy.js b/t/html/pfappserver/cypress/specs/e2e/50-views/20-collections.cy.js index cf4a89b3ed7a..70e7a5d71708 100644 --- a/t/html/pfappserver/cypress/specs/e2e/50-views/20-collections.cy.js +++ b/t/html/pfappserver/cypress/specs/e2e/50-views/20-collections.cy.js @@ -3,8 +3,17 @@ 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') || 1 +const SLICE = +Cypress.env('SLICE') || 0 + +/* +const slicedCollections = (PARALLEL > 1) + ? Object.values(collections).filter((collection, i) => (i % PARALLEL) === SLICE) + : Object.values(collections) +*/ + describe('Collections', () => { - Object.values(collections).forEach(collection => { + Object.values(collections).forEach((collection, c) => { context(`Collection - ${collection.description}`, () => { beforeEach('Login as system', () => { cy.session('system', () => { @@ -29,7 +38,7 @@ describe('Collections', () => { } = selectors || {}; const selectorOptions = { timeout } - it(description, () => { + const unit = () => { cy.fixture(fixture).then((data) => { const associative = (flattenFixture) ? flatten(data): data const form = Object.entries(associative).reduce((items, [k, v]) => { @@ -240,7 +249,12 @@ describe('Collections', () => { cy.task('error', `Unhandled scope '${scope || 'unknown'}'`) } }) - }) + } + if (PARALLEL > 1 && ((c % PARALLEL) !== SLICE)) { + // parallel processing, skip slice + return it.skip(`[skipped ${SLICE+1}/${PARALLEL}] ${description}`, unit) + } + it(description, unit) }) }) }) diff --git a/t/html/pfappserver/package-lock.json b/t/html/pfappserver/package-lock.json index e1cd522cca74..22d2fe92f324 100644 --- a/t/html/pfappserver/package-lock.json +++ b/t/html/pfappserver/package-lock.json @@ -12,6 +12,7 @@ "@babel/preset-env": "^7.24.5", "@cypress/webpack-preprocessor": "^6.0.0", "babel-loader": "^9.1.3", + "dotenv": "^16.3.1", "node-fetch": "^2.7.0", "webpack": "^5.91.0" } @@ -2121,6 +2122,17 @@ } } }, + "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": ">=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", diff --git a/t/html/pfappserver/package.json b/t/html/pfappserver/package.json index 071b72597320..9080493e1668 100644 --- a/t/html/pfappserver/package.json +++ b/t/html/pfappserver/package.json @@ -7,6 +7,7 @@ "@babel/preset-env": "^7.24.5", "@cypress/webpack-preprocessor": "^6.0.0", "babel-loader": "^9.1.3", + "dotenv": "^16.3.1", "node-fetch": "^2.7.0", "webpack": "^5.91.0" } From 1e9c11fb3daa857429dd423ea198ff545533c26e Mon Sep 17 00:00:00 2001 From: Darren Satkunas Date: Fri, 15 Dec 2023 10:40:04 -0800 Subject: [PATCH 60/91] cleanup --- t/html/pfappserver/cypress/config/cypress.config.js | 4 ++-- .../cypress/specs/e2e/50-views/10-bases.cy.js | 6 +++--- .../cypress/specs/e2e/50-views/20-collections.cy.js | 12 +++--------- 3 files changed, 8 insertions(+), 14 deletions(-) diff --git a/t/html/pfappserver/cypress/config/cypress.config.js b/t/html/pfappserver/cypress/config/cypress.config.js index e3fac9aebece..85471a267d1c 100644 --- a/t/html/pfappserver/cypress/config/cypress.config.js +++ b/t/html/pfappserver/cypress/config/cypress.config.js @@ -57,8 +57,8 @@ module.exports = { return config; }, env: { - PARALLEL: process.env.PARALLEL, - SLICE: process.env.SLICE, + PARALLEL: +process.env.PARALLEL || 1, + SLICE: +process.env.SLICE || 0, }, specPattern: [ 'cypress/specs/e2e/*.cy.{js,jsx,ts,tsx}', diff --git a/t/html/pfappserver/cypress/specs/e2e/50-views/10-bases.cy.js b/t/html/pfappserver/cypress/specs/e2e/50-views/10-bases.cy.js index 852fbacfdf25..2ff3019472ac 100644 --- a/t/html/pfappserver/cypress/specs/e2e/50-views/10-bases.cy.js +++ b/t/html/pfappserver/cypress/specs/e2e/50-views/10-bases.cy.js @@ -2,8 +2,8 @@ const { global, bases } = require('config'); -const PARALLEL = +Cypress.env('PARALLEL') || 1 -const SLICE = +Cypress.env('SLICE') || 0 +const PARALLEL = Cypress.env('PARALLEL') +const SLICE = Cypress.env('SLICE') describe('Bases', () => { Object.values(bases).forEach((base, b) => { @@ -63,7 +63,7 @@ describe('Bases', () => { } if (PARALLEL > 1 && ((b % PARALLEL) !== SLICE)) { // parallel processing, skip slice - return it.skip(`[skipped ${SLICE+1}/${PARALLEL}] ${description}`, unit) + return it.skip(`[skipped ${b % PARALLEL}/${PARALLEL}] ${description}`, unit) } it(description, unit) }) diff --git a/t/html/pfappserver/cypress/specs/e2e/50-views/20-collections.cy.js b/t/html/pfappserver/cypress/specs/e2e/50-views/20-collections.cy.js index 70e7a5d71708..3a8f0a76be42 100644 --- a/t/html/pfappserver/cypress/specs/e2e/50-views/20-collections.cy.js +++ b/t/html/pfappserver/cypress/specs/e2e/50-views/20-collections.cy.js @@ -3,14 +3,8 @@ 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') || 1 -const SLICE = +Cypress.env('SLICE') || 0 - -/* -const slicedCollections = (PARALLEL > 1) - ? Object.values(collections).filter((collection, i) => (i % PARALLEL) === SLICE) - : Object.values(collections) -*/ +const PARALLEL = Cypress.env('PARALLEL') +const SLICE = Cypress.env('SLICE') describe('Collections', () => { Object.values(collections).forEach((collection, c) => { @@ -252,7 +246,7 @@ describe('Collections', () => { } if (PARALLEL > 1 && ((c % PARALLEL) !== SLICE)) { // parallel processing, skip slice - return it.skip(`[skipped ${SLICE+1}/${PARALLEL}] ${description}`, unit) + return it.skip(`[skipped ${c % PARALLEL}/${PARALLEL}] ${description}`, unit) } it(description, unit) }) From 49962754e398f3d638e2a2820344dac5b4495aca Mon Sep 17 00:00:00 2001 From: Darren Satkunas Date: Fri, 5 Jan 2024 12:45:09 -0800 Subject: [PATCH 61/91] improve concurrency --- t/html/pfappserver/Makefile | 4 +++ t/html/pfappserver/concurrent.sh | 26 +++++++++++++++++++ .../cypress/config/cypress.config-views.js | 2 +- .../cypress/specs/e2e/50-views/10-bases.cy.js | 4 +-- .../specs/e2e/50-views/20-collections.cy.js | 4 +-- 5 files changed, 35 insertions(+), 5 deletions(-) create mode 100755 t/html/pfappserver/concurrent.sh diff --git a/t/html/pfappserver/Makefile b/t/html/pfappserver/Makefile index f59ce8cf74bc..b7a434c4b01c 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) @@ -56,6 +57,9 @@ test: CYPRESS_baseUrl=$(BASE_URL) \ 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= \ 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/cypress/config/cypress.config-views.js b/t/html/pfappserver/cypress/config/cypress.config-views.js index ea5e307ce592..76f53d5b79e8 100644 --- a/t/html/pfappserver/cypress/config/cypress.config-views.js +++ b/t/html/pfappserver/cypress/config/cypress.config-views.js @@ -47,5 +47,5 @@ module.exports = { // 'cypress/specs/e2e/*-views/10*.cy.{js,jsx,ts,tsx}', 'cypress/specs/e2e/*-views/**/*.cy.{js,jsx,ts,tsx}', ], - } + }, }; diff --git a/t/html/pfappserver/cypress/specs/e2e/50-views/10-bases.cy.js b/t/html/pfappserver/cypress/specs/e2e/50-views/10-bases.cy.js index 2ff3019472ac..293e0402f9dc 100644 --- a/t/html/pfappserver/cypress/specs/e2e/50-views/10-bases.cy.js +++ b/t/html/pfappserver/cypress/specs/e2e/50-views/10-bases.cy.js @@ -63,9 +63,9 @@ describe('Bases', () => { } if (PARALLEL > 1 && ((b % PARALLEL) !== SLICE)) { // parallel processing, skip slice - return it.skip(`[skipped ${b % PARALLEL}/${PARALLEL}] ${description}`, unit) + return it.skip(`[${b % PARALLEL}/${PARALLEL}: skip] ${description}`, unit) } - it(description, unit) + it(`[${b % PARALLEL}/${PARALLEL}: run] ${description}`, unit) }) }) }) diff --git a/t/html/pfappserver/cypress/specs/e2e/50-views/20-collections.cy.js b/t/html/pfappserver/cypress/specs/e2e/50-views/20-collections.cy.js index 3a8f0a76be42..3424e5e029eb 100644 --- a/t/html/pfappserver/cypress/specs/e2e/50-views/20-collections.cy.js +++ b/t/html/pfappserver/cypress/specs/e2e/50-views/20-collections.cy.js @@ -246,9 +246,9 @@ describe('Collections', () => { } if (PARALLEL > 1 && ((c % PARALLEL) !== SLICE)) { // parallel processing, skip slice - return it.skip(`[skipped ${c % PARALLEL}/${PARALLEL}] ${description}`, unit) + return it.skip(`[${c % PARALLEL}/${PARALLEL}: skip] ${description}`, unit) } - it(description, unit) + it(`[${c % PARALLEL}/${PARALLEL}: run] ${description}`, unit) }) }) }) From 5db7c77c3f3fbe7d027287050b488b9c74bf4c57 Mon Sep 17 00:00:00 2001 From: Darren Satkunas Date: Thu, 7 Mar 2024 13:01:46 -0800 Subject: [PATCH 62/91] rename existing scenario --- .gitlab-ci.yml | 8 ++++---- t/venom/Makefile | 12 ++++++------ t/venom/scenarios/pfappserver/site.yml | 11 ----------- .../playbooks/configure.yml | 0 .../playbooks/localdev.yml | 0 .../playbooks/rsync.yml | 0 .../playbooks/run_tests.yml | 0 t/venom/scenarios/pfappserver_configurator/site.yml | 11 +++++++++++ 8 files changed, 21 insertions(+), 21 deletions(-) delete mode 100644 t/venom/scenarios/pfappserver/site.yml rename t/venom/scenarios/{pfappserver => pfappserver_common}/playbooks/configure.yml (100%) rename t/venom/scenarios/{pfappserver => pfappserver_common}/playbooks/localdev.yml (100%) rename t/venom/scenarios/{pfappserver => pfappserver_common}/playbooks/rsync.yml (100%) rename t/venom/scenarios/{pfappserver => pfappserver_configurator}/playbooks/run_tests.yml (100%) create mode 100644 t/venom/scenarios/pfappserver_configurator/site.yml diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 134be4a50010..f77df223d99d 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,7 @@ 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: @@ -1361,7 +1361,7 @@ 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 @@ -1370,7 +1370,7 @@ pfappserver_el8_branches: - .test_script_job - .test_branches_only_rules -pfappserver_deb11_branches: +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 diff --git a/t/venom/Makefile b/t/venom/Makefile index 61b246810176..272b73c7ebb9 100644 --- a/t/venom/Makefile +++ b/t/venom/Makefile @@ -232,16 +232,16 @@ 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) example_el8: SCENARIOS_TO_RUN=example @@ -302,5 +302,5 @@ 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 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/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 From fabb5935c385fbd41a5f045b10524299943ec751 Mon Sep 17 00:00:00 2001 From: Darren Satkunas Date: Thu, 7 Mar 2024 13:22:22 -0800 Subject: [PATCH 63/91] add new scenario --- .gitlab-ci.yml | 34 +++++++++++++ .../config/cypress.config-configuration.js | 45 ++++++++++++++-- .../cypress/config/cypress.config-views.js | 51 ------------------- .../10-bases.cy.js | 0 .../20-collections.cy.js | 0 .../01-roles.cy.js | 25 +++++++++ .../specs/e2e/90-extras/01-login.cy.js | 41 +++++++++++++++ .../specs/e2e/90-extras/02-locale.cy.js | 14 +++++ .../01-roles.cy.js | 25 +++++++++ t/venom/Makefile | 14 +++++ 10 files changed, 194 insertions(+), 55 deletions(-) delete mode 100644 t/html/pfappserver/cypress/config/cypress.config-views.js rename t/html/pfappserver/cypress/specs/e2e/{50-views => 10-configuration}/10-bases.cy.js (100%) rename t/html/pfappserver/cypress/specs/e2e/{50-views => 10-configuration}/20-collections.cy.js (100%) create mode 100644 t/html/pfappserver/cypress/specs/e2e/90-configuration/40-policies-and-access-control/01-roles.cy.js create mode 100644 t/html/pfappserver/cypress/specs/e2e/90-extras/01-login.cy.js create mode 100644 t/html/pfappserver/cypress/specs/e2e/90-extras/02-locale.cy.js create mode 100644 t/html/pfappserver/cypress/specs/e2e/90-extras/40-policies-and-access-control/01-roles.cy.js diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index f77df223d99d..fb4dcd2a7453 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1212,6 +1212,22 @@ pfappserver_configurator_deb11: - .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: + - .test_job + - .test_script_job + - .test_devel_and_maintenance_rules + dot1x_eap_peap_el8: variables: VAGRANT_PF_DOTFILE_PATH: /var/local/gitlab-runner/vagrant/vagrant-${CI_JOB_NAME}-${CI_JOB_ID} @@ -1379,6 +1395,24 @@ pfappserver_configurator_deb11_branches: - .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 + extends: + - .test_job + - .test_script_job + - .test_branches_only_rules + +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 + extends: + - .test_job + - .test_script_job + - .test_branches_only_rules + dot1x_eap_peap_el8_branches: variables: VAGRANT_PF_DOTFILE_PATH: /var/local/gitlab-runner/vagrant/vagrant-${CI_JOB_NAME}-${CI_JOB_ID} diff --git a/t/html/pfappserver/cypress/config/cypress.config-configuration.js b/t/html/pfappserver/cypress/config/cypress.config-configuration.js index f1d08b219c59..de9f28167337 100644 --- a/t/html/pfappserver/cypress/config/cypress.config-configuration.js +++ b/t/html/pfappserver/cypress/config/cypress.config-configuration.js @@ -1,13 +1,50 @@ -const config = require('./cypress.config.js'); +const fs = require('fs-extra'); +const fetch = require('node-fetch'); +const base = require('./cypress.config.js'); 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.writeFile('../fixtures/runtime/maintenanceTasks.json', JSON.stringify(items.map(item => item.id), null, 2)); + await items.forEach(async item => { + await fs.writeFile(`../fixtures/runtime/maintenanceTask-${item.id}.json`, JSON.stringify(item, null, 2)); + }) + + // 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.writeFile('../fixtures/runtime/acls.json', JSON.stringify(acls, null, 2)); + }) + }); + return base.e2e.setupNodeEvents(on, config); + }, specPattern: [ 'cypress/specs/e2e/*-configuration/**/*.cy.{js,jsx,ts,tsx}', ], - } + }, }; diff --git a/t/html/pfappserver/cypress/config/cypress.config-views.js b/t/html/pfappserver/cypress/config/cypress.config-views.js deleted file mode 100644 index 76f53d5b79e8..000000000000 --- a/t/html/pfappserver/cypress/config/cypress.config-views.js +++ /dev/null @@ -1,51 +0,0 @@ -const fs = require('fs-extra'); -const fetch = require('node-fetch'); -const base = require('./cypress.config.js'); - -module.exports = { - ...base, - - 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.writeFile('../fixtures/runtime/maintenanceTasks.json', JSON.stringify(items.map(item => item.id), null, 2)); - await items.forEach(async item => { - await fs.writeFile(`../fixtures/runtime/maintenanceTask-${item.id}.json`, JSON.stringify(item, null, 2)); - }) - - // 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.writeFile('../fixtures/runtime/acls.json', JSON.stringify(acls, null, 2)); - }) - }); - return base.e2e.setupNodeEvents(on, config); - }, - - specPattern: [ -// 'cypress/specs/e2e/*-views/10*.cy.{js,jsx,ts,tsx}', - 'cypress/specs/e2e/*-views/**/*.cy.{js,jsx,ts,tsx}', - ], - }, -}; diff --git a/t/html/pfappserver/cypress/specs/e2e/50-views/10-bases.cy.js b/t/html/pfappserver/cypress/specs/e2e/10-configuration/10-bases.cy.js similarity index 100% rename from t/html/pfappserver/cypress/specs/e2e/50-views/10-bases.cy.js rename to t/html/pfappserver/cypress/specs/e2e/10-configuration/10-bases.cy.js diff --git a/t/html/pfappserver/cypress/specs/e2e/50-views/20-collections.cy.js b/t/html/pfappserver/cypress/specs/e2e/10-configuration/20-collections.cy.js similarity index 100% rename from t/html/pfappserver/cypress/specs/e2e/50-views/20-collections.cy.js rename to t/html/pfappserver/cypress/specs/e2e/10-configuration/20-collections.cy.js 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/venom/Makefile b/t/venom/Makefile index 272b73c7ebb9..99beaeb40f26 100644 --- a/t/venom/Makefile +++ b/t/venom/Makefile @@ -244,6 +244,18 @@ pfappserver_configurator_deb11: 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 example_el8: make \ @@ -304,3 +316,5 @@ security_events_deb11_branches: security_events_deb11 unit_tests_el8_branches: unit_tests_el8 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 From 8596562fdb0b15185046eee9fe99278eb4e1b65a Mon Sep 17 00:00:00 2001 From: Darren Satkunas Date: Fri, 8 Mar 2024 06:56:51 -0800 Subject: [PATCH 64/91] add missing scenario --- .../playbooks/run_tests.yml | 27 +++++++++++++++++++ .../pfappserver_configuration/site.yml | 11 ++++++++ .../pfappserver_configuration/TESTSUITE.md | 13 +++++++++ .../pfappserver_configuration/run_e2e.yml | 14 ++++++++++ 4 files changed, 65 insertions(+) create mode 100644 t/venom/scenarios/pfappserver_configuration/playbooks/run_tests.yml create mode 100644 t/venom/scenarios/pfappserver_configuration/site.yml create mode 100644 t/venom/test_suites/pfappserver_configuration/TESTSUITE.md create mode 100644 t/venom/test_suites/pfappserver_configuration/run_e2e.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..05bb2d65e4dd --- /dev/null +++ b/t/venom/scenarios/pfappserver_configuration/playbooks/run_tests.yml @@ -0,0 +1,27 @@ +--- +- hosts: pfservers + name: Run HTML pfappserver configuration tests + become: True + + vars: + test_suites: + - 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/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 From 1ad52690a8efce58b8d195164bd8baa1c62e3295 Mon Sep 17 00:00:00 2001 From: Darren Satkunas Date: Fri, 8 Mar 2024 09:32:35 -0800 Subject: [PATCH 65/91] add fs-extra --- t/html/pfappserver/package-lock.json | 33 ++++++++++++++++++++++++++++ t/html/pfappserver/package.json | 1 + 2 files changed, 34 insertions(+) diff --git a/t/html/pfappserver/package-lock.json b/t/html/pfappserver/package-lock.json index 22d2fe92f324..adaaf4878ffb 100644 --- a/t/html/pfappserver/package-lock.json +++ b/t/html/pfappserver/package-lock.json @@ -13,6 +13,7 @@ "@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" } @@ -2266,6 +2267,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/fs-extra": { + "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": ">=14.14" + } + }, "node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", @@ -2402,6 +2416,17 @@ "node": ">=6" } }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, "node_modules/loader-runner": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", @@ -2913,6 +2938,14 @@ "node": ">=4" } }, + "node_modules/universalify": { + "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" + } + }, "node_modules/update-browserslist-db": { "version": "1.0.13", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", diff --git a/t/html/pfappserver/package.json b/t/html/pfappserver/package.json index 9080493e1668..cac7c017a054 100644 --- a/t/html/pfappserver/package.json +++ b/t/html/pfappserver/package.json @@ -8,6 +8,7 @@ "@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" } From 18219bdcab2af07f492fabd2d8c2c614ed08e660 Mon Sep 17 00:00:00 2001 From: Darren Satkunas Date: Mon, 18 Mar 2024 11:06:07 -0700 Subject: [PATCH 66/91] readd fixture --- t/html/pfappserver/cypress/fixtures/configurator.js | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 t/html/pfappserver/cypress/fixtures/configurator.js diff --git a/t/html/pfappserver/cypress/fixtures/configurator.js b/t/html/pfappserver/cypress/fixtures/configurator.js new file mode 100644 index 000000000000..12782e775a1c --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/configurator.js @@ -0,0 +1,11 @@ +{ + network: { + hostname: 'packetfence.demo' + }, + administrator: { + password: 'admin' + }, + fingerbank: { + 'upstream.api_key': null + } +} From 26354994ddbb947eb40cebf566b00ae5c62fdb77 Mon Sep 17 00:00:00 2001 From: Darren Satkunas Date: Mon, 18 Mar 2024 12:09:46 -0700 Subject: [PATCH 67/91] swap params --- .../cypress/specs/e2e/00-configurator/01-configurator.cy.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) 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() From 6eac7faab6296f53d5318801e7f7b45b6a2b1e44 Mon Sep 17 00:00:00 2001 From: Darren Satkunas Date: Tue, 19 Mar 2024 11:39:52 -0700 Subject: [PATCH 68/91] mix scenarios --- .../scenarios/pfappserver_configuration/playbooks/run_tests.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/t/venom/scenarios/pfappserver_configuration/playbooks/run_tests.yml b/t/venom/scenarios/pfappserver_configuration/playbooks/run_tests.yml index 05bb2d65e4dd..81946e0beb1c 100644 --- a/t/venom/scenarios/pfappserver_configuration/playbooks/run_tests.yml +++ b/t/venom/scenarios/pfappserver_configuration/playbooks/run_tests.yml @@ -5,6 +5,7 @@ vars: test_suites: + - pfappserver_configurator - pfappserver_configuration tasks: From ce46d5cd9d4b2cdb49126557e0b6b32cb7621ef8 Mon Sep 17 00:00:00 2001 From: Darren Satkunas Date: Wed, 20 Mar 2024 07:16:48 -0700 Subject: [PATCH 69/91] adjust timeouts --- .../config/collections/modules/fingerbankMacVendors.js | 4 ++++ t/html/pfappserver/config/collections/modules/scanEngines.js | 4 ++++ t/html/pfappserver/config/collections/modules/switchGroups.js | 4 ++++ t/html/pfappserver/config/collections/modules/switches.js | 4 ++++ 4 files changed, 16 insertions(+) diff --git a/t/html/pfappserver/config/collections/modules/fingerbankMacVendors.js b/t/html/pfappserver/config/collections/modules/fingerbankMacVendors.js index 1c394c63ad71..820228895ef3 100644 --- a/t/html/pfappserver/config/collections/modules/fingerbankMacVendors.js +++ b/t/html/pfappserver/config/collections/modules/fingerbankMacVendors.js @@ -2,6 +2,7 @@ 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 timeout = 10E3; const fixture = 'collections/fingerbank/macVendor.json'; module.exports = { @@ -11,6 +12,7 @@ module.exports = { { description: 'Fingerbank MAC Vendors - Create New', scope: SCOPE_INSERT, + timeout, fixture, url: collection_url, selectors: { @@ -36,6 +38,7 @@ module.exports = { { description: 'Fingerbank MAC Vendors - Update Existing', scope: SCOPE_UPDATE, + timeout, fixture, url: resource_url, idFrom: (_, cache) => cache.id, @@ -58,6 +61,7 @@ module.exports = { { description: 'Fingerbank MAC Vendors - Delete Existing', scope: SCOPE_DELETE, + timeout, fixture, url: resource_url, idFrom: (_, cache) => cache.id, diff --git a/t/html/pfappserver/config/collections/modules/scanEngines.js b/t/html/pfappserver/config/collections/modules/scanEngines.js index 3de890edc7c3..be14d1b36ad9 100644 --- a/t/html/pfappserver/config/collections/modules/scanEngines.js +++ b/t/html/pfappserver/config/collections/modules/scanEngines.js @@ -11,12 +11,14 @@ 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`; + const timeout = 10E3; return [...tests, ...[ { description: `ScanEngines (${name}) - Create New`, scope: SCOPE_INSERT, url: collection_url, + timeout, fixture, selectors: { buttonNewSelectors: [`button[type="button"]:contains(New Scan Engine)`, `ul li a[href$="/new/${type}"]`], @@ -40,6 +42,7 @@ const tests = Object.entries(types).reduce((tests, [type, name]) => { { description: `ScanEngines (${name}) - Update Existing`, scope: SCOPE_UPDATE, + timeout, fixture, url: resource_url, interceptors: [ @@ -61,6 +64,7 @@ const tests = Object.entries(types).reduce((tests, [type, name]) => { { description: `ScanEngines (${name}) - Delete Existing`, scope: SCOPE_DELETE, + timeout, fixture, url: resource_url, interceptors: [ diff --git a/t/html/pfappserver/config/collections/modules/switchGroups.js b/t/html/pfappserver/config/collections/modules/switchGroups.js index ec8fd3c056f3..26b299ca7cac 100644 --- a/t/html/pfappserver/config/collections/modules/switchGroups.js +++ b/t/html/pfappserver/config/collections/modules/switchGroups.js @@ -2,6 +2,7 @@ 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'; +const timeout = 10E3; module.exports = { id: 'switchGroups', @@ -11,6 +12,7 @@ module.exports = { description: 'Switch Groups - Create New', scope: SCOPE_INSERT, url: collection_url, + timeout, fixture, selectors: { buttonNewSelectors: ['button[type="button"]:contains(New Switch Group)'], @@ -34,6 +36,7 @@ module.exports = { { description: 'Switch Groups - Update Existing', scope: SCOPE_UPDATE, + timeout, fixture, url: resource_url, interceptors: [ @@ -55,6 +58,7 @@ module.exports = { { description: 'Switch Groups - Delete Existing', scope: SCOPE_DELETE, + timeout, fixture, url: resource_url, interceptors: [ diff --git a/t/html/pfappserver/config/collections/modules/switches.js b/t/html/pfappserver/config/collections/modules/switches.js index 24c7f2d29987..b7d1ab6a57be 100644 --- a/t/html/pfappserver/config/collections/modules/switches.js +++ b/t/html/pfappserver/config/collections/modules/switches.js @@ -2,6 +2,7 @@ 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'; +const timeout = 10E3; module.exports = { id: 'switches', @@ -11,6 +12,7 @@ module.exports = { description: 'Switches - Create New', scope: SCOPE_INSERT, url: collection_url, + timeout, fixture, selectors: { buttonNewSelectors: ['button[type="button"]:contains(New)', 'ul li a[href]:contains(default)'], @@ -34,6 +36,7 @@ module.exports = { { description: 'Switches - Update Existing', scope: SCOPE_UPDATE, + timeout, fixture, url: resource_url, interceptors: [ @@ -55,6 +58,7 @@ module.exports = { { description: 'Switches - Delete Existing', scope: SCOPE_DELETE, + timeout, fixture, url: resource_url, interceptors: [ From eb62fa3eaaed3a5254ef2f530b3216091ce5b37b Mon Sep 17 00:00:00 2001 From: Darren Satkunas Date: Wed, 20 Mar 2024 07:17:07 -0700 Subject: [PATCH 70/91] add missing form field --- t/html/pfappserver/cypress/fixtures/collections/domain.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/t/html/pfappserver/cypress/fixtures/collections/domain.json b/t/html/pfappserver/cypress/fixtures/collections/domain.json index 05d513fc4022..3f10c0b40c18 100644 --- a/t/html/pfappserver/cypress/fixtures/collections/domain.json +++ b/t/html/pfappserver/cypress/fixtures/collections/domain.json @@ -3,5 +3,6 @@ "workgroup": "test", "dns_name": "test.local", "ad_server": "1.2.3.4", - "dns_servers": "8.8.8.8" + "dns_servers": "8.8.8.8", + "machine_account_password": "foobar" } \ No newline at end of file From 49ee4592b1d580a1170e6e9b11bff1d6ab108054 Mon Sep 17 00:00:00 2001 From: Darren Satkunas Date: Wed, 20 Mar 2024 13:14:37 -0700 Subject: [PATCH 71/91] adjust tests --- html/pfappserver/root/src/App.vue | 3 ++- .../config/collections/modules/fingerbankMacVendors.js | 2 +- t/html/pfappserver/cypress/fixtures/collections/domain.json | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/html/pfappserver/root/src/App.vue b/html/pfappserver/root/src/App.vue index b9da8a5f043d..e8781fd1411f 100644 --- a/html/pfappserver/root/src/App.vue +++ b/html/pfappserver/root/src/App.vue @@ -67,8 +67,9 @@ {{ hostname }} - + + diff --git a/t/html/pfappserver/config/collections/modules/fingerbankMacVendors.js b/t/html/pfappserver/config/collections/modules/fingerbankMacVendors.js index 820228895ef3..36c3b34578e3 100644 --- a/t/html/pfappserver/config/collections/modules/fingerbankMacVendors.js +++ b/t/html/pfappserver/config/collections/modules/fingerbankMacVendors.js @@ -2,7 +2,7 @@ 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 timeout = 10E3; +const timeout = 15E3; const fixture = 'collections/fingerbank/macVendor.json'; module.exports = { diff --git a/t/html/pfappserver/cypress/fixtures/collections/domain.json b/t/html/pfappserver/cypress/fixtures/collections/domain.json index 3f10c0b40c18..8ecccdd3f6c6 100644 --- a/t/html/pfappserver/cypress/fixtures/collections/domain.json +++ b/t/html/pfappserver/cypress/fixtures/collections/domain.json @@ -4,5 +4,5 @@ "dns_name": "test.local", "ad_server": "1.2.3.4", "dns_servers": "8.8.8.8", - "machine_account_password": "foobar" + "machine_account_password": "foobarbaz" } \ No newline at end of file From e36658a9d2f3b479b6baf05616bd66cf11acd23e Mon Sep 17 00:00:00 2001 From: Darren Satkunas Date: Mon, 25 Mar 2024 11:45:17 -0700 Subject: [PATCH 72/91] add ad_fqdn to fixtures --- t/html/pfappserver/cypress/fixtures/collections/domain.json | 1 + 1 file changed, 1 insertion(+) diff --git a/t/html/pfappserver/cypress/fixtures/collections/domain.json b/t/html/pfappserver/cypress/fixtures/collections/domain.json index 8ecccdd3f6c6..5117fe9f2ac7 100644 --- a/t/html/pfappserver/cypress/fixtures/collections/domain.json +++ b/t/html/pfappserver/cypress/fixtures/collections/domain.json @@ -3,6 +3,7 @@ "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 From 4805a85334a16b623359dc5b60b06d1eaa3ffd14 Mon Sep 17 00:00:00 2001 From: Darren Satkunas Date: Mon, 25 Mar 2024 12:15:55 -0700 Subject: [PATCH 73/91] adjust timeouts --- t/html/pfappserver/config/collections/modules/scanEngines.js | 2 +- t/html/pfappserver/config/collections/modules/securityEvents.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/t/html/pfappserver/config/collections/modules/scanEngines.js b/t/html/pfappserver/config/collections/modules/scanEngines.js index be14d1b36ad9..95b8e36c8ef4 100644 --- a/t/html/pfappserver/config/collections/modules/scanEngines.js +++ b/t/html/pfappserver/config/collections/modules/scanEngines.js @@ -11,7 +11,7 @@ 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`; - const timeout = 10E3; + const timeout = 15E3; return [...tests, ...[ { diff --git a/t/html/pfappserver/config/collections/modules/securityEvents.js b/t/html/pfappserver/config/collections/modules/securityEvents.js index 40f1110f5356..f6bc0f9ad7ce 100644 --- a/t/html/pfappserver/config/collections/modules/securityEvents.js +++ b/t/html/pfappserver/config/collections/modules/securityEvents.js @@ -2,7 +2,7 @@ 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'; -const timeout = 10E3; +const timeout = 15E3; module.exports = { id: 'securityEvents', From e860adbf986220eae905732a1acf22070b04c6ec Mon Sep 17 00:00:00 2001 From: Darren Satkunas Date: Tue, 26 Mar 2024 08:25:18 -0700 Subject: [PATCH 74/91] make timeout global --- t/html/pfappserver/config/collections/modules/adminRoles.js | 4 ---- .../config/collections/modules/connectionProfiles.js | 4 ---- t/html/pfappserver/config/collections/modules/domains.js | 4 ---- .../config/collections/modules/fingerbankMacVendors.js | 4 ---- t/html/pfappserver/config/collections/modules/firewalls.js | 2 -- .../config/collections/modules/maintenanceTasks.js | 2 -- t/html/pfappserver/config/collections/modules/pkiCas.js | 3 --- .../pfappserver/config/collections/modules/provisionings.js | 4 ---- .../pfappserver/config/collections/modules/radiusProfiles.js | 4 ---- t/html/pfappserver/config/collections/modules/scanEngines.js | 4 ---- .../pfappserver/config/collections/modules/securityEvents.js | 4 ---- t/html/pfappserver/config/collections/modules/sources.js | 3 --- t/html/pfappserver/config/collections/modules/switchGroups.js | 4 ---- t/html/pfappserver/config/collections/modules/switches.js | 4 ---- .../cypress/config/cypress.config-configuration.js | 1 + 15 files changed, 1 insertion(+), 50 deletions(-) diff --git a/t/html/pfappserver/config/collections/modules/adminRoles.js b/t/html/pfappserver/config/collections/modules/adminRoles.js index 39b9394fda78..7094fd73773a 100644 --- a/t/html/pfappserver/config/collections/modules/adminRoles.js +++ b/t/html/pfappserver/config/collections/modules/adminRoles.js @@ -3,7 +3,6 @@ const collection_url = 'configuration/admin_roles'; const resource_url = id => `/configuration/admin_role/${id}`; const fixture = 'collections/adminRole.json'; -const timeout = 10E3; const acls = require('../../../cypress/fixtures/runtime/acls.json'); const map = (value, namespace = '') => { @@ -21,7 +20,6 @@ module.exports = { description: 'Admin Roles - Create New', scope: SCOPE_INSERT, fixture, - timeout, map, url: collection_url, selectors: { @@ -47,7 +45,6 @@ module.exports = { description: 'Admin Roles - Update Existing', scope: SCOPE_UPDATE, fixture, - timeout, url: resource_url, interceptors: [ { @@ -69,7 +66,6 @@ module.exports = { description: 'Admin Roles - Delete Existing', scope: SCOPE_DELETE, fixture, - timeout, url: resource_url, interceptors: [ { diff --git a/t/html/pfappserver/config/collections/modules/connectionProfiles.js b/t/html/pfappserver/config/collections/modules/connectionProfiles.js index 43526a3767a2..baa4cab64e90 100644 --- a/t/html/pfappserver/config/collections/modules/connectionProfiles.js +++ b/t/html/pfappserver/config/collections/modules/connectionProfiles.js @@ -4,7 +4,6 @@ const resource_url = id => `/configuration/connection_profile/${id}`; const fixture = 'collections/connectionProfile.json'; const flatten = true; -const timeout = 10E3; module.exports = { id: 'connectionProfiles', @@ -16,7 +15,6 @@ module.exports = { url: collection_url, fixture, flatten, - timeout, selectors: { buttonNewSelectors: ['button[type="button"]:contains(New Connection Profile)'], }, @@ -53,7 +51,6 @@ module.exports = { scope: SCOPE_UPDATE, fixture, flatten, - timeout, url: resource_url, interceptors: [ { @@ -76,7 +73,6 @@ module.exports = { scope: SCOPE_DELETE, fixture, flatten, - timeout, url: resource_url, interceptors: [ { diff --git a/t/html/pfappserver/config/collections/modules/domains.js b/t/html/pfappserver/config/collections/modules/domains.js index 9f34f9d63414..76683d55ea13 100644 --- a/t/html/pfappserver/config/collections/modules/domains.js +++ b/t/html/pfappserver/config/collections/modules/domains.js @@ -2,7 +2,6 @@ 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 timeout = 60E3; module.exports = { id: 'domains', @@ -12,7 +11,6 @@ module.exports = { description: 'Domains - Create New', scope: SCOPE_INSERT, fixture, - timeout, url: collection_url, interceptors: [ { @@ -34,7 +32,6 @@ module.exports = { description: 'Domains - Update Existing', scope: SCOPE_UPDATE, fixture, - timeout, url: resource_url, interceptors: [ { @@ -56,7 +53,6 @@ module.exports = { description: 'Domains - Delete Existing', scope: SCOPE_DELETE, fixture, - timeout, url: resource_url, interceptors: [ { diff --git a/t/html/pfappserver/config/collections/modules/fingerbankMacVendors.js b/t/html/pfappserver/config/collections/modules/fingerbankMacVendors.js index 36c3b34578e3..1c394c63ad71 100644 --- a/t/html/pfappserver/config/collections/modules/fingerbankMacVendors.js +++ b/t/html/pfappserver/config/collections/modules/fingerbankMacVendors.js @@ -2,7 +2,6 @@ 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 timeout = 15E3; const fixture = 'collections/fingerbank/macVendor.json'; module.exports = { @@ -12,7 +11,6 @@ module.exports = { { description: 'Fingerbank MAC Vendors - Create New', scope: SCOPE_INSERT, - timeout, fixture, url: collection_url, selectors: { @@ -38,7 +36,6 @@ module.exports = { { description: 'Fingerbank MAC Vendors - Update Existing', scope: SCOPE_UPDATE, - timeout, fixture, url: resource_url, idFrom: (_, cache) => cache.id, @@ -61,7 +58,6 @@ module.exports = { { description: 'Fingerbank MAC Vendors - Delete Existing', scope: SCOPE_DELETE, - timeout, fixture, url: resource_url, idFrom: (_, cache) => cache.id, diff --git a/t/html/pfappserver/config/collections/modules/firewalls.js b/t/html/pfappserver/config/collections/modules/firewalls.js index 383b14cb36cf..2fd9f90cfdb2 100644 --- a/t/html/pfappserver/config/collections/modules/firewalls.js +++ b/t/html/pfappserver/config/collections/modules/firewalls.js @@ -1,5 +1,4 @@ const { SCOPE_INSERT, SCOPE_UPDATE, SCOPE_DELETE } = require('../config'); -const timeout = 15E3; const types = { BarracudaNG: 'BarracudaNG', @@ -87,6 +86,5 @@ const tests = Object.entries(types).reduce((tests, [type, name]) => { module.exports = { id: 'firewalls', description: 'Firewalls', - timeout, tests }; \ 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 index e4f4d0e02d57..4fffc657ceda 100644 --- a/t/html/pfappserver/config/collections/modules/maintenanceTasks.js +++ b/t/html/pfappserver/config/collections/modules/maintenanceTasks.js @@ -2,7 +2,6 @@ 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}`; -const timeout = 10E3; module.exports = { id: 'maintenaceTasks', @@ -13,7 +12,6 @@ module.exports = { description: `Maintenance Task (${id}) - Update Existing`, scope: SCOPE_UPDATE, fixture: `/runtime/maintenanceTask-${id}.json`, - timeout, url: resource_url, interceptors: [ { diff --git a/t/html/pfappserver/config/collections/modules/pkiCas.js b/t/html/pfappserver/config/collections/modules/pkiCas.js index cd4e5d013be9..207b54b0a684 100644 --- a/t/html/pfappserver/config/collections/modules/pkiCas.js +++ b/t/html/pfappserver/config/collections/modules/pkiCas.js @@ -5,7 +5,6 @@ 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 timeout = 10E3; const map = (value, namespace = '') => { if (namespace === 'country') { // remap country @@ -28,7 +27,6 @@ module.exports = { description: 'PKI Certificate Authorities - Create New', scope: SCOPE_INSERT, fixture, - timeout, map, url: collection_url, selectors: { @@ -56,7 +54,6 @@ module.exports = { description: 'PKI Certificate Authorities - Resign Existing', scope: SCOPE_DELETE, fixture, - timeout, url: resource_url, idFrom: (_, cache) => cache.ID, selectors: { diff --git a/t/html/pfappserver/config/collections/modules/provisionings.js b/t/html/pfappserver/config/collections/modules/provisionings.js index 47c76b557079..323c1492686e 100644 --- a/t/html/pfappserver/config/collections/modules/provisionings.js +++ b/t/html/pfappserver/config/collections/modules/provisionings.js @@ -1,5 +1,4 @@ const { SCOPE_INSERT, SCOPE_UPDATE, SCOPE_DELETE } = require('../config'); -const timeout = 15E3; const types = { accept: 'Accept', @@ -28,7 +27,6 @@ const tests = Object.entries(types).reduce((tests, [type, name]) => { scope: SCOPE_INSERT, url: collection_url, fixture, - timeout, selectors: { buttonNewSelectors: [`button[type="button"]:contains(New Provisioner)`, `ul li a[href$="/new/${type}"]`], }, @@ -52,7 +50,6 @@ const tests = Object.entries(types).reduce((tests, [type, name]) => { description: `Provisionings (${name}) - Update Existing`, scope: SCOPE_UPDATE, fixture, - timeout, url: resource_url, interceptors: [ { @@ -74,7 +71,6 @@ const tests = Object.entries(types).reduce((tests, [type, name]) => { description: `Provisionings (${name}) - Delete Existing`, scope: SCOPE_DELETE, fixture, - timeout, url: resource_url, interceptors: [ { diff --git a/t/html/pfappserver/config/collections/modules/radiusProfiles.js b/t/html/pfappserver/config/collections/modules/radiusProfiles.js index c7a937d0d8bd..af022ad4d033 100644 --- a/t/html/pfappserver/config/collections/modules/radiusProfiles.js +++ b/t/html/pfappserver/config/collections/modules/radiusProfiles.js @@ -6,7 +6,6 @@ const types = { // singular, 's' is appended for plural fast: 'Fast Profile', ocsp: 'OCSP Profile' }; -const timeout = 10E3; const tests = Object.entries(types).reduce((tests, [type, name]) => { @@ -20,7 +19,6 @@ const tests = Object.entries(types).reduce((tests, [type, name]) => { scope: SCOPE_INSERT, url: collection_url, fixture, - timeout, selectors: { buttonNewSelectors: [`button[type="button"]:contains(New ${name})`], tabSelector: false, @@ -45,7 +43,6 @@ const tests = Object.entries(types).reduce((tests, [type, name]) => { description: `RADIUS Profiles (${name}) - Update Existing`, scope: SCOPE_UPDATE, fixture, - timeout, url: resource_url, interceptors: [ { @@ -67,7 +64,6 @@ const tests = Object.entries(types).reduce((tests, [type, name]) => { description: `RADIUS Profiles (${name}) - Delete Existing`, scope: SCOPE_DELETE, fixture, - timeout, url: resource_url, interceptors: [ { diff --git a/t/html/pfappserver/config/collections/modules/scanEngines.js b/t/html/pfappserver/config/collections/modules/scanEngines.js index 95b8e36c8ef4..3de890edc7c3 100644 --- a/t/html/pfappserver/config/collections/modules/scanEngines.js +++ b/t/html/pfappserver/config/collections/modules/scanEngines.js @@ -11,14 +11,12 @@ 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`; - const timeout = 15E3; return [...tests, ...[ { description: `ScanEngines (${name}) - Create New`, scope: SCOPE_INSERT, url: collection_url, - timeout, fixture, selectors: { buttonNewSelectors: [`button[type="button"]:contains(New Scan Engine)`, `ul li a[href$="/new/${type}"]`], @@ -42,7 +40,6 @@ const tests = Object.entries(types).reduce((tests, [type, name]) => { { description: `ScanEngines (${name}) - Update Existing`, scope: SCOPE_UPDATE, - timeout, fixture, url: resource_url, interceptors: [ @@ -64,7 +61,6 @@ const tests = Object.entries(types).reduce((tests, [type, name]) => { { description: `ScanEngines (${name}) - Delete Existing`, scope: SCOPE_DELETE, - timeout, fixture, url: resource_url, interceptors: [ diff --git a/t/html/pfappserver/config/collections/modules/securityEvents.js b/t/html/pfappserver/config/collections/modules/securityEvents.js index f6bc0f9ad7ce..da4cf6b99083 100644 --- a/t/html/pfappserver/config/collections/modules/securityEvents.js +++ b/t/html/pfappserver/config/collections/modules/securityEvents.js @@ -2,7 +2,6 @@ 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'; -const timeout = 15E3; module.exports = { id: 'securityEvents', @@ -13,7 +12,6 @@ module.exports = { scope: SCOPE_INSERT, url: collection_url, fixture, - timeout, selectors: { buttonNewSelectors: ['button[type="button"]:contains(New)'], }, @@ -39,7 +37,6 @@ module.exports = { description: 'Security Events - Update Existing', scope: SCOPE_UPDATE, fixture, - timeout, url: resource_url, idFrom: (_, cache) => cache.id, interceptors: [ @@ -62,7 +59,6 @@ module.exports = { description: 'Security Events - Delete Existing', scope: SCOPE_DELETE, fixture, - timeout, url: resource_url, idFrom: (_, cache) => cache.id, interceptors: [ diff --git a/t/html/pfappserver/config/collections/modules/sources.js b/t/html/pfappserver/config/collections/modules/sources.js index 28ba03a796d7..ceec10307e6b 100644 --- a/t/html/pfappserver/config/collections/modules/sources.js +++ b/t/html/pfappserver/config/collections/modules/sources.js @@ -1,5 +1,4 @@ const { SCOPE_INSERT, SCOPE_UPDATE, SCOPE_DELETE } = require('../config'); -const timeout = 10E3; const typeCategories = { INTERNAL: 'Internal', @@ -64,7 +63,6 @@ const tests = types.reduce((tests, typeCategory) => { { description: `Sources (${category}/${type}) - Create New`, scope: SCOPE_INSERT, - timeout, url: collection_url, fixture, selectors: { @@ -126,6 +124,5 @@ const tests = types.reduce((tests, typeCategory) => { module.exports = { id: 'sources', description: 'Sources', - timeout, 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 index 26b299ca7cac..ec8fd3c056f3 100644 --- a/t/html/pfappserver/config/collections/modules/switchGroups.js +++ b/t/html/pfappserver/config/collections/modules/switchGroups.js @@ -2,7 +2,6 @@ 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'; -const timeout = 10E3; module.exports = { id: 'switchGroups', @@ -12,7 +11,6 @@ module.exports = { description: 'Switch Groups - Create New', scope: SCOPE_INSERT, url: collection_url, - timeout, fixture, selectors: { buttonNewSelectors: ['button[type="button"]:contains(New Switch Group)'], @@ -36,7 +34,6 @@ module.exports = { { description: 'Switch Groups - Update Existing', scope: SCOPE_UPDATE, - timeout, fixture, url: resource_url, interceptors: [ @@ -58,7 +55,6 @@ module.exports = { { description: 'Switch Groups - Delete Existing', scope: SCOPE_DELETE, - timeout, fixture, url: resource_url, interceptors: [ diff --git a/t/html/pfappserver/config/collections/modules/switches.js b/t/html/pfappserver/config/collections/modules/switches.js index b7d1ab6a57be..24c7f2d29987 100644 --- a/t/html/pfappserver/config/collections/modules/switches.js +++ b/t/html/pfappserver/config/collections/modules/switches.js @@ -2,7 +2,6 @@ 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'; -const timeout = 10E3; module.exports = { id: 'switches', @@ -12,7 +11,6 @@ module.exports = { description: 'Switches - Create New', scope: SCOPE_INSERT, url: collection_url, - timeout, fixture, selectors: { buttonNewSelectors: ['button[type="button"]:contains(New)', 'ul li a[href]:contains(default)'], @@ -36,7 +34,6 @@ module.exports = { { description: 'Switches - Update Existing', scope: SCOPE_UPDATE, - timeout, fixture, url: resource_url, interceptors: [ @@ -58,7 +55,6 @@ module.exports = { { description: 'Switches - Delete Existing', scope: SCOPE_DELETE, - timeout, fixture, url: resource_url, interceptors: [ diff --git a/t/html/pfappserver/cypress/config/cypress.config-configuration.js b/t/html/pfappserver/cypress/config/cypress.config-configuration.js index de9f28167337..058cf70033c7 100644 --- a/t/html/pfappserver/cypress/config/cypress.config-configuration.js +++ b/t/html/pfappserver/cypress/config/cypress.config-configuration.js @@ -43,6 +43,7 @@ module.exports = { return base.e2e.setupNodeEvents(on, config); }, + defaultCommandTimeout: 20E3, specPattern: [ 'cypress/specs/e2e/*-configuration/**/*.cy.{js,jsx,ts,tsx}', ], From 366a51b8e43c1c357153fc4b35b54efca897eef4 Mon Sep 17 00:00:00 2001 From: Darren Satkunas Date: Tue, 26 Mar 2024 13:00:12 -0700 Subject: [PATCH 75/91] increase timeout --- html/pfappserver/root/src/App.vue | 2 +- .../pfappserver/cypress/config/cypress.config-configuration.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/html/pfappserver/root/src/App.vue b/html/pfappserver/root/src/App.vue index e8781fd1411f..87fec558cd72 100644 --- a/html/pfappserver/root/src/App.vue +++ b/html/pfappserver/root/src/App.vue @@ -69,7 +69,7 @@ - + diff --git a/t/html/pfappserver/cypress/config/cypress.config-configuration.js b/t/html/pfappserver/cypress/config/cypress.config-configuration.js index 058cf70033c7..a523b95b5f21 100644 --- a/t/html/pfappserver/cypress/config/cypress.config-configuration.js +++ b/t/html/pfappserver/cypress/config/cypress.config-configuration.js @@ -43,7 +43,7 @@ module.exports = { return base.e2e.setupNodeEvents(on, config); }, - defaultCommandTimeout: 20E3, + defaultCommandTimeout: 60E3, specPattern: [ 'cypress/specs/e2e/*-configuration/**/*.cy.{js,jsx,ts,tsx}', ], From 125404f1e5ed7a570b906ccc04040e95be002b14 Mon Sep 17 00:00:00 2001 From: Darren Satkunas Date: Wed, 27 Mar 2024 10:45:59 -0700 Subject: [PATCH 76/91] test ad_skip --- t/html/pfappserver/config/collections/modules/domains.js | 2 ++ .../specs/e2e/10-configuration/20-collections.cy.js | 7 ++++--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/t/html/pfappserver/config/collections/modules/domains.js b/t/html/pfappserver/config/collections/modules/domains.js index 76683d55ea13..280adf851ca3 100644 --- a/t/html/pfappserver/config/collections/modules/domains.js +++ b/t/html/pfappserver/config/collections/modules/domains.js @@ -21,6 +21,8 @@ module.exports = { expect(request.body).to.have.property(key) expect(request.body[key]).to.deep.equal(fixture[key], key) }) + request.body.ad_skip = true // don't use backend AD + return request }, expectResponse: (response, fixture) => { expect(response.statusCode).to.equal(201) 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 index 3424e5e029eb..ca065c5a7885 100644 --- 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 @@ -66,15 +66,16 @@ describe('Collections', () => { 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 } - if (expectRequest) { - expectRequest(request, data, cache) // expect - } }).as(`interceptor${i}`) }) From fef2e966ce24ae4f928d18f05e44aed29ad3474e Mon Sep 17 00:00:00 2001 From: Darren Satkunas Date: Wed, 27 Mar 2024 13:05:40 -0700 Subject: [PATCH 77/91] increase request timeout --- .../pfappserver/cypress/config/cypress.config-configuration.js | 1 + 1 file changed, 1 insertion(+) diff --git a/t/html/pfappserver/cypress/config/cypress.config-configuration.js b/t/html/pfappserver/cypress/config/cypress.config-configuration.js index a523b95b5f21..3af114b0a8ad 100644 --- a/t/html/pfappserver/cypress/config/cypress.config-configuration.js +++ b/t/html/pfappserver/cypress/config/cypress.config-configuration.js @@ -44,6 +44,7 @@ module.exports = { }, defaultCommandTimeout: 60E3, + requestTimeout: 60E3, specPattern: [ 'cypress/specs/e2e/*-configuration/**/*.cy.{js,jsx,ts,tsx}', ], From dafd197a1748c6c5606989634e0491eb2eab3f12 Mon Sep 17 00:00:00 2001 From: Darren Satkunas Date: Wed, 27 Mar 2024 13:23:28 -0700 Subject: [PATCH 78/91] expect request --- t/html/pfappserver/config/collections/modules/domains.js | 4 +++- .../cypress/specs/e2e/10-configuration/20-collections.cy.js | 6 +++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/t/html/pfappserver/config/collections/modules/domains.js b/t/html/pfappserver/config/collections/modules/domains.js index 280adf851ca3..1ba8dc5f7204 100644 --- a/t/html/pfappserver/config/collections/modules/domains.js +++ b/t/html/pfappserver/config/collections/modules/domains.js @@ -21,7 +21,7 @@ module.exports = { expect(request.body).to.have.property(key) expect(request.body[key]).to.deep.equal(fixture[key], key) }) - request.body.ad_skip = true // don't use backend AD + request.body.ad_skip = true // don't use AD return request }, expectResponse: (response, fixture) => { @@ -44,6 +44,8 @@ module.exports = { expect(request.body).to.have.property(key) 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) 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 index ca065c5a7885..827b5118106c 100644 --- 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 @@ -150,8 +150,12 @@ describe('Collections', () => { // setup API interceptors interceptors.forEach((interceptor, i) => { - const { method, url, timeout = global.interceptorTimeoutMs, block } = interceptor + const { method, url, expectRequest, timeout = global.interceptorTimeoutMs, block } = interceptor cy.intercept({ method, url }, (req) => { + if (expectRequest) { + let retVal = expectRequest(request, data, cache) // expect + request = retVal || request + } if (block) { req.destroy() // block } From e4400b7617e372494eff47f6cdeb95ce27c405a5 Mon Sep 17 00:00:00 2001 From: Darren Satkunas Date: Thu, 28 Mar 2024 10:13:00 -0700 Subject: [PATCH 79/91] fix variable naming --- .../specs/e2e/10-configuration/20-collections.cy.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) 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 index 827b5118106c..6c43781c590a 100644 --- 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 @@ -151,16 +151,16 @@ describe('Collections', () => { // setup API interceptors interceptors.forEach((interceptor, i) => { const { method, url, expectRequest, timeout = global.interceptorTimeoutMs, block } = interceptor - cy.intercept({ method, url }, (req) => { + cy.intercept({ method, url }, (request) => { if (expectRequest) { let retVal = expectRequest(request, data, cache) // expect request = retVal || request } if (block) { - req.destroy() // block + request.destroy() // block } else { - req.continue() // passthrough + request.continue() // passthrough } }).as(`interceptor${i}`) }) @@ -201,12 +201,12 @@ describe('Collections', () => { // setup API interceptors interceptors.forEach((interceptor, i) => { const { method, url, timeout = global.interceptorTimeoutMs, block } = interceptor - cy.intercept({ method, url }, (req) => { + cy.intercept({ method, url }, (request) => { if (block) { - req.destroy() // block + request.destroy() // block } else { - req.continue() // passthrough + request.continue() // passthrough } }).as(`interceptor${i}`) }) From 93d1223335f6f125f995f22b73c9d0d3e9ea7880 Mon Sep 17 00:00:00 2001 From: Darren Satkunas Date: Thu, 4 Apr 2024 13:40:15 -0700 Subject: [PATCH 80/91] cleanup --- html/pfappserver/root/src/App.vue | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/html/pfappserver/root/src/App.vue b/html/pfappserver/root/src/App.vue index 87fec558cd72..c2ddb2080a9c 100644 --- a/html/pfappserver/root/src/App.vue +++ b/html/pfappserver/root/src/App.vue @@ -193,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) { @@ -200,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 From 88a59755ee9d2933bb88e74614dedd6216225e95 Mon Sep 17 00:00:00 2001 From: Darren Satkunas Date: Thu, 4 Apr 2024 13:41:15 -0700 Subject: [PATCH 81/91] fix domains --- lib/pf/UnifiedApi/Controller/Config/Domains.pm | 2 ++ t/html/pfappserver/config/collections/modules/domains.js | 8 ++++++-- 2 files changed, 8 insertions(+), 2 deletions(-) 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/config/collections/modules/domains.js b/t/html/pfappserver/config/collections/modules/domains.js index 1ba8dc5f7204..6fd276531dee 100644 --- a/t/html/pfappserver/config/collections/modules/domains.js +++ b/t/html/pfappserver/config/collections/modules/domains.js @@ -3,6 +3,8 @@ 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', @@ -21,7 +23,7 @@ module.exports = { expect(request.body).to.have.property(key) expect(request.body[key]).to.deep.equal(fixture[key], key) }) - request.body.ad_skip = true // don't use AD + request.body.ad_skip = true // skip add_computer w/ AD return request }, expectResponse: (response, fixture) => { @@ -42,7 +44,9 @@ module.exports = { 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) + 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 From e38279460ac4974568f98ab485adba00968dc639 Mon Sep 17 00:00:00 2001 From: Darren Satkunas Date: Thu, 4 Apr 2024 13:54:57 -0700 Subject: [PATCH 82/91] increase timeout --- t/html/pfappserver/config/global/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/t/html/pfappserver/config/global/index.js b/t/html/pfappserver/config/global/index.js index 3cfab565247f..91f7ff2476b8 100644 --- a/t/html/pfappserver/config/global/index.js +++ b/t/html/pfappserver/config/global/index.js @@ -1,6 +1,6 @@ const countries = require('./countries'); const url = '/admin#'; -const interceptorTimeoutMs = 10E3; +const interceptorTimeoutMs = 60E3; module.exports = { countries, From 62ad0cf44e3ba56cf03c3d939d20eea86038224f Mon Sep 17 00:00:00 2001 From: Darren Satkunas Date: Fri, 5 Apr 2024 05:51:17 -0700 Subject: [PATCH 83/91] increase browser timeout --- t/html/pfappserver/Makefile | 3 +++ 1 file changed, 3 insertions(+) diff --git a/t/html/pfappserver/Makefile b/t/html/pfappserver/Makefile index b7a434c4b01c..7dad8c23b9b3 100644 --- a/t/html/pfappserver/Makefile +++ b/t/html/pfappserver/Makefile @@ -12,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 @@ -55,6 +56,7 @@ test: 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: @@ -66,6 +68,7 @@ test-project: 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: From b6afb7fccc904aeda6f14e06c0772f1413943d46 Mon Sep 17 00:00:00 2001 From: Darren Satkunas Date: Wed, 10 Apr 2024 10:53:34 -0700 Subject: [PATCH 84/91] add broswer debug --- t/venom/lib/html_e2e.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/t/venom/lib/html_e2e.yml b/t/venom/lib/html_e2e.yml index fce96df6f1a5..d078a435de83 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:config:browser \ # Info is only returned if assertion passes info: - "{{.result.systemout}}" From eb5061afeb079e0f819f112fbcc8fe58da63676f Mon Sep 17 00:00:00 2001 From: Darren Satkunas Date: Thu, 11 Apr 2024 09:53:50 -0700 Subject: [PATCH 85/91] libgl workaround --- t/html/pfappserver/Makefile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/t/html/pfappserver/Makefile b/t/html/pfappserver/Makefile index 7dad8c23b9b3..c9b7b86e6ac3 100644 --- a/t/html/pfappserver/Makefile +++ b/t/html/pfappserver/Makefile @@ -55,6 +55,7 @@ test: DISPLAY= \ NO_COLOR=1 \ BROWSERSLIST_IGNORE_OLD_DATA=true \ + LIBGL_ALWAYS_INDIRECT=1 \ 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)] ; \ @@ -67,6 +68,7 @@ test-project: DISPLAY= \ NO_COLOR=1 \ BROWSERSLIST_IGNORE_OLD_DATA=true \ + LIBGL_ALWAYS_INDIRECT=1 \ 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)] ; \ From 062dc13a593d32bcebc0b75ecfe3a08bfe0b8fa4 Mon Sep 17 00:00:00 2001 From: Darren Satkunas Date: Fri, 12 Apr 2024 05:12:32 -0700 Subject: [PATCH 86/91] add fs flags --- t/html/pfappserver/Makefile | 2 -- .../cypress/config/cypress.config-configuration.js | 6 +++--- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/t/html/pfappserver/Makefile b/t/html/pfappserver/Makefile index c9b7b86e6ac3..7dad8c23b9b3 100644 --- a/t/html/pfappserver/Makefile +++ b/t/html/pfappserver/Makefile @@ -55,7 +55,6 @@ test: DISPLAY= \ NO_COLOR=1 \ BROWSERSLIST_IGNORE_OLD_DATA=true \ - LIBGL_ALWAYS_INDIRECT=1 \ 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)] ; \ @@ -68,7 +67,6 @@ test-project: DISPLAY= \ NO_COLOR=1 \ BROWSERSLIST_IGNORE_OLD_DATA=true \ - LIBGL_ALWAYS_INDIRECT=1 \ 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)] ; \ diff --git a/t/html/pfappserver/cypress/config/cypress.config-configuration.js b/t/html/pfappserver/cypress/config/cypress.config-configuration.js index 3af114b0a8ad..13bebaab81ac 100644 --- a/t/html/pfappserver/cypress/config/cypress.config-configuration.js +++ b/t/html/pfappserver/cypress/config/cypress.config-configuration.js @@ -22,9 +22,9 @@ module.exports = { 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.writeFile('../fixtures/runtime/maintenanceTasks.json', JSON.stringify(items.map(item => item.id), null, 2)); + await fs.writeFile('../fixtures/runtime/maintenanceTasks.json', JSON.stringify(items.map(item => item.id), null, 2), { flag: 'w+' }); await items.forEach(async item => { - await fs.writeFile(`../fixtures/runtime/maintenanceTask-${item.id}.json`, JSON.stringify(item, null, 2)); + await fs.writeFile(`../fixtures/runtime/maintenanceTask-${item.id}.json`, JSON.stringify(item, null, 2), { flag: 'w+' }); }) // get ACLs, write fixtures @@ -37,7 +37,7 @@ module.exports = { }) return acls }, {}) - await fs.writeFile('../fixtures/runtime/acls.json', JSON.stringify(acls, null, 2)); + await fs.writeFile('../fixtures/runtime/acls.json', JSON.stringify(acls, null, 2), { flag: 'w+' }); }) }); return base.e2e.setupNodeEvents(on, config); From a53eef690deb209ae61146fda091eca99b147645 Mon Sep 17 00:00:00 2001 From: Darren Satkunas Date: Fri, 12 Apr 2024 05:23:13 -0700 Subject: [PATCH 87/91] expand path --- .../cypress/config/cypress.config-configuration.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/t/html/pfappserver/cypress/config/cypress.config-configuration.js b/t/html/pfappserver/cypress/config/cypress.config-configuration.js index 13bebaab81ac..fa191eef45bc 100644 --- a/t/html/pfappserver/cypress/config/cypress.config-configuration.js +++ b/t/html/pfappserver/cypress/config/cypress.config-configuration.js @@ -1,6 +1,8 @@ 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 = { ...base, @@ -22,9 +24,9 @@ module.exports = { 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.writeFile('../fixtures/runtime/maintenanceTasks.json', JSON.stringify(items.map(item => item.id), null, 2), { flag: 'w+' }); + await fs.writeFile(`${fixturesPath}/runtime/maintenanceTasks.json`, JSON.stringify(items.map(item => item.id), null, 2), { flag: 'w+' }); await items.forEach(async item => { - await fs.writeFile(`../fixtures/runtime/maintenanceTask-${item.id}.json`, JSON.stringify(item, null, 2), { flag: 'w+' }); + await fs.writeFile(`${fixturesPath}/runtime/maintenanceTask-${item.id}.json`, JSON.stringify(item, null, 2), { flag: 'w+' }); }) // get ACLs, write fixtures @@ -37,7 +39,7 @@ module.exports = { }) return acls }, {}) - await fs.writeFile('../fixtures/runtime/acls.json', JSON.stringify(acls, null, 2), { flag: 'w+' }); + await fs.writeFile(`${fixturesPath}/runtime/acls.json', JSON.stringify(acls, null, 2), { flag: 'w+' }); }) }); return base.e2e.setupNodeEvents(on, config); From 8255c8b6fb56260bb680d6fb4eacb213c65924ce Mon Sep 17 00:00:00 2001 From: Darren Satkunas Date: Fri, 12 Apr 2024 05:29:03 -0700 Subject: [PATCH 88/91] fix typo --- .../pfappserver/cypress/config/cypress.config-configuration.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/t/html/pfappserver/cypress/config/cypress.config-configuration.js b/t/html/pfappserver/cypress/config/cypress.config-configuration.js index fa191eef45bc..e179b3f98810 100644 --- a/t/html/pfappserver/cypress/config/cypress.config-configuration.js +++ b/t/html/pfappserver/cypress/config/cypress.config-configuration.js @@ -39,7 +39,7 @@ module.exports = { }) return acls }, {}) - await fs.writeFile(`${fixturesPath}/runtime/acls.json', JSON.stringify(acls, null, 2), { flag: 'w+' }); + await fs.writeFile(`${fixturesPath}/runtime/acls.json`, JSON.stringify(acls, null, 2), { flag: 'w+' }); }) }); return base.e2e.setupNodeEvents(on, config); From b7cf92c4c8b77f05023216de538270c2588c3349 Mon Sep 17 00:00:00 2001 From: Darren Satkunas Date: Fri, 12 Apr 2024 11:11:05 -0700 Subject: [PATCH 89/91] writeJson --- .../cypress/config/cypress.config-configuration.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/t/html/pfappserver/cypress/config/cypress.config-configuration.js b/t/html/pfappserver/cypress/config/cypress.config-configuration.js index e179b3f98810..d692ec9f8d78 100644 --- a/t/html/pfappserver/cypress/config/cypress.config-configuration.js +++ b/t/html/pfappserver/cypress/config/cypress.config-configuration.js @@ -24,9 +24,9 @@ module.exports = { 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.writeFile(`${fixturesPath}/runtime/maintenanceTasks.json`, JSON.stringify(items.map(item => item.id), null, 2), { flag: 'w+' }); + await fs.writeJson(`${fixturesPath}/runtime/maintenanceTasks.json`, items.map(item => item.id), { spaces: '\t' }); await items.forEach(async item => { - await fs.writeFile(`${fixturesPath}/runtime/maintenanceTask-${item.id}.json`, JSON.stringify(item, null, 2), { flag: 'w+' }); + await fs.writeJson(`${fixturesPath}/runtime/maintenanceTask-${item.id}.json`, item, { spaces: '\t' }); }) // get ACLs, write fixtures @@ -39,7 +39,7 @@ module.exports = { }) return acls }, {}) - await fs.writeFile(`${fixturesPath}/runtime/acls.json`, JSON.stringify(acls, null, 2), { flag: 'w+' }); + await fs.writeJson(`${fixturesPath}/runtime/acls.json`, acls, { spaces: '\t' }); }) }); return base.e2e.setupNodeEvents(on, config); From a337d4134c941709cf833a66616eaaad253a689b Mon Sep 17 00:00:00 2001 From: Darren Satkunas Date: Tue, 16 Apr 2024 05:50:48 -0700 Subject: [PATCH 90/91] increase debug --- t/html/pfappserver/cypress/config/cypress.config.js | 3 --- t/venom/lib/html_e2e.yml | 2 +- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/t/html/pfappserver/cypress/config/cypress.config.js b/t/html/pfappserver/cypress/config/cypress.config.js index 85471a267d1c..eccc797c306b 100644 --- a/t/html/pfappserver/cypress/config/cypress.config.js +++ b/t/html/pfappserver/cypress/config/cypress.config.js @@ -75,7 +75,4 @@ module.exports = { // 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/venom/lib/html_e2e.yml b/t/venom/lib/html_e2e.yml index d078a435de83..156409ef0593 100644 --- a/t/venom/lib/html_e2e.yml +++ b/t/venom/lib/html_e2e.yml @@ -13,7 +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:config:browser \ + DEBUG=cypress:* \ # Info is only returned if assertion passes info: - "{{.result.systemout}}" From eeaab9e9fdd403023c3bd2bdefea60063d4562b1 Mon Sep 17 00:00:00 2001 From: Darren Satkunas Date: Tue, 28 May 2024 09:40:35 -0700 Subject: [PATCH 91/91] adjust spacing --- t/html/pfappserver/Makefile | 2 +- .../cypress/specs/e2e/10-configuration/20-collections.cy.js | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/t/html/pfappserver/Makefile b/t/html/pfappserver/Makefile index 7dad8c23b9b3..089a961733f7 100644 --- a/t/html/pfappserver/Makefile +++ b/t/html/pfappserver/Makefile @@ -46,7 +46,7 @@ install-debian: apt-get install -y firefox-esr install: - npm install -g npm + npm install -g npm npm install cypress -g --allow-root --unsafe-perm=true npm install --legacy-peer-deps 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 index 6c43781c590a..e1ce53736334 100644 --- 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 @@ -16,7 +16,8 @@ describe('Collections', () => { }) let cache = {}; collection.tests.forEach(test => { - const { description, fixture = 'empty.json', flatten: flattenFixture, scope, url, interceptors = [], selectors, timeout, + const { description, fixture = 'empty.json', flatten: flattenFixture, scope, url, interceptors = [], selectors, + timeout = 15E3, idFrom = ({ id }) => id, beforeFormFill, map = (v) => v,