From c7419165b2d9f6a92c8e6aaa565e9090158d23dc Mon Sep 17 00:00:00 2001 From: Nodeful Date: Wed, 24 Mar 2021 16:42:45 +0200 Subject: [PATCH] added eslint to the monorepo and fixed UI linting errors --- .eslintignore | 2 + .eslintrc.js | 40 + package-lock.json | 1948 +++++++++++++++++ package.json | 30 + ui/.eslintignore | 2 + ui/.eslintrc.js | 3 + ui/package-lock.json | 2 +- ui/scripts/purge-cache.ts | 2 +- ui/src/app/app.component.ts | 14 +- ui/src/app/app.module.ts | 10 +- .../confirm-dialog.component.ts | 5 +- .../options-dialog.component.ts | 5 +- .../components/options/options.component.ts | 18 +- .../prompt-dialog/prompt-dialog.component.ts | 2 +- ui/src/app/modules/animations/fade-in-out.ts | 6 +- ui/src/app/modules/animations/from-top.ts | 4 +- .../components/analyzer/analyzer.component.ts | 6 +- .../breadcrumbs/breadcrumbs.component.ts | 8 +- .../components/button/button.component.ts | 4 +- .../components/carousel/carousel.component.ts | 17 +- .../components/checkbox/checkbox.component.ts | 4 +- .../container/container.component.ts | 4 +- .../components/divider/divider.component.ts | 5 +- .../components/dropdown/dropdown.component.ts | 20 +- .../flat-slider/flat-slider.component.ts | 64 +- .../components/icon/icon.component.ts | 6 +- .../input-field/input-field.component.ts | 4 +- .../components/knob/knob.component.ts | 8 +- .../components/label/label.component.ts | 5 +- .../components/loading/loading.component.ts | 5 +- .../components/prompt/prompt.component.ts | 6 +- .../components/question/question.component.ts | 6 +- .../components/screw/screw.component.ts | 6 +- .../select-box/select-box.component.ts | 5 +- .../skeuomorph-slider.component.ts | 24 +- .../components/toggle/toggle.component.ts | 5 +- .../tooltip/tooltip-container.component.ts | 4 +- .../components/tooltip/tooltip.component.ts | 14 +- .../components/tooltip/tooltip.directive.ts | 1 - .../components/tooltip/tooltip.service.ts | 1 - .../value-screen/value-screen.component.ts | 7 +- .../components/vent/vent.component.ts | 4 +- .../directives/clicked-outside.directive.ts | 7 +- .../directives/mousewheel.directive.ts | 8 +- .../eqmac-components.module.ts | 4 +- .../services/utilities.service.ts | 25 +- ui/src/app/modules/pipes/clip-value.pipe.ts | 2 - ui/src/app/modules/pipes/fix-float.pipe.ts | 2 - ui/src/app/modules/pipes/map-value.pipe.ts | 2 - ui/src/app/sections/effects/effect.service.ts | 2 +- .../advanced-equalizer.component.ts | 23 +- .../advanced-equalizer.service.ts | 18 +- .../basic-equalizer.component.ts | 14 +- .../basic-equalizer.service.ts | 21 +- .../effects/equalizers/equalizer.component.ts | 5 +- .../equalizers/equalizers.component.ts | 8 +- .../presets/equalizer-presets.component.ts | 9 +- .../effects/reverb/reverb.component.ts | 4 +- .../app/sections/header/header.component.ts | 9 +- ui/src/app/sections/help/help.component.ts | 4 +- .../app/sections/outputs/outputs.component.ts | 2 +- .../app/sections/outputs/outputs.service.ts | 2 +- .../sections/recorder/recorder.component.ts | 3 +- .../sections/settings/settings.component.ts | 9 +- .../app/sections/settings/settings.service.ts | 2 +- .../sections/source/file/file.component.ts | 13 +- .../app/sections/source/file/file.service.ts | 4 +- .../sections/source/input/input.component.ts | 5 +- .../app/sections/source/source.component.ts | 4 +- .../source/system/system.component.ts | 6 +- .../balance/balance.component.ts | 4 +- .../balance/balance.service.ts | 1 - .../booster/booster.component.ts | 4 +- .../volume-booster-balance.component.ts | 3 +- .../volume-mixer/volume-mixer.component.html | 3 - .../volume-mixer/volume-mixer.component.scss | 0 .../volume-mixer/volume-mixer.component.ts | 15 - ui/src/app/services/bridge.service.ts | 3 +- ui/src/app/services/constants.service.ts | 2 +- ui/src/app/services/cookies.service.ts | 1 + ui/src/app/services/data.service.ts | 3 +- ui/src/app/services/logger.service.ts | 2 +- ui/src/app/services/transitions.service.ts | 4 +- ui/src/app/services/ui.service.ts | 15 +- ui/src/main.ts | 4 +- ui/src/polyfills.ts | 13 +- ui/src/tsconfig.app.json | 3 +- ui/tsconfig.eslint.json | 17 + ui/tsconfig.json | 2 +- ui/tslint.json | 6 - 90 files changed, 2317 insertions(+), 341 deletions(-) create mode 100644 .eslintignore create mode 100644 .eslintrc.js create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 ui/.eslintignore create mode 100644 ui/.eslintrc.js delete mode 100644 ui/src/app/sections/volume/volume-mixer/volume-mixer.component.html delete mode 100644 ui/src/app/sections/volume/volume-mixer/volume-mixer.component.scss delete mode 100644 ui/src/app/sections/volume/volume-mixer/volume-mixer.component.ts create mode 100644 ui/tsconfig.eslint.json delete mode 100644 ui/tslint.json diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000..76add87 --- /dev/null +++ b/.eslintignore @@ -0,0 +1,2 @@ +node_modules +dist \ No newline at end of file diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 0000000..32f34d6 --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,40 @@ +module.exports = { + extends: 'standard-with-typescript', + parserOptions: { + tsconfigRootDir: __dirname, + project: [ + './ui/tsconfig.eslint.json' + ] + }, + overrides: [{ + files: ['*.ts'], + rules: { + radix: 'off', + 'accessor-pairs': 'off', + 'return-undefined': 'off', + 'no-throw-literal': 'off', + 'import-first': 'off', + '@typescript-eslint/array-type': 'off', + '@typescript-eslint/consistent-type-assertions': 'off', + '@typescript-eslint/explicit-function-return-type': 'off', + '@typescript-eslint/no-empty-interface': 'off', + '@typescript-eslint/no-extraneous-class': 'off', + '@typescript-eslint/no-floating-promises': 'off', + '@typescript-eslint/no-unused-vars': [2, { args: 'none' }], + '@typescript-eslint/require-await': 'off', + '@typescript-eslint/restrict-template-expressions': 'off', + '@typescript-eslint/promise-function-async': 'off', + '@typescript-eslint/no-misused-promises': 'off', + 'array-bracket-spacing': ['error', 'always'], + '@typescript-eslint/quotes': ['error', 'single', { avoidEscape: true }], + '@typescript-eslint/strict-boolean-expressions': 'off', + '@typescript-eslint/return-await': 'off', + 'node/no-callback-literal': 'off', + 'no-async-promise-executor': 'off', + '@typescript-eslint/no-dynamic-delete': 'off' + } + }], + env: { + node: true + } +} diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..14fec09 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,1948 @@ +{ + "name": "eqmac", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "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" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + }, + "@babel/highlight": { + "version": "7.13.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz", + "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + } + } + }, + "@eslint/eslintrc": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.0.tgz", + "integrity": "sha512-2ZPCc+uNbjV5ERJr+aKSPRwZgKd2z11x0EgLvb1PURmUrn9QNRXFqje0Ldq454PfAVyaJYyrDvvIKSFP4NnBog==", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "globals": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", + "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "dev": true, + "requires": { + "type-fest": "^0.8.1" + } + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + } + } + }, + "@nodelib/fs.scandir": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz", + "integrity": "sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.4", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz", + "integrity": "sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz", + "integrity": "sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.4", + "fastq": "^1.6.0" + } + }, + "@types/json-schema": { + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz", + "integrity": "sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==", + "dev": true + }, + "@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", + "dev": true + }, + "@typescript-eslint/eslint-plugin": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.19.0.tgz", + "integrity": "sha512-CRQNQ0mC2Pa7VLwKFbrGVTArfdVDdefS+gTw0oC98vSI98IX5A8EVH4BzJ2FOB0YlCmm8Im36Elad/Jgtvveaw==", + "dev": true, + "requires": { + "@typescript-eslint/experimental-utils": "4.19.0", + "@typescript-eslint/scope-manager": "4.19.0", + "debug": "^4.1.1", + "functional-red-black-tree": "^1.0.1", + "lodash": "^4.17.15", + "regexpp": "^3.0.0", + "semver": "^7.3.2", + "tsutils": "^3.17.1" + } + }, + "@typescript-eslint/experimental-utils": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.19.0.tgz", + "integrity": "sha512-9/23F1nnyzbHKuoTqFN1iXwN3bvOm/PRIXSBR3qFAYotK/0LveEOHr5JT1WZSzcD6BESl8kPOG3OoDRKO84bHA==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.3", + "@typescript-eslint/scope-manager": "4.19.0", + "@typescript-eslint/types": "4.19.0", + "@typescript-eslint/typescript-estree": "4.19.0", + "eslint-scope": "^5.0.0", + "eslint-utils": "^2.0.0" + } + }, + "@typescript-eslint/parser": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.19.0.tgz", + "integrity": "sha512-/uabZjo2ZZhm66rdAu21HA8nQebl3lAIDcybUoOxoI7VbZBYavLIwtOOmykKCJy+Xq6Vw6ugkiwn8Js7D6wieA==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "4.19.0", + "@typescript-eslint/types": "4.19.0", + "@typescript-eslint/typescript-estree": "4.19.0", + "debug": "^4.1.1" + } + }, + "@typescript-eslint/scope-manager": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.19.0.tgz", + "integrity": "sha512-GGy4Ba/hLXwJXygkXqMzduqOMc+Na6LrJTZXJWVhRrSuZeXmu8TAnniQVKgj8uTRKe4igO2ysYzH+Np879G75g==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.19.0", + "@typescript-eslint/visitor-keys": "4.19.0" + } + }, + "@typescript-eslint/types": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.19.0.tgz", + "integrity": "sha512-A4iAlexVvd4IBsSTNxdvdepW0D4uR/fwxDrKUa+iEY9UWvGREu2ZyB8ylTENM1SH8F7bVC9ac9+si3LWNxcBuA==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.19.0.tgz", + "integrity": "sha512-3xqArJ/A62smaQYRv2ZFyTA+XxGGWmlDYrsfZG68zJeNbeqRScnhf81rUVa6QG4UgzHnXw5VnMT5cg75dQGDkA==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.19.0", + "@typescript-eslint/visitor-keys": "4.19.0", + "debug": "^4.1.1", + "globby": "^11.0.1", + "is-glob": "^4.0.1", + "semver": "^7.3.2", + "tsutils": "^3.17.1" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.19.0.tgz", + "integrity": "sha512-aGPS6kz//j7XLSlgpzU2SeTqHPsmRYxFztj2vPuMMFJXZudpRSehE3WCV+BaxwZFvfAqMoSd86TEuM0PQ59E/A==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.19.0", + "eslint-visitor-keys": "^2.0.0" + } + }, + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true + }, + "acorn-jsx": { + "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 + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true + }, + "ansi-regex": { + "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": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "array-includes": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.3.tgz", + "integrity": "sha512-gcem1KlBU7c9rB+Rq8/3PPKsK2kjqeEBa3bD5kkQo4nYlOHQCJqIJFqBXDEfwaRuYTT4E+FxA9xez7Gf/e3Q7A==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.2", + "get-intrinsic": "^1.1.1", + "is-string": "^1.0.5" + } + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true + }, + "array.prototype.flat": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz", + "integrity": "sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1" + } + }, + "astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "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 + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "contains-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", + "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", + "dev": true + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "debug": { + "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" + } + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "requires": { + "path-type": "^4.0.0" + } + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "requires": { + "ansi-colors": "^4.1.1" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0.tgz", + "integrity": "sha512-LJzK7MrQa8TS0ja2w3YNLzUgJCGPdPOV1yVvezjNnS89D+VR08+Szt2mz3YB2Dck/+w5tfIq/RoUAFqJJGM2yw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "is-callable": "^1.2.3", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.2", + "is-string": "^1.0.5", + "object-inspect": "^1.9.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.0" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "eslint": { + "version": "7.22.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.22.0.tgz", + "integrity": "sha512-3VawOtjSJUQiiqac8MQc+w457iGLfuNGLFn8JmF051tTKbh5/x/0vlcEj8OgDCaw7Ysa2Jn8paGshV7x2abKXg==", + "dev": true, + "requires": { + "@babel/code-frame": "7.12.11", + "@eslint/eslintrc": "^0.4.0", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "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", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.0.0", + "globals": "^13.6.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash": "^4.17.21", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^6.0.4", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + } + } + }, + "eslint-config-standard": { + "version": "16.0.2", + "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-16.0.2.tgz", + "integrity": "sha512-fx3f1rJDsl9bY7qzyX8SAtP8GBSk6MfXFaTfaGgk12aAYW4gJSyRm7dM790L6cbXv63fvjY4XeSzXnb4WM+SKw==", + "dev": true + }, + "eslint-config-standard-with-typescript": { + "version": "20.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-standard-with-typescript/-/eslint-config-standard-with-typescript-20.0.0.tgz", + "integrity": "sha512-IoySf3r0a2+P3Z6GMjv8p1HuOQ6GWQbMpdt9G8uEbkGpnNWAGBXpgaiutbZHbaQAvG5pkVtYepCfHUxYbVDLCA==", + "dev": true, + "requires": { + "@typescript-eslint/parser": "^4.0.0", + "eslint-config-standard": "^16.0.0" + } + }, + "eslint-import-resolver-node": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz", + "integrity": "sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==", + "dev": true, + "requires": { + "debug": "^2.6.9", + "resolve": "^1.13.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "eslint-module-utils": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz", + "integrity": "sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA==", + "dev": true, + "requires": { + "debug": "^2.6.9", + "pkg-dir": "^2.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "eslint-plugin-es": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz", + "integrity": "sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==", + "dev": true, + "requires": { + "eslint-utils": "^2.0.0", + "regexpp": "^3.0.0" + } + }, + "eslint-plugin-import": { + "version": "2.22.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.22.1.tgz", + "integrity": "sha512-8K7JjINHOpH64ozkAhpT3sd+FswIZTfMZTjdx052pnWrgRCVfp8op9tbjpAk3DdUeI/Ba4C8OjdC0r90erHEOw==", + "dev": true, + "requires": { + "array-includes": "^3.1.1", + "array.prototype.flat": "^1.2.3", + "contains-path": "^0.1.0", + "debug": "^2.6.9", + "doctrine": "1.5.0", + "eslint-import-resolver-node": "^0.3.4", + "eslint-module-utils": "^2.6.0", + "has": "^1.0.3", + "minimatch": "^3.0.4", + "object.values": "^1.1.1", + "read-pkg-up": "^2.0.0", + "resolve": "^1.17.0", + "tsconfig-paths": "^3.9.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "doctrine": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "isarray": "^1.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "eslint-plugin-node": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz", + "integrity": "sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==", + "dev": true, + "requires": { + "eslint-plugin-es": "^3.0.0", + "eslint-utils": "^2.0.0", + "ignore": "^5.1.1", + "minimatch": "^3.0.4", + "resolve": "^1.10.1", + "semver": "^6.1.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "eslint-plugin-promise": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-4.3.1.tgz", + "integrity": "sha512-bY2sGqyptzFBDLh/GMbAxfdJC+b0f23ME63FOE4+Jao0oZ3E1LEwFtWJX/1pGMJLiTtrSSern2CRM/g+dfc0eQ==", + "dev": true + }, + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "eslint-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 + } + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "requires": { + "estraverse": "^5.1.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 + } + } + }, + "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 + } + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "fast-glob": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz", + "integrity": "sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.0", + "merge2": "^1.3.0", + "micromatch": "^4.0.2", + "picomatch": "^2.2.1" + } + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "fastq": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.11.0.tgz", + "integrity": "sha512-7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "requires": { + "flat-cache": "^3.0.4" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "requires": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + } + }, + "flatted": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz", + "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==", + "dev": true + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "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": { + "version": "13.7.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.7.0.tgz", + "integrity": "sha512-Aipsz6ZKRxa/xQkZhNg0qIWXT6x6rD46f6x/PCnBomlttdIyAPak4YD9jTmKpZ72uROSMU87qJtcgpgHaVchiA==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + }, + "dependencies": { + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true + } + } + }, + "globby": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.3.tgz", + "integrity": "sha512-ffdmosjA807y7+lA1NM0jELARVmYul/715xiILEjo3hBLPTcirgQNnXECn5g3mtR8TOLCVbkfua1Hpen25/Xcg==", + "dev": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" + } + }, + "graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-bigints": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "dev": true + }, + "hosted-git-info": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", + "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", + "dev": true + }, + "ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "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" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-bigint": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.1.tgz", + "integrity": "sha512-J0ELF4yHFxHy0cmSxZuheDOz2luOdVvqjwmEcj8H/L1JHeuEDSDbeRP+Dk9kFVk5RTFzbucJ2Kb9F7ixY2QaCg==", + "dev": true + }, + "is-boolean-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.0.tgz", + "integrity": "sha512-a7Uprx8UtD+HWdyYwnD1+ExtTgqQtD2k/1yJgtXP6wnMm8byhkoTZRl+95LLThpzNZJ5aEvi46cdH+ayMFRwmA==", + "dev": true, + "requires": { + "call-bind": "^1.0.0" + } + }, + "is-callable": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", + "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==", + "dev": true + }, + "is-core-module": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", + "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-date-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-negative-zero": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-number-object": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.4.tgz", + "integrity": "sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw==", + "dev": true + }, + "is-regex": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.2.tgz", + "integrity": "sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-symbols": "^1.0.1" + } + }, + "is-string": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", + "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", + "dev": true + }, + "is-symbol": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "object-inspect": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz", + "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==", + "dev": true + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + }, + "object.values": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.3.tgz", + "integrity": "sha512-nkF6PfDB9alkOUxpf1HNm/QlkeW3SReqL5WXeBLpEJJnlPSvRaDQpW3gQTksTN3fgJX4hL42RzKyOin6ff3tyw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.2", + "has": "^1.0.3" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "requires": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "^1.2.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, + "picomatch": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "dev": true + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, + "requires": { + "find-up": "^2.1.0" + } + }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true, + "requires": { + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" + }, + "dependencies": { + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true, + "requires": { + "pify": "^2.0.0" + } + } + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" + } + }, + "regexpp": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", + "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", + "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 + }, + "resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "dev": true, + "requires": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + } + }, + "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 + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "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" + }, + "dependencies": { + "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 + } + } + }, + "spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz", + "integrity": "sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ==", + "dev": true + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "string-width": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "string.prototype.trimend": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "strip-ansi": { + "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.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "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 + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "table": { + "version": "6.0.7", + "resolved": "https://registry.npmjs.org/table/-/table-6.0.7.tgz", + "integrity": "sha512-rxZevLGTUzWna/qBLObOe16kB2RTnnbhciwgPbMMlazz1yZGVEgnZK762xyVdVznhqxrfCeBMmMkgOOaPwjH7g==", + "dev": true, + "requires": { + "ajv": "^7.0.2", + "lodash": "^4.17.20", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.0" + }, + "dependencies": { + "ajv": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-7.2.3.tgz", + "integrity": "sha512-idv5WZvKVXDqKralOImQgPM9v6WOdLNa0IY3B3doOjw/YxRGT8I+allIJ6kd7Uaj+SF1xZUSU+nPM5aDNBVtnw==", + "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" + } + }, + "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 + } + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "tsconfig-paths": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz", + "integrity": "sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw==", + "dev": true, + "requires": { + "@types/json5": "^0.0.29", + "json5": "^1.0.1", + "minimist": "^1.2.0", + "strip-bom": "^3.0.0" + } + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + } + }, + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1" + } + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + }, + "typescript": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.2.3.tgz", + "integrity": "sha512-qOcYwxaByStAWrBf4x0fibwZvMRG+r4cQoTjbPtUlrWjBHbmCAww1i448U0GJ+3cNNEtebDteo/cHOR3xJ4wEw==" + }, + "unbox-primitive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.0.tgz", + "integrity": "sha512-P/51NX+JXyxK/aigg1/ZgyccdAxm5K1+n8+tvqSntjOivPt19gvm1VC49RWYetsiub8WViUchdxl/KWHHB0kzA==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has-bigints": "^1.0.0", + "has-symbols": "^1.0.0", + "which-boxed-primitive": "^1.0.1" + } + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "requires": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + } + }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..e85f5d8 --- /dev/null +++ b/package.json @@ -0,0 +1,30 @@ +{ + "name": "eqmac", + "version": "1.0.0", + "description": "eqMac Monorepo", + "main": ".eslintrc.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/bitgapp/eqMac.git" + }, + "author": "Roman Kisil ", + "license": "ISC", + "bugs": { + "url": "https://github.com/bitgapp/eqMac/issues" + }, + "homepage": "https://github.com/bitgapp/eqMac#readme", + "devDependencies": { + "@typescript-eslint/eslint-plugin": "^4.19.0", + "eslint": "^7.22.0", + "eslint-config-standard-with-typescript": "^20.0.0", + "eslint-plugin-import": "^2.22.1", + "eslint-plugin-node": "^11.1.0", + "eslint-plugin-promise": "^4.3.1" + }, + "dependencies": { + "typescript": "^4.2.3" + } +} diff --git a/ui/.eslintignore b/ui/.eslintignore new file mode 100644 index 0000000..76add87 --- /dev/null +++ b/ui/.eslintignore @@ -0,0 +1,2 @@ +node_modules +dist \ No newline at end of file diff --git a/ui/.eslintrc.js b/ui/.eslintrc.js new file mode 100644 index 0000000..639ccc3 --- /dev/null +++ b/ui/.eslintrc.js @@ -0,0 +1,3 @@ +module.exports = { + extends: '../.eslintrc.js' +} diff --git a/ui/package-lock.json b/ui/package-lock.json index b415b54..e32036e 100644 --- a/ui/package-lock.json +++ b/ui/package-lock.json @@ -1,6 +1,6 @@ { "name": "eqmac", - "version": "1.2.2", + "version": "1.3.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/ui/scripts/purge-cache.ts b/ui/scripts/purge-cache.ts index 030985f..7919550 100644 --- a/ui/scripts/purge-cache.ts +++ b/ui/scripts/purge-cache.ts @@ -9,7 +9,7 @@ const cf = Cloudflare({ }) ;(async () => { - const [ major, minor ] = version.split('.') + const [ major ] = version.split('.') const domain = `https://ui-v${major}.eqmac.app` await cf.zones.purgeCache(process.env.CLOUDFLARE_ZONE_ID, { files: [ domain ] diff --git a/ui/src/app/app.component.ts b/ui/src/app/app.component.ts index 14be29e..2421fc4 100644 --- a/ui/src/app/app.component.ts +++ b/ui/src/app/app.component.ts @@ -16,8 +16,8 @@ import { SettingsService, IconMode } from './sections/settings/settings.service' @Component({ selector: 'app-root', templateUrl: './app.component.html', - styleUrls: ['./app.component.scss'], - animations: [FadeInOutAnimation, FromTopAnimation] + styleUrls: [ './app.component.scss' ], + animations: [ FadeInOutAnimation, FromTopAnimation ] }) export class AppComponent implements OnInit, AfterContentInit { @@ -75,7 +75,7 @@ export class AppComponent implements OnInit, AfterContentInit { async syncHeight (dimensions?: UIDimensions) { await this.utils.delay(10) - let height = this.container.nativeElement.offsetHeight + let height: number = this.container.nativeElement.offsetHeight if (dimensions) { if (dimensions.heightDiff) { height += dimensions.heightDiff @@ -88,7 +88,7 @@ export class AppComponent implements OnInit, AfterContentInit { async syncWidth (dimensions?: UIDimensions) { await this.utils.delay(10) - let width = this.container.nativeElement.offsetWidth + let width: number = this.container.nativeElement.offsetWidth if (dimensions) { if (dimensions.widthDiff) { width += dimensions.widthDiff @@ -100,8 +100,8 @@ export class AppComponent implements OnInit, AfterContentInit { } startDimensionsSync () { - this.ui.dimensionsChanged.subscribe(dimensions => this.syncDimensions(dimensions)) - setInterval(() => this.syncDimensions(), 1000) + this.ui.dimensionsChanged.subscribe(async dimensions => await this.syncDimensions(dimensions)) + setInterval(async () => await this.syncDimensions(), 1000) } toggleDropdownSection (section: string) { @@ -123,7 +123,7 @@ export class AppComponent implements OnInit, AfterContentInit { closeDropdownSection (section: string, event?: any) { // if (event && event.target && ['backdrop', 'mat-dialog'].some(e => event.target.className.includes(e))) return - if (this.matDialog.openDialogs.length) return + if (this.matDialog.openDialogs.length > 0) return if (section in this.showDropdownSections) { this.showDropdownSections[section] = false } diff --git a/ui/src/app/app.module.ts b/ui/src/app/app.module.ts index bd17367..4175fd8 100644 --- a/ui/src/app/app.module.ts +++ b/ui/src/app/app.module.ts @@ -9,10 +9,6 @@ import { AppComponent } from './app.component' -import { - environment -} from '../environments/environment' - import { FlexLayoutModule } from '@angular/flex-layout' @@ -70,9 +66,6 @@ import { import { VolumeBoosterBalanceComponent } from './sections/volume/booster-balance/volume-booster-balance.component' -import { - VolumeMixerComponent -} from './sections/volume/volume-mixer/volume-mixer.component' import { BrowserAnimationsModule } from '@angular/platform-browser/animations' import { SettingsComponent } from './sections/settings/settings.component' @@ -115,7 +108,6 @@ import { OptionsDialogComponent } from './components/options-dialog/options-dial BasicEqualizerComponent, AdvancedEqualizerComponent, VolumeBoosterBalanceComponent, - VolumeMixerComponent, SettingsComponent, OptionsComponent, HelpComponent, @@ -125,6 +117,6 @@ import { OptionsDialogComponent } from './components/options-dialog/options-dial OptionsDialogComponent ], providers: [], - bootstrap: [AppComponent] + bootstrap: [ AppComponent ] }) export class AppModule {} diff --git a/ui/src/app/components/confirm-dialog/confirm-dialog.component.ts b/ui/src/app/components/confirm-dialog/confirm-dialog.component.ts index 699907b..cb75cb2 100644 --- a/ui/src/app/components/confirm-dialog/confirm-dialog.component.ts +++ b/ui/src/app/components/confirm-dialog/confirm-dialog.component.ts @@ -10,7 +10,7 @@ export interface ConfirmDialogData { @Component({ selector: 'eqm-confirm-dialog', templateUrl: './confirm-dialog.component.html', - styleUrls: ['./confirm-dialog.component.scss'] + styleUrls: [ './confirm-dialog.component.scss' ] }) export class ConfirmDialogComponent implements OnInit { @Input() text: string @@ -26,7 +26,7 @@ export class ConfirmDialogComponent implements OnInit { ngOnInit () { if (this.data) { - for (const [key, value] of Object.entries(this.data)) { + for (const [ key, value ] of Object.entries(this.data)) { this[key] = value || this[key] } } @@ -43,5 +43,4 @@ export class ConfirmDialogComponent implements OnInit { this.dialogRef.close(true) } } - } diff --git a/ui/src/app/components/options-dialog/options-dialog.component.ts b/ui/src/app/components/options-dialog/options-dialog.component.ts index f56d18f..e241158 100644 --- a/ui/src/app/components/options-dialog/options-dialog.component.ts +++ b/ui/src/app/components/options-dialog/options-dialog.component.ts @@ -9,7 +9,7 @@ export interface OptionsDialogData { @Component({ selector: 'eqm-options-dialog', templateUrl: './options-dialog.component.html', - styleUrls: ['./options-dialog.component.scss'] + styleUrls: [ './options-dialog.component.scss' ] }) export class OptionsDialogComponent implements OnInit { @Input() options: Options @@ -22,10 +22,9 @@ export class OptionsDialogComponent implements OnInit { ngOnInit () { if (this.data) { - for (const [key, value] of Object.entries(this.data)) { + for (const [ key, value ] of Object.entries(this.data)) { this[key] = value || this[key] } } } - } diff --git a/ui/src/app/components/options/options.component.ts b/ui/src/app/components/options/options.component.ts index 5227b7c..3b18ab4 100644 --- a/ui/src/app/components/options/options.component.ts +++ b/ui/src/app/components/options/options.component.ts @@ -74,8 +74,8 @@ export interface BreadcrumbsOption extends BaseOptions { } export interface InputOption extends BaseOptions { - type: 'input', - value?: string, + type: 'input' + value?: string placeholder?: string changed?: (value: string) => any enter?: () => any @@ -117,7 +117,7 @@ export interface ValueScreenOption extends BaseOptions { clicked?: () => any } -export type Option = ButtonOption | CheckboxOption | SelectOption +export type Option = ButtonOption | CheckboxOption | SelectOption | DividerOption | LabelOption | HTMLOption | DropdownOption | BreadcrumbsOption | InputOption | FlatSliderOption | SkeuomorphSliderOption | ValueScreenOption @@ -126,7 +126,7 @@ export type Options = Option[][] @Component({ selector: 'eqm-options', templateUrl: './options.component.html', - styleUrls: ['./options.component.scss'] + styleUrls: [ './options.component.scss' ] }) export class OptionsComponent { @Input() options: Options = [] @@ -135,10 +135,10 @@ export class OptionsComponent { constructor ( public app: ApplicationService, public ref: ChangeDetectorRef - ) {} + ) {} getOptionStyle (option: Option, row: Option[]) { - let style = option.style || {} + const style = option.style || {} if (!style.width) { style.width = `${100 / row.length}%` } @@ -146,7 +146,7 @@ export class OptionsComponent { style.width = '100%' } - if (!!option.isEnabled && option.isEnabled() === false) { + if (!!option.isEnabled && !option.isEnabled()) { style.filter = 'grayscale(1)' } @@ -154,7 +154,7 @@ export class OptionsComponent { } toggleCheckbox (checkbox: CheckboxOption) { - if (!!checkbox.isEnabled && checkbox.isEnabled() === false) { + if (!!checkbox.isEnabled && !checkbox.isEnabled()) { return } checkbox.value = !checkbox.value @@ -163,7 +163,7 @@ export class OptionsComponent { } selectedOption (option: SelectOption, selectOption: SelectOptionOption) { - if (!!option.isEnabled && option.isEnabled() === false) { + if (!!option.isEnabled && !option.isEnabled()) { return } if (option.selectedId !== selectOption.id) { diff --git a/ui/src/app/components/prompt-dialog/prompt-dialog.component.ts b/ui/src/app/components/prompt-dialog/prompt-dialog.component.ts index 6d4b4b4..c494d68 100644 --- a/ui/src/app/components/prompt-dialog/prompt-dialog.component.ts +++ b/ui/src/app/components/prompt-dialog/prompt-dialog.component.ts @@ -10,7 +10,7 @@ export interface PromptDialogData extends ConfirmDialogData { @Component({ selector: 'eqm-prompt-dialog', templateUrl: './prompt-dialog.component.html', - styleUrls: ['./prompt-dialog.component.scss'] + styleUrls: [ './prompt-dialog.component.scss' ] }) export class PromptDialogComponent extends ConfirmDialogComponent { @Input() prompt diff --git a/ui/src/app/modules/animations/fade-in-out.ts b/ui/src/app/modules/animations/fade-in-out.ts index 51d5c6f..779564d 100644 --- a/ui/src/app/modules/animations/fade-in-out.ts +++ b/ui/src/app/modules/animations/fade-in-out.ts @@ -1,13 +1,13 @@ -import { trigger, style, animate, transition, state } from '@angular/animations' +import { trigger, style, animate, transition } from '@angular/animations' const DURATION = 100 export const FadeInOutAnimation = trigger('FadeInOut', [ - transition(':enter', [ // :enter is alias to 'void => *' + transition(':enter', [ // :enter is alias to 'void => *' style({ opacity: 0 }), animate(DURATION, style({ opacity: 1 })) ]), - transition(':leave', [ // :leave is alias to '* => void' + transition(':leave', [ // :leave is alias to '* => void' animate(DURATION, style({ opacity: 0 })) ]) ]) diff --git a/ui/src/app/modules/animations/from-top.ts b/ui/src/app/modules/animations/from-top.ts index 63ef3bd..edee1c8 100644 --- a/ui/src/app/modules/animations/from-top.ts +++ b/ui/src/app/modules/animations/from-top.ts @@ -11,11 +11,11 @@ const END_FRAME_STATE = { } export const FromTopAnimation = trigger('FromTop', [ - transition(':enter', [ // :enter is alias to 'void => *' + transition(':enter', [ // :enter is alias to 'void => *' style(INITIAL_STATE), animate(DURATION, style(END_FRAME_STATE)) ]), - transition(':leave', [ // :leave is alias to '* => void' + transition(':leave', [ // :leave is alias to '* => void' animate(DURATION, style(INITIAL_STATE)) ]) ]) diff --git a/ui/src/app/modules/eqmac-components/components/analyzer/analyzer.component.ts b/ui/src/app/modules/eqmac-components/components/analyzer/analyzer.component.ts index b886900..226db7c 100644 --- a/ui/src/app/modules/eqmac-components/components/analyzer/analyzer.component.ts +++ b/ui/src/app/modules/eqmac-components/components/analyzer/analyzer.component.ts @@ -8,7 +8,7 @@ import { @Component({ selector: 'eqm-analyzer', templateUrl: './analyzer.component.html', - styleUrls: ['./analyzer.component.scss'] + styleUrls: [ './analyzer.component.scss' ] }) export class AnalyzerComponent implements OnInit { @@ -32,8 +32,8 @@ export class AnalyzerComponent implements OnInit { // Get canvas context const gridCanvas: HTMLCanvasElement = this.gridCanvas.nativeElement - gridCanvas.style.height = this.container.nativeElement.offsetHeight + 'px' - gridCanvas.style.width = this.container.nativeElement.offsetWidth + 'px' + gridCanvas.style.height = `${parseInt(this.container.nativeElement.offsetHeight)}px` + gridCanvas.style.width = `${parseInt(this.container.nativeElement.offsetWidth)}px` this.width = gridCanvas.offsetWidth this.height = gridCanvas.offsetHeight diff --git a/ui/src/app/modules/eqmac-components/components/breadcrumbs/breadcrumbs.component.ts b/ui/src/app/modules/eqmac-components/components/breadcrumbs/breadcrumbs.component.ts index 273e898..b25214d 100644 --- a/ui/src/app/modules/eqmac-components/components/breadcrumbs/breadcrumbs.component.ts +++ b/ui/src/app/modules/eqmac-components/components/breadcrumbs/breadcrumbs.component.ts @@ -1,17 +1,15 @@ -import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; +import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core' @Component({ selector: 'eqm-breadcrumbs', templateUrl: './breadcrumbs.component.html', - styleUrls: ['./breadcrumbs.component.scss'] + styleUrls: [ './breadcrumbs.component.scss' ] }) export class BreadcrumbsComponent implements OnInit { @Input() crumbs: string[] @Input() underline = true @Output() crumbClicked = new EventEmitter<{ crumb: string, index: number }>() - constructor() { } - ngOnInit(): void { + ngOnInit (): void { } - } diff --git a/ui/src/app/modules/eqmac-components/components/button/button.component.ts b/ui/src/app/modules/eqmac-components/components/button/button.component.ts index 3b6a3d9..e8a7cd6 100644 --- a/ui/src/app/modules/eqmac-components/components/button/button.component.ts +++ b/ui/src/app/modules/eqmac-components/components/button/button.component.ts @@ -3,7 +3,7 @@ import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core' @Component({ selector: 'eqm-button', templateUrl: './button.component.html', - styleUrls: ['./button.component.scss'] + styleUrls: [ './button.component.scss' ] }) export class ButtonComponent implements OnInit { @Input() type: 'large' | 'narrow' | 'square' | 'circle' | 'transparent' = 'large' @@ -15,7 +15,6 @@ export class ButtonComponent implements OnInit { @Input() hoverable = true @Input() disabled = false @Output() pressed = new EventEmitter() - constructor () { } ngOnInit () { } @@ -55,5 +54,4 @@ export class ButtonComponent implements OnInit { this.pressed.emit() } } - } diff --git a/ui/src/app/modules/eqmac-components/components/carousel/carousel.component.ts b/ui/src/app/modules/eqmac-components/components/carousel/carousel.component.ts index 77c313a..9c9798a 100644 --- a/ui/src/app/modules/eqmac-components/components/carousel/carousel.component.ts +++ b/ui/src/app/modules/eqmac-components/components/carousel/carousel.component.ts @@ -1,5 +1,5 @@ -import { Component, ContentChildren, QueryList, Directive, ViewChild, ElementRef, Input, TemplateRef, ViewContainerRef, AfterViewInit, Output, EventEmitter, HostBinding, ViewChildren, OnDestroy } from '@angular/core' -import { AnimationPlayer, AnimationFactory, animate, style, AnimationBuilder } from '@angular/animations' +import { Component, ContentChildren, QueryList, Directive, ViewChild, ElementRef, Input, TemplateRef, AfterViewInit, Output, EventEmitter, ViewChildren, OnDestroy } from '@angular/core' +import { AnimationFactory, animate, style, AnimationBuilder } from '@angular/animations' @Directive({ selector: '[eqmCarouselItem]' @@ -23,7 +23,7 @@ export class CarouselItemElement { @Component({ selector: 'eqm-carousel', templateUrl: './carousel.component.html', - styleUrls: ['./carousel.component.scss'] + styleUrls: [ './carousel.component.scss' ] }) export class CarouselComponent implements AfterViewInit, OnDestroy { @ContentChildren(CarouselItemDirective) items: QueryList @@ -41,6 +41,7 @@ export class CarouselComponent implements AfterViewInit, OnDestroy { this.heightDiff.emit(diff) } } + @Output() heightDiff = new EventEmitter() @Output() heightChange = new EventEmitter() public recalculateHeightTimer @@ -54,6 +55,7 @@ export class CarouselComponent implements AfterViewInit, OnDestroy { this.recalculateHeight() this.itemCameIntoView.emit(this.selectedItemId) } + get selectedItemId () { return this._selectedItemId } @Output() selectedItemIdChange = new EventEmitter() @Output() animationCompleted = new EventEmitter() @@ -75,13 +77,13 @@ export class CarouselComponent implements AfterViewInit, OnDestroy { ngAfterViewInit () { for (const item of this.items.toArray()) { if (!item.eqmCarouselItem || typeof item.eqmCarouselItem !== 'string') { - throw new Error(`eqmCarouselItem directive was not provided an item ID`) + throw new Error('eqmCarouselItem directive was not provided an item ID') } } this.animate() this.recalculateHeight() - this.recalculateHeightTimer = setInterval(this.recalculateHeight.bind(this), 1000) + this.recalculateHeightTimer = setInterval(() => this.recalculateHeight(), 1000) } ngOnDestroy () { @@ -127,8 +129,7 @@ export class CarouselComponent implements AfterViewInit, OnDestroy { } public recalculateHeight () { - const itemEl = this.itemElems && this.itemElems.toArray()[this.currentIndex].nativeElement.nextElementSibling - itemEl && itemEl.offsetHeight && (this.height = itemEl.offsetHeight) + const itemEl = this.itemElems?.toArray()[this.currentIndex].nativeElement.nextElementSibling + itemEl?.offsetHeight && (this.height = itemEl.offsetHeight) } - } diff --git a/ui/src/app/modules/eqmac-components/components/checkbox/checkbox.component.ts b/ui/src/app/modules/eqmac-components/components/checkbox/checkbox.component.ts index 59ef83a..9976d0d 100644 --- a/ui/src/app/modules/eqmac-components/components/checkbox/checkbox.component.ts +++ b/ui/src/app/modules/eqmac-components/components/checkbox/checkbox.component.ts @@ -1,9 +1,9 @@ -import { Component, OnInit, Input, Output, EventEmitter, HostBinding } from '@angular/core' +import { Component, Input, Output, EventEmitter, HostBinding } from '@angular/core' @Component({ selector: 'eqm-checkbox', templateUrl: './checkbox.component.html', - styleUrls: ['./checkbox.component.scss'] + styleUrls: [ './checkbox.component.scss' ] }) export class CheckboxComponent { @Input() interactive: boolean = true diff --git a/ui/src/app/modules/eqmac-components/components/container/container.component.ts b/ui/src/app/modules/eqmac-components/components/container/container.component.ts index df4b3b2..d433271 100644 --- a/ui/src/app/modules/eqmac-components/components/container/container.component.ts +++ b/ui/src/app/modules/eqmac-components/components/container/container.component.ts @@ -3,13 +3,11 @@ import { Component, OnInit, HostBinding, Input } from '@angular/core' @Component({ selector: 'eqm-container', templateUrl: './container.component.html', - styleUrls: ['./container.component.scss'] + styleUrls: [ './container.component.scss' ] }) export class ContainerComponent implements OnInit { @HostBinding('class.disabled') @Input() disabled = false - constructor () { } ngOnInit () { } - } diff --git a/ui/src/app/modules/eqmac-components/components/divider/divider.component.ts b/ui/src/app/modules/eqmac-components/components/divider/divider.component.ts index abf44d8..a97754f 100644 --- a/ui/src/app/modules/eqmac-components/components/divider/divider.component.ts +++ b/ui/src/app/modules/eqmac-components/components/divider/divider.component.ts @@ -1,9 +1,9 @@ -import { Component, OnInit, Input, ElementRef, HostBinding } from '@angular/core' +import { Component, Input, ElementRef, HostBinding } from '@angular/core' @Component({ selector: 'eqm-divider', templateUrl: './divider.component.html', - styleUrls: ['./divider.component.scss'] + styleUrls: [ './divider.component.scss' ] }) export class DividerComponent { @Input() orientation: 'vertical' | 'horizontal' = 'horizontal' @@ -41,5 +41,4 @@ export class DividerComponent { get bottomtBorder () { return this.orientation === 'horizontal' ? '1px solid rgb(96, 97, 101)' : undefined } - } diff --git a/ui/src/app/modules/eqmac-components/components/dropdown/dropdown.component.ts b/ui/src/app/modules/eqmac-components/components/dropdown/dropdown.component.ts index 5be90bc..a758452 100644 --- a/ui/src/app/modules/eqmac-components/components/dropdown/dropdown.component.ts +++ b/ui/src/app/modules/eqmac-components/components/dropdown/dropdown.component.ts @@ -1,34 +1,35 @@ import { Component, OnInit, Input, ViewChild, ElementRef, EventEmitter, Output, NgZone, HostBinding, HostListener } from '@angular/core' import { SelectBoxComponent } from '../select-box/select-box.component' import { UtilitiesService } from '../../services/utilities.service' -import { InputFieldComponent } from '../input-field/input-field.component' import { FadeInOutAnimation } from 'src/app/modules/animations' @Component({ selector: 'eqm-dropdown', templateUrl: './dropdown.component.html', - styleUrls: ['./dropdown.component.scss'], + styleUrls: [ './dropdown.component.scss' ], animations: [ FadeInOutAnimation ] }) export class DropdownComponent implements OnInit { constructor ( - public utils: UtilitiesService, + public utils: UtilitiesService, public zone: NgZone, public ref: ElementRef ) { } - + public _items: any[] = [] @Input() editable = false @Input() get items () { return this._items } + set items (newItems) { if (!newItems || !Array.isArray(newItems)) return this.searchText = null this._items = newItems } + @Output() refChanged = new EventEmitter() @HostBinding('class.disabled') @Input() disabled = false @Input() selectedItem = null @@ -54,7 +55,8 @@ export class DropdownComponent implements OnInit { if (!this.items) this.items = [] this.setDimensions() this.calculateYCoordinate() - for (let _ in [...Array(3)]) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + for (const _ of [ ...Array(3) ]) { await this.utils.delay(100) this.calculateYCoordinate() } @@ -78,19 +80,19 @@ export class DropdownComponent implements OnInit { this.direction = preferredDirection const inputEl = this.container.nativeElement - const inputHeight = inputEl.offsetHeight + const inputHeight = parseInt(inputEl.offsetHeight) const inputPosition = inputEl.getBoundingClientRect() const boxHeight = this.boxComponent.height - const downY = inputPosition.y + inputHeight + this.padding / 2 + const downY = parseInt(inputPosition.y) + inputHeight + this.padding / 2 const downSpaceLeft = viewHeight - (downY + boxHeight) const upY = inputPosition.top - boxHeight - this.padding const upSpaceLeft = upY this.direction = this.forceDirection ?? (downSpaceLeft > upSpaceLeft ? 'down' : 'up') - let y = this.direction === 'down' ? downY : upY + const y = this.direction === 'down' ? downY : upY this.yCoordinate = y } @@ -128,7 +130,7 @@ export class DropdownComponent implements OnInit { } searchText: string - @HostListener('document:keypress', ['$event']) + @HostListener('document:keypress', [ '$event' ]) keypress (event: KeyboardEvent) { if (!this.disabled && this.shown && this.searchable) { switch (event.key) { diff --git a/ui/src/app/modules/eqmac-components/components/flat-slider/flat-slider.component.ts b/ui/src/app/modules/eqmac-components/components/flat-slider/flat-slider.component.ts index 6f3fc85..a92aba4 100644 --- a/ui/src/app/modules/eqmac-components/components/flat-slider/flat-slider.component.ts +++ b/ui/src/app/modules/eqmac-components/components/flat-slider/flat-slider.component.ts @@ -1,6 +1,5 @@ import { Component, - OnInit, ViewChild, Input, Output, @@ -13,7 +12,7 @@ import { UtilitiesService } from '../../services/utilities.service' import { FadeInOutAnimation } from '../../../animations' -import { SafeStyle, DomSanitizer } from '@angular/platform-browser' +import { DomSanitizer } from '@angular/platform-browser' export interface FlatSliderValueChangedEvent { value: number @@ -23,8 +22,8 @@ export interface FlatSliderValueChangedEvent { @Component({ selector: 'eqm-flat-slider', templateUrl: './flat-slider.component.html', - styleUrls: ['./flat-slider.component.scss'], - animations: [FadeInOutAnimation] + styleUrls: [ './flat-slider.component.scss' ], + animations: [ FadeInOutAnimation ] }) export class FlatSliderComponent { constructor ( @@ -61,6 +60,7 @@ export class FlatSliderComponent { this._enabled = shouldBeEnabled this._color = this._enabled ? this.defaultColor : '#777' } + get enabled () { return this._enabled } public _color = this.defaultColor @@ -69,6 +69,7 @@ export class FlatSliderComponent { this.defaultColor = newColor this._color = this._enabled ? this.defaultColor : '#777' } + get color () { return this._color } @@ -85,7 +86,7 @@ export class FlatSliderComponent { public dragging = false public thumbRadius = 4 - public _value = .5 + public _value = 0.5 @Input() set value (newValue) { let value = this.clampValue(newValue) @@ -98,10 +99,10 @@ export class FlatSliderComponent { diffFromMiddle *= -1 } const percFromMiddle = this.mapValue({ - value: diffFromMiddle, - inMin: 0, - inMax: this.max - middleValue, - outMin: 0, + value: diffFromMiddle, + inMin: 0, + inMax: this.max - middleValue, + outMin: 0, outMax: 100 }) if ((this._value).toFixed(2) === (middleValue).toFixed(2) && percFromMiddle < 5) { @@ -116,6 +117,7 @@ export class FlatSliderComponent { this._value = this.clampValue(value) this.valueChange.emit(this._value) } + get value () { return this._value } @Output() valueChange = new EventEmitter() @@ -128,13 +130,14 @@ export class FlatSliderComponent { get width () { return this.containerRef.nativeElement.offsetWidth } + public clampValue (value) { if (value < this.min) return this.min if (value > this.max) return this.max return value } - @HostListener('mousewheel', ['$event']) + @HostListener('mousewheel', [ '$event' ]) mouseWheel (event: MouseWheelEvent) { if (this.enabled && this.scrollEnabled) { // const multiplier = (this.max - this.min) / 1000 @@ -165,7 +168,8 @@ export class FlatSliderComponent { if (progress > inMax) progress = inMax return this.mapValue({ value: progress, - inMin, inMax, + inMin, + inMax, outMin: this.min, outMax: this.max }) @@ -173,7 +177,7 @@ export class FlatSliderComponent { return value } - @HostListener('mousedown', ['$event']) + @HostListener('mousedown', [ '$event' ]) mousedown (event: MouseEvent) { if (this.enabled) { this.dragging = true @@ -182,7 +186,7 @@ export class FlatSliderComponent { } } - @HostListener('mousemove', ['$event']) + @HostListener('mousemove', [ '$event' ]) mousemove (event: MouseEvent) { if (this.enabled && this.dragging) { this.value = this.getValueFromMouseEvent(event) @@ -195,6 +199,7 @@ export class FlatSliderComponent { onMouseEnter (): void { this.mouseInside = true } + @HostListener('mouseleave') onMouseLeave (): void { this.mouseInside = false @@ -229,13 +234,13 @@ export class FlatSliderComponent { value += step this.value = value } - return } - @HostListener('mouseup', ['$event']) + @HostListener('mouseup', [ '$event' ]) onMouseUp () { this.dragging = false } + mouseup (event) { this.dragging = false } @@ -259,10 +264,10 @@ export class FlatSliderComponent { const styles: { [style: string]: string } = {} const narrow = this.thumbRadius * 2 + 2 if (this.orientation === 'horizontal') { - styles.width = `100%` + styles.width = '100%' styles.height = `${narrow}px` } else { - styles.height = `100%` + styles.height = '100%' styles.width = `${narrow}px` } @@ -329,20 +334,20 @@ export class FlatSliderComponent { style.borderRadius = '100%' if (this.orientation === 'horizontal') { const left = this.mapValue({ - value: this.value, - inMin: this.min, - inMax: this.max, - outMin: -borderSize, + value: this.value, + inMin: this.min, + inMax: this.max, + outMin: -borderSize, outMax: this.width - this.thumbRadius * 2 - borderSize, logInverse: true }) style.left = `${left}px` } else { style.bottom = `${this.mapValue({ - value: this.value, - inMin: this.min, - inMax: this.max, - outMin: -borderSize, + value: this.value, + inMin: this.min, + inMax: this.max, + outMin: -borderSize, outMax: this.height - this.thumbRadius * 2 - borderSize, logInverse: true })}px` @@ -351,13 +356,16 @@ export class FlatSliderComponent { } private mapValue ({ value, inMin, inMax, outMin, outMax, logInverse }: { - value: number, inMin: number, inMax: number, outMin: number, outMax: number + value: number + inMin: number + inMax: number + outMin: number + outMax: number logInverse?: boolean }) { switch (this.scale) { case 'linear': return this.utils.mapValue(value, inMin, inMax, outMin, outMax) - case 'logarithmic': return (logInverse ? this.utils.logMapValueInverse : this.utils.logMapValue) - ({ value, inMin, inMax, outMin, outMax }) + case 'logarithmic': return (logInverse ? this.utils.logMapValueInverse : this.utils.logMapValue)({ value, inMin, inMax, outMin, outMax }) } } } diff --git a/ui/src/app/modules/eqmac-components/components/icon/icon.component.ts b/ui/src/app/modules/eqmac-components/components/icon/icon.component.ts index 5738f35..ab56749 100644 --- a/ui/src/app/modules/eqmac-components/components/icon/icon.component.ts +++ b/ui/src/app/modules/eqmac-components/components/icon/icon.component.ts @@ -10,7 +10,7 @@ import { DomSanitizer, SafeHtml } from '@angular/platform-browser' @Component({ selector: 'eqm-icon', templateUrl: './icon.component.html', - styleUrls: ['./icon.component.scss'], + styleUrls: [ './icon.component.scss' ], encapsulation: ViewEncapsulation.ShadowDom }) export class IconComponent implements OnInit { @@ -18,10 +18,12 @@ export class IconComponent implements OnInit { @Input() height = 20 svg: SafeHtml icons = svgs + @Input() set size (newSize) { this.width = newSize this.height = newSize } + _color = '#979aa0' @Input() set color (newColor) { @@ -47,6 +49,7 @@ export class IconComponent implements OnInit { get rotate () { return this._rotate } + set rotate (angle: number) { this._rotate = angle } @@ -57,6 +60,7 @@ export class IconComponent implements OnInit { this._name = iconName this.svg = this.sanitizer.bypassSecurityTrustHtml(this.icons[this.name]) } + get name () { return this._name } @Input() stroke: number = 0 diff --git a/ui/src/app/modules/eqmac-components/components/input-field/input-field.component.ts b/ui/src/app/modules/eqmac-components/components/input-field/input-field.component.ts index 7ac76a4..b726e58 100644 --- a/ui/src/app/modules/eqmac-components/components/input-field/input-field.component.ts +++ b/ui/src/app/modules/eqmac-components/components/input-field/input-field.component.ts @@ -3,7 +3,7 @@ import { Component, OnInit, Input, EventEmitter, Output, ViewChild, HostBinding @Component({ selector: 'eqm-input-field', templateUrl: './input-field.component.html', - styleUrls: ['./input-field.component.scss'] + styleUrls: [ './input-field.component.scss' ] }) export class InputFieldComponent implements OnInit { @Input() text: string @@ -14,7 +14,6 @@ export class InputFieldComponent implements OnInit { @HostBinding('class.disabled') @Input() disabled = false @Input() fontSize = 12 @ViewChild('container', { static: true }) container - constructor () { } ngOnInit () { } @@ -26,5 +25,4 @@ export class InputFieldComponent implements OnInit { enterPressed () { this.enter.emit() } - } diff --git a/ui/src/app/modules/eqmac-components/components/knob/knob.component.ts b/ui/src/app/modules/eqmac-components/components/knob/knob.component.ts index 7021bf0..251c2a4 100644 --- a/ui/src/app/modules/eqmac-components/components/knob/knob.component.ts +++ b/ui/src/app/modules/eqmac-components/components/knob/knob.component.ts @@ -19,7 +19,7 @@ export interface KnobValueChangedEvent { @Component({ selector: 'eqm-knob', templateUrl: './knob.component.html', - styleUrls: ['./knob.component.scss'] + styleUrls: [ './knob.component.scss' ] }) export class KnobComponent implements OnInit { @Input() size: 'large' | 'medium' | 'small' = 'medium' @@ -59,7 +59,6 @@ export class KnobComponent implements OnInit { if (this._value === newValue || typeof newValue !== 'number') return let value = newValue if (this.stickToMiddle) { - let diffFromMiddle = this.middleValue - value if (diffFromMiddle < 0) { diffFromMiddle *= -1 @@ -77,6 +76,7 @@ export class KnobComponent implements OnInit { this._value = this.clampValue(value) this.valueChange.emit(this._value) } + get value () { return this._value } @@ -116,7 +116,7 @@ export class KnobComponent implements OnInit { this.dragging = false } - @HostListener('gesturechange', ['$event']) + @HostListener('gesturechange', [ '$event' ]) onGestureChange (event) { if (!this.disabled) { try { @@ -133,7 +133,6 @@ export class KnobComponent implements OnInit { mousemove (event) { if (!this.disabled) { - if (this.setDraggingFalseTimeout) { window.clearTimeout(this.setDraggingFalseTimeout) } @@ -236,7 +235,6 @@ export class KnobComponent implements OnInit { } } this.continueAnimation = false - return } public getDegreesFromEvent (event) { diff --git a/ui/src/app/modules/eqmac-components/components/label/label.component.ts b/ui/src/app/modules/eqmac-components/components/label/label.component.ts index d5d0a93..4a951b3 100644 --- a/ui/src/app/modules/eqmac-components/components/label/label.component.ts +++ b/ui/src/app/modules/eqmac-components/components/label/label.component.ts @@ -1,15 +1,14 @@ -import { Component, OnInit, Input, HostBinding } from '@angular/core' +import { Component, Input, HostBinding } from '@angular/core' @Component({ selector: 'eqm-label', templateUrl: './label.component.html', - styleUrls: ['./label.component.scss'] + styleUrls: [ './label.component.scss' ] }) export class LabelComponent { @Input() fontSize: number @Input() color: string @Input() clickable = false - constructor () { } get style () { return { diff --git a/ui/src/app/modules/eqmac-components/components/loading/loading.component.ts b/ui/src/app/modules/eqmac-components/components/loading/loading.component.ts index 0097d82..489d99b 100644 --- a/ui/src/app/modules/eqmac-components/components/loading/loading.component.ts +++ b/ui/src/app/modules/eqmac-components/components/loading/loading.component.ts @@ -1,15 +1,16 @@ -import { Component, ViewChild, ElementRef, OnInit, AfterViewInit } from '@angular/core' +import { Component, ViewChild, ElementRef, AfterViewInit } from '@angular/core' @Component({ selector: 'eqm-loading', templateUrl: './loading.component.html', - styleUrls: ['./loading.component.scss'] + styleUrls: [ './loading.component.scss' ] }) export class LoadingComponent implements AfterViewInit { @ViewChild('wave', { static: true }) wave: ElementRef ngAfterViewInit () { const path = this.wave.nativeElement + // eslint-disable-next-line no-loss-of-precision const m = 0.512286623256592433 const w = 90 const h = 60 diff --git a/ui/src/app/modules/eqmac-components/components/prompt/prompt.component.ts b/ui/src/app/modules/eqmac-components/components/prompt/prompt.component.ts index 65a0110..fa75d1b 100644 --- a/ui/src/app/modules/eqmac-components/components/prompt/prompt.component.ts +++ b/ui/src/app/modules/eqmac-components/components/prompt/prompt.component.ts @@ -3,13 +3,9 @@ import { Component, OnInit } from '@angular/core' @Component({ selector: 'eqm-prompt', templateUrl: './prompt.component.html', - styleUrls: ['./prompt.component.scss'] + styleUrls: [ './prompt.component.scss' ] }) export class PromptComponent implements OnInit { - - constructor () { } - ngOnInit () { } - } diff --git a/ui/src/app/modules/eqmac-components/components/question/question.component.ts b/ui/src/app/modules/eqmac-components/components/question/question.component.ts index b317702..82a14ff 100644 --- a/ui/src/app/modules/eqmac-components/components/question/question.component.ts +++ b/ui/src/app/modules/eqmac-components/components/question/question.component.ts @@ -1,13 +1,11 @@ -import { Component, OnInit, Input } from '@angular/core' +import { Component, OnInit } from '@angular/core' @Component({ selector: 'eqm-question', template: '', - styles: [':host { height: 12px; width: 12px; display: flex; align-items: center; justify-content: center; border-radius: 50%; background-color: #2c2c2e; }'] + styles: [ ':host { height: 12px; width: 12px; display: flex; align-items: center; justify-content: center; border-radius: 50%; background-color: #2c2c2e; }' ] }) export class QuestionComponent implements OnInit { - constructor () { } - ngOnInit () { } } diff --git a/ui/src/app/modules/eqmac-components/components/screw/screw.component.ts b/ui/src/app/modules/eqmac-components/components/screw/screw.component.ts index 9ac02ad..15d81e0 100644 --- a/ui/src/app/modules/eqmac-components/components/screw/screw.component.ts +++ b/ui/src/app/modules/eqmac-components/components/screw/screw.component.ts @@ -3,13 +3,9 @@ import { Component, OnInit } from '@angular/core' @Component({ selector: 'eqm-screw', templateUrl: './screw.component.html', - styleUrls: ['./screw.component.scss'] + styleUrls: [ './screw.component.scss' ] }) export class ScrewComponent implements OnInit { - - constructor () { } - ngOnInit () { } - } diff --git a/ui/src/app/modules/eqmac-components/components/select-box/select-box.component.ts b/ui/src/app/modules/eqmac-components/components/select-box/select-box.component.ts index 46c77c6..f1b49f8 100644 --- a/ui/src/app/modules/eqmac-components/components/select-box/select-box.component.ts +++ b/ui/src/app/modules/eqmac-components/components/select-box/select-box.component.ts @@ -3,16 +3,16 @@ import { Component, OnInit, Input, Output, EventEmitter, ViewChild, ElementRef } @Component({ selector: 'eqm-select-box', templateUrl: './select-box.component.html', - styleUrls: ['./select-box.component.scss'] + styleUrls: [ './select-box.component.scss' ] }) export class SelectBoxComponent implements OnInit { - _items: any[] = [] @Input() set items (newItems: any[]) { this._items = newItems this.setHeight() } + get items () { return this._items } @@ -67,5 +67,4 @@ export class SelectBoxComponent implements OnInit { this.selectedItem = item this.itemSelected.emit(item) } - } diff --git a/ui/src/app/modules/eqmac-components/components/skeuomorph-slider/skeuomorph-slider.component.ts b/ui/src/app/modules/eqmac-components/components/skeuomorph-slider/skeuomorph-slider.component.ts index de6e9f4..611a651 100644 --- a/ui/src/app/modules/eqmac-components/components/skeuomorph-slider/skeuomorph-slider.component.ts +++ b/ui/src/app/modules/eqmac-components/components/skeuomorph-slider/skeuomorph-slider.component.ts @@ -21,10 +21,9 @@ export interface SkeuomorphSliderValueChangedEvent { @Component({ selector: 'eqm-skeuomorph-slider', templateUrl: './skeuomorph-slider.component.html', - styleUrls: ['./skeuomorph-slider.component.scss'] + styleUrls: [ './skeuomorph-slider.component.scss' ] }) export class SkeuomorphSliderComponent implements OnInit { - constructor (public utils: UtilitiesService, public elRef: ElementRef) {} @Input() min: number = 0 @@ -50,7 +49,7 @@ export class SkeuomorphSliderComponent implements OnInit { @HostBinding('class.disabled') @Input() disabled = false - public _value = .5 + public _value = 0.5 @Input() set value (newValue) { let value = this.clampValue(newValue) @@ -74,11 +73,11 @@ export class SkeuomorphSliderComponent implements OnInit { } this._value = this.clampValue(value) this.valueChange.emit(this._value) - } + get value () { return this._value } - @HostListener('mousewheel', ['$event']) + @HostListener('mousewheel', [ '$event' ]) onMouseWheel (event): void { if (!this.disabled && this.scrollEnabled) { this.value += -event.deltaY / 100 @@ -105,7 +104,7 @@ export class SkeuomorphSliderComponent implements OnInit { } } - @HostListener('mousedown', ['$event']) + @HostListener('mousedown', [ '$event' ]) onMouseDown (event) { if (!this.disabled) { this.dragging = true @@ -119,7 +118,7 @@ export class SkeuomorphSliderComponent implements OnInit { } } - @HostListener('mousemove', ['$event']) + @HostListener('mousemove', [ '$event' ]) onMouseMove (event) { if (!this.disabled && this.dragging) { this.value = this.getValueFromMouseEvent(event) @@ -127,7 +126,7 @@ export class SkeuomorphSliderComponent implements OnInit { } } - @HostListener('mouseup', ['$event']) + @HostListener('mouseup', [ '$event' ]) onMouseUp () { this.dragging = false } @@ -154,7 +153,7 @@ export class SkeuomorphSliderComponent implements OnInit { ngOnInit () { if (this.showNotches) { this.drawNotches() - setTimeout(this.drawNotches.bind(this)) + setTimeout(() => this.drawNotches()) } } @@ -171,7 +170,6 @@ export class SkeuomorphSliderComponent implements OnInit { value += step this.value = value } - return } @HostListener('window:resize') @@ -186,9 +184,9 @@ export class SkeuomorphSliderComponent implements OnInit { const gap = (height - padding * 2) / 10 ctx.strokeStyle = '#559e7d' for (let i = 0; i <= 10; i++) { - const y = Math.round(padding + gap * i) - .5 + const y = Math.round(padding + gap * i) - 0.5 ctx.beginPath() - const lineWidth = [0, 5, 10].includes(i) ? width : (width * 0.9) + const lineWidth = [ 0, 5, 10 ].includes(i) ? width : (width * 0.9) ctx.moveTo((width - lineWidth) / 1, y) ctx.lineTo(lineWidth, y) ctx.stroke() @@ -198,6 +196,6 @@ export class SkeuomorphSliderComponent implements OnInit { } calculateTop () { - return this.utils.mapValue(this._value, this.min, this.max, this.elRef.nativeElement.offsetHeight - 25, 0) + 'px' + return `${this.utils.mapValue(this._value, this.min, this.max, parseInt(this.elRef.nativeElement.offsetHeight) - 25, 0)}px` } } diff --git a/ui/src/app/modules/eqmac-components/components/toggle/toggle.component.ts b/ui/src/app/modules/eqmac-components/components/toggle/toggle.component.ts index 4cb20e6..4220cc7 100644 --- a/ui/src/app/modules/eqmac-components/components/toggle/toggle.component.ts +++ b/ui/src/app/modules/eqmac-components/components/toggle/toggle.component.ts @@ -3,12 +3,9 @@ import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core' @Component({ selector: 'eqm-toggle', templateUrl: './toggle.component.html', - styleUrls: ['./toggle.component.scss'] + styleUrls: [ './toggle.component.scss' ] }) export class ToggleComponent implements OnInit { - - constructor () { } - @Input() state = false @Output() stateChange = new EventEmitter() diff --git a/ui/src/app/modules/eqmac-components/components/tooltip/tooltip-container.component.ts b/ui/src/app/modules/eqmac-components/components/tooltip/tooltip-container.component.ts index ffa496a..782ebaa 100644 --- a/ui/src/app/modules/eqmac-components/components/tooltip/tooltip-container.component.ts +++ b/ui/src/app/modules/eqmac-components/components/tooltip/tooltip-container.component.ts @@ -16,10 +16,8 @@ import { FadeInOutAnimation } from '../../../animations/fade-in-out' `, - animations: [FadeInOutAnimation] + animations: [ FadeInOutAnimation ] }) export class TooltipContainerComponent { - constructor (public tooltipService: TooltipService) {} - } diff --git a/ui/src/app/modules/eqmac-components/components/tooltip/tooltip.component.ts b/ui/src/app/modules/eqmac-components/components/tooltip/tooltip.component.ts index a63d082..4936740 100644 --- a/ui/src/app/modules/eqmac-components/components/tooltip/tooltip.component.ts +++ b/ui/src/app/modules/eqmac-components/components/tooltip/tooltip.component.ts @@ -6,13 +6,13 @@ import { ViewChild } from '@angular/core' import { UtilitiesService } from '../../services/utilities.service' -import { SafeStyle, DomSanitizer } from '@angular/platform-browser' +import { DomSanitizer } from '@angular/platform-browser' export type TooltipPositionSide = 'top' | 'bottom' | 'left' | 'right' @Component({ selector: 'eqm-tooltip', templateUrl: './tooltip.component.html', - styleUrls: ['./tooltip.component.scss'] + styleUrls: [ './tooltip.component.scss' ] }) export class TooltipComponent implements OnInit { @Input() text: string @@ -49,12 +49,11 @@ export class TooltipComponent implements OnInit { const viewHeight = Math.max(body.scrollHeight, body.offsetHeight, html.clientHeight, html.scrollHeight, html.offsetHeight) const viewWidth = Math.max(body.scrollWidth, body.offsetWidth, html.clientWidth, html.scrollWidth, html.offsetWidth) const tooltipEl = this.tooltip.nativeElement - const tooltipWidth = tooltipEl.offsetWidth + 3 - const tooltipHeight = tooltipEl.offsetHeight + 2 + const tooltipWidth = parseInt(tooltipEl.offsetWidth) + 3 + const tooltipHeight = parseInt(tooltipEl.offsetHeight) + 2 const parentEl = this.parent.nativeElement const parentPosition = this.utils.getElementPosition(parentEl) - const parentWidth = parentEl.offsetWidth - const parentHeight = parentEl.offsetHeight + const parentHeight = parseInt(parentEl.offsetHeight) x = parentPosition.x y = parentPosition.y @@ -98,14 +97,12 @@ export class TooltipComponent implements OnInit { let angle = 0 const style: { [style: string]: string } = {} const tooltipEl = this.tooltip.nativeElement - const tooltipWidth = tooltipEl.offsetWidth const tooltipHeight = tooltipEl.offsetHeight const tooltipPosition = this.utils.getElementPosition(tooltipEl) const parentEl = this.parent.nativeElement const parentPosition = this.utils.getElementPosition(parentEl) const parentWidth = parentEl.offsetWidth - const parentHeight = parentEl.offsetHeight x = parentPosition.x + parentWidth / 2 - tooltipPosition.x - arrowSize / 2 + 3 if (this.positionSide === 'top') { @@ -126,5 +123,4 @@ export class TooltipComponent implements OnInit { return style } - } diff --git a/ui/src/app/modules/eqmac-components/components/tooltip/tooltip.directive.ts b/ui/src/app/modules/eqmac-components/components/tooltip/tooltip.directive.ts index 9cae0cf..311cdad 100644 --- a/ui/src/app/modules/eqmac-components/components/tooltip/tooltip.directive.ts +++ b/ui/src/app/modules/eqmac-components/components/tooltip/tooltip.directive.ts @@ -51,5 +51,4 @@ export class TooltipDirective implements OnDestroy { destroy (): void { this.tooltipService.components = [] } - } diff --git a/ui/src/app/modules/eqmac-components/components/tooltip/tooltip.service.ts b/ui/src/app/modules/eqmac-components/components/tooltip/tooltip.service.ts index 45876c3..6549ea1 100644 --- a/ui/src/app/modules/eqmac-components/components/tooltip/tooltip.service.ts +++ b/ui/src/app/modules/eqmac-components/components/tooltip/tooltip.service.ts @@ -4,6 +4,5 @@ import { Injectable } from '@angular/core' providedIn: 'root' }) export class TooltipService { - components: any[] = [] } diff --git a/ui/src/app/modules/eqmac-components/components/value-screen/value-screen.component.ts b/ui/src/app/modules/eqmac-components/components/value-screen/value-screen.component.ts index 6c5f170..5423eeb 100644 --- a/ui/src/app/modules/eqmac-components/components/value-screen/value-screen.component.ts +++ b/ui/src/app/modules/eqmac-components/components/value-screen/value-screen.component.ts @@ -1,20 +1,17 @@ import { Component, OnInit, - Input, - HostBinding + Input } from '@angular/core' @Component({ selector: 'eqm-value-screen', templateUrl: './value-screen.component.html', - styleUrls: ['./value-screen.component.scss'] + styleUrls: [ './value-screen.component.scss' ] }) export class ValueScreenComponent implements OnInit { @Input() fontSize = 10 @Input() disabled = false - constructor () {} ngOnInit () {} - } diff --git a/ui/src/app/modules/eqmac-components/components/vent/vent.component.ts b/ui/src/app/modules/eqmac-components/components/vent/vent.component.ts index d6a89e7..cd08626 100644 --- a/ui/src/app/modules/eqmac-components/components/vent/vent.component.ts +++ b/ui/src/app/modules/eqmac-components/components/vent/vent.component.ts @@ -3,11 +3,9 @@ import { Component, OnInit } from '@angular/core' @Component({ selector: 'eqm-vent', template: '', - styleUrls: ['./vent.component.scss'] + styleUrls: [ './vent.component.scss' ] }) export class VentComponent implements OnInit { - constructor () { } - ngOnInit () { } } diff --git a/ui/src/app/modules/eqmac-components/directives/clicked-outside.directive.ts b/ui/src/app/modules/eqmac-components/directives/clicked-outside.directive.ts index 5f3ab99..abcfc5e 100644 --- a/ui/src/app/modules/eqmac-components/directives/clicked-outside.directive.ts +++ b/ui/src/app/modules/eqmac-components/directives/clicked-outside.directive.ts @@ -1,6 +1,6 @@ -import { Component, Directive, EventEmitter, HostListener, Output } from "@angular/core"; +import { Directive, EventEmitter, HostListener, Output } from '@angular/core' -@Directive({ selector: `[clickedOutside]` }) +@Directive({ selector: '[clickedOutside]' }) export class ClickedOutsideDirective { @Output() clickedOutside = new EventEmitter() @@ -9,6 +9,7 @@ export class ClickedOutsideDirective { insideClick () { this.inside = true } + @HostListener('document:click') outsideClick () { if (!this.inside) { @@ -16,4 +17,4 @@ export class ClickedOutsideDirective { } this.inside = false } -} \ No newline at end of file +} diff --git a/ui/src/app/modules/eqmac-components/directives/mousewheel.directive.ts b/ui/src/app/modules/eqmac-components/directives/mousewheel.directive.ts index 046a10d..de055ca 100644 --- a/ui/src/app/modules/eqmac-components/directives/mousewheel.directive.ts +++ b/ui/src/app/modules/eqmac-components/directives/mousewheel.directive.ts @@ -4,21 +4,20 @@ import { Directive, Output, HostListener, EventEmitter } from '@angular/core' export class MouseWheelDirective { @Output() mouseWheel = new EventEmitter() - @HostListener('mousewheel', ['$event']) onMouseWheelChrome (event: any) { + @HostListener('mousewheel', [ '$event' ]) onMouseWheelChrome (event: any) { this.mouseWheelFunc(event) } - @HostListener('DOMMouseScroll', ['$event']) onMouseWheelFirefox (event: any) { + @HostListener('DOMMouseScroll', [ '$event' ]) onMouseWheelFirefox (event: any) { this.mouseWheelFunc(event) } - @HostListener('onmousewheel', ['$event']) onMouseWheelIE (event: any) { + @HostListener('onmousewheel', [ '$event' ]) onMouseWheelIE (event: any) { this.mouseWheelFunc(event) } mouseWheelFunc (event: any) { event = window.event || event // old IE support - const delta = Math.max(-1, Math.min(1, (event.wheelDelta || -event.detail))) this.mouseWheel.emit(event) // for IE event.returnValue = false @@ -27,5 +26,4 @@ export class MouseWheelDirective { event.preventDefault() } } - } diff --git a/ui/src/app/modules/eqmac-components/eqmac-components.module.ts b/ui/src/app/modules/eqmac-components/eqmac-components.module.ts index 39a22c2..4f4ca55 100644 --- a/ui/src/app/modules/eqmac-components/eqmac-components.module.ts +++ b/ui/src/app/modules/eqmac-components/eqmac-components.module.ts @@ -1,5 +1,5 @@ import { - NgModule, TemplateRef + NgModule } from '@angular/core' import { CommonModule @@ -46,7 +46,7 @@ import { BrowserAnimationsModule } from '@angular/platform-browser/animations' import { CarouselComponent, CarouselItemDirective, CarouselItemElement } from './components/carousel/carousel.component' import { QuestionComponent } from './components/question/question.component' import { ClickedOutsideDirective } from './directives/clicked-outside.directive' -import { ScrollingModule } from '@angular/cdk/scrolling'; +import { ScrollingModule } from '@angular/cdk/scrolling' import { BreadcrumbsComponent } from './components/breadcrumbs/breadcrumbs.component' @NgModule({ diff --git a/ui/src/app/modules/eqmac-components/services/utilities.service.ts b/ui/src/app/modules/eqmac-components/services/utilities.service.ts index ac6ff0c..ecff474 100644 --- a/ui/src/app/modules/eqmac-components/services/utilities.service.ts +++ b/ui/src/app/modules/eqmac-components/services/utilities.service.ts @@ -2,14 +2,16 @@ import { Injectable } from '@angular/core' @Injectable() export class UtilitiesService { - constructor () { } - mapValue (value: number, inMin: number, inMax: number, outMin: number, outMax: number): number { return (value - inMin) * (outMax - outMin) / (inMax - inMin) + outMin } logMapValue ({ value, inMin, inMax, outMin, outMax }: { - value: number, inMin: number, inMax: number, outMin: number, outMax: number + value: number + inMin: number + inMax: number + outMin: number + outMax: number }) { outMin = Math.log(outMin) outMax = Math.log(outMax) @@ -18,7 +20,11 @@ export class UtilitiesService { } logMapValueInverse ({ value, inMin, inMax, outMin, outMax }: { - value: number, inMin: number, inMax: number, outMin: number, outMax: number + value: number + inMin: number + inMax: number + outMin: number + outMax: number }) { inMin = Math.log(inMin || 1) inMax = Math.log(inMax) @@ -31,7 +37,7 @@ export class UtilitiesService { getImageFromSrcWhenLoaded (src) { return new Promise((resolve, reject) => { const image = new Image() - image.crossOrigin = 'anonymous' // This enables CORS + image.crossOrigin = 'anonymous' // This enables CORS image.onload = () => resolve(image) image.onerror = () => reject(image) image.src = src @@ -52,12 +58,12 @@ export class UtilitiesService { return this.getImageFromSrcWhenLoaded(this.getBackgroundImageSrcFromClass(className)) } - getRandomFloatInRange (min, max) { + getRandomFloatInRange (min: number, max: number) { return (Math.random() * (max - min) + min) } getCoordinatesInsideElementFromEvent (event: MouseEvent, element?) { - let el = element || event.target + const el = element || event.target const rect = el.getBoundingClientRect() return { x: event.clientX - rect.left, @@ -75,7 +81,7 @@ export class UtilitiesService { const rect = el.getBoundingClientRect() const scrollLeft = window.pageXOffset || document.documentElement.scrollLeft const scrollTop = window.pageYOffset || document.documentElement.scrollTop - return { y: rect.top + scrollTop, x: rect.left + scrollLeft } + return { y: parseInt(rect.top) + scrollTop, x: parseInt(rect.left) + scrollLeft } } hexToRgb (hex: string) { @@ -86,7 +92,7 @@ export class UtilitiesService { g: result[2], b: result[3] } - for (const [color, hex] of Object.entries(rgb)) { + for (const [ color, hex ] of Object.entries(rgb)) { if ((hex as string).length < 2) rgb[color] = `${hex}${hex}` rgb[color] = parseInt(rgb[color], 16) } @@ -99,5 +105,4 @@ export class UtilitiesService { rgbToHex ({ r, g, b }: { r: number, g: number, b: number }) { return '#' + ((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1) } - } diff --git a/ui/src/app/modules/pipes/clip-value.pipe.ts b/ui/src/app/modules/pipes/clip-value.pipe.ts index c0749d0..4904a32 100644 --- a/ui/src/app/modules/pipes/clip-value.pipe.ts +++ b/ui/src/app/modules/pipes/clip-value.pipe.ts @@ -4,11 +4,9 @@ import { Pipe, PipeTransform } from '@angular/core' name: 'clipValue' }) export class ClipValuePipe implements PipeTransform { - transform (value: number, min: number, max: number): number { if (value < min) { return min } if (value > max) { return max } return value } - } diff --git a/ui/src/app/modules/pipes/fix-float.pipe.ts b/ui/src/app/modules/pipes/fix-float.pipe.ts index ac5b5f9..02ffd8a 100644 --- a/ui/src/app/modules/pipes/fix-float.pipe.ts +++ b/ui/src/app/modules/pipes/fix-float.pipe.ts @@ -4,7 +4,6 @@ import { Pipe, PipeTransform } from '@angular/core' name: 'fixFloat' }) export class FixFloatPipe implements PipeTransform { - transform (value: number, fixTo: number, showZeros = true) { let fixedValue: any = value.toFixed(fixTo) if (!showZeros) { @@ -12,5 +11,4 @@ export class FixFloatPipe implements PipeTransform { } return fixedValue } - } diff --git a/ui/src/app/modules/pipes/map-value.pipe.ts b/ui/src/app/modules/pipes/map-value.pipe.ts index ee0132d..dfcf572 100644 --- a/ui/src/app/modules/pipes/map-value.pipe.ts +++ b/ui/src/app/modules/pipes/map-value.pipe.ts @@ -4,9 +4,7 @@ import { Pipe, PipeTransform } from '@angular/core' name: 'mapValue' }) export class MapValuePipe implements PipeTransform { - constructor () {} transform (value: number, inMin: number, inMax: number, outMin: number, outMax: number): number { return (value - inMin) * (outMax - outMin) / (inMax - inMin) + outMin } - } diff --git a/ui/src/app/sections/effects/effect.service.ts b/ui/src/app/sections/effects/effect.service.ts index fc995b3..46585de 100644 --- a/ui/src/app/sections/effects/effect.service.ts +++ b/ui/src/app/sections/effects/effect.service.ts @@ -17,6 +17,6 @@ export class EffectService extends DataService { } onEnabledChanged (callback: (enabled: boolean) => void) { - this.on(`/enabled`, ({ enabled }) => callback(enabled)) + this.on('/enabled', ({ enabled }) => callback(enabled)) } } diff --git a/ui/src/app/sections/effects/equalizers/advanced-equalizer/advanced-equalizer.component.ts b/ui/src/app/sections/effects/equalizers/advanced-equalizer/advanced-equalizer.component.ts index 20ec40f..da03137 100644 --- a/ui/src/app/sections/effects/equalizers/advanced-equalizer/advanced-equalizer.component.ts +++ b/ui/src/app/sections/effects/equalizers/advanced-equalizer/advanced-equalizer.component.ts @@ -15,7 +15,7 @@ import { ApplicationService } from '../../../../services/app.service' @Component({ selector: 'eqm-advanced-equalizer', templateUrl: './advanced-equalizer.component.html', - styleUrls: ['./advanced-equalizer.component.scss'] + styleUrls: [ './advanced-equalizer.component.scss' ] }) export class AdvancedEqualizerComponent extends EqualizerComponent implements OnInit { @Input() enabled = true @@ -26,7 +26,8 @@ export class AdvancedEqualizerComponent extends EqualizerComponent implements On value: false, toggled: (show) => this.service.setShowDefaultPresets(show) } - settings: Options = [[ + + settings: Options = [ [ { type: 'button', label: 'Import Presets', @@ -38,7 +39,8 @@ export class AdvancedEqualizerComponent extends EqualizerComponent implements On } ], [ this.ShowDefaultPresetsCheckbox - ]] + ] ] + public _presets: AdvancedEqualizerPreset[] @Output() presetsChange = new EventEmitter() set presets (newPresets: AdvancedEqualizerPreset[]) { @@ -46,10 +48,11 @@ export class AdvancedEqualizerComponent extends EqualizerComponent implements On [ newPresets.find(p => p.id === 'manual'), newPresets.find(p => p.id === 'flat'), - ...newPresets.filter(p => !['manual', 'flat'].includes(p.id)).sort((a, b) => a.name > b.name ? 1 : -1) + ...newPresets.filter(p => ![ 'manual', 'flat' ].includes(p.id)).sort((a, b) => a.name > b.name ? 1 : -1) ] this.presetsChange.emit(this.presets) } + get presets () { return this._presets } public _selectedPreset: AdvancedEqualizerPreset @@ -58,10 +61,11 @@ export class AdvancedEqualizerComponent extends EqualizerComponent implements On this._selectedPreset = newSelectedPreset this.selectedPresetChange.emit(this.selectedPreset) } - get selectedPreset () { return this._selectedPreset } - bandFrequencyLabels = ['32', '64', '125', '250', '500', '1K', '2K', '4K', '8K', '16K'] - bands = [...Array(10)].map(() => 0) + get selectedPreset () { return this._selectedPreset } + bandFrequencyLabels = [ '32', '64', '125', '250', '500', '1K', '2K', '4K', '8K', '16K' ] + + bands = [ ...Array(10) ].map(() => 0) global = 0 stickSlidersToMiddle = true @@ -80,7 +84,7 @@ export class AdvancedEqualizerComponent extends EqualizerComponent implements On this.change.detectChanges() }) } - for (const [i, gain] of this.selectedPreset.gains.bands.entries()) { + for (const [ i, gain ] of this.selectedPreset.gains.bands.entries()) { const currentGain = this.bands[i] if (currentGain !== gain) { this.stickSlidersToMiddle = false @@ -101,7 +105,7 @@ export class AdvancedEqualizerComponent extends EqualizerComponent implements On public transition: TransitionService, public change: ChangeDetectorRef, public app: ApplicationService - ) { + ) { super() this.getImportLegacyAvailable() } @@ -134,6 +138,7 @@ export class AdvancedEqualizerComponent extends EqualizerComponent implements On ) } } + public async syncPresets () { const [ presets, selectedPreset ] = await Promise.all([ this.service.getPresets(), diff --git a/ui/src/app/sections/effects/equalizers/advanced-equalizer/advanced-equalizer.service.ts b/ui/src/app/sections/effects/equalizers/advanced-equalizer/advanced-equalizer.service.ts index ce0b6af..b457924 100644 --- a/ui/src/app/sections/effects/equalizers/advanced-equalizer/advanced-equalizer.service.ts +++ b/ui/src/app/sections/effects/equalizers/advanced-equalizer/advanced-equalizer.service.ts @@ -24,27 +24,27 @@ export class AdvancedEqualizerService extends EqualizersService { } createPreset (preset: AdvancedEqualizerPreset, select: boolean = false) { - return this.request({ method: 'POST', endpoint: `/presets`, data: { ...preset, select } }) + return this.request({ method: 'POST', endpoint: '/presets', data: { ...preset, select } }) } updatePreset (preset: AdvancedEqualizerPreset, opts?: { select?: boolean, transition?: boolean }) { return this.request({ method: 'POST', - endpoint: `/presets`, + endpoint: '/presets', data: { - ...preset, - select: opts && opts.select, - transition: opts && opts.transition + // ...preset, + select: opts?.select, + transition: opts?.transition } }) } selectPreset (preset: AdvancedEqualizerPreset) { - return this.request({ method: 'POST', endpoint: `/presets/select`, data: { ...preset } }) + return this.request({ method: 'POST', endpoint: '/presets/select', data: { ...preset } }) } deletePreset (preset: AdvancedEqualizerPreset) { - return this.request({ method: 'DELETE', endpoint: `/presets`, data: { ...preset } }) + return this.request({ method: 'DELETE', endpoint: '/presets', data: { ...preset } }) } async getImportLegacyAvailable () { @@ -81,10 +81,10 @@ export class AdvancedEqualizerService extends EqualizersService { } onPresetsChanged (callback: (presets: AdvancedEqualizerPreset[]) => void) { - this.on(`/presets`, (presets) => callback(presets)) + this.on('/presets', (presets) => callback(presets)) } onSelectedPresetChanged (callback: (preset: AdvancedEqualizerPreset) => void) { - this.on(`/presets/selected`, (preset) => callback(preset)) + this.on('/presets/selected', (preset) => callback(preset)) } } diff --git a/ui/src/app/sections/effects/equalizers/basic-equalizer/basic-equalizer.component.ts b/ui/src/app/sections/effects/equalizers/basic-equalizer/basic-equalizer.component.ts index b57b679..0dcbf5a 100644 --- a/ui/src/app/sections/effects/equalizers/basic-equalizer/basic-equalizer.component.ts +++ b/ui/src/app/sections/effects/equalizers/basic-equalizer/basic-equalizer.component.ts @@ -1,16 +1,15 @@ import { Component, OnInit, Input, Output, EventEmitter, ChangeDetectorRef } from '@angular/core' import { BasicEqualizerService, BasicEqualizerPreset, BasicEqualizerBand, BasicEqualizerPresetGains } from './basic-equalizer.service' -import { BridgeService } from '../../../../services/bridge.service' import { EqualizerComponent } from '../equalizer.component' import { KnobValueChangedEvent } from '../../../../modules/eqmac-components/components/knob/knob.component' import { TransitionService } from '../../../../services/transitions.service' import { ApplicationService } from '../../../../services/app.service' -import { UISettings, UIService } from '../../../../services/ui.service' +import { UIService } from '../../../../services/ui.service' @Component({ selector: 'eqm-basic-equalizer', templateUrl: './basic-equalizer.component.html', - styleUrls: ['./basic-equalizer.component.scss'] + styleUrls: [ './basic-equalizer.component.scss' ] }) export class BasicEqualizerComponent extends EqualizerComponent implements OnInit { @Input() enabled = true @@ -20,6 +19,7 @@ export class BasicEqualizerComponent extends EqualizerComponent implements OnIni mid: 0, treble: 0 } + peakLimiter = false replaceKnobsWithSliders = false @@ -31,10 +31,11 @@ export class BasicEqualizerComponent extends EqualizerComponent implements OnIni [ newPresets.find(p => p.id === 'manual'), newPresets.find(p => p.id === 'flat'), - ...newPresets.filter(p => !['manual', 'flat'].includes(p.id)).sort((a, b) => a.name > b.name ? 1 : -1) + ...newPresets.filter(p => ![ 'manual', 'flat' ].includes(p.id)).sort((a, b) => a.name > b.name ? 1 : -1) ] this.presetsChange.emit(this.presets) } + get presets () { return this._presets } public _selectedPreset: BasicEqualizerPreset @@ -43,6 +44,7 @@ export class BasicEqualizerComponent extends EqualizerComponent implements OnIni this._selectedPreset = newSelectedPreset this.selectedPresetChange.emit(this.selectedPreset) } + get selectedPreset () { return this._selectedPreset } settings = [] @@ -108,8 +110,8 @@ export class BasicEqualizerComponent extends EqualizerComponent implements OnIni // TODO: Refactor this bollocks this.peakLimiter = this.selectedPreset.peakLimiter || false - for (const [type, gain] of Object.entries(this.selectedPreset.gains)) { - const currentGain: number = this.gains[type] + for (const [ type, gain ] of Object.entries(this.selectedPreset.gains)) { + const currentGain = this.gains[type] as number if (currentGain !== gain) { this.stickSlidersToMiddle = false this.change.detectChanges() diff --git a/ui/src/app/sections/effects/equalizers/basic-equalizer/basic-equalizer.service.ts b/ui/src/app/sections/effects/equalizers/basic-equalizer/basic-equalizer.service.ts index b4c76d8..04e442f 100644 --- a/ui/src/app/sections/effects/equalizers/basic-equalizer/basic-equalizer.service.ts +++ b/ui/src/app/sections/effects/equalizers/basic-equalizer/basic-equalizer.service.ts @@ -1,9 +1,8 @@ import { Injectable } from '@angular/core' import { EqualizersService } from '../equalizers.service' import { EqualizerPreset } from '../presets/equalizer-presets.component' -import { JSONEncodable, JSONData } from '../../../../services/data.service' -export type BasicEqualizerPresetGains = { +export interface BasicEqualizerPresetGains { bass: number mid: number treble: number @@ -31,34 +30,34 @@ export class BasicEqualizerService extends EqualizersService { } createPreset (preset: BasicEqualizerPreset, select: boolean = false) { - return this.request({ method: 'POST', endpoint: `/presets`, data: { ...preset, select } }) + return this.request({ method: 'POST', endpoint: '/presets', data: { ...preset, select } as any }) } updatePreset (preset: BasicEqualizerPreset, opts?: { select?: boolean, transition?: boolean }) { return this.request({ method: 'POST', - endpoint: `/presets`, + endpoint: '/presets', data: { ...preset, - select: opts && opts.select, - transition: opts && opts.transition - } + select: opts?.select, + transition: opts?.transition + } as any }) } selectPreset (preset: BasicEqualizerPreset) { - return this.request({ method: 'POST', endpoint: `/presets/select`, data: { ...preset } }) + return this.request({ method: 'POST', endpoint: '/presets/select', data: { ...preset } as any }) } deletePreset (preset: BasicEqualizerPreset) { - return this.request({ method: 'DELETE', endpoint: `/presets`, data: { ...preset } }) + return this.request({ method: 'DELETE', endpoint: '/presets', data: { ...preset } as any }) } onPresetsChanged (callback: (presets: BasicEqualizerPreset[]) => void) { - this.on(`/presets`, (presets) => callback(presets)) + this.on('/presets', (presets) => callback(presets)) } onSelectedPresetChanged (callback: (preset: BasicEqualizerPreset) => void) { - this.on(`/presets/selected`, (preset) => callback(preset)) + this.on('/presets/selected', (preset) => callback(preset)) } } diff --git a/ui/src/app/sections/effects/equalizers/equalizer.component.ts b/ui/src/app/sections/effects/equalizers/equalizer.component.ts index 24e8d4a..067338e 100644 --- a/ui/src/app/sections/effects/equalizers/equalizer.component.ts +++ b/ui/src/app/sections/effects/equalizers/equalizer.component.ts @@ -1,9 +1,10 @@ -import { Option, Options } from 'src/app/components/options/options.component' +import { Options } from 'src/app/components/options/options.component' import { AdditionalPresetOption, EqualizerPreset } from './presets/equalizer-presets.component' -import { Input } from '@angular/core' +import { Component, Input } from '@angular/core' import { MatDialogRef } from '@angular/material/dialog' import { OptionsDialogComponent } from '../../../components/options-dialog/options-dialog.component' +@Component({ template: '' }) export abstract class EqualizerComponent { @Input() animationDuration = 500 @Input() animationFps = 30 diff --git a/ui/src/app/sections/effects/equalizers/equalizers.component.ts b/ui/src/app/sections/effects/equalizers/equalizers.component.ts index 50713ad..338ea24 100644 --- a/ui/src/app/sections/effects/equalizers/equalizers.component.ts +++ b/ui/src/app/sections/effects/equalizers/equalizers.component.ts @@ -12,7 +12,7 @@ import { UIService } from '../../../services/ui.service' @Component({ selector: 'eqm-equalizers', templateUrl: './equalizers.component.html', - styleUrls: ['./equalizers.component.scss'], + styleUrls: [ './equalizers.component.scss' ], animations: [ FadeInOutAnimation ] }) export class EqualizersComponent implements OnInit { @@ -38,6 +38,7 @@ export class EqualizersComponent implements OnInit { this.changeRef.detectChanges() this.activeEqualizer = this.getEqualizerFromType(this.type) } + get type () { return this._type } gain: number = 0 @@ -48,8 +49,8 @@ export class EqualizersComponent implements OnInit { public equalizersService: EqualizersService, public dialog: MatDialog, public ui: UIService, - private changeRef: ChangeDetectorRef - ) { } + private readonly changeRef: ChangeDetectorRef + ) { } async ngOnInit () { await this.sync() @@ -132,5 +133,4 @@ export class EqualizersComponent implements OnInit { selectPreset (preset: EqualizerPreset) { return this.activeEqualizer.selectPreset(preset) } - } diff --git a/ui/src/app/sections/effects/equalizers/presets/equalizer-presets.component.ts b/ui/src/app/sections/effects/equalizers/presets/equalizer-presets.component.ts index bfb3f76..54457dc 100644 --- a/ui/src/app/sections/effects/equalizers/presets/equalizer-presets.component.ts +++ b/ui/src/app/sections/effects/equalizers/presets/equalizer-presets.component.ts @@ -20,7 +20,7 @@ export interface AdditionalPresetOption { @Component({ selector: 'eqm-equalizer-presets', templateUrl: './equalizer-presets.component.html', - styleUrls: ['./equalizer-presets.component.scss'] + styleUrls: [ './equalizer-presets.component.scss' ] }) export class EqualizerPresetsComponent implements OnInit { @Input() presets: EqualizerPreset[] @@ -62,7 +62,7 @@ export class EqualizerPresetsComponent implements OnInit { data: { confirmText: 'Yes, save', cancelText: 'No, cancel', - text: `A Default preset with this name already exists. Would you like to use this name anyway? You might see Duplicate names in the Preset list.` + text: 'A Default preset with this name already exists. Would you like to use this name anyway? You might see Duplicate names in the Preset list.' } }).afterClosed().toPromise() if (!saveAnyway) return this.savePreset(presetName) @@ -73,7 +73,7 @@ export class EqualizerPresetsComponent implements OnInit { data: { confirmText: 'Yes, overwrite', cancelText: 'No, cancel', - text: `A preset with this name already exists. Would you like to overwrite it?` + text: 'A preset with this name already exists. Would you like to overwrite it?' } }).afterClosed().toPromise() if (!overwrite) return this.savePreset(presetName) @@ -90,7 +90,7 @@ export class EqualizerPresetsComponent implements OnInit { data: { confirmText: 'Yes, remove', cancelText: 'No, cancel', - text: `Are you sure you want to remove this Preset?` + text: 'Are you sure you want to remove this Preset?' } }).afterClosed().toPromise() @@ -98,5 +98,4 @@ export class EqualizerPresetsComponent implements OnInit { this.presetDeleted.emit() } } - } diff --git a/ui/src/app/sections/effects/reverb/reverb.component.ts b/ui/src/app/sections/effects/reverb/reverb.component.ts index 317e134..406c917 100644 --- a/ui/src/app/sections/effects/reverb/reverb.component.ts +++ b/ui/src/app/sections/effects/reverb/reverb.component.ts @@ -11,7 +11,7 @@ import { @Component({ selector: 'eqm-reverb', templateUrl: './reverb.component.html', - styleUrls: ['./reverb.component.scss'] + styleUrls: [ './reverb.component.scss' ] }) export class ReverbComponent implements OnInit { presets = [] @@ -51,7 +51,6 @@ export class ReverbComponent implements OnInit { this.getSelectedPreset() this.getMix() this.getEnabled() - } async getPresets () { @@ -87,5 +86,4 @@ export class ReverbComponent implements OnInit { this.hide = !this.hide this.visibilityToggled.emit() } - } diff --git a/ui/src/app/sections/header/header.component.ts b/ui/src/app/sections/header/header.component.ts index 7997a88..40c51a8 100644 --- a/ui/src/app/sections/header/header.component.ts +++ b/ui/src/app/sections/header/header.component.ts @@ -9,7 +9,7 @@ import { SettingsService, IconMode } from '../settings/settings.service' @Component({ selector: 'eqm-header', templateUrl: './header.component.html', - styleUrls: ['./header.component.scss'], + styleUrls: [ './header.component.scss' ], animations: [ FadeInOutAnimation ] }) export class HeaderComponent implements OnInit { @@ -25,7 +25,7 @@ export class HeaderComponent implements OnInit { public ui: UIService, public dialog: MatDialog, public settings: SettingsService - ) { } + ) { } async ngOnInit () { await this.sync() @@ -41,8 +41,8 @@ export class HeaderComponent implements OnInit { this.uiMode = await this.ui.getMode() } - setShowBoolean (name, bool) { - if (this.showBooleanDebouncers.hasOwnProperty(name)) { + setShowBoolean (name: string, bool: boolean) { + if (name in this.showBooleanDebouncers) { clearTimeout(this.showBooleanDebouncers[name]) delete this.showBooleanDebouncers[name] this[name] = bool @@ -104,5 +104,4 @@ export class HeaderComponent implements OnInit { // this.mode = this.mode === 'window' ? 'popover' : 'window' // return this.ui.setMode(this.mode) // } - } diff --git a/ui/src/app/sections/help/help.component.ts b/ui/src/app/sections/help/help.component.ts index 51b5a4f..c5e3d82 100644 --- a/ui/src/app/sections/help/help.component.ts +++ b/ui/src/app/sections/help/help.component.ts @@ -1,5 +1,5 @@ import { Component, OnInit } from '@angular/core' -import { Option, Options } from 'src/app/components/options/options.component' +import { Options } from 'src/app/components/options/options.component' import { ApplicationService, MacInfo } from 'src/app/services/app.service' import { ConstantsService } from 'src/app/services/constants.service' import { version } from '../../../../package.json' @@ -8,7 +8,7 @@ import { UIService } from '../../services/ui.service.js' @Component({ selector: 'eqm-help', templateUrl: './help.component.html', - styleUrls: ['./help.component.scss'] + styleUrls: [ './help.component.scss' ] }) export class HelpComponent implements OnInit { options: Options = [ diff --git a/ui/src/app/sections/outputs/outputs.component.ts b/ui/src/app/sections/outputs/outputs.component.ts index 99372e0..426e46b 100644 --- a/ui/src/app/sections/outputs/outputs.component.ts +++ b/ui/src/app/sections/outputs/outputs.component.ts @@ -4,7 +4,7 @@ import { OutputsService, Output } from './outputs.service' @Component({ selector: 'eqm-outputs', templateUrl: './outputs.component.html', - styleUrls: ['./outputs.component.scss'] + styleUrls: [ './outputs.component.scss' ] }) export class OutputsComponent implements OnInit { outputs: Output[] diff --git a/ui/src/app/sections/outputs/outputs.service.ts b/ui/src/app/sections/outputs/outputs.service.ts index ddd78e2..776b0d3 100644 --- a/ui/src/app/sections/outputs/outputs.service.ts +++ b/ui/src/app/sections/outputs/outputs.service.ts @@ -18,7 +18,7 @@ export type DeviceTransportType = export interface Output { id: number name: string - transportType: DeviceTransportType, + transportType: DeviceTransportType icon?: IconName } @Injectable({ diff --git a/ui/src/app/sections/recorder/recorder.component.ts b/ui/src/app/sections/recorder/recorder.component.ts index ccd6a2d..c3acf44 100644 --- a/ui/src/app/sections/recorder/recorder.component.ts +++ b/ui/src/app/sections/recorder/recorder.component.ts @@ -4,7 +4,7 @@ import { UtilitiesService } from '../../services/utilities.service' @Component({ selector: 'eqm-recorder', templateUrl: './recorder.component.html', - styleUrls: ['./recorder.component.scss'] + styleUrls: [ './recorder.component.scss' ] }) export class RecorderComponent implements OnInit { recording = false @@ -29,5 +29,4 @@ export class RecorderComponent implements OnInit { }, 1000) } } - } diff --git a/ui/src/app/sections/settings/settings.component.ts b/ui/src/app/sections/settings/settings.component.ts index eae1dcf..ba2330c 100644 --- a/ui/src/app/sections/settings/settings.component.ts +++ b/ui/src/app/sections/settings/settings.component.ts @@ -1,5 +1,5 @@ import { Component, OnInit } from '@angular/core' -import { Option, CheckboxOption, ButtonOption, Options, SelectOption } from 'src/app/components/options/options.component' +import { CheckboxOption, ButtonOption, Options, SelectOption } from 'src/app/components/options/options.component' import { SettingsService, IconMode } from './settings.service' import { ApplicationService } from '../../services/app.service' import { MatDialog } from '@angular/material/dialog' @@ -9,7 +9,7 @@ import { UIService } from '../../services/ui.service' @Component({ selector: 'eqm-settings', templateUrl: './settings.component.html', - styleUrls: ['./settings.component.scss'] + styleUrls: [ './settings.component.scss' ] }) export class SettingsComponent implements OnInit { launchOnStartupOption: CheckboxOption = { @@ -29,7 +29,7 @@ export class SettingsComponent implements OnInit { iconModeOption: SelectOption = { type: 'select', label: 'Show Icon', - options: [{ + options: [ { id: IconMode.dock, label: 'Dock' }, { @@ -38,7 +38,7 @@ export class SettingsComponent implements OnInit { }, { id: IconMode.statusBar, label: 'Status Bar' - }], + } ], selectedId: IconMode.both, selected: async iconMode => { const uiMode = await this.ui.getMode() @@ -48,6 +48,7 @@ export class SettingsComponent implements OnInit { await this.settingsService.setIconMode(iconMode as IconMode) } } + uninstallOption: ButtonOption = { type: 'button', label: 'Uninstall eqMac', diff --git a/ui/src/app/sections/settings/settings.service.ts b/ui/src/app/sections/settings/settings.service.ts index c933c11..5cca334 100644 --- a/ui/src/app/sections/settings/settings.service.ts +++ b/ui/src/app/sections/settings/settings.service.ts @@ -31,7 +31,7 @@ export class SettingsService extends DataService { return this.request({ method: 'POST', endpoint: '/icon-mode', data: { mode } }) } - // async getMode () { + // async getMode () { // const { mode } = await this.request({ method: 'GET', endpoint: '/mode' }) // return mode as UIMode // } diff --git a/ui/src/app/sections/source/file/file.component.ts b/ui/src/app/sections/source/file/file.component.ts index feb41bc..23529bb 100644 --- a/ui/src/app/sections/source/file/file.component.ts +++ b/ui/src/app/sections/source/file/file.component.ts @@ -19,7 +19,7 @@ interface FileMeta { @Component({ selector: 'eqm-file', templateUrl: './file.component.html', - styleUrls: ['./file.component.scss'] + styleUrls: [ './file.component.scss' ] }) export class FileComponent implements OnInit, OnDestroy { @@ -27,6 +27,7 @@ export class FileComponent implements OnInit, OnDestroy { name: null, duration: 0 } + public syncedOnce = false public progressProjectionInterval = null public progressSetDebouncer = null @@ -95,14 +96,13 @@ export class FileComponent implements OnInit, OnDestroy { ] if (this.selected || !this.syncedOnce) { thingsToSync.push( - this.getFile(), - this.getProgress(), - this.getPlaybackState() - ) + this.getFile(), + this.getProgress(), + this.getPlaybackState() + ) } await Promise.all(thingsToSync) this.syncedOnce = true - } async getSelected () { @@ -112,6 +112,7 @@ export class FileComponent implements OnInit, OnDestroy { this.selected = false } } + async getFile () { try { this.meta = await this.fileService.getMeta() diff --git a/ui/src/app/sections/source/file/file.service.ts b/ui/src/app/sections/source/file/file.service.ts index af2b762..d2b5d1d 100644 --- a/ui/src/app/sections/source/file/file.service.ts +++ b/ui/src/app/sections/source/file/file.service.ts @@ -46,10 +46,10 @@ export class FileService extends SourceService { } onPlayingChanged (callback: (playing: boolean) => void) { - this.on(`/playing`, ({ playing }) => callback(playing)) + this.on('/playing', ({ playing }) => callback(playing)) } onProgressChanged (callback: (progress: number) => void) { - this.on(`/progress`, ({ progress }) => callback(progress)) + this.on('/progress', ({ progress }) => callback(progress)) } } diff --git a/ui/src/app/sections/source/input/input.component.ts b/ui/src/app/sections/source/input/input.component.ts index 17013a9..df0bec7 100644 --- a/ui/src/app/sections/source/input/input.component.ts +++ b/ui/src/app/sections/source/input/input.component.ts @@ -10,10 +10,9 @@ export interface InputDevice { @Component({ selector: 'eqm-input', templateUrl: './input.component.html', - styleUrls: ['./input.component.scss'] + styleUrls: [ './input.component.scss' ] }) export class InputComponent implements OnInit { - constructor (public inputService: InputService) { } devices: InputDevice[] = [] @@ -36,7 +35,7 @@ export class InputComponent implements OnInit { } async syncSelectedDevice () { - const selectedDevice = await this.inputService.getDevice() + await this.inputService.getDevice() } protected setupEvents () { diff --git a/ui/src/app/sections/source/source.component.ts b/ui/src/app/sections/source/source.component.ts index 5bc2828..fd0c973 100644 --- a/ui/src/app/sections/source/source.component.ts +++ b/ui/src/app/sections/source/source.component.ts @@ -4,10 +4,9 @@ import { SourceService, SourceType } from './source.service' @Component({ selector: 'eqm-source', templateUrl: './source.component.html', - styleUrls: ['./source.component.scss'] + styleUrls: [ './source.component.scss' ] }) export class SourceComponent implements OnInit { - source: SourceType = 'File' constructor (public sourceService: SourceService) { } @@ -27,5 +26,4 @@ export class SourceComponent implements OnInit { this.sourceService.setSource(this.source) } } - } diff --git a/ui/src/app/sections/source/system/system.component.ts b/ui/src/app/sections/source/system/system.component.ts index 257bd24..f515197 100644 --- a/ui/src/app/sections/source/system/system.component.ts +++ b/ui/src/app/sections/source/system/system.component.ts @@ -3,13 +3,9 @@ import { Component, OnInit } from '@angular/core' @Component({ selector: 'eqm-system', templateUrl: './system.component.html', - styleUrls: ['./system.component.scss'] + styleUrls: [ './system.component.scss' ] }) export class SystemComponent implements OnInit { - - constructor () { } - ngOnInit () { } - } diff --git a/ui/src/app/sections/volume/booster-balance/balance/balance.component.ts b/ui/src/app/sections/volume/booster-balance/balance/balance.component.ts index 89d3430..b80a7c8 100644 --- a/ui/src/app/sections/volume/booster-balance/balance/balance.component.ts +++ b/ui/src/app/sections/volume/booster-balance/balance/balance.component.ts @@ -3,12 +3,12 @@ import { BalanceService } from './balance.service' import { ApplicationService } from '../../../../services/app.service' import { KnobValueChangedEvent } from '../../../../modules/eqmac-components/components/knob/knob.component' import { FlatSliderValueChangedEvent } from '../../../../modules/eqmac-components/components/flat-slider/flat-slider.component' -import { UIService, UISettings } from '../../../../services/ui.service' +import { UIService } from '../../../../services/ui.service' @Component({ selector: 'eqm-balance', templateUrl: './balance.component.html', - styleUrls: ['./balance.component.scss'] + styleUrls: [ './balance.component.scss' ] }) export class BalanceComponent implements OnInit { balance = 0 diff --git a/ui/src/app/sections/volume/booster-balance/balance/balance.service.ts b/ui/src/app/sections/volume/booster-balance/balance/balance.service.ts index c9aaad6..51bcfc2 100644 --- a/ui/src/app/sections/volume/booster-balance/balance/balance.service.ts +++ b/ui/src/app/sections/volume/booster-balance/balance/balance.service.ts @@ -5,7 +5,6 @@ import { VolumeService } from '../../../../services/volume.service' providedIn: 'root' }) export class BalanceService extends VolumeService { - async getBalance () { const resp = await this.request({ method: 'GET', endpoint: '/balance' }) return resp.balance diff --git a/ui/src/app/sections/volume/booster-balance/booster/booster.component.ts b/ui/src/app/sections/volume/booster-balance/booster/booster.component.ts index 9abee8c..c64cc95 100644 --- a/ui/src/app/sections/volume/booster-balance/booster/booster.component.ts +++ b/ui/src/app/sections/volume/booster-balance/booster/booster.component.ts @@ -7,12 +7,12 @@ import { import { BoosterService } from './booster.service' import { ApplicationService } from '../../../../services/app.service' -import { UIService, UISettings } from '../../../../services/ui.service' +import { UIService } from '../../../../services/ui.service' @Component({ selector: 'eqm-booster', templateUrl: './booster.component.html', - styleUrls: ['./booster.component.scss'] + styleUrls: [ './booster.component.scss' ] }) export class BoosterComponent implements OnInit { gain = 1 diff --git a/ui/src/app/sections/volume/booster-balance/volume-booster-balance.component.ts b/ui/src/app/sections/volume/booster-balance/volume-booster-balance.component.ts index 3a04dcf..6f4d53f 100644 --- a/ui/src/app/sections/volume/booster-balance/volume-booster-balance.component.ts +++ b/ui/src/app/sections/volume/booster-balance/volume-booster-balance.component.ts @@ -4,7 +4,7 @@ import { UIService } from '../../../services/ui.service' @Component({ selector: 'eqm-volume-booster-balance', templateUrl: './volume-booster-balance.component.html', - styleUrls: ['./volume-booster-balance.component.scss'] + styleUrls: [ './volume-booster-balance.component.scss' ] }) export class VolumeBoosterBalanceComponent implements OnInit { hide = false @@ -34,5 +34,4 @@ export class VolumeBoosterBalanceComponent implements OnInit { this.hide = !this.hide this.visibilityToggled.emit() } - } diff --git a/ui/src/app/sections/volume/volume-mixer/volume-mixer.component.html b/ui/src/app/sections/volume/volume-mixer/volume-mixer.component.html deleted file mode 100644 index 7d8e5ee..0000000 --- a/ui/src/app/sections/volume/volume-mixer/volume-mixer.component.html +++ /dev/null @@ -1,3 +0,0 @@ -

- volume-mixer works! -

diff --git a/ui/src/app/sections/volume/volume-mixer/volume-mixer.component.scss b/ui/src/app/sections/volume/volume-mixer/volume-mixer.component.scss deleted file mode 100644 index e69de29..0000000 diff --git a/ui/src/app/sections/volume/volume-mixer/volume-mixer.component.ts b/ui/src/app/sections/volume/volume-mixer/volume-mixer.component.ts deleted file mode 100644 index bf12c25..0000000 --- a/ui/src/app/sections/volume/volume-mixer/volume-mixer.component.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { Component, OnInit } from '@angular/core' - -@Component({ - selector: 'eqm-volume-mixer', - templateUrl: './volume-mixer.component.html', - styleUrls: ['./volume-mixer.component.scss'] -}) -export class VolumeMixerComponent implements OnInit { - - constructor () { } - - ngOnInit () { - } - -} diff --git a/ui/src/app/services/bridge.service.ts b/ui/src/app/services/bridge.service.ts index cb57397..740e879 100644 --- a/ui/src/app/services/bridge.service.ts +++ b/ui/src/app/services/bridge.service.ts @@ -47,7 +47,7 @@ export class BridgeService { if (window[bridgeCallbacksKey]) { return window[bridgeCallbacksKey].push(resolve) } - window[bridgeCallbacksKey] = [resolve] + window[bridgeCallbacksKey] = [ resolve ] const WVJBIframe = document.createElement('iframe') WVJBIframe.style.display = 'none' @@ -78,6 +78,7 @@ export class BridgeService { bridge.registerHandler(event, async (data, cb) => { const handleError = (err: string | Error) => { console.error(err) + // eslint-disable-next-line @typescript-eslint/no-base-to-string cb({ error: err.toString() }) } try { diff --git a/ui/src/app/services/constants.service.ts b/ui/src/app/services/constants.service.ts index 925cbe3..4996028 100644 --- a/ui/src/app/services/constants.service.ts +++ b/ui/src/app/services/constants.service.ts @@ -7,6 +7,6 @@ export class ConstantsService { readonly DOMAIN = 'eqmac.app' readonly FAQ_URL = new URL(`https://${this.DOMAIN}/faq`) readonly BUG_REPORT_URL = new URL(`https://${this.DOMAIN}/report-bug`) - readonly LOCAL_API_URL = `https://127.0.0.1` + readonly LOCAL_API_URL = 'https://127.0.0.1' readonly REMOTE_API_URL = `https://api.${this.DOMAIN}` } diff --git a/ui/src/app/services/cookies.service.ts b/ui/src/app/services/cookies.service.ts index bcd6192..142976c 100644 --- a/ui/src/app/services/cookies.service.ts +++ b/ui/src/app/services/cookies.service.ts @@ -10,6 +10,7 @@ export class CookiesService { constructor ( public CONST: ConstantsService ) {} + set (key: string, value: any) { if (typeof value !== 'string') { value = JSON.stringify(value) diff --git a/ui/src/app/services/data.service.ts b/ui/src/app/services/data.service.ts index 3a86764..8100be9 100644 --- a/ui/src/app/services/data.service.ts +++ b/ui/src/app/services/data.service.ts @@ -1,6 +1,5 @@ import { Injectable } from '@angular/core' import { BridgeService } from './bridge.service' -import { Logger } from './logger.service' import { CookiesService } from './cookies.service' export type JSONEncodable = null | boolean | number | string | JSONData @@ -27,7 +26,7 @@ export class DataService { async request (opts: RequestOptions): Promise { if (opts.endpoint && opts.endpoint[0] !== '/') opts.endpoint = `/${opts.endpoint}` - const args: [string, any?] = [`${opts.method} ${this.route}${opts.endpoint || ''}`, opts.data] + const args: [string, any?] = [ `${opts.method} ${this.route}${opts.endpoint || ''}`, opts.data ] const resp = await this.bridge.call(...args) return resp } diff --git a/ui/src/app/services/logger.service.ts b/ui/src/app/services/logger.service.ts index 8fdf7a2..6297f9c 100644 --- a/ui/src/app/services/logger.service.ts +++ b/ui/src/app/services/logger.service.ts @@ -5,7 +5,7 @@ export class Logger { this.console('log', ...something) } - public static console (func: 'log' , ...something: any[]) { + public static console (func: 'log', ...something: any[]) { if (!environment.production) { console[func](...something) } diff --git a/ui/src/app/services/transitions.service.ts b/ui/src/app/services/transitions.service.ts index bd9deb7..70ad7d3 100644 --- a/ui/src/app/services/transitions.service.ts +++ b/ui/src/app/services/transitions.service.ts @@ -36,9 +36,9 @@ export class TransitionService extends DataService { perform (from: number, to: number, cb: (value: number) => any) { const distance = to - from const step = distance / this.FRAME_COUNT - const frames = [...Array(this.FRAME_COUNT)].map((_, i) => i + 1) + const frames = [ ...Array(this.FRAME_COUNT) ].map((_, i) => i + 1) for (const frame of frames) { - let delay = Math.round(this.FRAME_DURATION * frame) + const delay = Math.round(this.FRAME_DURATION * frame) setTimeout(() => { cb(from + step * frame) }, delay) diff --git a/ui/src/app/services/ui.service.ts b/ui/src/app/services/ui.service.ts index 46d9a5d..f9bb4bd 100644 --- a/ui/src/app/services/ui.service.ts +++ b/ui/src/app/services/ui.service.ts @@ -1,8 +1,8 @@ -import { Injectable, EventEmitter } from '@angular/core' +import { Injectable } from '@angular/core' import { DataService } from './data.service' -import { Observable, Subject } from 'rxjs' +import { Subject } from 'rxjs' -export type UISettings = { +export interface UISettings { replaceKnobsWithSliders?: boolean } @@ -24,12 +24,12 @@ export class UIService extends DataService { settingsChanged = new Subject() readonly colors = { - 'accent': '#4f8d71', - 'warning': '#e80415', + accent: '#4f8d71', + warning: '#e80415', 'gradient-start': '#5a5b5f', 'gradient-end': '#2c2c2e', - 'light': '#c9cdd0', - 'dark': '#16191c' + light: '#c9cdd0', + dark: '#16191c' } get isLocal () { @@ -84,5 +84,4 @@ export class UIService extends DataService { settings = await this.request({ method: 'POST', endpoint: '/settings', data: settings }) this.settingsChanged.next(settings) } - } diff --git a/ui/src/main.ts b/ui/src/main.ts index c60c328..128e31f 100644 --- a/ui/src/main.ts +++ b/ui/src/main.ts @@ -10,11 +10,11 @@ if (environment.production) { } platformBrowserDynamic() -.bootstrapModule(AppModule) + .bootstrapModule(AppModule) .then(() => { if ('serviceWorker' in navigator) { navigator.serviceWorker.getRegistration('ngsw-worker.js') - .then(registration => registration && registration.unregister()) + .then(async registration => await registration?.unregister()) } }) .catch(err => console.error(err)) diff --git a/ui/src/polyfills.ts b/ui/src/polyfills.ts index c0168a8..8a2d508 100644 --- a/ui/src/polyfills.ts +++ b/ui/src/polyfills.ts @@ -52,18 +52,18 @@ * Only required if AnimationBuilder is used within the application and using IE/Edge or Safari. * Standard animation support in Angular DOES NOT require any polyfills (as of Angular 6.0). **/ -import 'web-animations-js' // Run `npm install --save web-animations-js`. +import 'web-animations-js' // Run `npm install --save web-animations-js`. /** * By default, zone.js will patch all possible macroTask and DomEvents * user can disable parts of macroTask/DomEvents patch by setting following flags */ - // (window as any).__Zone_disable_requestAnimationFrame = true; // disable patch requestAnimationFrame - // (window as any).__Zone_disable_on_property = true; // disable patch onProperty such as onclick - // (window as any).__zone_symbol__BLACK_LISTED_EVENTS = ['scroll', 'mousemove']; // disable patch specified eventNames +// (window as any).__Zone_disable_requestAnimationFrame = true; // disable patch requestAnimationFrame +// (window as any).__Zone_disable_on_property = true; // disable patch onProperty such as onclick +// (window as any).__zone_symbol__BLACK_LISTED_EVENTS = ['scroll', 'mousemove']; // disable patch specified eventNames - /* +/* * in IE/Edge developer tools, the addEventListener will also be wrapped by zone.js * with the following flag, it will bypass `zone.js` patch for IE/Edge */ @@ -72,8 +72,7 @@ import 'web-animations-js' // Run `npm install --save web-animations-js`. /*************************************************************************************************** * Zone JS is required by default for Angular itself. */ -import 'zone.js/dist/zone'; // Included with Angular CLI. - +import 'zone.js/dist/zone' // Included with Angular CLI. /*************************************************************************************************** * APPLICATION IMPORTS diff --git a/ui/src/tsconfig.app.json b/ui/src/tsconfig.app.json index 218202b..144bd55 100644 --- a/ui/src/tsconfig.app.json +++ b/ui/src/tsconfig.app.json @@ -6,7 +6,8 @@ "resolveJsonModule": true }, "angularCompilerOptions": { - "enableIvy": false + "enableIvy": true, + "strictTemplates": true }, "exclude": [] } diff --git a/ui/tsconfig.eslint.json b/ui/tsconfig.eslint.json new file mode 100644 index 0000000..fb2cc68 --- /dev/null +++ b/ui/tsconfig.eslint.json @@ -0,0 +1,17 @@ +{ + // extend your base config to share compilerOptions, etc + "extends": "./tsconfig.json", + "compilerOptions": { + // ensure that nobody can accidentally use this config for a build + "noEmit": true + }, + "include": [ + // whatever paths you intend to lint + "src", + "scripts" + ], + "exclude": [ + "node_modules", + "dist" + ] +} \ No newline at end of file diff --git a/ui/tsconfig.json b/ui/tsconfig.json index 25e3240..f535685 100644 --- a/ui/tsconfig.json +++ b/ui/tsconfig.json @@ -18,6 +18,6 @@ "lib": [ "es2018", "dom" - ] + ], } } diff --git a/ui/tslint.json b/ui/tslint.json deleted file mode 100644 index b4455d3..0000000 --- a/ui/tslint.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "extends": "tslint-config-standard", - "rules": { - "no-empty": false - } -} \ No newline at end of file