diff --git a/cypress/integration/ui/accessibility.js b/cypress/integration/ui/accessibility.js deleted file mode 100644 index bb383668..00000000 --- a/cypress/integration/ui/accessibility.js +++ /dev/null @@ -1,43 +0,0 @@ -import { - visitAndApproveStorage -} from '../../support/ui-test-helper.js'; - -describe('UI - Accessibility', function () { - beforeEach(() => { - visitAndApproveStorage(); - cy.injectAxe(); - }); - // https://www.npmjs.com/package/cypress-axe - it.skip('Has no detectable a11y violations on load', () => { - // Configure aXe and test the page at initial load - cy.configureAxe({ - // Todo: Reenable when have time to fix - // See https://www.deque.com/axe/axe-for-web/documentation/api-documentation/#user-content-parameters-1 - rules: [ { - id: 'meta-viewport', - enabled: false - } ] - /* - branding: { - brand: String, - application: String - }, - reporter: 'option', - checks: [Object], - rules: [Object], - locale: Object - */ - }); - cy.checkA11y( - {}, - { - rules: { - 'label-title-only': { enabled: false }, - 'page-has-heading-one': { enabled: false }, - region: { enabled: false }, - 'scrollable-region-focusable': { enabled: false } - } - } - ); - }); -}); diff --git a/cypress/support/index.js b/cypress/support/index.js index cf57e23e..27fcdbe3 100644 --- a/cypress/support/index.js +++ b/cypress/support/index.js @@ -37,12 +37,6 @@ import '@cypress/fiddle'; */ import '@cypress/code-coverage/support.js'; -/** - * ACCESSIBILITY. - * @see https://www.npmjs.com/package/cypress-axe - */ -import 'cypress-axe'; - /***** * SNAPSHOTS * @see https://www.npmjs.com/package/cypress-plugin-snapshots diff --git a/package-lock.json b/package-lock.json index 28eeecc3..086a6f52 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,21 +1,21 @@ { "name": "svgedit", - "version": "7.0.0", + "version": "7.0.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "svgedit", - "version": "7.0.0", + "version": "7.0.1", "license": "(MIT AND Apache-2.0 AND ISC AND LGPL-3.0-or-later AND X11)", "dependencies": { "@babel/polyfill": "7.12.1", - "browser-fs-access": "^0.21.0", + "browser-fs-access": "0.21.1", "canvg": "3.0.9", "core-js": "3.19.1", "elix": "15.0.0", "html2canvas": "1.3.2", - "i18next": "21.4.0", + "i18next": "21.4.2", "jspdf": "2.4.0", "pathseg": "1.2.1", "regenerator-runtime": "0.13.9", @@ -26,7 +26,7 @@ "@babel/core": "7.16.0", "@babel/preset-env": "7.16.0", "@babel/register": "7.16.0", - "@babel/runtime-corejs3": "7.16.0", + "@babel/runtime-corejs3": "7.16.3", "@cypress/code-coverage": "3.9.11", "@cypress/fiddle": "1.19.2", "@fintechstudios/eslint-plugin-chai-as-promised": "3.1.0", @@ -36,18 +36,16 @@ "@rollup/plugin-node-resolve": "13.0.6", "@rollup/plugin-replace": "3.0.0", "@rollup/plugin-url": "6.1.0", - "@web/dev-server": "0.1.27", - "@web/dev-server-rollup": "0.3.12", - "axe-core": "4.3.5", + "@web/dev-server": "0.1.28", + "@web/dev-server-rollup": "0.3.13", "babel-plugin-transform-object-rest-spread": "7.0.0-beta.3", "copyfiles": "2.4.1", "core-js-bundle": "3.19.1", "cp-cli": "2.0.0", - "cypress": "8.7.0", - "cypress-axe": "0.13.0", + "cypress": "9.0.0", "cypress-multi-reporters": "1.5.0", "cypress-plugin-snapshots": "1.4.4", - "eslint": "8.2.0", + "eslint": "^7", "eslint-config-standard": "16.0.3", "eslint-plugin-array-func": "3.1.7", "eslint-plugin-chai-expect": "3.0.0", @@ -57,7 +55,7 @@ "eslint-plugin-cypress": "2.12.1", "eslint-plugin-eslint-comments": "3.2.0", "eslint-plugin-html": "6.2.0", - "eslint-plugin-import": "2.25.2", + "eslint-plugin-import": "2.25.3", "eslint-plugin-jsdoc": "37.0.3", "eslint-plugin-markdown": "2.2.1", "eslint-plugin-no-unsanitized": "4.0.0", @@ -77,7 +75,7 @@ "remark-cli": "10.0.0", "remark-lint-ordered-list-marker-value": "3.1.0", "rimraf": "3.0.2", - "rollup": "2.59.0", + "rollup": "2.60.0", "rollup-plugin-copy": "3.4.0", "rollup-plugin-filesize": "9.1.1", "rollup-plugin-node-polyfills": "0.2.1", @@ -208,14 +206,14 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.0.tgz", - "integrity": "sha512-S7iaOT1SYlqK0sQaCi21RX4+13hmdmnxIEAnQUB/eh7GeAnRjOUgTYpLkUOiRXzD+yog1JxP0qyAQZ7ZxVxLVg==", + "version": "7.16.3", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.3.tgz", + "integrity": "sha512-vKsoSQAyBmxS35JUOOt+07cLc6Nk/2ljLIHwmq2/NM6hdioUaqEXq/S+nXvbvXbZkNDlWOymPanJGOc4CBjSJA==", "dev": true, "dependencies": { "@babel/compat-data": "^7.16.0", "@babel/helper-validator-option": "^7.14.5", - "browserslist": "^4.16.6", + "browserslist": "^4.17.5", "semver": "^6.3.0" }, "engines": { @@ -534,13 +532,13 @@ } }, "node_modules/@babel/helpers": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.16.0.tgz", - "integrity": "sha512-dVRM0StFMdKlkt7cVcGgwD8UMaBfWJHl3A83Yfs8GQ3MO0LHIIIMvK7Fa0RGOGUQ10qikLaX6D7o5htcQWgTMQ==", + "version": "7.16.3", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.16.3.tgz", + "integrity": "sha512-Xn8IhDlBPhvYTvgewPKawhADichOsbkZuzN7qz2BusOM0brChsyXMDJvldWaYMMUNiCQdQzNEioXTp3sC8Nt8w==", "dev": true, "dependencies": { "@babel/template": "^7.16.0", - "@babel/traverse": "^7.16.0", + "@babel/traverse": "^7.16.3", "@babel/types": "^7.16.0" }, "engines": { @@ -562,9 +560,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.0.tgz", - "integrity": "sha512-TEHWXf0xxpi9wKVyBCmRcSSDjbJ/cl6LUdlbYUHEaNQUJGhreJbZrXT6sR4+fZLxVUJqNRB4KyOvjuy/D9009A==", + "version": "7.16.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.3.tgz", + "integrity": "sha512-dcNwU1O4sx57ClvLBVFbEgx0UZWfd0JQX5X6fxFRCLHelFBGXFfSz6Y0FAq2PEwUqlqLkdVjVr4VASEOuUnLJw==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -574,9 +572,9 @@ } }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.16.0", - "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.16.0.tgz", - "integrity": "sha512-djyecbGMEh4rOb/Tc1M5bUW2Ih1IZRa9PoubnPOCzM+DRE89uGUHR1Y+3aDdTMW4drjGRZ2ol8dt1JUFg6hJLQ==", + "version": "7.16.2", + "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.16.2.tgz", + "integrity": "sha512-h37CvpLSf8gb2lIJ2CgC3t+EjFbi0t8qS7LCS1xcJIlEXE4czlofwaW7W1HA8zpgOCzI9C1nmoqNR1zWkk0pQg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" @@ -1362,9 +1360,9 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.0.tgz", - "integrity": "sha512-XgnQEm1CevKROPx+udOi/8f8TiGhrUWiHiaUCIp47tE0tpFDjzXNTZc9E5CmCwxNjXTWEVqvRfWZYOTFvMa/ZQ==", + "version": "7.16.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.3.tgz", + "integrity": "sha512-3MaDpJrOXT1MZ/WCmkOFo7EtmVVC8H4EUZVrHvFOsmwkk4lOjQj8rzv8JKUZV4YoQKeoIgk07GO+acPU9IMu/w==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" @@ -1751,9 +1749,9 @@ } }, "node_modules/@babel/runtime-corejs3": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.16.0.tgz", - "integrity": "sha512-Oi2qwQ21X7/d9gn3WiwkDTJmq3TQtYNz89lRnoFy8VeZpWlsyXvzSwiRrRZ8cXluvSwqKxqHJ6dBd9Rv+p0ZGQ==", + "version": "7.16.3", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.16.3.tgz", + "integrity": "sha512-IAdDC7T0+wEB4y2gbIL0uOXEYpiZEeuFUTVbdGq+UwCcF35T/tS8KrmMomEwEc5wBbyfH3PJVpTSUqrhPDXFcQ==", "dev": true, "dependencies": { "core-js-pure": "^3.19.0", @@ -1778,9 +1776,9 @@ } }, "node_modules/@babel/traverse": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.0.tgz", - "integrity": "sha512-qQ84jIs1aRQxaGaxSysII9TuDaguZ5yVrEuC0BN2vcPlalwfLovVmCjbFDPECPXcYM/wLvNFfp8uDOliLxIoUQ==", + "version": "7.16.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.3.tgz", + "integrity": "sha512-eolumr1vVMjqevCpwVO99yN/LoGL0EyHiLO5I043aYQvwOJ9eR5UsZSClHVCzfhBduMAsSzgA/6AyqPjNayJag==", "dev": true, "dependencies": { "@babel/code-frame": "^7.16.0", @@ -1788,7 +1786,7 @@ "@babel/helper-function-name": "^7.16.0", "@babel/helper-hoist-variables": "^7.16.0", "@babel/helper-split-export-declaration": "^7.16.0", - "@babel/parser": "^7.16.0", + "@babel/parser": "^7.16.3", "@babel/types": "^7.16.0", "debug": "^4.1.0", "globals": "^11.1.0" @@ -2339,9 +2337,9 @@ "dev": true }, "node_modules/@cypress/request": { - "version": "2.88.6", - "resolved": "https://registry.npmjs.org/@cypress/request/-/request-2.88.6.tgz", - "integrity": "sha512-z0UxBE/+qaESAHY9p9sM2h8Y4XqtsbDCt0/DPOrqA/RZgKi4PkxdpXyK4wCCnSk1xHqWHZZAE+gV6aDAR6+caQ==", + "version": "2.88.7", + "resolved": "https://registry.npmjs.org/@cypress/request/-/request-2.88.7.tgz", + "integrity": "sha512-FTULIP2rnDJvZDT9t6B4nSfYR40ue19tVmv3wUcY05R9/FPCoMl1nAPJkzWzBCo7ltVn5ThQTbxiMoGBN7k0ig==", "dev": true, "dependencies": { "aws-sign2": "~0.7.0", @@ -2439,31 +2437,25 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.4.tgz", - "integrity": "sha512-h8Vx6MdxwWI2WM8/zREHMoqdgLNXEL4QX3MWSVMdyNJGvXVOs+6lp+m2hc3FnuMHDc4poxFNI20vCk0OmI4G0Q==", + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", + "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", "dev": true, "dependencies": { "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.0.0", + "debug": "^4.1.1", + "espree": "^7.3.0", "globals": "^13.9.0", "ignore": "^4.0.6", "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", + "js-yaml": "^3.13.1", "minimatch": "^3.0.4", "strip-json-comments": "^3.1.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/@eslint/eslintrc/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, "node_modules/@eslint/eslintrc/node_modules/debug": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", @@ -2481,10 +2473,24 @@ } } }, + "node_modules/@eslint/eslintrc/node_modules/espree": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "dev": true, + "dependencies": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz", - "integrity": "sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==", + "version": "13.10.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.10.0.tgz", + "integrity": "sha512-piHC3blgLGFjvOuMmWZX60f+na1lXFDhQXBf1UYp2fXPXqvEUbOhNwi6BsQ0bQishwedgnjkwv1d9zKf+MWw3g==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -2505,16 +2511,20 @@ "node": ">= 4" } }, - "node_modules/@eslint/eslintrc/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "node_modules/@eslint/eslintrc/node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, "dependencies": { - "argparse": "^2.0.1" + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/@eslint/eslintrc/node_modules/ms": { @@ -2523,6 +2533,27 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, + "node_modules/@eslint/eslintrc/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@eslint/eslintrc/node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@eslint/eslintrc/node_modules/type-fest": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", @@ -2560,9 +2591,9 @@ } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.6.0.tgz", - "integrity": "sha512-JQlEKbcgEUjBFhLIF4iqM7u/9lwgHRBcpHrmUNCALK0Q3amXN6lxdoXLnF0sm11E9VqTmBALR87IlUg1bZ8A9A==", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", + "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", "dev": true, "dependencies": { "@humanwhocodes/object-schema": "^1.2.0", @@ -2597,9 +2628,9 @@ "dev": true }, "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz", + "integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==", "dev": true }, "node_modules/@istanbuljs/load-nyc-config": { @@ -3248,9 +3279,9 @@ } }, "node_modules/@rollup/plugin-commonjs": { - "version": "18.1.0", - "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-18.1.0.tgz", - "integrity": "sha512-h3e6T9rUxVMAQswpDIobfUHn/doMzM9sgkMrsMWCFLmB84PSoC8mV8tOloAJjSRwdqhXBqstlX2BwBpHJvbhxg==", + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-18.0.0.tgz", + "integrity": "sha512-fj92shhg8luw7XbA0HowAqz90oo7qtLGwqTKbyZ8pmOyH8ui5e+u0wPEgeHLH3djcVma6gUCUrjY6w5R2o1u6g==", "dev": true, "dependencies": { "@rollup/pluginutils": "^3.1.0", @@ -3561,9 +3592,9 @@ } }, "node_modules/@types/express-serve-static-core": { - "version": "4.17.24", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.24.tgz", - "integrity": "sha512-3UJuW+Qxhzwjq3xhwXm2onQcFHn76frIYVbTu+kn24LFxI+dEhdfISDFovPB8VpEgW8oQCTpRuCe+0zJxB7NEA==", + "version": "4.17.25", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.25.tgz", + "integrity": "sha512-OUJIVfRMFijZukGGwTpKNFprqCCXk5WjNGvUgB/CxxBR40QWSjsNK86+yvGKlCOGc7sbwfHLaXhkG+NsytwBaQ==", "dev": true, "dependencies": { "@types/node": "*", @@ -3834,17 +3865,16 @@ } }, "node_modules/@web/dev-server": { - "version": "0.1.27", - "resolved": "https://registry.npmjs.org/@web/dev-server/-/dev-server-0.1.27.tgz", - "integrity": "sha512-qrmD+s3IK+KY0khCygEOnf4Cix2ISSm40A9L9s1ToLvQoZ6t9GlgEBPqGvNIhOOCkmzDbWsyoAiuiG10HZkwRQ==", + "version": "0.1.28", + "resolved": "https://registry.npmjs.org/@web/dev-server/-/dev-server-0.1.28.tgz", + "integrity": "sha512-964NqgatvFWX7LM8QGlB1XpcJoUQRXZPiEn3XKgDIUSNS6JNCjGfQQ+TfxBlT5KBHYJakDYbTk+sdEeRi2gaLw==", "dev": true, "dependencies": { "@babel/code-frame": "^7.12.11", - "@rollup/plugin-node-resolve": "^11.0.1", "@types/command-line-args": "^5.0.0", "@web/config-loader": "^0.1.3", "@web/dev-server-core": "^0.3.17", - "@web/dev-server-rollup": "^0.3.12", + "@web/dev-server-rollup": "^0.3.13", "camelcase": "^6.2.0", "command-line-args": "^5.1.1", "command-line-usage": "^6.1.1", @@ -4049,11 +4079,12 @@ } }, "node_modules/@web/dev-server-rollup": { - "version": "0.3.12", - "resolved": "https://registry.npmjs.org/@web/dev-server-rollup/-/dev-server-rollup-0.3.12.tgz", - "integrity": "sha512-nPvBAvmk5ybiUekLhaIweI/2SI+uuUL6S7PQimtjG5Ko8Bp1A00WAeVKRGydScqV4iNIxdc+bOjbyaLked96bQ==", + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@web/dev-server-rollup/-/dev-server-rollup-0.3.13.tgz", + "integrity": "sha512-QaxEtsdL6+fktIa1ZL8VEtq4U7WB7ikKEnxkbhUpFknB+WSvwx6DUrvyBDuPckunpczCnljXBFPugu+2W6N8Fg==", "dev": true, "dependencies": { + "@rollup/plugin-node-resolve": "^11.0.1", "@web/dev-server-core": "^0.3.16", "nanocolors": "^0.2.1", "parse5": "^6.0.1", @@ -4064,6 +4095,26 @@ "node": ">=10.0.0" } }, + "node_modules/@web/dev-server-rollup/node_modules/@rollup/plugin-node-resolve": { + "version": "11.2.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-11.2.1.tgz", + "integrity": "sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "^3.1.0", + "@types/resolve": "1.17.1", + "builtin-modules": "^3.1.0", + "deepmerge": "^4.2.2", + "is-module": "^1.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0" + } + }, "node_modules/@web/dev-server-rollup/node_modules/parse5": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", @@ -4113,26 +4164,6 @@ "node": ">=12" } }, - "node_modules/@web/dev-server/node_modules/@rollup/plugin-node-resolve": { - "version": "11.2.1", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-11.2.1.tgz", - "integrity": "sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==", - "dev": true, - "dependencies": { - "@rollup/pluginutils": "^3.1.0", - "@types/resolve": "1.17.1", - "builtin-modules": "^3.1.0", - "deepmerge": "^4.2.2", - "is-module": "^1.0.0", - "resolve": "^1.19.0" - }, - "engines": { - "node": ">= 10.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0" - } - }, "node_modules/@web/dev-server/node_modules/array-back": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.1.tgz", @@ -4256,9 +4287,9 @@ } }, "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", + "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", "dev": true, "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" @@ -4477,9 +4508,9 @@ } }, "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", "dev": true, "engines": { "node": ">=8" @@ -4835,15 +4866,6 @@ "integrity": "sha512-3YDiu347mtVtjpyV3u5kVqQLP242c06zwDOgpeRnybmXlYYsLbtTrUBUm8i8srONt+FWobl5aibnU1030PeeuA==", "dev": true }, - "node_modules/axe-core": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.3.5.tgz", - "integrity": "sha512-WKTW1+xAzhMS5dJsxWkliixlO/PqC4VhmO9T4juNYcaTg9jzWiJsou6m5pxWYGfigWbwzJWeFY6z47a+4neRXA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/axios": { "version": "0.21.1", "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz", @@ -5190,9 +5212,9 @@ } }, "node_modules/browser-fs-access": { - "version": "0.21.0", - "resolved": "https://registry.npmjs.org/browser-fs-access/-/browser-fs-access-0.21.0.tgz", - "integrity": "sha512-8lhipY8R/Mdm/WXmwY2VQWwddr8dVMFXS8bVX9j9OuwZT1ZxKbhuYSzAguxGN3VabtjyIM9oZxmZC8YD8EhGCQ==" + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/browser-fs-access/-/browser-fs-access-0.21.1.tgz", + "integrity": "sha512-t+1KVXoPxgbP3s8dR2mVe0cwRi7XA0Sx/XJwvh8oWsCx3QmmEjNyfnatSaGyg77yvFQc99kDxrIEJGmMLz9hXQ==" }, "node_modules/browser-pack": { "version": "6.1.0", @@ -5395,13 +5417,13 @@ } }, "node_modules/browserslist": { - "version": "4.17.5", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.17.5.tgz", - "integrity": "sha512-I3ekeB92mmpctWBoLXe0d5wPS2cBuRvvW0JyyJHMrk9/HmP2ZjrTboNAZ8iuGqaEIlKguljbQY32OkOJIRrgoA==", + "version": "4.17.6", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.17.6.tgz", + "integrity": "sha512-uPgz3vyRTlEiCv4ee9KlsKgo2V6qPk7Jsn0KAn2OBqbqKo3iNcPEC1Ti6J4dwnz+aIRfEEEuOzC9IBk8tXUomw==", "dev": true, "dependencies": { - "caniuse-lite": "^1.0.30001271", - "electron-to-chromium": "^1.3.878", + "caniuse-lite": "^1.0.30001274", + "electron-to-chromium": "^1.3.886", "escalade": "^3.1.1", "node-releases": "^2.0.1", "picocolors": "^1.0.0" @@ -5699,9 +5721,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001275", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001275.tgz", - "integrity": "sha512-ihJVvj8RX0kn9GgP43HKhb5q9s2XQn4nEQhdldEJvZhCsuiB2XOq6fAMYQZaN6FPWfsr2qU0cdL0CSbETwbJAg==", + "version": "1.0.30001280", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001280.tgz", + "integrity": "sha512-kFXwYvHe5rix25uwueBxC569o53J6TpnGu0BEEn+6Lhl2vsnAumRFWEBhDft1fwyo6m1r4i+RqA4+163FpeFcA==", "dev": true, "funding": { "type": "opencollective", @@ -6373,12 +6395,12 @@ } }, "node_modules/core-js-compat": { - "version": "3.19.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.19.0.tgz", - "integrity": "sha512-R09rKZ56ccGBebjTLZHvzDxhz93YPT37gBm6qUhnwj3Kt7aCjjZWD1injyNbyeFHxNKfeZBSyds6O9n3MKq1sw==", + "version": "3.19.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.19.1.tgz", + "integrity": "sha512-Q/VJ7jAF/y68+aUsQJ/afPOewdsGkDtcMb40J8MbuWKlK3Y+wtHq8bTHKPj2WKWLIqmS5JhHs4CzHtz6pT2W6g==", "dev": true, "dependencies": { - "browserslist": "^4.17.5", + "browserslist": "^4.17.6", "semver": "7.0.0" }, "funding": { @@ -6396,9 +6418,9 @@ } }, "node_modules/core-js-pure": { - "version": "3.19.0", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.19.0.tgz", - "integrity": "sha512-UEQk8AxyCYvNAs6baNoPqDADv7BX0AmBLGxVsrAifPPx/C8EAzV4Q+2ZUJqVzfI2TQQEZITnwUkWcHpgc/IubQ==", + "version": "3.19.1", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.19.1.tgz", + "integrity": "sha512-Q0Knr8Es84vtv62ei6/6jXH/7izKmOrtrxH9WJTHLCMAVeU+8TF8z8Nr08CsH4Ot0oJKzBzJJL9SJBYIv7WlfQ==", "dev": true, "hasInstallScript": true, "funding": { @@ -6745,13 +6767,13 @@ "dev": true }, "node_modules/cypress": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/cypress/-/cypress-8.7.0.tgz", - "integrity": "sha512-b1bMC3VQydC6sXzBMFnSqcvwc9dTZMgcaOzT0vpSD+Gq1yFc+72JDWi55sfUK5eIeNLAtWOGy1NNb6UlhMvB+Q==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cypress/-/cypress-9.0.0.tgz", + "integrity": "sha512-/93SWBZTw7BjFZ+I9S8SqkFYZx7VhedDjTtRBmXO0VzTeDbmxgK/snMJm/VFjrqk/caWbI+XY4Qr80myDMQvYg==", "dev": true, "hasInstallScript": true, "dependencies": { - "@cypress/request": "^2.88.6", + "@cypress/request": "^2.88.7", "@cypress/xvfb": "^1.2.4", "@types/node": "^14.14.31", "@types/sinonjs__fake-timers": "^6.0.2", @@ -6786,7 +6808,6 @@ "ospath": "^1.2.2", "pretty-bytes": "^5.6.0", "proxy-from-env": "1.0.0", - "ramda": "~0.27.1", "request-progress": "^3.0.0", "supports-color": "^8.1.1", "tmp": "~0.2.1", @@ -6801,19 +6822,6 @@ "node": ">=12.0.0" } }, - "node_modules/cypress-axe": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/cypress-axe/-/cypress-axe-0.13.0.tgz", - "integrity": "sha512-fCIy7RiDCm7t30U3C99gGwQrUO307EYE1QqXNaf9ToK4DVqW8y5on+0a/kUHMrHdlls2rENF6TN9ZPpPpwLrnw==", - "dev": true, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "axe-core": "^3 || ^4", - "cypress": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" - } - }, "node_modules/cypress-multi-reporters": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/cypress-multi-reporters/-/cypress-multi-reporters-1.5.0.tgz", @@ -7614,9 +7622,9 @@ "dev": true }, "node_modules/electron-to-chromium": { - "version": "1.3.886", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.886.tgz", - "integrity": "sha512-+vYdeBosI63VkCtNWnEVFjgNd/IZwvnsWkKyPtWAvrhA+XfByKoBJcbsMgudVU/bUcGAF9Xp3aXn96voWlc3oQ==", + "version": "1.3.895", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.895.tgz", + "integrity": "sha512-9Ww3fB8CWctjqHwkOt7DQbMZMpal2x2reod+/lU4b9axO1XJEDUpPMBxs7YnjLhhqpKXIIB5SRYN/B4K0QpvyQ==", "dev": true }, "node_modules/elix": { @@ -7948,36 +7956,37 @@ } }, "node_modules/eslint": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.2.0.tgz", - "integrity": "sha512-erw7XmM+CLxTOickrimJ1SiF55jiNlVSp2qqm0NuBWPtHYQCegD5ZMaW0c3i5ytPqL+SSLaCxdvQXFPLJn+ABw==", + "version": "7.32.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", + "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", "dev": true, "dependencies": { - "@eslint/eslintrc": "^1.0.4", - "@humanwhocodes/config-array": "^0.6.0", + "@babel/code-frame": "7.12.11", + "@eslint/eslintrc": "^0.4.3", + "@humanwhocodes/config-array": "^0.5.0", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", - "debug": "^4.3.2", + "debug": "^4.0.1", "doctrine": "^3.0.0", "enquirer": "^2.3.5", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^6.0.0", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.0.0", - "espree": "^9.0.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", "esquery": "^1.4.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", "functional-red-black-tree": "^1.0.1", - "glob-parent": "^6.0.1", + "glob-parent": "^5.1.2", "globals": "^13.6.0", "ignore": "^4.0.6", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", - "js-yaml": "^4.1.0", + "js-yaml": "^3.13.1", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", "lodash.merge": "^4.6.2", @@ -7985,10 +7994,11 @@ "natural-compare": "^1.4.0", "optionator": "^0.9.1", "progress": "^2.0.0", - "regexpp": "^3.2.0", + "regexpp": "^3.1.0", "semver": "^7.2.1", - "strip-ansi": "^6.0.1", + "strip-ansi": "^6.0.0", "strip-json-comments": "^3.1.0", + "table": "^6.0.9", "text-table": "^0.2.0", "v8-compile-cache": "^2.0.3" }, @@ -7996,7 +8006,7 @@ "eslint": "bin/eslint.js" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^10.12.0 || >=12.0.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -8342,9 +8352,9 @@ } }, "node_modules/eslint-plugin-import": { - "version": "2.25.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.25.2.tgz", - "integrity": "sha512-qCwQr9TYfoBHOFcVGKY9C9unq05uOxxdklmBXLVvcwo68y5Hta6/GzCZEMx2zQiu0woKNEER0LE7ZgaOfBU14g==", + "version": "2.25.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.25.3.tgz", + "integrity": "sha512-RzAVbby+72IB3iOEL8clzPLzL3wpDrlwjsTBAQXgyp5SeTqqY+0bFubwuo+y/HLhNZcXV4XqTBO4LGsfyHIDXg==", "dev": true, "dependencies": { "array-includes": "^3.1.4", @@ -8352,9 +8362,9 @@ "debug": "^2.6.9", "doctrine": "^2.1.0", "eslint-import-resolver-node": "^0.3.6", - "eslint-module-utils": "^2.7.0", + "eslint-module-utils": "^2.7.1", "has": "^1.0.3", - "is-core-module": "^2.7.0", + "is-core-module": "^2.8.0", "is-glob": "^4.0.3", "minimatch": "^3.0.4", "object.values": "^1.1.5", @@ -8522,6 +8532,15 @@ "node": ">=6" } }, + "node_modules/eslint-plugin-node/node_modules/regexpp": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", + "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/eslint-plugin-node/node_modules/semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", @@ -8549,55 +8568,6 @@ "integrity": "sha512-ZL7+QRixjTR6/528YNGyDotyffm5OQst/sGxKDwGb9Uqs4In5Egi4+jbobhqJoyoCM6/7v/1A5fhQ7ScMtDjaQ==", "dev": true }, - "node_modules/eslint-scope": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-6.0.0.tgz", - "integrity": "sha512-uRDL9MWmQCkaFus8RF5K9/L/2fn+80yoW3jkD53l4shjCh26fCtvJGasxjUqP5OT87SYTxCVA3BwTUzuELx9kA==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/eslint-scope/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^2.0.0" - }, - "engines": { - "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=5" - } - }, - "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, "node_modules/eslint-visitor-keys": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", @@ -8607,6 +8577,15 @@ "node": ">=4" } }, + "node_modules/eslint/node_modules/@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.10.4" + } + }, "node_modules/eslint/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -8619,12 +8598,6 @@ "node": ">=8" } }, - "node_modules/eslint/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, "node_modules/eslint/node_modules/chalk": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", @@ -8657,20 +8630,15 @@ "dev": true }, "node_modules/eslint/node_modules/debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", "dev": true, "dependencies": { "ms": "2.1.2" }, "engines": { "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } } }, "node_modules/eslint/node_modules/escape-string-regexp": { @@ -8685,25 +8653,103 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint/node_modules/eslint-visitor-keys": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.0.0.tgz", - "integrity": "sha512-mJOZa35trBTb3IyRmo8xmKBZlxf+N7OnUl4+ZhJHs/r+0770Wh/LEACE2pqMGMe27G/4y8P2bYGk4J70IC5k1Q==", + "node_modules/eslint/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint/node_modules/eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/eslint/node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", "dev": true, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=4" + } + }, + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz", + "integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint/node_modules/espree": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "dev": true, + "dependencies": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/eslint/node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint/node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/eslint/node_modules/esrecurse/node_modules/estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true, + "engines": { + "node": ">=4.0" } }, "node_modules/eslint/node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, "dependencies": { - "is-glob": "^4.0.3" + "is-glob": "^4.0.1" }, "engines": { - "node": ">=10.13.0" + "node": ">= 6" } }, "node_modules/eslint/node_modules/globals": { @@ -8736,16 +8782,17 @@ "node": ">= 4" } }, - "node_modules/eslint/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "node_modules/eslint/node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, "dependencies": { - "argparse": "^2.0.1" + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "engines": { + "node": ">=6" } }, "node_modules/eslint/node_modules/levn": { @@ -8793,6 +8840,24 @@ "node": ">= 0.8.0" } }, + "node_modules/eslint/node_modules/regexpp": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", + "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/eslint/node_modules/semver": { "version": "7.3.4", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", @@ -8808,6 +8873,15 @@ "node": ">=10" } }, + "node_modules/eslint/node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/eslint/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -8841,41 +8915,6 @@ "node": ">=10" } }, - "node_modules/espree": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.0.0.tgz", - "integrity": "sha512-r5EQJcYZ2oaGbeR0jR0fFVijGOcwai07/690YRXLINuhmVeRY4UKSAsQPe/0BNuDgwP7Ophoc1PRsr2E3tkbdQ==", - "dev": true, - "dependencies": { - "acorn": "^8.5.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^3.0.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/espree/node_modules/acorn": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.5.0.tgz", - "integrity": "sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.0.0.tgz", - "integrity": "sha512-mJOZa35trBTb3IyRmo8xmKBZlxf+N7OnUl4+ZhJHs/r+0770Wh/LEACE2pqMGMe27G/4y8P2bYGk4J70IC5k1Q==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, "node_modules/esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", @@ -8910,27 +8949,6 @@ "node": ">=4.0" } }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, "node_modules/estraverse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", @@ -10526,9 +10544,9 @@ } }, "node_modules/i18next": { - "version": "21.4.0", - "resolved": "https://registry.npmjs.org/i18next/-/i18next-21.4.0.tgz", - "integrity": "sha512-H8QwhJXxnPWDvRlLn3nqDvbry7PM7i3UYa0+5EHWvlVkvNNy5WJVTzZe2tZH+HnaGVAE5MaujasyOca8mbQN+w==", + "version": "21.4.2", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-21.4.2.tgz", + "integrity": "sha512-vVWsmTnZNdYHPLt01MvT5YNM2lxec2R6r5T72J89eaazp8XQnGSqA66O+a918qqmjHZGB6HHRSs02xp753he9g==", "dependencies": { "@babel/runtime": "^7.12.0" } @@ -10595,31 +10613,6 @@ "node": ">=6.9.0" } }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-fresh/node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/import-meta-resolve": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-1.1.1.tgz", @@ -11753,6 +11746,15 @@ "node": ">=10" } }, + "node_modules/jsdoc/node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/jsdom": { "version": "16.4.0", "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.4.0.tgz", @@ -12431,6 +12433,12 @@ "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", "dev": true }, + "node_modules/lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", + "dev": true + }, "node_modules/log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", @@ -14423,6 +14431,16 @@ "randombytes": "^2.1.0" } }, + "node_modules/mocha/node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, "node_modules/mocha/node_modules/supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", @@ -16354,12 +16372,6 @@ "performance-now": "^2.1.0" } }, - "node_modules/ramda": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.27.1.tgz", - "integrity": "sha512-PgIdVpn5y5Yns8vqb8FzBUEYn98V3xcPgawAkkgj0YJ0qDsnHCiNmZYfOGMgOvoB0eWFLpYbhxUR3mxfDIMvpw==", - "dev": true - }, "node_modules/randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -16578,18 +16590,6 @@ "node": ">=0.10.0" } }, - "node_modules/regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, "node_modules/regexpu-core": { "version": "4.8.0", "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.8.0.tgz", @@ -17482,6 +17482,15 @@ "node": ">=0.10.0" } }, + "node_modules/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==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/require-main-filename": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", @@ -17637,9 +17646,9 @@ } }, "node_modules/rollup": { - "version": "2.59.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.59.0.tgz", - "integrity": "sha512-l7s90JQhCQ6JyZjKgo7Lq1dKh2RxatOM+Jr6a9F7WbS9WgKbocyUSeLmZl8evAse7y96Ae98L2k1cBOwWD8nHw==", + "version": "2.60.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.60.0.tgz", + "integrity": "sha512-cHdv9GWd58v58rdseC8e8XIaPUo8a9cgZpnCMMDGZFDZKEODOiPPEQFXLriWr/TjXzhPPmG5bkAztPsOARIcGQ==", "dev": true, "bin": { "rollup": "dist/bin/rollup" @@ -19077,12 +19086,12 @@ } }, "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", "dev": true, "dependencies": { - "ansi-regex": "^5.0.1" + "ansi-regex": "^5.0.0" }, "engines": { "node": ">=8" @@ -19130,18 +19139,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/strtok3": { "version": "6.1.3", "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-6.1.3.tgz", @@ -19231,6 +19228,23 @@ "acorn-node": "^1.2.0" } }, + "node_modules/table": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/table/-/table-6.7.1.tgz", + "integrity": "sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg==", + "dev": true, + "dependencies": { + "ajv": "^8.0.1", + "lodash.clonedeep": "^4.5.0", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/table-layout": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-1.0.1.tgz", @@ -19264,6 +19278,78 @@ "node": ">=8" } }, + "node_modules/table/node_modules/ajv": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.5.0.tgz", + "integrity": "sha512-Y2l399Tt1AguU3BPRP9Fn4eN+Or+StUGWCUpbnFyXSo8NZ9S4uj+AG2pjs5apK+ZMOwYOz1+a+VKvKH7CudXgQ==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/table/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/table/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/table/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/table/node_modules/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==", + "dev": true + }, + "node_modules/table/node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, "node_modules/taffydb": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/taffydb/-/taffydb-2.6.2.tgz", @@ -21939,14 +22025,14 @@ } }, "@babel/helper-compilation-targets": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.0.tgz", - "integrity": "sha512-S7iaOT1SYlqK0sQaCi21RX4+13hmdmnxIEAnQUB/eh7GeAnRjOUgTYpLkUOiRXzD+yog1JxP0qyAQZ7ZxVxLVg==", + "version": "7.16.3", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.3.tgz", + "integrity": "sha512-vKsoSQAyBmxS35JUOOt+07cLc6Nk/2ljLIHwmq2/NM6hdioUaqEXq/S+nXvbvXbZkNDlWOymPanJGOc4CBjSJA==", "dev": true, "requires": { "@babel/compat-data": "^7.16.0", "@babel/helper-validator-option": "^7.14.5", - "browserslist": "^4.16.6", + "browserslist": "^4.17.5", "semver": "^6.3.0" }, "dependencies": { @@ -22183,13 +22269,13 @@ } }, "@babel/helpers": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.16.0.tgz", - "integrity": "sha512-dVRM0StFMdKlkt7cVcGgwD8UMaBfWJHl3A83Yfs8GQ3MO0LHIIIMvK7Fa0RGOGUQ10qikLaX6D7o5htcQWgTMQ==", + "version": "7.16.3", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.16.3.tgz", + "integrity": "sha512-Xn8IhDlBPhvYTvgewPKawhADichOsbkZuzN7qz2BusOM0brChsyXMDJvldWaYMMUNiCQdQzNEioXTp3sC8Nt8w==", "dev": true, "requires": { "@babel/template": "^7.16.0", - "@babel/traverse": "^7.16.0", + "@babel/traverse": "^7.16.3", "@babel/types": "^7.16.0" } }, @@ -22205,15 +22291,15 @@ } }, "@babel/parser": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.0.tgz", - "integrity": "sha512-TEHWXf0xxpi9wKVyBCmRcSSDjbJ/cl6LUdlbYUHEaNQUJGhreJbZrXT6sR4+fZLxVUJqNRB4KyOvjuy/D9009A==", + "version": "7.16.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.3.tgz", + "integrity": "sha512-dcNwU1O4sx57ClvLBVFbEgx0UZWfd0JQX5X6fxFRCLHelFBGXFfSz6Y0FAq2PEwUqlqLkdVjVr4VASEOuUnLJw==", "dev": true }, "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.16.0", - "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.16.0.tgz", - "integrity": "sha512-djyecbGMEh4rOb/Tc1M5bUW2Ih1IZRa9PoubnPOCzM+DRE89uGUHR1Y+3aDdTMW4drjGRZ2ol8dt1JUFg6hJLQ==", + "version": "7.16.2", + "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.16.2.tgz", + "integrity": "sha512-h37CvpLSf8gb2lIJ2CgC3t+EjFbi0t8qS7LCS1xcJIlEXE4czlofwaW7W1HA8zpgOCzI9C1nmoqNR1zWkk0pQg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.14.5" @@ -22735,9 +22821,9 @@ } }, "@babel/plugin-transform-parameters": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.0.tgz", - "integrity": "sha512-XgnQEm1CevKROPx+udOi/8f8TiGhrUWiHiaUCIp47tE0tpFDjzXNTZc9E5CmCwxNjXTWEVqvRfWZYOTFvMa/ZQ==", + "version": "7.16.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.3.tgz", + "integrity": "sha512-3MaDpJrOXT1MZ/WCmkOFo7EtmVVC8H4EUZVrHvFOsmwkk4lOjQj8rzv8JKUZV4YoQKeoIgk07GO+acPU9IMu/w==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.14.5" @@ -23041,9 +23127,9 @@ } }, "@babel/runtime-corejs3": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.16.0.tgz", - "integrity": "sha512-Oi2qwQ21X7/d9gn3WiwkDTJmq3TQtYNz89lRnoFy8VeZpWlsyXvzSwiRrRZ8cXluvSwqKxqHJ6dBd9Rv+p0ZGQ==", + "version": "7.16.3", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.16.3.tgz", + "integrity": "sha512-IAdDC7T0+wEB4y2gbIL0uOXEYpiZEeuFUTVbdGq+UwCcF35T/tS8KrmMomEwEc5wBbyfH3PJVpTSUqrhPDXFcQ==", "dev": true, "requires": { "core-js-pure": "^3.19.0", @@ -23062,9 +23148,9 @@ } }, "@babel/traverse": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.0.tgz", - "integrity": "sha512-qQ84jIs1aRQxaGaxSysII9TuDaguZ5yVrEuC0BN2vcPlalwfLovVmCjbFDPECPXcYM/wLvNFfp8uDOliLxIoUQ==", + "version": "7.16.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.3.tgz", + "integrity": "sha512-eolumr1vVMjqevCpwVO99yN/LoGL0EyHiLO5I043aYQvwOJ9eR5UsZSClHVCzfhBduMAsSzgA/6AyqPjNayJag==", "dev": true, "requires": { "@babel/code-frame": "^7.16.0", @@ -23072,7 +23158,7 @@ "@babel/helper-function-name": "^7.16.0", "@babel/helper-hoist-variables": "^7.16.0", "@babel/helper-split-export-declaration": "^7.16.0", - "@babel/parser": "^7.16.0", + "@babel/parser": "^7.16.3", "@babel/types": "^7.16.0", "debug": "^4.1.0", "globals": "^11.1.0" @@ -23575,9 +23661,9 @@ } }, "@cypress/request": { - "version": "2.88.6", - "resolved": "https://registry.npmjs.org/@cypress/request/-/request-2.88.6.tgz", - "integrity": "sha512-z0UxBE/+qaESAHY9p9sM2h8Y4XqtsbDCt0/DPOrqA/RZgKi4PkxdpXyK4wCCnSk1xHqWHZZAE+gV6aDAR6+caQ==", + "version": "2.88.7", + "resolved": "https://registry.npmjs.org/@cypress/request/-/request-2.88.7.tgz", + "integrity": "sha512-FTULIP2rnDJvZDT9t6B4nSfYR40ue19tVmv3wUcY05R9/FPCoMl1nAPJkzWzBCo7ltVn5ThQTbxiMoGBN7k0ig==", "dev": true, "requires": { "aws-sign2": "~0.7.0", @@ -23664,28 +23750,22 @@ } }, "@eslint/eslintrc": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.4.tgz", - "integrity": "sha512-h8Vx6MdxwWI2WM8/zREHMoqdgLNXEL4QX3MWSVMdyNJGvXVOs+6lp+m2hc3FnuMHDc4poxFNI20vCk0OmI4G0Q==", + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", + "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", "dev": true, "requires": { "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.0.0", + "debug": "^4.1.1", + "espree": "^7.3.0", "globals": "^13.9.0", "ignore": "^4.0.6", "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", + "js-yaml": "^3.13.1", "minimatch": "^3.0.4", "strip-json-comments": "^3.1.1" }, "dependencies": { - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, "debug": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", @@ -23695,10 +23775,21 @@ "ms": "2.1.2" } }, + "espree": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "dev": true, + "requires": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" + } + }, "globals": { - "version": "13.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz", - "integrity": "sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==", + "version": "13.10.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.10.0.tgz", + "integrity": "sha512-piHC3blgLGFjvOuMmWZX60f+na1lXFDhQXBf1UYp2fXPXqvEUbOhNwi6BsQ0bQishwedgnjkwv1d9zKf+MWw3g==", "dev": true, "requires": { "type-fest": "^0.20.2" @@ -23710,13 +23801,14 @@ "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", "dev": true }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, "requires": { - "argparse": "^2.0.1" + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" } }, "ms": { @@ -23725,6 +23817,18 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, "type-fest": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", @@ -23755,9 +23859,9 @@ } }, "@humanwhocodes/config-array": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.6.0.tgz", - "integrity": "sha512-JQlEKbcgEUjBFhLIF4iqM7u/9lwgHRBcpHrmUNCALK0Q3amXN6lxdoXLnF0sm11E9VqTmBALR87IlUg1bZ8A9A==", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", + "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", "dev": true, "requires": { "@humanwhocodes/object-schema": "^1.2.0", @@ -23783,9 +23887,9 @@ } }, "@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz", + "integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==", "dev": true }, "@istanbuljs/load-nyc-config": { @@ -24379,9 +24483,9 @@ } }, "@rollup/plugin-commonjs": { - "version": "18.1.0", - "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-18.1.0.tgz", - "integrity": "sha512-h3e6T9rUxVMAQswpDIobfUHn/doMzM9sgkMrsMWCFLmB84PSoC8mV8tOloAJjSRwdqhXBqstlX2BwBpHJvbhxg==", + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-18.0.0.tgz", + "integrity": "sha512-fj92shhg8luw7XbA0HowAqz90oo7qtLGwqTKbyZ8pmOyH8ui5e+u0wPEgeHLH3djcVma6gUCUrjY6w5R2o1u6g==", "dev": true, "requires": { "@rollup/pluginutils": "^3.1.0", @@ -24658,9 +24762,9 @@ } }, "@types/express-serve-static-core": { - "version": "4.17.24", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.24.tgz", - "integrity": "sha512-3UJuW+Qxhzwjq3xhwXm2onQcFHn76frIYVbTu+kn24LFxI+dEhdfISDFovPB8VpEgW8oQCTpRuCe+0zJxB7NEA==", + "version": "4.17.25", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.25.tgz", + "integrity": "sha512-OUJIVfRMFijZukGGwTpKNFprqCCXk5WjNGvUgB/CxxBR40QWSjsNK86+yvGKlCOGc7sbwfHLaXhkG+NsytwBaQ==", "dev": true, "requires": { "@types/node": "*", @@ -24924,17 +25028,16 @@ } }, "@web/dev-server": { - "version": "0.1.27", - "resolved": "https://registry.npmjs.org/@web/dev-server/-/dev-server-0.1.27.tgz", - "integrity": "sha512-qrmD+s3IK+KY0khCygEOnf4Cix2ISSm40A9L9s1ToLvQoZ6t9GlgEBPqGvNIhOOCkmzDbWsyoAiuiG10HZkwRQ==", + "version": "0.1.28", + "resolved": "https://registry.npmjs.org/@web/dev-server/-/dev-server-0.1.28.tgz", + "integrity": "sha512-964NqgatvFWX7LM8QGlB1XpcJoUQRXZPiEn3XKgDIUSNS6JNCjGfQQ+TfxBlT5KBHYJakDYbTk+sdEeRi2gaLw==", "dev": true, "requires": { "@babel/code-frame": "^7.12.11", - "@rollup/plugin-node-resolve": "^11.0.1", "@types/command-line-args": "^5.0.0", "@web/config-loader": "^0.1.3", "@web/dev-server-core": "^0.3.17", - "@web/dev-server-rollup": "^0.3.12", + "@web/dev-server-rollup": "^0.3.13", "camelcase": "^6.2.0", "command-line-args": "^5.1.1", "command-line-usage": "^6.1.1", @@ -24946,20 +25049,6 @@ "portfinder": "^1.0.28" }, "dependencies": { - "@rollup/plugin-node-resolve": { - "version": "11.2.1", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-11.2.1.tgz", - "integrity": "sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==", - "dev": true, - "requires": { - "@rollup/pluginutils": "^3.1.0", - "@types/resolve": "1.17.1", - "builtin-modules": "^3.1.0", - "deepmerge": "^4.2.2", - "is-module": "^1.0.0", - "resolve": "^1.19.0" - } - }, "array-back": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.1.tgz", @@ -25145,11 +25234,12 @@ } }, "@web/dev-server-rollup": { - "version": "0.3.12", - "resolved": "https://registry.npmjs.org/@web/dev-server-rollup/-/dev-server-rollup-0.3.12.tgz", - "integrity": "sha512-nPvBAvmk5ybiUekLhaIweI/2SI+uuUL6S7PQimtjG5Ko8Bp1A00WAeVKRGydScqV4iNIxdc+bOjbyaLked96bQ==", + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@web/dev-server-rollup/-/dev-server-rollup-0.3.13.tgz", + "integrity": "sha512-QaxEtsdL6+fktIa1ZL8VEtq4U7WB7ikKEnxkbhUpFknB+WSvwx6DUrvyBDuPckunpczCnljXBFPugu+2W6N8Fg==", "dev": true, "requires": { + "@rollup/plugin-node-resolve": "^11.0.1", "@web/dev-server-core": "^0.3.16", "nanocolors": "^0.2.1", "parse5": "^6.0.1", @@ -25157,6 +25247,20 @@ "whatwg-url": "^11.0.0" }, "dependencies": { + "@rollup/plugin-node-resolve": { + "version": "11.2.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-11.2.1.tgz", + "integrity": "sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==", + "dev": true, + "requires": { + "@rollup/pluginutils": "^3.1.0", + "@types/resolve": "1.17.1", + "builtin-modules": "^3.1.0", + "deepmerge": "^4.2.2", + "is-module": "^1.0.0", + "resolve": "^1.19.0" + } + }, "parse5": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", @@ -25253,9 +25357,9 @@ } }, "acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", + "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", "dev": true, "requires": {} }, @@ -25431,9 +25535,9 @@ } }, "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", "dev": true }, "ansi-styles": { @@ -25729,12 +25833,6 @@ "integrity": "sha512-3YDiu347mtVtjpyV3u5kVqQLP242c06zwDOgpeRnybmXlYYsLbtTrUBUm8i8srONt+FWobl5aibnU1030PeeuA==", "dev": true }, - "axe-core": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.3.5.tgz", - "integrity": "sha512-WKTW1+xAzhMS5dJsxWkliixlO/PqC4VhmO9T4juNYcaTg9jzWiJsou6m5pxWYGfigWbwzJWeFY6z47a+4neRXA==", - "dev": true - }, "axios": { "version": "0.21.1", "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz", @@ -26036,9 +26134,9 @@ } }, "browser-fs-access": { - "version": "0.21.0", - "resolved": "https://registry.npmjs.org/browser-fs-access/-/browser-fs-access-0.21.0.tgz", - "integrity": "sha512-8lhipY8R/Mdm/WXmwY2VQWwddr8dVMFXS8bVX9j9OuwZT1ZxKbhuYSzAguxGN3VabtjyIM9oZxmZC8YD8EhGCQ==" + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/browser-fs-access/-/browser-fs-access-0.21.1.tgz", + "integrity": "sha512-t+1KVXoPxgbP3s8dR2mVe0cwRi7XA0Sx/XJwvh8oWsCx3QmmEjNyfnatSaGyg77yvFQc99kDxrIEJGmMLz9hXQ==" }, "browser-pack": { "version": "6.1.0", @@ -26233,13 +26331,13 @@ } }, "browserslist": { - "version": "4.17.5", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.17.5.tgz", - "integrity": "sha512-I3ekeB92mmpctWBoLXe0d5wPS2cBuRvvW0JyyJHMrk9/HmP2ZjrTboNAZ8iuGqaEIlKguljbQY32OkOJIRrgoA==", + "version": "4.17.6", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.17.6.tgz", + "integrity": "sha512-uPgz3vyRTlEiCv4ee9KlsKgo2V6qPk7Jsn0KAn2OBqbqKo3iNcPEC1Ti6J4dwnz+aIRfEEEuOzC9IBk8tXUomw==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001271", - "electron-to-chromium": "^1.3.878", + "caniuse-lite": "^1.0.30001274", + "electron-to-chromium": "^1.3.886", "escalade": "^3.1.1", "node-releases": "^2.0.1", "picocolors": "^1.0.0" @@ -26461,9 +26559,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001275", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001275.tgz", - "integrity": "sha512-ihJVvj8RX0kn9GgP43HKhb5q9s2XQn4nEQhdldEJvZhCsuiB2XOq6fAMYQZaN6FPWfsr2qU0cdL0CSbETwbJAg==", + "version": "1.0.30001280", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001280.tgz", + "integrity": "sha512-kFXwYvHe5rix25uwueBxC569o53J6TpnGu0BEEn+6Lhl2vsnAumRFWEBhDft1fwyo6m1r4i+RqA4+163FpeFcA==", "dev": true }, "canvg": { @@ -27001,12 +27099,12 @@ "dev": true }, "core-js-compat": { - "version": "3.19.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.19.0.tgz", - "integrity": "sha512-R09rKZ56ccGBebjTLZHvzDxhz93YPT37gBm6qUhnwj3Kt7aCjjZWD1injyNbyeFHxNKfeZBSyds6O9n3MKq1sw==", + "version": "3.19.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.19.1.tgz", + "integrity": "sha512-Q/VJ7jAF/y68+aUsQJ/afPOewdsGkDtcMb40J8MbuWKlK3Y+wtHq8bTHKPj2WKWLIqmS5JhHs4CzHtz6pT2W6g==", "dev": true, "requires": { - "browserslist": "^4.17.5", + "browserslist": "^4.17.6", "semver": "7.0.0" }, "dependencies": { @@ -27019,9 +27117,9 @@ } }, "core-js-pure": { - "version": "3.19.0", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.19.0.tgz", - "integrity": "sha512-UEQk8AxyCYvNAs6baNoPqDADv7BX0AmBLGxVsrAifPPx/C8EAzV4Q+2ZUJqVzfI2TQQEZITnwUkWcHpgc/IubQ==", + "version": "3.19.1", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.19.1.tgz", + "integrity": "sha512-Q0Knr8Es84vtv62ei6/6jXH/7izKmOrtrxH9WJTHLCMAVeU+8TF8z8Nr08CsH4Ot0oJKzBzJJL9SJBYIv7WlfQ==", "dev": true }, "core-util-is": { @@ -27317,12 +27415,12 @@ } }, "cypress": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/cypress/-/cypress-8.7.0.tgz", - "integrity": "sha512-b1bMC3VQydC6sXzBMFnSqcvwc9dTZMgcaOzT0vpSD+Gq1yFc+72JDWi55sfUK5eIeNLAtWOGy1NNb6UlhMvB+Q==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cypress/-/cypress-9.0.0.tgz", + "integrity": "sha512-/93SWBZTw7BjFZ+I9S8SqkFYZx7VhedDjTtRBmXO0VzTeDbmxgK/snMJm/VFjrqk/caWbI+XY4Qr80myDMQvYg==", "dev": true, "requires": { - "@cypress/request": "^2.88.6", + "@cypress/request": "^2.88.7", "@cypress/xvfb": "^1.2.4", "@types/node": "^14.14.31", "@types/sinonjs__fake-timers": "^6.0.2", @@ -27357,7 +27455,6 @@ "ospath": "^1.2.2", "pretty-bytes": "^5.6.0", "proxy-from-env": "1.0.0", - "ramda": "~0.27.1", "request-progress": "^3.0.0", "supports-color": "^8.1.1", "tmp": "~0.2.1", @@ -27524,13 +27621,6 @@ } } }, - "cypress-axe": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/cypress-axe/-/cypress-axe-0.13.0.tgz", - "integrity": "sha512-fCIy7RiDCm7t30U3C99gGwQrUO307EYE1QqXNaf9ToK4DVqW8y5on+0a/kUHMrHdlls2rENF6TN9ZPpPpwLrnw==", - "dev": true, - "requires": {} - }, "cypress-multi-reporters": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/cypress-multi-reporters/-/cypress-multi-reporters-1.5.0.tgz", @@ -28013,9 +28103,9 @@ "dev": true }, "electron-to-chromium": { - "version": "1.3.886", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.886.tgz", - "integrity": "sha512-+vYdeBosI63VkCtNWnEVFjgNd/IZwvnsWkKyPtWAvrhA+XfByKoBJcbsMgudVU/bUcGAF9Xp3aXn96voWlc3oQ==", + "version": "1.3.895", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.895.tgz", + "integrity": "sha512-9Ww3fB8CWctjqHwkOt7DQbMZMpal2x2reod+/lU4b9axO1XJEDUpPMBxs7YnjLhhqpKXIIB5SRYN/B4K0QpvyQ==", "dev": true }, "elix": { @@ -28314,36 +28404,37 @@ } }, "eslint": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.2.0.tgz", - "integrity": "sha512-erw7XmM+CLxTOickrimJ1SiF55jiNlVSp2qqm0NuBWPtHYQCegD5ZMaW0c3i5ytPqL+SSLaCxdvQXFPLJn+ABw==", + "version": "7.32.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", + "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", "dev": true, "requires": { - "@eslint/eslintrc": "^1.0.4", - "@humanwhocodes/config-array": "^0.6.0", + "@babel/code-frame": "7.12.11", + "@eslint/eslintrc": "^0.4.3", + "@humanwhocodes/config-array": "^0.5.0", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", - "debug": "^4.3.2", + "debug": "^4.0.1", "doctrine": "^3.0.0", "enquirer": "^2.3.5", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^6.0.0", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.0.0", - "espree": "^9.0.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", "esquery": "^1.4.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", "functional-red-black-tree": "^1.0.1", - "glob-parent": "^6.0.1", + "glob-parent": "^5.1.2", "globals": "^13.6.0", "ignore": "^4.0.6", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", - "js-yaml": "^4.1.0", + "js-yaml": "^3.13.1", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", "lodash.merge": "^4.6.2", @@ -28351,14 +28442,24 @@ "natural-compare": "^1.4.0", "optionator": "^0.9.1", "progress": "^2.0.0", - "regexpp": "^3.2.0", + "regexpp": "^3.1.0", "semver": "^7.2.1", - "strip-ansi": "^6.0.1", + "strip-ansi": "^6.0.0", "strip-json-comments": "^3.1.0", + "table": "^6.0.9", "text-table": "^0.2.0", "v8-compile-cache": "^2.0.3" }, "dependencies": { + "@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.4" + } + }, "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -28368,12 +28469,6 @@ "color-convert": "^2.0.1" } }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, "chalk": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", @@ -28400,9 +28495,9 @@ "dev": true }, "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", "dev": true, "requires": { "ms": "2.1.2" @@ -28414,19 +28509,82 @@ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true }, - "eslint-visitor-keys": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.0.0.tgz", - "integrity": "sha512-mJOZa35trBTb3IyRmo8xmKBZlxf+N7OnUl4+ZhJHs/r+0770Wh/LEACE2pqMGMe27G/4y8P2bYGk4J70IC5k1Q==", - "dev": true - }, - "glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, "requires": { - "is-glob": "^4.0.3" + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + } + } + }, + "eslint-visitor-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz", + "integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==", + "dev": true + }, + "espree": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "dev": true, + "requires": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + } + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + } + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" } }, "globals": { @@ -28450,13 +28608,14 @@ "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", "dev": true }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, "requires": { - "argparse": "^2.0.1" + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" } }, "levn": { @@ -28495,6 +28654,18 @@ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true }, + "regexpp": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", + "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", + "dev": true + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, "semver": { "version": "7.3.4", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", @@ -28504,6 +28675,12 @@ "lru-cache": "^6.0.0" } }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -28775,9 +28952,9 @@ } }, "eslint-plugin-import": { - "version": "2.25.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.25.2.tgz", - "integrity": "sha512-qCwQr9TYfoBHOFcVGKY9C9unq05uOxxdklmBXLVvcwo68y5Hta6/GzCZEMx2zQiu0woKNEER0LE7ZgaOfBU14g==", + "version": "2.25.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.25.3.tgz", + "integrity": "sha512-RzAVbby+72IB3iOEL8clzPLzL3wpDrlwjsTBAQXgyp5SeTqqY+0bFubwuo+y/HLhNZcXV4XqTBO4LGsfyHIDXg==", "dev": true, "requires": { "array-includes": "^3.1.4", @@ -28785,9 +28962,9 @@ "debug": "^2.6.9", "doctrine": "^2.1.0", "eslint-import-resolver-node": "^0.3.6", - "eslint-module-utils": "^2.7.0", + "eslint-module-utils": "^2.7.1", "has": "^1.0.3", - "is-core-module": "^2.7.0", + "is-core-module": "^2.8.0", "is-glob": "^4.0.3", "minimatch": "^3.0.4", "object.values": "^1.1.5", @@ -28910,6 +29087,12 @@ "eslint-visitor-keys": "^1.1.0" } }, + "regexpp": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", + "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", + "dev": true + }, "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", @@ -28931,72 +29114,12 @@ "integrity": "sha512-ZL7+QRixjTR6/528YNGyDotyffm5OQst/sGxKDwGb9Uqs4In5Egi4+jbobhqJoyoCM6/7v/1A5fhQ7ScMtDjaQ==", "dev": true }, - "eslint-scope": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-6.0.0.tgz", - "integrity": "sha512-uRDL9MWmQCkaFus8RF5K9/L/2fn+80yoW3jkD53l4shjCh26fCtvJGasxjUqP5OT87SYTxCVA3BwTUzuELx9kA==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "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==", - "dev": true - } - } - }, - "eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^2.0.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true - } - } - }, "eslint-visitor-keys": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", "dev": true }, - "espree": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.0.0.tgz", - "integrity": "sha512-r5EQJcYZ2oaGbeR0jR0fFVijGOcwai07/690YRXLINuhmVeRY4UKSAsQPe/0BNuDgwP7Ophoc1PRsr2E3tkbdQ==", - "dev": true, - "requires": { - "acorn": "^8.5.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^3.0.0" - }, - "dependencies": { - "acorn": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.5.0.tgz", - "integrity": "sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q==", - "dev": true - }, - "eslint-visitor-keys": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.0.0.tgz", - "integrity": "sha512-mJOZa35trBTb3IyRmo8xmKBZlxf+N7OnUl4+ZhJHs/r+0770Wh/LEACE2pqMGMe27G/4y8P2bYGk4J70IC5k1Q==", - "dev": true - } - } - }, "esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", @@ -29020,23 +29143,6 @@ } } }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "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==", - "dev": true - } - } - }, "estraverse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", @@ -30315,9 +30421,9 @@ } }, "i18next": { - "version": "21.4.0", - "resolved": "https://registry.npmjs.org/i18next/-/i18next-21.4.0.tgz", - "integrity": "sha512-H8QwhJXxnPWDvRlLn3nqDvbry7PM7i3UYa0+5EHWvlVkvNNy5WJVTzZe2tZH+HnaGVAE5MaujasyOca8mbQN+w==", + "version": "21.4.2", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-21.4.2.tgz", + "integrity": "sha512-vVWsmTnZNdYHPLt01MvT5YNM2lxec2R6r5T72J89eaazp8XQnGSqA66O+a918qqmjHZGB6HHRSs02xp753he9g==", "requires": { "@babel/runtime": "^7.12.0" } @@ -30358,24 +30464,6 @@ "integrity": "sha512-Hiyv+mXHfFEP7LzUL/llg9RwFxxY+o9N3JVLIeG5E7iFIFAalxvRU9UZthBdYDEVnzHMgjnKJPPpay5BWf1g9g==", "dev": true }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - } - } - }, "import-meta-resolve": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-1.1.1.tgz", @@ -31266,6 +31354,12 @@ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true } } }, @@ -31840,6 +31934,12 @@ "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", "dev": true }, + "lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", + "dev": true + }, "log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", @@ -33236,6 +33336,13 @@ "randombytes": "^2.1.0" } }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "peer": true + }, "supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", @@ -34772,12 +34879,6 @@ "performance-now": "^2.1.0" } }, - "ramda": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.27.1.tgz", - "integrity": "sha512-PgIdVpn5y5Yns8vqb8FzBUEYn98V3xcPgawAkkgj0YJ0qDsnHCiNmZYfOGMgOvoB0eWFLpYbhxUR3mxfDIMvpw==", - "dev": true - }, "randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -34955,12 +35056,6 @@ "safe-regex": "^1.1.0" } }, - "regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true - }, "regexpu-core": { "version": "4.8.0", "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.8.0.tgz", @@ -35587,6 +35682,12 @@ "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", "dev": true }, + "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==", + "dev": true + }, "require-main-filename": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", @@ -35713,9 +35814,9 @@ } }, "rollup": { - "version": "2.59.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.59.0.tgz", - "integrity": "sha512-l7s90JQhCQ6JyZjKgo7Lq1dKh2RxatOM+Jr6a9F7WbS9WgKbocyUSeLmZl8evAse7y96Ae98L2k1cBOwWD8nHw==", + "version": "2.60.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.60.0.tgz", + "integrity": "sha512-cHdv9GWd58v58rdseC8e8XIaPUo8a9cgZpnCMMDGZFDZKEODOiPPEQFXLriWr/TjXzhPPmG5bkAztPsOARIcGQ==", "dev": true, "requires": { "fsevents": "~2.3.2" @@ -36948,12 +37049,12 @@ } }, "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", "dev": true, "requires": { - "ansi-regex": "^5.0.1" + "ansi-regex": "^5.0.0" } }, "strip-bom": { @@ -36983,12 +37084,6 @@ "min-indent": "^1.0.1" } }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true - }, "strtok3": { "version": "6.1.3", "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-6.1.3.tgz", @@ -37062,6 +37157,75 @@ "acorn-node": "^1.2.0" } }, + "table": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/table/-/table-6.7.1.tgz", + "integrity": "sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg==", + "dev": true, + "requires": { + "ajv": "^8.0.1", + "lodash.clonedeep": "^4.5.0", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ajv": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.5.0.tgz", + "integrity": "sha512-Y2l399Tt1AguU3BPRP9Fn4eN+Or+StUGWCUpbnFyXSo8NZ9S4uj+AG2pjs5apK+ZMOwYOz1+a+VKvKH7CudXgQ==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "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==", + "dev": true + }, + "slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + } + } + } + }, "table-layout": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-1.0.1.tgz", diff --git a/package.json b/package.json index 2b646edf..864d6cbf 100644 --- a/package.json +++ b/package.json @@ -1,9 +1,9 @@ { "name": "svgedit", - "version": "7.0.0", + "version": "7.0.1", "description": "Powerful SVG-Editor for your browser ", - "main": "dist/editor/Editor.js", - "module": "dist/editor/Editor.js", + "main": "dist/Editor.js", + "module": "dist/Editor.js", "directories": { "doc": "docs", "example": "examples", @@ -57,7 +57,7 @@ "Fabien Jacq", "OptimistikSAS" ], - "license": "MIT", + "license": "(MIT AND Apache-2.0 AND ISC AND LGPL-3.0-or-later AND X11)", "bugs": { "url": "https://github.com/SVG-Edit/svgedit/issues" }, @@ -69,12 +69,12 @@ ], "dependencies": { "@babel/polyfill": "7.12.1", - "browser-fs-access": "^0.21.0", + "browser-fs-access": "0.21.1", "canvg": "3.0.9", "core-js": "3.19.1", "elix": "15.0.0", "html2canvas": "1.3.2", - "i18next": "21.4.0", + "i18next": "21.4.2", "jspdf": "2.4.0", "pathseg": "1.2.1", "regenerator-runtime": "0.13.9", @@ -85,7 +85,7 @@ "@babel/core": "7.16.0", "@babel/preset-env": "7.16.0", "@babel/register": "7.16.0", - "@babel/runtime-corejs3": "7.16.0", + "@babel/runtime-corejs3": "7.16.3", "@cypress/code-coverage": "3.9.11", "@cypress/fiddle": "1.19.2", "@fintechstudios/eslint-plugin-chai-as-promised": "3.1.0", @@ -95,18 +95,16 @@ "@rollup/plugin-node-resolve": "13.0.6", "@rollup/plugin-replace": "3.0.0", "@rollup/plugin-url": "6.1.0", - "@web/dev-server": "0.1.27", - "@web/dev-server-rollup": "0.3.12", - "axe-core": "4.3.5", + "@web/dev-server": "0.1.28", + "@web/dev-server-rollup": "0.3.13", "babel-plugin-transform-object-rest-spread": "7.0.0-beta.3", "copyfiles": "2.4.1", "core-js-bundle": "3.19.1", "cp-cli": "2.0.0", - "cypress": "8.7.0", - "cypress-axe": "0.13.0", + "cypress": "9.0.0", "cypress-multi-reporters": "1.5.0", "cypress-plugin-snapshots": "1.4.4", - "eslint": "8.2.0", + "eslint": "^7", "eslint-config-standard": "16.0.3", "eslint-plugin-array-func": "3.1.7", "eslint-plugin-chai-expect": "3.0.0", @@ -116,7 +114,7 @@ "eslint-plugin-cypress": "2.12.1", "eslint-plugin-eslint-comments": "3.2.0", "eslint-plugin-html": "6.2.0", - "eslint-plugin-import": "2.25.2", + "eslint-plugin-import": "2.25.3", "eslint-plugin-jsdoc": "37.0.3", "eslint-plugin-markdown": "2.2.1", "eslint-plugin-no-unsanitized": "4.0.0", @@ -136,7 +134,7 @@ "remark-cli": "10.0.0", "remark-lint-ordered-list-marker-value": "3.1.0", "rimraf": "3.0.2", - "rollup": "2.59.0", + "rollup": "2.60.0", "rollup-plugin-copy": "3.4.0", "rollup-plugin-filesize": "9.1.1", "rollup-plugin-node-polyfills": "0.2.1", diff --git a/src/common/browser.js b/src/common/browser.js index 2cc67ba4..00e3b4b7 100644 --- a/src/common/browser.js +++ b/src/common/browser.js @@ -37,29 +37,6 @@ const supportsGoodTextCharPos_ = (function () { } }()); -// Support for correct bbox sizing on groups with horizontal/vertical lines -const supportsHVLineContainerBBox_ = (function () { - const svgcontent = document.createElementNS(NSSVG, 'svg'); - document.documentElement.append(svgcontent); - const path = document.createElementNS(NSSVG, 'path'); - path.setAttribute('d', 'M0,0 10,0'); - const path2 = document.createElementNS(NSSVG, 'path'); - path2.setAttribute('d', 'M5,0 15,0'); - const g = document.createElementNS(NSSVG, 'g'); - g.append(path, path2); - svgcontent.append(g); - const bbox = g.getBBox(); - svgcontent.remove(); - // Webkit gives 0, FF gives 10, Opera (correctly) gives 15 - return (bbox.width === 15); -}()); - -const supportsNonScalingStroke_ = (function () { - const rect = document.createElementNS(NSSVG, 'rect'); - rect.setAttribute('style', 'vector-effect:non-scaling-stroke'); - return rect.style.vectorEffect === 'non-scaling-stroke'; -}()); - // Public API /** @@ -89,21 +66,8 @@ export const isMac = () => isMac_; */ export const isTouch = () => isTouch_; -/** - * @function module:browser.supportsHVLineContainerBBox - * @returns {boolean} -*/ -export const supportsHVLineContainerBBox = () => supportsHVLineContainerBBox_; - /** * @function module:browser.supportsGoodTextCharPos * @returns {boolean} */ export const supportsGoodTextCharPos = () => supportsGoodTextCharPos_; - -/** -* @function module:browser.supportsNonScalingStroke -* @returns {boolean} -*/ -export const supportsNonScalingStroke = () => supportsNonScalingStroke_; - diff --git a/src/common/units.js b/src/common/units.js index 1ea24e56..e47eb923 100644 --- a/src/common/units.js +++ b/src/common/units.js @@ -11,20 +11,7 @@ const NSSVG = 'http://www.w3.org/2000/svg'; const wAttrs = [ 'x', 'x1', 'cx', 'rx', 'width' ]; const hAttrs = [ 'y', 'y1', 'cy', 'ry', 'height' ]; const unitAttrs = [ 'r', 'radius', ...wAttrs, ...hAttrs ]; -// unused -/* -const unitNumMap = { - '%': 2, - em: 3, - ex: 4, - px: 5, - cm: 6, - mm: 7, - in: 8, - pt: 9, - pc: 10 -}; -*/ + // Container of elements. let elementContainer_; diff --git a/src/editor/ConfigObj.js b/src/editor/ConfigObj.js index 30770d03..f5400d78 100644 --- a/src/editor/ConfigObj.js +++ b/src/editor/ConfigObj.js @@ -175,8 +175,9 @@ export default class ConfigObj { 'ext-eyedropper', 'ext-grid', 'ext-imagelib', + // 'ext-arrows', 'ext-markers', - 'ext-overview_window', + // 'ext-overview_window', disabled until we fix performance issue 'ext-panning', 'ext-shapes', 'ext-polystar', diff --git a/src/svgcanvas/event.js b/src/svgcanvas/event.js index 7b343f43..44067be3 100644 --- a/src/svgcanvas/event.js +++ b/src/svgcanvas/event.js @@ -6,7 +6,7 @@ */ import { assignAttributes, cleanupElement, getElem, getRotationAngle, snapToGrid, walkTree, - getBBox as utilsGetBBox, isNullish, preventClickDefault, setHref + isNullish, preventClickDefault, setHref, getBBox } from './utilities.js'; import { convertAttrs @@ -14,7 +14,6 @@ import { import { transformPoint, hasMatrixTransform, getMatrix, snapToAngle } from './math.js'; -import { supportsNonScalingStroke } from '../common/browser.js'; import * as draw from './draw.js'; import * as pathModule from './path.js'; import * as hstry from './history.js'; @@ -79,7 +78,7 @@ export const getBsplinePoint = function (t) { * @returns {void} */ export const mouseMoveEvent = function (evt) { - const selectedElements = eventContext_.getSelectedElements; + const selectedElements = eventContext_.getSelectedElements(); const currentZoom = eventContext_.getCurrentZoom(); const svgRoot = eventContext_.getSVGRoot(); const svgCanvas = eventContext_.getCanvas(); @@ -96,7 +95,7 @@ export const mouseMoveEvent = function (evt) { let len; let angle; let box; - let selected = selectedElements()[0]; + let selected = selectedElements[0]; const pt = transformPoint(evt.clientX, evt.clientY, eventContext_.getrootSctm()); const mouseX = pt.x * currentZoom; const mouseY = pt.y * currentZoom; @@ -119,7 +118,7 @@ export const mouseMoveEvent = function (evt) { // we temporarily use a translate on the element(s) being dragged // this transform is removed upon mousing up and the element is // relocated to the new location - if (selectedElements()[0] !== null) { + if (selectedElements[0] !== null) { dx = x - eventContext_.getStartX(); dy = y - eventContext_.getStartY(); if (eventContext_.getCurConfig().gridSnapping) { @@ -128,16 +127,10 @@ export const mouseMoveEvent = function (evt) { } if (dx !== 0 || dy !== 0) { - len = selectedElements().length; + len = selectedElements.length; for (i = 0; i < len; ++i) { - selected = selectedElements()[i]; + selected = selectedElements[i]; if (isNullish(selected)) { break; } - // if (i === 0) { - // const box = utilsGetBBox(selected); - // selectedBBoxes[i].x = box.x + dx; - // selectedBBoxes[i].y = box.y + dy; - // } - // update the dummy transform in our transform list // to be a translate const xform = svgRoot.createSVGTransform(); @@ -157,7 +150,7 @@ export const mouseMoveEvent = function (evt) { svgCanvas.selectorManager.requestSelector(selected).resize(); } - svgCanvas.call('transition', selectedElements()); + svgCanvas.call('transition', selectedElements); } } break; @@ -175,7 +168,7 @@ export const mouseMoveEvent = function (evt) { // - if newList contains selected, do nothing // - if newList doesn't contain selected, remove it from selected // - for any newList that was not in selectedElements, add it to selected - const elemsToRemove = selectedElements().slice(); const elemsToAdd = []; + const elemsToRemove = selectedElements.slice(); const elemsToAdd = []; const newList = eventContext_.getIntersectionList(); // For every element in the intersection, add if not present in selectedElements. @@ -183,7 +176,7 @@ export const mouseMoveEvent = function (evt) { for (i = 0; i < len; ++i) { const intElem = newList[i]; // Found an element that was not selected before, so we should add it. - if (!selectedElements().includes(intElem)) { + if (!selectedElements.includes(intElem)) { elemsToAdd.push(intElem); } // Found an element that was already selected, so we shouldn't remove it. @@ -208,7 +201,7 @@ export const mouseMoveEvent = function (evt) { // the shape's coordinates tlist = selected.transform.baseVal; const hasMatrix = hasMatrixTransform(tlist); - box = hasMatrix ? eventContext_.getInitBbox() : utilsGetBBox(selected); + box = hasMatrix ? eventContext_.getInitBbox() : getBBox(selected); let left = box.x; let top = box.y; let { width, height } = box; @@ -290,7 +283,7 @@ export const mouseMoveEvent = function (evt) { } svgCanvas.selectorManager.requestSelector(selected).resize(); - svgCanvas.call('transition', selectedElements()); + svgCanvas.call('transition', selectedElements); break; } case 'zoom': { @@ -485,7 +478,7 @@ export const mouseMoveEvent = function (evt) { break; } case 'rotate': { - box = utilsGetBBox(selected); + box = getBBox(selected); cx = box.x + box.width / 2; cy = box.y + box.height / 2; const m = getMatrix(selected); @@ -502,7 +495,7 @@ export const mouseMoveEvent = function (evt) { } svgCanvas.setRotationAngle(angle < -180 ? (360 + angle) : angle, true); - svgCanvas.call('transition', selectedElements()); + svgCanvas.call('transition', selectedElements); break; } default: break; @@ -579,16 +572,16 @@ export const mouseUpEvent = function (evt) { // intentionally fall-through to select here case 'resize': case 'multiselect': - if (!isNullish(eventContext_.getRubberBox())) { + if (eventContext_.getRubberBox()) { eventContext_.getRubberBox().setAttribute('display', 'none'); eventContext_.setCurBBoxes([]); } eventContext_.setCurrentMode('select'); // Fallthrough case 'select': - if (!isNullish(selectedElements[0])) { + if (selectedElements[0]) { // if we only have one selected element - if (isNullish(selectedElements[1])) { + if (!selectedElements[1]) { // set our current stroke/fill properties to the element's const selected = selectedElements[0]; switch (selected.tagName) { @@ -613,9 +606,6 @@ export const mouseUpEvent = function (evt) { eventContext_.setCurText('font_family', selected.getAttribute('font-family')); } svgCanvas.selectorManager.requestSelector(selected).showGrips(true); - - // This shouldn't be necessary as it was done on mouseDown... - // svgCanvas.call('selected', [selected]); } // always recalculate dimensions to strip off stray identity transforms svgCanvas.recalculateAllSelectedDimensions(); @@ -624,10 +614,6 @@ export const mouseUpEvent = function (evt) { const len = selectedElements.length; for (let i = 0; i < len; ++i) { if (isNullish(selectedElements[i])) { break; } - if (!selectedElements[i].firstChild) { - // Not needed for groups (incorrectly resizes elems), possibly not needed at all? - svgCanvas.selectorManager.requestSelector(selectedElements[i]).resize(); - } } // no change in position/size, so maybe we should move to pathedit } else { @@ -642,15 +628,14 @@ export const mouseUpEvent = function (evt) { } // no change in mouse position // Remove non-scaling stroke - if (supportsNonScalingStroke()) { - const elem = selectedElements[0]; - if (elem) { - elem.removeAttribute('style'); - walkTree(elem, function (el) { - el.removeAttribute('style'); - }); - } + const elem = selectedElements[0]; + if (elem) { + elem.removeAttribute('style'); + walkTree(elem, function (el) { + el.removeAttribute('style'); + }); } + } return; case 'zoom': { @@ -823,7 +808,7 @@ export const mouseUpEvent = function (evt) { // if this element is in a group, go up until we reach the top-level group // just below the layer groups // TODO: once we implement links, we also would have to check for elements - while (t && t.parentNode && t.parentNode.parentNode && t.parentNode.parentNode.tagName === 'g') { + while (t?.parentNode?.parentNode?.tagName === 'g') { t = t.parentNode; } // if we are not in the middle of creating a path, and we've clicked on some shape, @@ -1089,7 +1074,7 @@ export const mouseDownEvent = function (evt) { // Getting the BBox from the selection box, since we know we // want to orient around it - eventContext_.setInitBbox(utilsGetBBox($id('selectedBox0'))); + eventContext_.setInitBbox(getBBox($id('selectedBox0'))); const bb = {}; for (const [ key, val ] of Object.entries(eventContext_.getInitBbox())) { bb[key] = val / currentZoom; diff --git a/src/svgcanvas/history.js b/src/svgcanvas/history.js index 6e0b5310..3ada9d9e 100644 --- a/src/svgcanvas/history.js +++ b/src/svgcanvas/history.js @@ -6,7 +6,7 @@ * @copyright 2010 Jeff Schiller */ -import { getHref, setHref, getRotationAngle, isNullish } from './utilities.js'; +import { getHref, setHref, getRotationAngle, isNullish, getBBox } from './utilities.js'; /** * Group: Undo/Redo history management. @@ -330,7 +330,7 @@ export class ChangeElementCommand extends Command { if (!bChangedTransform) { const angle = getRotationAngle(this.elem); if (angle) { - const bbox = this.elem.getBBox(); + const bbox = getBBox(this.elem); const cx = bbox.x + bbox.width / 2; const cy = bbox.y + bbox.height / 2; const rotate = [ 'rotate(', angle, ' ', cx, ',', cy, ')' ].join(''); @@ -371,7 +371,7 @@ export class ChangeElementCommand extends Command { if (!bChangedTransform) { const angle = getRotationAngle(this.elem); if (angle) { - const bbox = this.elem.getBBox(); + const bbox = getBBox(this.elem); const cx = bbox.x + bbox.width / 2; const cy = bbox.y + bbox.height / 2; const rotate = [ 'rotate(', angle, ' ', cx, ',', cy, ')' ].join(''); diff --git a/src/svgcanvas/math.js b/src/svgcanvas/math.js index e6b8436e..63736732 100644 --- a/src/svgcanvas/math.js +++ b/src/svgcanvas/math.js @@ -176,7 +176,7 @@ export const transformListToTransform = function (tlist, min, max) { * @param {Element} elem - The DOM element to check * @returns {SVGMatrix} The matrix object associated with the element's transformlist */ -export const getMatrix = function (elem) { +export const getMatrix = (elem) => { const tlist = elem.transform.baseVal; return transformListToTransform(tlist).matrix; }; @@ -191,7 +191,7 @@ export const getMatrix = function (elem) { * @param {Integer} y2 - Second coordinate's y value * @returns {module:math.AngleCoord45} */ -export const snapToAngle = function (x1, y1, x2, y2) { +export const snapToAngle = (x1, y1, x2, y2) => { const snap = Math.PI / 4; // 45 degrees const dx = x2 - x1; const dy = y2 - y1; @@ -213,7 +213,7 @@ export const snapToAngle = function (x1, y1, x2, y2) { * @param {SVGRect} r2 - The second BBox-like object * @returns {boolean} True if rectangles intersect */ -export const rectsIntersect = function (r1, r2) { +export const rectsIntersect = (r1, r2) => { return r2.x < (r1.x + r1.width) && (r2.x + r2.width) > r1.x && r2.y < (r1.y + r1.height) && diff --git a/src/svgcanvas/path-actions.js b/src/svgcanvas/path-actions.js index e0f7b3dd..d35fee3f 100644 --- a/src/svgcanvas/path-actions.js +++ b/src/svgcanvas/path-actions.js @@ -15,7 +15,7 @@ import { } from './math.js'; import { assignAttributes, getElem, getRotationAngle, snapToGrid, isNullish, - getBBox as utilsGetBBox + getBBox } from './utilities.js'; let pathActionsContext_ = null; @@ -679,7 +679,7 @@ export const pathActionsMethod = (function () { // const {item} = seg; const rubberBox = editorContext_.getRubberBox(); - const rbb = rubberBox.getBBox(); + const rbb = getBBox(rubberBox); const pt = pathActionsContext_.getGripPt(seg); const ptBb = { @@ -770,7 +770,7 @@ export const pathActionsMethod = (function () { editorContext_.clearSelection(); path.setPathContext(); path.show(true).update(); - path.oldbbox = utilsGetBBox(path.elem); + path.oldbbox = getBBox(path.elem); subpath = false; }, /** diff --git a/src/svgcanvas/select.js b/src/svgcanvas/select.js index 3803b3c4..f4596fbf 100644 --- a/src/svgcanvas/select.js +++ b/src/svgcanvas/select.js @@ -110,9 +110,9 @@ export class Selector { const mgr = selectorManager_; const selectedGrips = mgr.selectorGrips; const selected = this.selectedElement; - const sw = selected.getAttribute('stroke-width'); const currentZoom = svgFactory_.getCurrentZoom(); let offset = 1 / currentZoom; + const sw = selected.getAttribute('stroke-width'); if (selected.getAttribute('stroke') !== 'none' && !isNaN(sw)) { offset += (sw / 2); } @@ -200,10 +200,8 @@ export class Selector { ' L' + (nbax + nbaw) + ',' + nbay + ' ' + (nbax + nbaw) + ',' + (nbay + nbah) + ' ' + nbax + ',' + (nbay + nbah) + 'z'; - selectedBox.setAttribute('d', dstr); const xform = angle ? 'rotate(' + [ angle, cx, cy ].join(',') + ')' : ''; - this.selectorGroup.setAttribute('transform', xform); // TODO(codedread): Is this needed? // if (selected === selectedElements[0]) { @@ -217,6 +215,8 @@ export class Selector { e: [ nbax + nbaw, nbay + (nbah) / 2 ], s: [ nbax + (nbaw) / 2, nbay + nbah ] }; + selectedBox.setAttribute('d', dstr); + this.selectorGroup.setAttribute('transform', xform); Object.entries(this.gripCoords).forEach(([ dir, coords ]) => { selectedGrips[dir].setAttribute('cx', coords[0]); selectedGrips[dir].setAttribute('cy', coords[1]); @@ -415,7 +415,7 @@ export class SelectorManager { * @returns {Selector} The selector based on the given element */ requestSelector(elem, bbox) { - if (isNullish(elem)) { return null; } + if (!elem) { return null; } const N = this.selectors.length; // If we've already acquired one for this element, return it. diff --git a/src/svgcanvas/selected-elem.js b/src/svgcanvas/selected-elem.js index e26e2807..93955fc3 100644 --- a/src/svgcanvas/selected-elem.js +++ b/src/svgcanvas/selected-elem.js @@ -108,7 +108,6 @@ export const moveUpDownSelected = function (dir) { if (!selected) { return; } elementContext_.setCurBBoxes([]); - // curBBoxes = []; let closest; let foundCur; // jQuery sorts this list const list = elementContext_.getIntersectionList(getStrokedBBoxDefaultVisible([ selected ])); @@ -163,10 +162,8 @@ export const moveSelectedElements = function (dx, dy, undoable = true) { } const batchCmd = new BatchCommand('position'); - let i = selectedElements.length; - while (i--) { - const selected = selectedElements[i]; - if (!isNullish(selected)) { + selectedElements.forEach((selected, i) => { + if (selected) { const xform = elementContext_.getSVGRoot().createSVGTransform(); const tlist = selected.transform?.baseVal; @@ -190,7 +187,7 @@ export const moveSelectedElements = function (dx, dy, undoable = true) { elementContext_.gettingSelectorManager().requestSelector(selected).resize(); } - } + }); if (!batchCmd.isEmpty()) { if (undoable) { elementContext_.addCommandToHistory(batchCmd); @@ -893,12 +890,7 @@ export const ungroupSelectedElement = function () { continue; } - if (anchor) { - anchor.before(elem); - } else { - g.after(elem); - } - children[i++] = elem; + children[i++] = parent.insertBefore(elem, anchor); batchCmd.addSubCommand(new MoveElementCommand(elem, oldNextSibling, oldParent)); } diff --git a/src/svgcanvas/selection.js b/src/svgcanvas/selection.js index 9910fa85..d69d0cb1 100644 --- a/src/svgcanvas/selection.js +++ b/src/svgcanvas/selection.js @@ -5,142 +5,159 @@ * @copyright 2011 Jeff Schiller */ -import { NS } from './namespaces.js'; +import { NS } from "./namespaces.js"; import { - isNullish, getBBox as utilsGetBBox, getStrokedBBoxDefaultVisible -} from './utilities.js'; -import { transformPoint, transformListToTransform, rectsIntersect } from './math.js'; -import * as hstry from './history.js'; -import { getClosest } from '../editor/components/jgraduate/Util.js'; + getBBox, + getStrokedBBoxDefaultVisible +} from "./utilities.js"; +import { + transformPoint, + transformListToTransform, + rectsIntersect +} from "./math.js"; +import * as hstry from "./history.js"; +import { getClosest } from "../editor/components/jgraduate/Util.js"; const { BatchCommand } = hstry; let selectionContext_ = null; let svgCanvas = null; -let selectedElements; /** -* @function module:selection.init -* @param {module:selection.selectionContext} selectionContext -* @returns {void} -*/ + * @function module:selection.init + * @param {module:selection.selectionContext} selectionContext + * @returns {void} + */ export const init = function (selectionContext) { selectionContext_ = selectionContext; svgCanvas = selectionContext_.getCanvas(); - selectedElements = selectionContext_.getSelectedElements; }; /** -* Clears the selection. The 'selected' handler is then optionally called. -* This should really be an intersection applying to all types rather than a union. -* @name module:selection.SvgCanvas#clearSelection -* @type {module:draw.DrawCanvasInit#clearSelection|module:path.EditorContext#clearSelection} -* @fires module:selection.SvgCanvas#event:selected -*/ + * Clears the selection. The 'selected' handler is then optionally called. + * This should really be an intersection applying to all types rather than a union. + * @name module:selection.SvgCanvas#clearSelection + * @type {module:draw.DrawCanvasInit#clearSelection|module:path.EditorContext#clearSelection} + * @fires module:selection.SvgCanvas#event:selected + */ export const clearSelectionMethod = function (noCall) { - selectedElements().forEach((elem) => { - if (isNullish(elem)) { + const selectedElements = selectionContext_.getSelectedElements(); + selectedElements.forEach((elem) => { + if (!elem) { return; } + svgCanvas.selectorManager.releaseSelector(elem); }); svgCanvas.setEmptySelectedElements(); - if (!noCall) { svgCanvas.call('selected', selectedElements()); } + if (!noCall) { + svgCanvas.call("selected", selectedElements); + } }; /** -* Adds a list of elements to the selection. The 'selected' handler is then called. -* @name module:selection.SvgCanvas#addToSelection -* @type {module:path.EditorContext#addToSelection} -* @fires module:selection.SvgCanvas#event:selected -*/ + * Adds a list of elements to the selection. The 'selected' handler is then called. + * @name module:selection.SvgCanvas#addToSelection + * @type {module:path.EditorContext#addToSelection} + * @fires module:selection.SvgCanvas#event:selected + */ export const addToSelectionMethod = function (elemsToAdd, showGrips) { - if (!elemsToAdd.length) { return; } + const selectedElements = selectionContext_.getSelectedElements(); + if (!elemsToAdd.length) { + return; + } // find the first null in our selectedElements array - let j = 0; - while (j < selectedElements().length) { - if (isNullish(selectedElements()[j])) { + let firstNull = 0; + while (firstNull < selectedElements.length) { + if (selectedElements[firstNull] === null) { break; } - ++j; + ++firstNull; } // now add each element consecutively let i = elemsToAdd.length; while (i--) { let elem = elemsToAdd[i]; - if (!elem) { continue; } - const bbox = utilsGetBBox(elem); - if (!bbox) { continue; } + if (!elem || !elem.getBBox) { + continue; + } - if (elem.tagName === 'a' && elem.childNodes.length === 1) { + if (elem.tagName === "a" && elem.childNodes.length === 1) { // Make "a" element's child be the selected element elem = elem.firstChild; } // if it's not already there, add it - if (!selectedElements().includes(elem)) { - selectedElements()[j] = elem; + if (!selectedElements.includes(elem)) { + selectedElements[firstNull] = elem; // only the first selectedBBoxes element is ever used in the codebase these days // if (j === 0) selectedBBoxes[0] = utilsGetBBox(elem); - j++; - const sel = svgCanvas.selectorManager.requestSelector(elem, bbox); + firstNull++; + const sel = svgCanvas.selectorManager.requestSelector(elem); - if (selectedElements().length > 1) { + if (selectedElements.length > 1) { sel.showGrips(false); } } } - if (!selectedElements().length) { + if (!selectedElements.length) { return; } - svgCanvas.call('selected', selectedElements()); + svgCanvas.call("selected", selectedElements); - if (selectedElements().length === 1) { - svgCanvas.selectorManager.requestSelector(selectedElements()[0]).showGrips(showGrips); + if (selectedElements.length === 1) { + svgCanvas.selectorManager + .requestSelector(selectedElements[0]) + .showGrips(showGrips); } // make sure the elements are in the correct order // See: https://www.w3.org/TR/DOM-Level-3-Core/core.html#Node3-compareDocumentPosition - selectedElements().sort(function (a, b) { + selectedElements.sort(function (a, b) { if (a && b && a.compareDocumentPosition) { return 3 - (b.compareDocumentPosition(a) & 6); // eslint-disable-line no-bitwise } - if (isNullish(a)) { + if (!a) { return 1; } return 0; }); // Make sure first elements are not null - while (isNullish(selectedElements())[0]) { - selectedElements().shift(0); + while (!selectedElements[0]) { + selectedElements.shift(0); } }; /** -* @name module:svgcanvas.SvgCanvas#getMouseTarget -* @type {module:path.EditorContext#getMouseTarget} -*/ + * @name module:svgcanvas.SvgCanvas#getMouseTarget + * @type {module:path.EditorContext#getMouseTarget} + */ export const getMouseTargetMethod = function (evt) { - if (isNullish(evt)) { + if (!evt) { return null; } let mouseTarget = evt.target; // if it was a , Opera and WebKit return the SVGElementInstance - if (mouseTarget.correspondingUseElement) { mouseTarget = mouseTarget.correspondingUseElement; } + if (mouseTarget.correspondingUseElement) { + mouseTarget = mouseTarget.correspondingUseElement; + } // for foreign content, go up until we find the foreignObject // WebKit browsers set the mouse target to the svgcanvas div - if ([ NS.MATH, NS.HTML ].includes(mouseTarget.namespaceURI) && - mouseTarget.id !== 'svgcanvas' + if ( + [ NS.MATH, NS.HTML ].includes(mouseTarget.namespaceURI) && + mouseTarget.id !== "svgcanvas" ) { - while (mouseTarget.nodeName !== 'foreignObject') { + while (mouseTarget.nodeName !== "foreignObject") { mouseTarget = mouseTarget.parentNode; - if (!mouseTarget) { return selectionContext_.getSVGRoot(); } + if (!mouseTarget) { + return selectionContext_.getSVGRoot(); + } } } @@ -155,52 +172,61 @@ export const getMouseTargetMethod = function (evt) { } // If it's a selection grip, return the grip parent - if (getClosest(mouseTarget.parentNode, '#selectorParentGroup')) { + if (getClosest(mouseTarget.parentNode, "#selectorParentGroup")) { // While we could instead have just returned mouseTarget, // this makes it easier to indentify as being a selector grip return svgCanvas.selectorManager.selectorParentGroup; } - while (!mouseTarget?.parentNode?.isSameNode(selectionContext_.getCurrentGroup() || currentLayer)) { + while ( + !mouseTarget?.parentNode?.isSameNode( + selectionContext_.getCurrentGroup() || currentLayer + ) + ) { mouseTarget = mouseTarget.parentNode; } return mouseTarget; }; /** -* @typedef {module:svgcanvas.ExtensionMouseDownStatus|module:svgcanvas.ExtensionMouseUpStatus|module:svgcanvas.ExtensionIDsUpdatedStatus|module:locale.ExtensionLocaleData[]|void} module:svgcanvas.ExtensionStatus -* @tutorial ExtensionDocs -*/ + * @typedef {module:svgcanvas.ExtensionMouseDownStatus|module:svgcanvas.ExtensionMouseUpStatus|module:svgcanvas.ExtensionIDsUpdatedStatus|module:locale.ExtensionLocaleData[]|void} module:svgcanvas.ExtensionStatus + * @tutorial ExtensionDocs + */ /** -* @callback module:svgcanvas.ExtensionVarBuilder -* @param {string} name The name of the extension -* @returns {module:svgcanvas.SvgCanvas#event:ext_addLangData} -*/ + * @callback module:svgcanvas.ExtensionVarBuilder + * @param {string} name The name of the extension + * @returns {module:svgcanvas.SvgCanvas#event:ext_addLangData} + */ /** -* @callback module:svgcanvas.ExtensionNameFilter -* @param {string} name -* @returns {boolean} -*/ + * @callback module:svgcanvas.ExtensionNameFilter + * @param {string} name + * @returns {boolean} + */ /* eslint-disable max-len */ /** -* @todo Consider: Should this return an array by default, so extension results aren't overwritten? -* @todo Would be easier to document if passing in object with key of action and vars as value; could then define an interface which tied both together -* @function module:svgcanvas.SvgCanvas#runExtensions -* @param {"mouseDown"|"mouseMove"|"mouseUp"|"zoomChanged"|"IDsUpdated"|"canvasUpdated"|"toolButtonStateUpdate"|"selectedChanged"|"elementTransition"|"elementChanged"|"langReady"|"langChanged"|"addLangData"|"onNewDocument"|"workareaResized"} action -* @param {module:svgcanvas.SvgCanvas#event:ext_mouseDown|module:svgcanvas.SvgCanvas#event:ext_mouseMove|module:svgcanvas.SvgCanvas#event:ext_mouseUp|module:svgcanvas.SvgCanvas#event:ext_zoomChanged|module:svgcanvas.SvgCanvas#event:ext_IDsUpdated|module:svgcanvas.SvgCanvas#event:ext_canvasUpdated|module:svgcanvas.SvgCanvas#event:ext_toolButtonStateUpdate|module:svgcanvas.SvgCanvas#event:ext_selectedChanged|module:svgcanvas.SvgCanvas#event:ext_elementTransition|module:svgcanvas.SvgCanvas#event:ext_elementChanged|module:svgcanvas.SvgCanvas#event:ext_langReady|module:svgcanvas.SvgCanvas#event:ext_langChanged|module:svgcanvas.SvgCanvas#event:ext_addLangData|module:svgcanvas.SvgCanvas#event:ext_onNewDocument|module:svgcanvas.SvgCanvas#event:ext_workareaResized|module:svgcanvas.ExtensionVarBuilder} [vars] -* @param {boolean} [returnArray] -* @param {module:svgcanvas.ExtensionNameFilter} nameFilter -* @returns {GenericArray|module:svgcanvas.ExtensionStatus|false} See {@tutorial ExtensionDocs} on the ExtensionStatus. -*/ + * @todo Consider: Should this return an array by default, so extension results aren't overwritten? + * @todo Would be easier to document if passing in object with key of action and vars as value; could then define an interface which tied both together + * @function module:svgcanvas.SvgCanvas#runExtensions + * @param {"mouseDown"|"mouseMove"|"mouseUp"|"zoomChanged"|"IDsUpdated"|"canvasUpdated"|"toolButtonStateUpdate"|"selectedChanged"|"elementTransition"|"elementChanged"|"langReady"|"langChanged"|"addLangData"|"onNewDocument"|"workareaResized"} action + * @param {module:svgcanvas.SvgCanvas#event:ext_mouseDown|module:svgcanvas.SvgCanvas#event:ext_mouseMove|module:svgcanvas.SvgCanvas#event:ext_mouseUp|module:svgcanvas.SvgCanvas#event:ext_zoomChanged|module:svgcanvas.SvgCanvas#event:ext_IDsUpdated|module:svgcanvas.SvgCanvas#event:ext_canvasUpdated|module:svgcanvas.SvgCanvas#event:ext_toolButtonStateUpdate|module:svgcanvas.SvgCanvas#event:ext_selectedChanged|module:svgcanvas.SvgCanvas#event:ext_elementTransition|module:svgcanvas.SvgCanvas#event:ext_elementChanged|module:svgcanvas.SvgCanvas#event:ext_langReady|module:svgcanvas.SvgCanvas#event:ext_langChanged|module:svgcanvas.SvgCanvas#event:ext_addLangData|module:svgcanvas.SvgCanvas#event:ext_onNewDocument|module:svgcanvas.SvgCanvas#event:ext_workareaResized|module:svgcanvas.ExtensionVarBuilder} [vars] + * @param {boolean} [returnArray] + * @param {module:svgcanvas.ExtensionNameFilter} nameFilter + * @returns {GenericArray|module:svgcanvas.ExtensionStatus|false} See {@tutorial ExtensionDocs} on the ExtensionStatus. + */ /* eslint-enable max-len */ -export const runExtensionsMethod = function (action, vars, returnArray, nameFilter) { +export const runExtensionsMethod = function ( + action, + vars, + returnArray, + nameFilter +) { let result = returnArray ? [] : false; for (const [ name, ext ] of Object.entries(selectionContext_.getExtensions())) { if (nameFilter && !nameFilter(name)) { return; } if (ext && action in ext) { - if (typeof vars === 'function') { + if (typeof vars === "function") { vars = vars(name); // ext, action } if (returnArray) { @@ -214,13 +240,13 @@ export const runExtensionsMethod = function (action, vars, returnArray, nameFilt }; /** -* Get all elements that have a BBox (excludes ``, ``, etc). -* Note that 0-opacity, off-screen etc elements are still considered "visible" -* for this function. -* @function module:svgcanvas.SvgCanvas#getVisibleElementsAndBBoxes -* @param {Element} parent - The parent DOM element to search within -* @returns {ElementAndBBox[]} An array with objects that include: -*/ + * Get all elements that have a BBox (excludes `<defs>`, `<title>`, etc). + * Note that 0-opacity, off-screen etc elements are still considered "visible" + * for this function. + * @function module:svgcanvas.SvgCanvas#getVisibleElementsAndBBoxes + * @param {Element} parent - The parent DOM element to search within + * @returns {ElementAndBBox[]} An array with objects that include: + */ export const getVisibleElementsAndBBoxes = function (parent) { if (!parent) { const svgcontent = selectionContext_.getSVGContent(); @@ -228,7 +254,7 @@ export const getVisibleElementsAndBBoxes = function (parent) { } const contentElems = []; const elements = parent.children; - Array.prototype.forEach.call(elements, function (elem) { + Array.from(elements).forEach((elem) => { if (elem.getBBox) { contentElems.push({ elem, bbox: getStrokedBBoxDefaultVisible([ elem ]) }); } @@ -237,31 +263,37 @@ export const getVisibleElementsAndBBoxes = function (parent) { }; /** -* This method sends back an array or a NodeList full of elements that -* intersect the multi-select rubber-band-box on the currentLayer only. -* -* We brute-force `getIntersectionList` for browsers that do not support it (Firefox). -* -* Reference: -* Firefox does not implement `getIntersectionList()`, see {@link https://bugzilla.mozilla.org/show_bug.cgi?id=501421}. -* @function module:svgcanvas.SvgCanvas#getIntersectionList -* @param {SVGRect} rect -* @returns {Element[]|NodeList} Bbox elements -*/ + * This method sends back an array or a NodeList full of elements that + * intersect the multi-select rubber-band-box on the currentLayer only. + * + * We brute-force `getIntersectionList` for browsers that do not support it (Firefox). + * + * Reference: + * Firefox does not implement `getIntersectionList()`, see {@link https://bugzilla.mozilla.org/show_bug.cgi?id=501421}. + * @function module:svgcanvas.SvgCanvas#getIntersectionList + * @param {SVGRect} rect + * @returns {Element[]|NodeList} Bbox elements + */ export const getIntersectionListMethod = function (rect) { const currentZoom = selectionContext_.getCurrentZoom(); - if (isNullish(selectionContext_.getRubberBox())) { return null; } + if (!selectionContext_.getRubberBox()) { + return null; + } - const parent = selectionContext_.getCurrentGroup() || svgCanvas.getCurrentDrawing().getCurrentLayer(); + const parent = + selectionContext_.getCurrentGroup() || + svgCanvas.getCurrentDrawing().getCurrentLayer(); let rubberBBox; if (!rect) { - rubberBBox = selectionContext_.getRubberBox().getBBox(); + rubberBBox = getBBox(selectionContext_.getRubberBox()); const bb = selectionContext_.getSVGContent().createSVGRect(); - [ 'x', 'y', 'width', 'height', 'top', 'right', 'bottom', 'left' ].forEach((o) => { - bb[o] = rubberBBox[o] / currentZoom; - }); + [ "x", "y", "width", "height", "top", "right", "bottom", "left" ].forEach( + (o) => { + bb[o] = rubberBBox[o] / currentZoom; + } + ); rubberBBox = bb; } else { rubberBBox = selectionContext_.getSVGContent().createSVGRect(); @@ -271,22 +303,19 @@ export const getIntersectionListMethod = function (rect) { rubberBBox.height = rect.height; } - let resultList = null; - - if (isNullish(resultList) || typeof resultList.item !== 'function') { - resultList = []; - - if (!selectionContext_.getCurBBoxes().length) { - // Cache all bboxes - selectionContext_.setCurBBoxes(getVisibleElementsAndBBoxes(parent)); + const resultList = []; + if (selectionContext_.getCurBBoxes().length === 0) { + // Cache all bboxes + selectionContext_.setCurBBoxes(getVisibleElementsAndBBoxes(parent)); + } + let i = selectionContext_.getCurBBoxes().length; + while (i--) { + const curBBoxes = selectionContext_.getCurBBoxes(); + if (!rubberBBox.width) { + continue; } - let i = selectionContext_.getCurBBoxes().length; - while (i--) { - const curBBoxes = selectionContext_.getCurBBoxes(); - if (!rubberBBox.width) { continue; } - if (rectsIntersect(rubberBBox, curBBoxes[i].bbox)) { - resultList.push(curBBoxes[i].elem); - } + if (rectsIntersect(rubberBBox, curBBoxes[i].bbox)) { + resultList.push(curBBoxes[i].elem); } } @@ -297,61 +326,62 @@ export const getIntersectionListMethod = function (rect) { }; /** -* @typedef {PlainObject} ElementAndBBox -* @property {Element} elem - The element -* @property {module:utilities.BBoxObject} bbox - The element's BBox as retrieved from `getStrokedBBoxDefaultVisible` -*/ + * @typedef {PlainObject} ElementAndBBox + * @property {Element} elem - The element + * @property {module:utilities.BBoxObject} bbox - The element's BBox as retrieved from `getStrokedBBoxDefaultVisible` + */ /** -* Wrap an SVG element into a group element, mark the group as 'gsvg'. -* @function module:svgcanvas.SvgCanvas#groupSvgElem -* @param {Element} elem - SVG element to wrap -* @returns {void} -*/ + * Wrap an SVG element into a group element, mark the group as 'gsvg'. + * @function module:svgcanvas.SvgCanvas#groupSvgElem + * @param {Element} elem - SVG element to wrap + * @returns {void} + */ export const groupSvgElem = function (elem) { const dataStorage = selectionContext_.getDataStorage(); - const g = document.createElementNS(NS.SVG, 'g'); + const g = document.createElementNS(NS.SVG, "g"); elem.replaceWith(g); g.appendChild(elem); - dataStorage.put(g, 'gsvg', elem); + dataStorage.put(g, "gsvg", elem); g.id = svgCanvas.getNextId(); }; /** -* Runs the SVG Document through the sanitizer and then updates its paths. -* @function module:svgcanvas.SvgCanvas#prepareSvg -* @param {XMLDocument} newDoc - The SVG DOM document -* @returns {void} -*/ + * Runs the SVG Document through the sanitizer and then updates its paths. + * @function module:svgcanvas.SvgCanvas#prepareSvg + * @param {XMLDocument} newDoc - The SVG DOM document + * @returns {void} + */ export const prepareSvg = function (newDoc) { - svgCanvas.sanitizeSvg(newDoc.documentElement); // convert paths into absolute commands - const paths = [ ...newDoc.getElementsByTagNameNS(NS.SVG, 'path') ]; + const paths = [ ...newDoc.getElementsByTagNameNS(NS.SVG, "path") ]; paths.forEach((path) => { const convertedPath = svgCanvas.pathActions.convertPath(path); - path.setAttribute('d', convertedPath); + path.setAttribute("d", convertedPath); svgCanvas.pathActions.fixEnd(path); }); }; /** -* Removes any old rotations if present, prepends a new rotation at the -* transformed center. -* @function module:svgcanvas.SvgCanvas#setRotationAngle -* @param {string|Float} val - The new rotation angle in degrees -* @param {boolean} preventUndo - Indicates whether the action should be undoable or not -* @fires module:svgcanvas.SvgCanvas#event:changed -* @returns {void} -*/ + * Removes any old rotations if present, prepends a new rotation at the + * transformed center. + * @function module:svgcanvas.SvgCanvas#setRotationAngle + * @param {string|Float} val - The new rotation angle in degrees + * @param {boolean} preventUndo - Indicates whether the action should be undoable or not + * @fires module:svgcanvas.SvgCanvas#event:changed + * @returns {void} + */ export const setRotationAngle = function (val, preventUndo) { + const selectedElements = selectionContext_.getSelectedElements(); // ensure val is the proper type val = Number.parseFloat(val); - const elem = selectedElements()[0]; - const oldTransform = elem.getAttribute('transform'); - const bbox = utilsGetBBox(elem); - const cx = bbox.x + bbox.width / 2; const cy = bbox.y + bbox.height / 2; + const elem = selectedElements[0]; + const oldTransform = elem.getAttribute("transform"); + const bbox = getBBox(elem); + const cx = bbox.x + bbox.width / 2; + const cy = bbox.y + bbox.height / 2; const tlist = elem.transform.baseVal; // only remove the real rotational transform if present (i.e. at index=0) @@ -363,7 +393,11 @@ export const setRotationAngle = function (val, preventUndo) { } // find Rnc and insert it if (val !== 0) { - const center = transformPoint(cx, cy, transformListToTransform(tlist).matrix); + const center = transformPoint( + cx, + cy, + transformListToTransform(tlist).matrix + ); const Rnc = selectionContext_.getSVGRoot().createSVGTransform(); Rnc.setRotate(val, center.x, center.y); if (tlist.numberOfItems) { @@ -372,52 +406,58 @@ export const setRotationAngle = function (val, preventUndo) { tlist.appendItem(Rnc); } } else if (tlist.numberOfItems === 0) { - elem.removeAttribute('transform'); + elem.removeAttribute("transform"); } if (!preventUndo) { // we need to undo it, then redo it so it can be undo-able! :) // TODO: figure out how to make changes to transform list undo-able cross-browser? - const newTransform = elem.getAttribute('transform'); + const newTransform = elem.getAttribute("transform"); if (oldTransform) { - elem.setAttribute('transform', oldTransform); + elem.setAttribute("transform", oldTransform); } else { - elem.removeAttribute('transform'); + elem.removeAttribute("transform"); } - svgCanvas.changeSelectedAttribute('transform', newTransform, selectedElements()); - svgCanvas.call('changed', selectedElements()); + svgCanvas.changeSelectedAttribute( + "transform", + newTransform, + selectedElements + ); + svgCanvas.call("changed", selectedElements); } // const pointGripContainer = getElem('pathpointgrip_container'); // if (elem.nodeName === 'path' && pointGripContainer) { // pathActions.setPointContainerTransform(elem.getAttribute('transform')); // } - const selector = svgCanvas.selectorManager.requestSelector(selectedElements()[0]); + const selector = svgCanvas.selectorManager.requestSelector( + selectedElements[0] + ); selector.resize(); selectionContext_.getSelector().updateGripCursors(val); }; /** -* Runs `recalculateDimensions` on the selected elements, -* adding the changes to a single batch command. -* @function module:svgcanvas.SvgCanvas#recalculateAllSelectedDimensions -* @fires module:svgcanvas.SvgCanvas#event:changed -* @returns {void} -*/ + * Runs `recalculateDimensions` on the selected elements, + * adding the changes to a single batch command. + * @function module:svgcanvas.SvgCanvas#recalculateAllSelectedDimensions + * @fires module:svgcanvas.SvgCanvas#event:changed + * @returns {void} + */ export const recalculateAllSelectedDimensions = function () { - const text = (selectionContext_.getCurrentResizeMode() === 'none' ? 'position' : 'size'); + const text = + selectionContext_.getCurrentResizeMode() === "none" ? "position" : "size"; const batchCmd = new BatchCommand(text); + const selectedElements = selectionContext_.getSelectedElements(); - let i = selectedElements().length; - while (i--) { - const elem = selectedElements()[i]; + selectedElements.forEach((elem) => { const cmd = svgCanvas.recalculateDimensions(elem); if (cmd) { batchCmd.addSubCommand(cmd); } - } + }); if (!batchCmd.isEmpty()) { selectionContext_.addCommandToHistory(batchCmd); - svgCanvas.call('changed', selectedElements()); + svgCanvas.call("changed", selectedElements); } }; diff --git a/src/svgcanvas/svgcanvas.js b/src/svgcanvas/svgcanvas.js index b920289a..f2e04aa6 100644 --- a/src/svgcanvas/svgcanvas.js +++ b/src/svgcanvas/svgcanvas.js @@ -401,14 +401,12 @@ class SvgCanvas { * @name module:svgcanvas.SvgCanvas#getSelectedElements * @type {module:utilities.EditorContext#getSelectedElements|module:draw.DrawCanvasInit#getSelectedElements|module:path.EditorContext#getSelectedElements} */ - const getSelectedElements = this.getSelectedElems = function () { - return selectedElements; - }; + const getSelectedElements = this.getSelectedElems = () => ( selectedElements ); - this.setSelectedElements = function (key, value) { + this.setSelectedElements = (key, value) => { selectedElements[key] = value; }; - this.setEmptySelectedElements = function () { + this.setEmptySelectedElements = () => { selectedElements = []; }; @@ -625,7 +623,7 @@ class SvgCanvas { getCurrentZoom, getRubberBox() { return rubberBox; }, setCurBBoxes(value) { curBBoxes = value; }, - getCurBBoxes(_value) { return curBBoxes; }, + getCurBBoxes() { return curBBoxes; }, getCurrentResizeMode() { return currentResizeMode; }, addCommandToHistory, getSelector() { return Selector; } diff --git a/src/svgcanvas/utilities.js b/src/svgcanvas/utilities.js index 4934d99c..45993d8e 100644 --- a/src/svgcanvas/utilities.js +++ b/src/svgcanvas/utilities.js @@ -11,9 +11,6 @@ import { setUnitAttr, getTypeMap } from '../common/units.js'; import { hasMatrixTransform, transformListToTransform, transformBox } from './math.js'; -import { - isWebkit, supportsHVLineContainerBBox -} from '../common/browser.js'; import { getClosest, mergeDeep } from '../editor/components/jgraduate/Util.js'; // Much faster than running getBBox() every time @@ -467,61 +464,6 @@ export const getPathBBox = function (path) { }; }; -/** -* Get the given/selected element's bounding box object, checking for -* horizontal/vertical lines (see issue 717) -* Note that performance is currently terrible, so some way to improve would -* be great. -* @param {Element} selected - Container or `<use>` DOM element -* @returns {DOMRect} Bounding box object -*/ -function groupBBFix(selected) { - if (supportsHVLineContainerBBox()) { - try { return selected.getBBox(); } catch (e) {/* empty */ } - } - const ref = editorContext_.getDataStorage().get(selected, 'ref'); - let matched = null; - let ret; let copy; - - if (ref) { - const elements = []; - Array.prototype.forEach.call(ref.children, function (el) { - const elem = el.cloneNode(true); - elem.setAttribute('visibility', 'hidden'); - svgroot_.appendChild(elem); - copy.push(elem); - if ([ 'line', 'path' ].indexOf(elem.tagName) !== -1) { - elements.push(elem); - } - }); - matched = (elements.length) ? elements : null; - } else { - matched = selected.querySelectorAll('line, path'); - } - - let issue = false; - if (matched.length) { - Array.prototype.forEach.call(matched, function (match) { - const bb = match.getBBox(); - if (!bb.width || !bb.height) { - issue = true; - } - }); - if (issue) { - const elems = ref ? copy : selected.children; - ret = getStrokedBBox(elems); - } else { - ret = selected.getBBox(); - } - } else { - ret = selected.getBBox(); - } - if (ref) { - copy.remove(); - } - return ret; -} - /** * Get the given/selected element's bounding box object, convert it to be more * usable when necessary. @@ -530,7 +472,7 @@ function groupBBFix(selected) { * @returns {module:utilities.BBoxObject} Bounding box object */ export const getBBox = function (elem) { - const selected = elem || editorContext_.geSelectedElements()[0]; + const selected = elem || editorContext_.getSelectedElements()[0]; if (elem.nodeType !== 1) { return null; } const elname = selected.nodeName; @@ -546,22 +488,16 @@ export const getBBox = function (elem) { } break; case 'path': + case 'g': + case 'a': if (selected.getBBox) { ret = selected.getBBox(); } break; - case 'g': - case 'a': - ret = groupBBFix(selected); - break; default: if (elname === 'use') { - ret = groupBBFix(selected); // , true); - } - if (elname === 'use' || (elname === 'foreignObject' && isWebkit())) { - if (!ret) { ret = selected.getBBox(); } - + ret = selected.getBBox(); // , true); } else if (visElemsArr.includes(elname)) { if (selected) { try { @@ -918,20 +854,6 @@ export const getBBoxWithTransform = function (elem, addSVGElementFromJson, pathA if (!goodBb) { const { matrix } = transformListToTransform(tlist); bb = transformBox(bb.x, bb.y, bb.width, bb.height, matrix).aabox; - - // Old technique that was exceedingly slow with large documents. - // - // Accurate way to get BBox of rotated element in Firefox: - // Put element in group and get its BBox - // - // Must use clone else FF freaks out - // const clone = elem.cloneNode(true); - // const g = document.createElementNS(NS.SVG, 'g'); - // const parent = elem.parentNode; - // parent.append(g); - // g.append(clone); - // const bb2 = bboxToObj(g.getBBox()); - // g.remove(); } } return bb; @@ -1030,8 +952,8 @@ export const getVisibleElements = function (parentElement) { } const contentElems = []; - const childrens = parentElement.children; - Array.prototype.forEach.call(childrens, function (elem) { + const children = parentElement.children; + Array.from(children, function (elem) { if (elem.getBBox) { contentElems.push(elem); }