diff --git a/.eslintrc.json b/.eslintrc.json index 7e00937..1629d18 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -24,6 +24,7 @@ "max-classes-per-file": "error", "object-shorthand": ["error", "methods"], "no-useless-rename": "error", + "prefer-promise-reject-errors": "error", "import/no-extraneous-dependencies": [ "error", @@ -65,22 +66,20 @@ "settings": { "import/extensions": [".ts", "d.ts", ".js", ".json"], "import/parsers": { - "@typescript-eslint/parser": [".ts", "d.ts"] + "@typescript-eslint/parser": [".ts", ".d.ts"] } }, "rules": { "no-console": "error", "no-magic-numbers": "off", - "@typescript-eslint/no-unused-vars": "off", - "@typescript-eslint/no-explicit-any": "off", - "@typescript-eslint/typedef": [ + "@typescript-eslint/ban-types": [ "error", { - "arrowParameter": true, - "memberVariableDeclaration": true, - "parameter": true, - "propertyDeclaration": true + "extendDefaults": true, + "types": { + "object": false + } } ], "@typescript-eslint/explicit-function-return-type": "error", @@ -103,14 +102,30 @@ ], "@typescript-eslint/prefer-for-of": "error", "@typescript-eslint/no-empty-function": "off", - "@typescript-eslint/interface-name-prefix": ["error", { "prefixWithI": "always" }], + "@typescript-eslint/naming-convention": [ + "error", + { + "selector": "interface", + "format": ["PascalCase"], + "prefix": ["I"] + } + ], "@typescript-eslint/explicit-member-accessibility": "error", "@typescript-eslint/unbound-method": "off", "@typescript-eslint/ban-ts-ignore": "off", "@typescript-eslint/no-use-before-define": "off", "@typescript-eslint/no-misused-promises": ["error", { "checksVoidReturn": false }], "@typescript-eslint/member-ordering": "error", - "@typescript-eslint/array-type": ["error", { "default": "array-simple" }] + "@typescript-eslint/array-type": ["error", { "default": "array-simple" }], + "@typescript-eslint/restrict-template-expressions": [ + "error", + { + "allowNumber": true, + "allowBoolean": false, + "allowAny": false, + "allowNullish": false + } + ] } }, { @@ -123,7 +138,8 @@ "@typescript-eslint/no-magic-numbers": "off", "@typescript-eslint/typedef": "off", "@typescript-eslint/no-var-requires": "off", - "@typescript-eslint/explicit-function-return-type": "off" + "@typescript-eslint/explicit-function-return-type": "off", + "@typescript-eslint/ban-ts-comment": "off" } }, { diff --git a/declarations/json.d.ts b/declarations/json.d.ts deleted file mode 100644 index bbab69d..0000000 --- a/declarations/json.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -declare module '*.json' { - const value: any; - export default value; -} diff --git a/package-lock.json b/package-lock.json index b2ffff6..2fc5be1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -340,16 +340,16 @@ } }, "@electron-forge/async-ora": { - "version": "6.0.0-beta.51", - "resolved": "https://registry.npmjs.org/@electron-forge/async-ora/-/async-ora-6.0.0-beta.51.tgz", - "integrity": "sha512-t29LvNM5CTWOoNSVa5TXSQ/MlPEO5SIfpETmkXx3wdENj0QywrmFmypASp5QDf7ahGe+XR0zuR1T/0Lw8oLnLg==", + "version": "6.0.0-beta.52", + "resolved": "https://registry.npmjs.org/@electron-forge/async-ora/-/async-ora-6.0.0-beta.52.tgz", + "integrity": "sha512-te0yJbuSwxPMUJYcpFGLanvtmCsf7ZNKuhui2Y/2BYhcaYR7/jAH+VbPHeIj0etOvC08CSXNk3kWIQKweqsoDA==", "dev": true, "requires": { "colors": "^1.4.0", "debug": "^4.1.0", "log-symbols": "^4.0.0", "ora": "^4.0.3", - "pretty-ms": "^6.0.1" + "pretty-ms": "^7.0.0" }, "dependencies": { "debug": { @@ -364,73 +364,23 @@ } }, "@electron-forge/cli": { - "version": "6.0.0-beta.51", - "resolved": "https://registry.npmjs.org/@electron-forge/cli/-/cli-6.0.0-beta.51.tgz", - "integrity": "sha512-SDslti1kY0gb+zxAJpOEl+rAGP/wroiUTH3cWyrOFhDQXxzL/XgX3IpU33ASUCRcoOKNgnrnkc13/yaecFAZuw==", + "version": "6.0.0-beta.52", + "resolved": "https://registry.npmjs.org/@electron-forge/cli/-/cli-6.0.0-beta.52.tgz", + "integrity": "sha512-l3xzzll/zyI2qvIedm25tXMYo7/jnm51USgdrAi+DytYNTR1h/W7EmlQ9zGyXtXqYlwTk15rhwcjlH/3qarO+g==", "dev": true, "requires": { - "@electron-forge/async-ora": "6.0.0-beta.51", - "@electron-forge/core": "6.0.0-beta.51", - "@electron-forge/shared-types": "6.0.0-beta.51", + "@electron-forge/async-ora": "6.0.0-beta.52", + "@electron-forge/core": "6.0.0-beta.52", + "@electron-forge/shared-types": "6.0.0-beta.52", "@electron/get": "^1.9.0", "colors": "^1.4.0", "commander": "^4.1.1", "debug": "^4.1.0", - "fs-extra": "^9.0.0", - "inquirer": "^7.0.6", + "fs-extra": "^9.0.1", + "inquirer": "^7.2.0", "semver": "^7.2.1" }, "dependencies": { - "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": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "requires": { - "restore-cursor": "^3.1.0" - } - }, - "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 - }, "debug": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", @@ -440,136 +390,43 @@ "ms": "^2.1.1" } }, - "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 - }, - "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 - }, - "inquirer": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.1.0.tgz", - "integrity": "sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg==", - "dev": true, - "requires": { - "ansi-escapes": "^4.2.1", - "chalk": "^3.0.0", - "cli-cursor": "^3.1.0", - "cli-width": "^2.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.15", - "mute-stream": "0.0.8", - "run-async": "^2.4.0", - "rxjs": "^6.5.3", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6" - } - }, - "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 - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, - "onetime": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", - "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "requires": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - } - }, "semver": { "version": "7.3.2", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", "dev": true - }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "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" - } - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } } } }, "@electron-forge/core": { - "version": "6.0.0-beta.51", - "resolved": "https://registry.npmjs.org/@electron-forge/core/-/core-6.0.0-beta.51.tgz", - "integrity": "sha512-EUQ1ynWsPdwBtt3RDLiXf9zN4qPf5Fxnqdn9/86BNhpRkGRJ2d3yy5SlpMj8DIMpqwekSsGIutTjlfQKY/4HIQ==", + "version": "6.0.0-beta.52", + "resolved": "https://registry.npmjs.org/@electron-forge/core/-/core-6.0.0-beta.52.tgz", + "integrity": "sha512-Ykn7bUo5mEevPen82y061D9huEdjn5zfqm7erjRU4t6yZB+XGhi+P54xS5mWTPJEVbJM0N22m67ugOh0crFnDQ==", "dev": true, "requires": { - "@electron-forge/async-ora": "6.0.0-beta.51", - "@electron-forge/installer-base": "6.0.0-beta.51", - "@electron-forge/installer-deb": "6.0.0-beta.51", - "@electron-forge/installer-dmg": "6.0.0-beta.51", - "@electron-forge/installer-exe": "6.0.0-beta.51", - "@electron-forge/installer-rpm": "6.0.0-beta.51", - "@electron-forge/installer-zip": "6.0.0-beta.51", - "@electron-forge/maker-base": "6.0.0-beta.51", - "@electron-forge/plugin-base": "6.0.0-beta.51", - "@electron-forge/publisher-base": "6.0.0-beta.51", - "@electron-forge/shared-types": "6.0.0-beta.51", - "@electron-forge/template-base": "6.0.0-beta.51", - "@electron-forge/template-typescript": "6.0.0-beta.51", - "@electron-forge/template-typescript-webpack": "6.0.0-beta.51", - "@electron-forge/template-webpack": "6.0.0-beta.51", + "@electron-forge/async-ora": "6.0.0-beta.52", + "@electron-forge/installer-base": "6.0.0-beta.52", + "@electron-forge/installer-deb": "6.0.0-beta.52", + "@electron-forge/installer-dmg": "6.0.0-beta.52", + "@electron-forge/installer-exe": "6.0.0-beta.52", + "@electron-forge/installer-rpm": "6.0.0-beta.52", + "@electron-forge/installer-zip": "6.0.0-beta.52", + "@electron-forge/maker-base": "6.0.0-beta.52", + "@electron-forge/plugin-base": "6.0.0-beta.52", + "@electron-forge/publisher-base": "6.0.0-beta.52", + "@electron-forge/shared-types": "6.0.0-beta.52", + "@electron-forge/template-base": "6.0.0-beta.52", + "@electron-forge/template-typescript": "6.0.0-beta.52", + "@electron-forge/template-typescript-webpack": "6.0.0-beta.52", + "@electron-forge/template-webpack": "6.0.0-beta.52", "@electron/get": "^1.9.0", "@malept/cross-spawn-promise": "^1.1.0", "colors": "^1.4.0", "debug": "^4.1.0", - "electron-packager": "^14.2.0", + "electron-packager": "^15.0.0", "electron-rebuild": "^1.8.6", "find-up": "^4.1.0", - "fs-extra": "^9.0.0", + "fs-extra": "^9.0.1", "glob": "^7.1.5", "lodash": "^4.17.15", "log-symbols": "^4.0.0", @@ -615,45 +472,45 @@ } }, "@electron-forge/installer-base": { - "version": "6.0.0-beta.51", - "resolved": "https://registry.npmjs.org/@electron-forge/installer-base/-/installer-base-6.0.0-beta.51.tgz", - "integrity": "sha512-9zvTp9igmPzVjlqniuO6UbrKbaJbiVKc9C5KBNc+6smiPERXP2iBr+THJ/Snq9MJXOZ6R4G5Uf7w0P6RCSpZeA==", + "version": "6.0.0-beta.52", + "resolved": "https://registry.npmjs.org/@electron-forge/installer-base/-/installer-base-6.0.0-beta.52.tgz", + "integrity": "sha512-ZPchg/hDNUnovJ5U83NocBjB77u0GAjNtFEU9tJBr35M9XiNRIeEDnSLqrDmdHmxEnvJsjNre7JE83KmmuiXyA==", "dev": true, "requires": { - "@electron-forge/async-ora": "6.0.0-beta.51" + "@electron-forge/async-ora": "6.0.0-beta.52" } }, "@electron-forge/installer-darwin": { - "version": "6.0.0-beta.51", - "resolved": "https://registry.npmjs.org/@electron-forge/installer-darwin/-/installer-darwin-6.0.0-beta.51.tgz", - "integrity": "sha512-+JG4WzP5IfXNhepumaNaSc6BZ1UpOqp8wuTYNg3DN+YkhzOlBHxxBTDfLg1SMOVgBoerWh6tNsgjqe1pZdqYZA==", + "version": "6.0.0-beta.52", + "resolved": "https://registry.npmjs.org/@electron-forge/installer-darwin/-/installer-darwin-6.0.0-beta.52.tgz", + "integrity": "sha512-Ig2k4MB1ciHjYhtxPDYYi/Ca4GOi0xLdGNUN8fUTsdJKUt35g1nmH7mco7qrwUdxEMFEp23e3tyQsVevkGIhQw==", "dev": true, "requires": { - "@electron-forge/async-ora": "6.0.0-beta.51", - "@electron-forge/installer-base": "6.0.0-beta.51", - "fs-extra": "^9.0.0", + "@electron-forge/async-ora": "6.0.0-beta.52", + "@electron-forge/installer-base": "6.0.0-beta.52", + "fs-extra": "^9.0.1", "sudo-prompt": "^9.1.1" } }, "@electron-forge/installer-deb": { - "version": "6.0.0-beta.51", - "resolved": "https://registry.npmjs.org/@electron-forge/installer-deb/-/installer-deb-6.0.0-beta.51.tgz", - "integrity": "sha512-uY1z3yohxGktU3OLoffkuI+37gph0z6npgqY+5QQy8V7tYaHzDjfTFXyVjS/itCCanG9p2wlvb1XrIolJpVqVg==", + "version": "6.0.0-beta.52", + "resolved": "https://registry.npmjs.org/@electron-forge/installer-deb/-/installer-deb-6.0.0-beta.52.tgz", + "integrity": "sha512-c1R5EAtFZo9WnUiv0J5U2BVrEZRfeXhCcnHmRNRjY5RGHnwONVTWQbnxMfgNcHV9ZT9Yge71tgLdyHceAvhfTQ==", "dev": true, "requires": { - "@electron-forge/installer-linux": "6.0.0-beta.51" + "@electron-forge/installer-linux": "6.0.0-beta.52" } }, "@electron-forge/installer-dmg": { - "version": "6.0.0-beta.51", - "resolved": "https://registry.npmjs.org/@electron-forge/installer-dmg/-/installer-dmg-6.0.0-beta.51.tgz", - "integrity": "sha512-KMA8vIE2v7IsSIaMgw80VZbo7ktAHuQPKhcZhOdPVCVzX9xj0BwIrEDyBKy2YHyZpOKl4iBkr0Ya+dEpVPOeww==", + "version": "6.0.0-beta.52", + "resolved": "https://registry.npmjs.org/@electron-forge/installer-dmg/-/installer-dmg-6.0.0-beta.52.tgz", + "integrity": "sha512-hkOj7zotG3Cpan0fxKRSWfH/EIa3U+Ggyj3bkdGBL8RToKXWFJizApE3jOwJH1LTBQTTf9CPEhN3/c/jt5qHiw==", "dev": true, "requires": { - "@electron-forge/installer-darwin": "6.0.0-beta.51", + "@electron-forge/installer-darwin": "6.0.0-beta.52", "@malept/cross-spawn-promise": "^1.1.0", "debug": "^4.1.0", - "fs-extra": "^9.0.0" + "fs-extra": "^9.0.1" }, "dependencies": { "debug": { @@ -668,53 +525,53 @@ } }, "@electron-forge/installer-exe": { - "version": "6.0.0-beta.51", - "resolved": "https://registry.npmjs.org/@electron-forge/installer-exe/-/installer-exe-6.0.0-beta.51.tgz", - "integrity": "sha512-jIrn5ZRmQbFc+rj6PXX86/1aRUcZUVYFshF4M0XazjVb9J8vmELXYsUixHsXQ6IvsytH3jkXBu/3af3G6XhehQ==", + "version": "6.0.0-beta.52", + "resolved": "https://registry.npmjs.org/@electron-forge/installer-exe/-/installer-exe-6.0.0-beta.52.tgz", + "integrity": "sha512-aEeMlij+IC4iT4G76feEKfRJtEv/Zk9LMkFhCjKw3ZfWSH8iXWWHX5LPIZito2ZPTzj3NlmLPuk290HYbc0jkQ==", "dev": true, "requires": { - "@electron-forge/installer-base": "6.0.0-beta.51", + "@electron-forge/installer-base": "6.0.0-beta.52", "open": "^7.0.3" } }, "@electron-forge/installer-linux": { - "version": "6.0.0-beta.51", - "resolved": "https://registry.npmjs.org/@electron-forge/installer-linux/-/installer-linux-6.0.0-beta.51.tgz", - "integrity": "sha512-8DAPFaIHBch/RnQnHZ0w4ncOheLfFxXqQQu/re+umAYg/f6VS+G562iqSqMFqKXm4pp5VLBOw2GoK7YlcZctwA==", + "version": "6.0.0-beta.52", + "resolved": "https://registry.npmjs.org/@electron-forge/installer-linux/-/installer-linux-6.0.0-beta.52.tgz", + "integrity": "sha512-JROuiBL9hnbvAg8vRS1arMMtDbZOWRr/brUh0KnnrPm2rJ95RTpTGoN9bET/QS7uZxMOaxPg87PPArWj3jT2Tg==", "dev": true, "requires": { - "@electron-forge/installer-base": "6.0.0-beta.51", + "@electron-forge/installer-base": "6.0.0-beta.52", "sudo-prompt": "^9.1.1" } }, "@electron-forge/installer-rpm": { - "version": "6.0.0-beta.51", - "resolved": "https://registry.npmjs.org/@electron-forge/installer-rpm/-/installer-rpm-6.0.0-beta.51.tgz", - "integrity": "sha512-yTy91PCYJvFR+P842FB/6ttzhV37iRE8tU2UJu6J4jimEQ6Q3BEmXcJElzipEhLI4gVXwma+wD2nNnOjmjAzmw==", + "version": "6.0.0-beta.52", + "resolved": "https://registry.npmjs.org/@electron-forge/installer-rpm/-/installer-rpm-6.0.0-beta.52.tgz", + "integrity": "sha512-c0qRqdQp7asXOB2uG/qmFVu1i+7azkHQ+tvFoiZmgEg3xl2q2ZpRD2rLC3UHKLH2UFav08a5MjnMveMewrTlMg==", "dev": true, "requires": { - "@electron-forge/installer-linux": "6.0.0-beta.51" + "@electron-forge/installer-linux": "6.0.0-beta.52" } }, "@electron-forge/installer-zip": { - "version": "6.0.0-beta.51", - "resolved": "https://registry.npmjs.org/@electron-forge/installer-zip/-/installer-zip-6.0.0-beta.51.tgz", - "integrity": "sha512-uhH4+LVz88kVzCBz6KMTcWq+5LYGSg1Jd5IrLrvq075cegk3SG0jfXG77gZ2/VmTvzNXmTdi7Y+TH3kxr3zkNg==", + "version": "6.0.0-beta.52", + "resolved": "https://registry.npmjs.org/@electron-forge/installer-zip/-/installer-zip-6.0.0-beta.52.tgz", + "integrity": "sha512-EC9Y+hT8qp2F1k9mbzQlQpGSX+o4h64RkeuVwsgRzsJKL/bae/1HJF0sEcoNmO0nnDFBo26ScUPUgA/lopV6wA==", "dev": true, "requires": { - "@electron-forge/installer-darwin": "6.0.0-beta.51", + "@electron-forge/installer-darwin": "6.0.0-beta.52", "@malept/cross-spawn-promise": "^1.1.0", - "fs-extra": "^9.0.0" + "fs-extra": "^9.0.1" } }, "@electron-forge/maker-base": { - "version": "6.0.0-beta.51", - "resolved": "https://registry.npmjs.org/@electron-forge/maker-base/-/maker-base-6.0.0-beta.51.tgz", - "integrity": "sha512-81L5FOVgXvbGDl3O4ZcMJ4LZSOdCgKa17RvArFNFDp2QTeocOpb9Kz1CuZKZx/o68nMWtlknBEB6ZeNcAuMfUg==", + "version": "6.0.0-beta.52", + "resolved": "https://registry.npmjs.org/@electron-forge/maker-base/-/maker-base-6.0.0-beta.52.tgz", + "integrity": "sha512-MPfxLJ+v+g00bJo8ucFw2jug9bnaJt3oytAuTItZN7yeN73beAGYogs35M7EVQs3SiHxn1JwMmGhGDz1LXkiLg==", "dev": true, "requires": { - "@electron-forge/shared-types": "6.0.0-beta.51", - "fs-extra": "^9.0.0", + "@electron-forge/shared-types": "6.0.0-beta.52", + "fs-extra": "^9.0.1", "which": "^2.0.2" }, "dependencies": { @@ -730,54 +587,57 @@ } }, "@electron-forge/maker-squirrel": { - "version": "6.0.0-beta.51", - "resolved": "https://registry.npmjs.org/@electron-forge/maker-squirrel/-/maker-squirrel-6.0.0-beta.51.tgz", - "integrity": "sha512-vHOriccTB7xxwZpUQk5pI/hWAmHLWG2+h1wrb6obU08mwNeYKUaXPlnTkwXHQLr4DDmjH8YeYF2H0YzedTK0/g==", + "version": "6.0.0-beta.52", + "resolved": "https://registry.npmjs.org/@electron-forge/maker-squirrel/-/maker-squirrel-6.0.0-beta.52.tgz", + "integrity": "sha512-AindvuiCzHDsa8BPVmE0i99p4gguNXIKOXc0f7bXxudbFPaLP3Tj2+BA7YDPx9s1iCwzd48n20R/oiiEfW3KMA==", "dev": true, "requires": { - "@electron-forge/maker-base": "6.0.0-beta.51", - "@electron-forge/shared-types": "6.0.0-beta.51", + "@electron-forge/maker-base": "6.0.0-beta.52", + "@electron-forge/shared-types": "6.0.0-beta.52", "electron-winstaller": "^4.0.0", - "fs-extra": "^9.0.0" + "fs-extra": "^9.0.1" } }, "@electron-forge/plugin-base": { - "version": "6.0.0-beta.51", - "resolved": "https://registry.npmjs.org/@electron-forge/plugin-base/-/plugin-base-6.0.0-beta.51.tgz", - "integrity": "sha512-G0R/hbxPwrPIvck0H+GrVVqBDFbMdQ7uC/oor4tI1JZ1Hjde9VIwrqVLN+UCueT9LOOL3vJTBgZxVODz+VSSDA==", + "version": "6.0.0-beta.52", + "resolved": "https://registry.npmjs.org/@electron-forge/plugin-base/-/plugin-base-6.0.0-beta.52.tgz", + "integrity": "sha512-ZDkF1/c+N/BJIcQWns4OwXIiYNv3dRfPl/V0m1Qk/7wlpTEM55e0MmxpblAfqRZuQ4f90YKthQKVBnG3EyUUIw==", "dev": true, "requires": { - "@electron-forge/shared-types": "6.0.0-beta.51" + "@electron-forge/shared-types": "6.0.0-beta.52" } }, "@electron-forge/publisher-base": { - "version": "6.0.0-beta.51", - "resolved": "https://registry.npmjs.org/@electron-forge/publisher-base/-/publisher-base-6.0.0-beta.51.tgz", - "integrity": "sha512-Tk29I2wcvQX5Lhi3Rh6kQTmAfrzu9Wus++kD56HQJ72WOqOn2pOT/Tr5IOKOaZF2GQoqPhljCZmPo0Xh7sO6gQ==", - "dev": true - }, - "@electron-forge/shared-types": { - "version": "6.0.0-beta.51", - "resolved": "https://registry.npmjs.org/@electron-forge/shared-types/-/shared-types-6.0.0-beta.51.tgz", - "integrity": "sha512-m8ZdXuVLMSYKQTd+p7Mrtfe5qNJzh6nxQMEskxplj0+c45MTa83igw7UAKuL8sbSESHCY1UxRiQGONIoF7KB5Q==", + "version": "6.0.0-beta.52", + "resolved": "https://registry.npmjs.org/@electron-forge/publisher-base/-/publisher-base-6.0.0-beta.52.tgz", + "integrity": "sha512-EpGHK/ouwJmoNYr9UWDVoRAVI0gossDjJTwJFPlv5U+5h9O2+XEcU5gw0amJG4tPqH46Nmumujm0zzlWlBKiBQ==", "dev": true, "requires": { - "@electron-forge/async-ora": "6.0.0-beta.51", - "@types/electron-packager": "^14.0.0", + "@electron-forge/shared-types": "6.0.0-beta.52" + } + }, + "@electron-forge/shared-types": { + "version": "6.0.0-beta.52", + "resolved": "https://registry.npmjs.org/@electron-forge/shared-types/-/shared-types-6.0.0-beta.52.tgz", + "integrity": "sha512-hQD/oOEtzAKyGF4DvTJPss/4CWV8KkPsdS+L0UiN80Mk1TyAa7potqVZe4PZ7HmsYqDBoEvuDXuBwZdul4FYQA==", + "dev": true, + "requires": { + "@electron-forge/async-ora": "6.0.0-beta.52", + "electron-packager": "^15.0.0", "electron-rebuild": "^1.8.6", "ora": "^4.0.3" } }, "@electron-forge/template-base": { - "version": "6.0.0-beta.51", - "resolved": "https://registry.npmjs.org/@electron-forge/template-base/-/template-base-6.0.0-beta.51.tgz", - "integrity": "sha512-vTtAPhRyQ2QmQi/dhzIade2nWYGLQGjmvH7bwcScly0RdyTFKoK699z+oeI+5Et83g+m+Wl6wyCIZ20xyRTj2g==", + "version": "6.0.0-beta.52", + "resolved": "https://registry.npmjs.org/@electron-forge/template-base/-/template-base-6.0.0-beta.52.tgz", + "integrity": "sha512-0o7m/sKdFQ9dYj+9N6c1f7DE9v5SK9o6DyxKOtQ7U6kW66L0yyxnxZMk5p/pbtmpqpe3cCoOFruGzgxIOYVZiQ==", "dev": true, "requires": { - "@electron-forge/async-ora": "6.0.0-beta.51", - "@electron-forge/shared-types": "6.0.0-beta.51", + "@electron-forge/async-ora": "6.0.0-beta.52", + "@electron-forge/shared-types": "6.0.0-beta.52", "debug": "^4.1.0", - "fs-extra": "^9.0.0", + "fs-extra": "^9.0.1", "username": "^5.1.0" }, "dependencies": { @@ -793,39 +653,39 @@ } }, "@electron-forge/template-typescript": { - "version": "6.0.0-beta.51", - "resolved": "https://registry.npmjs.org/@electron-forge/template-typescript/-/template-typescript-6.0.0-beta.51.tgz", - "integrity": "sha512-4GAwgvMAaqLpUeCUh6vuxzBoEKZXwjbBZhb4on/4nQtdVdWnEaEF9Fq85GS9ralV1g8ZOgomjwOHOIuU2xdyrQ==", + "version": "6.0.0-beta.52", + "resolved": "https://registry.npmjs.org/@electron-forge/template-typescript/-/template-typescript-6.0.0-beta.52.tgz", + "integrity": "sha512-9Ab2eTRg8afh30c3eXA7HjSKXV+cdWR5CnOSshvpWyrSFLq/cnU+CWCYAxEftAnWmG7JwB5NGpkgNXK2ISjGzg==", "dev": true, "requires": { - "@electron-forge/async-ora": "6.0.0-beta.51", - "@electron-forge/shared-types": "6.0.0-beta.51", - "@electron-forge/template-base": "6.0.0-beta.51", - "fs-extra": "^9.0.0" + "@electron-forge/async-ora": "6.0.0-beta.52", + "@electron-forge/shared-types": "6.0.0-beta.52", + "@electron-forge/template-base": "6.0.0-beta.52", + "fs-extra": "^9.0.1" } }, "@electron-forge/template-typescript-webpack": { - "version": "6.0.0-beta.51", - "resolved": "https://registry.npmjs.org/@electron-forge/template-typescript-webpack/-/template-typescript-webpack-6.0.0-beta.51.tgz", - "integrity": "sha512-Kzhjnj026pN5AXVg7bYJYBx4HFGKXavsmL4TuDw2hWu7eRehDRPEckTYcZFsKJZZq8slFVw5QDWvtn0bNAH38A==", + "version": "6.0.0-beta.52", + "resolved": "https://registry.npmjs.org/@electron-forge/template-typescript-webpack/-/template-typescript-webpack-6.0.0-beta.52.tgz", + "integrity": "sha512-EEuj0OAqCcMWewL5/wOEkYYFxfR6bht/nlrPY7XOUTy4DqYUSRKGQGyYTT76cCHwacCj7vQEDUNeBBBSyDyShw==", "dev": true, "requires": { - "@electron-forge/async-ora": "6.0.0-beta.51", - "@electron-forge/shared-types": "6.0.0-beta.51", - "@electron-forge/template-base": "6.0.0-beta.51", - "fs-extra": "^9.0.0" + "@electron-forge/async-ora": "6.0.0-beta.52", + "@electron-forge/shared-types": "6.0.0-beta.52", + "@electron-forge/template-base": "6.0.0-beta.52", + "fs-extra": "^9.0.1" } }, "@electron-forge/template-webpack": { - "version": "6.0.0-beta.51", - "resolved": "https://registry.npmjs.org/@electron-forge/template-webpack/-/template-webpack-6.0.0-beta.51.tgz", - "integrity": "sha512-QIrQJ8sLUxhtjk524AQ5UMxEDE0vZXjtwNo8khMJQrhKjEvA0arNeQXMmAgPxrSSU3fCRLbeD+7xOU6KI8q2rQ==", + "version": "6.0.0-beta.52", + "resolved": "https://registry.npmjs.org/@electron-forge/template-webpack/-/template-webpack-6.0.0-beta.52.tgz", + "integrity": "sha512-S+z18b4nYGANYD5FSG/0arrxNU83qTm7GNwdI/G0mJ2Bqk+SwGUL4b6cPKdkVVorbElLU6vO1EmacUI1sS4+vA==", "dev": true, "requires": { - "@electron-forge/async-ora": "6.0.0-beta.51", - "@electron-forge/shared-types": "6.0.0-beta.51", - "@electron-forge/template-base": "6.0.0-beta.51", - "fs-extra": "^9.0.0" + "@electron-forge/async-ora": "6.0.0-beta.52", + "@electron-forge/shared-types": "6.0.0-beta.52", + "@electron-forge/template-base": "6.0.0-beta.52", + "fs-extra": "^9.0.1" } }, "@electron/get": { @@ -980,18 +840,6 @@ "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==" }, - "@types/electron-packager": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/@types/electron-packager/-/electron-packager-14.0.0.tgz", - "integrity": "sha512-n47/AbT4DEYPyXtES2myPyKCxVE3hICAB3MnpoVg+Ba8CLBGOpUUsNJ5fyLhfKt5N06sT9nTk4eAc+rtYVpvTQ==", - "dev": true, - "requires": { - "@electron/get": "^1.3.1", - "@types/node": "*", - "electron-notarize": "^0.1.1", - "electron-osx-sign": "^0.4.11" - } - }, "@types/eslint-visitor-keys": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", @@ -1008,9 +856,9 @@ } }, "@types/glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-VgNIkxK+j7Nz5P7jvUZlRvhuPSmsEfS03b0alKcq5V/STUKAa3Plemsn5mrQUO7am6OErJ4rhGEGJbACclrtRA==", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==", "dev": true, "optional": true, "requires": { @@ -1030,9 +878,15 @@ } }, "@types/json-schema": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.4.tgz", - "integrity": "sha512-8+KAKzEvSUdeo+kmqnKrqgeE+LcA0tjYWFY7RPProVYwnqDjukzO+3b6dLD56rYX5TdWejnEOLJYOIeh4CXKuA==", + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.5.tgz", + "integrity": "sha512-7+2BITlgjgDhH0vvwZU/HZJVyk+2XUlvxXe8dFMedNX/aMkaOq++rMAFXc0tM7ij15QaWlbdQASBR9dihi+bDQ==", + "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 }, "@types/minimatch": { @@ -1055,9 +909,9 @@ "dev": true }, "@types/node": { - "version": "12.12.44", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.44.tgz", - "integrity": "sha512-jM6QVv0Sm5d3nW+nUD5jSzPcO6oPqboitSNcwgBay9hifVq/Rauq1PYnROnsmuw45JMBiTnsPAno0bKu2e2xrg==", + "version": "12.12.51", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.51.tgz", + "integrity": "sha512-6ILqt8iNThALrxDv2Q4LyYFQxULQz96HKNIFd4s9QRQaiHINYeUpLqeU/2IU7YMtvipG1fQVAy//vY8/fX1Y9w==", "dev": true }, "@types/node-fetch": { @@ -1117,9 +971,9 @@ "dev": true }, "@types/tapable": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.5.tgz", - "integrity": "sha512-/gG2M/Imw7cQFp8PGvz/SwocNrmKFjFsm5Pb8HdbHkZ1K8pmuPzOX4VeVoiEecFCVf4CsN1r3/BRvx+6sNqwtQ==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.6.tgz", + "integrity": "sha512-W+bw9ds02rAQaMvaLYxAbJ6cvguW/iJXNT6lTssS1ps6QdrMKttqEAMEG/b5CR8TZl3/L7/lH0ZV5nNR1LXikA==", "dev": true }, "@types/tough-cookie": { @@ -1129,9 +983,9 @@ "dev": true }, "@types/uglify-js": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.9.2.tgz", - "integrity": "sha512-d6dIfpPbF+8B7WiCi2ELY7m0w1joD8cRW4ms88Emdb2w062NeEpbNCeWwVCgzLRpVG+5e74VFSg4rgJ2xXjEiQ==", + "version": "3.9.3", + "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.9.3.tgz", + "integrity": "sha512-KswB5C7Kwduwjj04Ykz+AjvPcfgv/37Za24O2EDzYNbwyzOo8+ydtvzUfZ5UMguiVu29Gx44l1A6VsPPcmYu9w==", "dev": true, "requires": { "source-map": "^0.6.1" @@ -1153,9 +1007,9 @@ } }, "@types/webpack": { - "version": "4.41.17", - "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.17.tgz", - "integrity": "sha512-6FfeCidTSHozwKI67gIVQQ5Mp0g4X96c2IXxX75hYEQJwST/i6NyZexP//zzMOBb+wG9jJ7oO8fk9yObP2HWAw==", + "version": "4.41.21", + "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.21.tgz", + "integrity": "sha512-2j9WVnNrr/8PLAB5csW44xzQSJwS26aOnICsP3pSGCEdsu6KYtfQ6QJsVUKHWRnm1bL7HziJsfh5fHqth87yKA==", "dev": true, "requires": { "@types/anymatch": "*", @@ -1185,61 +1039,88 @@ } } }, - "@typescript-eslint/eslint-plugin": { - "version": "2.34.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.34.0.tgz", - "integrity": "sha512-4zY3Z88rEE99+CNvTbXSyovv2z9PNOVffTWD2W8QF5s2prBQtwN2zadqERcrHpcR7O/+KMI3fcTAmUUhK/iQcQ==", + "@types/yauzl": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.9.1.tgz", + "integrity": "sha512-A1b8SU4D10uoPjwb0lnHmmu8wZhR9d+9o2PKBQT2jU5YPTKsxac6M2qGAdY7VcL+dHHhARVUDmeg0rOrcd9EjA==", "dev": true, + "optional": true, "requires": { - "@typescript-eslint/experimental-utils": "2.34.0", - "functional-red-black-tree": "^1.0.1", - "regexpp": "^3.0.0", - "tsutils": "^3.17.1" + "@types/node": "*" } }, - "@typescript-eslint/experimental-utils": { - "version": "2.34.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.34.0.tgz", - "integrity": "sha512-eS6FTkq+wuMJ+sgtuNTtcqavWXqsflWcfBnlYhg/nS4aZ1leewkXGbvBhaapn1q6qf4M71bsR1tez5JTRMuqwA==", + "@typescript-eslint/eslint-plugin": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-3.7.0.tgz", + "integrity": "sha512-4OEcPON3QIx0ntsuiuFP/TkldmBGXf0uKxPQlGtS/W2F3ndYm8Vgdpj/woPJkzUc65gd3iR+qi3K8SDQP/obFg==", "dev": true, "requires": { - "@types/json-schema": "^7.0.3", - "@typescript-eslint/typescript-estree": "2.34.0", - "eslint-scope": "^5.0.0", - "eslint-utils": "^2.0.0" + "@typescript-eslint/experimental-utils": "3.7.0", + "debug": "^4.1.1", + "functional-red-black-tree": "^1.0.1", + "regexpp": "^3.0.0", + "semver": "^7.3.2", + "tsutils": "^3.17.1" }, "dependencies": { - "eslint-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.0.0.tgz", - "integrity": "sha512-0HCPuJv+7Wv1bACm8y5/ECVfYdfsAm9xmVb7saeFlxjPYALefjhbYoCkBjPdPzGH8wWyTpAez82Fh3VKYEZ8OA==", + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "dev": true, "requires": { - "eslint-visitor-keys": "^1.1.0" + "ms": "^2.1.1" } + }, + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true } } }, + "@typescript-eslint/experimental-utils": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-3.7.0.tgz", + "integrity": "sha512-xpfXXAfZqhhqs5RPQBfAFrWDHoNxD5+sVB5A46TF58Bq1hRfVROrWHcQHHUM9aCBdy9+cwATcvCbRg8aIRbaHQ==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.3", + "@typescript-eslint/types": "3.7.0", + "@typescript-eslint/typescript-estree": "3.7.0", + "eslint-scope": "^5.0.0", + "eslint-utils": "^2.0.0" + } + }, "@typescript-eslint/parser": { - "version": "2.34.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.34.0.tgz", - "integrity": "sha512-03ilO0ucSD0EPTw2X4PntSIRFtDPWjrVq7C3/Z3VQHRC7+13YB55rcJI3Jt+YgeHbjUdJPcPa7b23rXCBokuyA==", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-3.7.0.tgz", + "integrity": "sha512-2LZauVUt7jAWkcIW7djUc3kyW+fSarNEuM3RF2JdLHR9BfX/nDEnyA4/uWz0wseoWVZbDXDF7iF9Jc342flNqQ==", "dev": true, "requires": { "@types/eslint-visitor-keys": "^1.0.0", - "@typescript-eslint/experimental-utils": "2.34.0", - "@typescript-eslint/typescript-estree": "2.34.0", + "@typescript-eslint/experimental-utils": "3.7.0", + "@typescript-eslint/types": "3.7.0", + "@typescript-eslint/typescript-estree": "3.7.0", "eslint-visitor-keys": "^1.1.0" } }, + "@typescript-eslint/types": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-3.7.0.tgz", + "integrity": "sha512-reCaK+hyKkKF+itoylAnLzFeNYAEktB0XVfSQvf0gcVgpz1l49Lt6Vo9x4MVCCxiDydA0iLAjTF/ODH0pbfnpg==", + "dev": true + }, "@typescript-eslint/typescript-estree": { - "version": "2.34.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.34.0.tgz", - "integrity": "sha512-OMAr+nJWKdlVM9LOqCqh3pQQPwxHAN7Du8DR6dmwCrAmxtiXQnhHJ6tBNtf+cggqfo51SG/FCwnKhXCIM7hnVg==", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-3.7.0.tgz", + "integrity": "sha512-xr5oobkYRebejlACGr1TJ0Z/r0a2/HUf0SXqPvlgUMwiMqOCu/J+/Dr9U3T0IxpE5oLFSkqMx1FE/dKaZ8KsOQ==", "dev": true, "requires": { + "@typescript-eslint/types": "3.7.0", + "@typescript-eslint/visitor-keys": "3.7.0", "debug": "^4.1.1", - "eslint-visitor-keys": "^1.1.0", "glob": "^7.1.6", "is-glob": "^4.0.1", "lodash": "^4.17.15", @@ -1278,6 +1159,15 @@ } } }, + "@typescript-eslint/visitor-keys": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-3.7.0.tgz", + "integrity": "sha512-k5PiZdB4vklUpUX4NBncn5RBKty8G3ihTY+hqJsCdMuD0v4jofI5xuqwnVcWxfv6iTm2P/dfEa2wMUnsUY8ODw==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + }, "@webassemblyjs/ast": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", @@ -1476,10 +1366,9 @@ "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" }, "acorn": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", - "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==", - "dev": true + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.2.0.tgz", + "integrity": "sha512-apwXVmYVpQ34m/i71vrApRrRKCWQnZZF1+npOD0WV5xZFfwWOmKGQ2RWlfdy9vWITsenisM8M0Qeq8agcFHNiQ==" }, "acorn-globals": { "version": "6.0.0", @@ -1488,13 +1377,6 @@ "requires": { "acorn": "^7.1.1", "acorn-walk": "^7.1.1" - }, - "dependencies": { - "acorn": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", - "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==" - } } }, "acorn-jsx": { @@ -1504,9 +1386,9 @@ "dev": true }, "acorn-walk": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.1.1.tgz", - "integrity": "sha512-wdlPY2tm/9XBr7QkKlq0WQVgiuGTX6YWPyRyBviSoScBuLfTVQhvwg6wJ369GJ/1nPfTLMfnrFIfjqVg6d+jQQ==" + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==" }, "aggregate-error": { "version": "3.0.1", @@ -1732,26 +1614,37 @@ } }, "asar": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/asar/-/asar-2.1.0.tgz", - "integrity": "sha512-d2Ovma+bfqNpvBzY/KU8oPY67ZworixTpkjSx0PCXnQi67c2cXmssaTxpFDUM0ttopXoGx/KRxNg/GDThYbXQA==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/asar/-/asar-3.0.3.tgz", + "integrity": "sha512-k7zd+KoR+n8pl71PvgElcoKHrVNiSXtw7odKbyNpmgKe7EGRF9Pnu3uLOukD37EvavKwVFxOUpqXTIZC5B5Pmw==", "dev": true, "requires": { "@types/glob": "^7.1.1", "chromium-pickle-js": "^0.2.0", - "commander": "^2.20.0", - "cuint": "^0.2.2", - "glob": "^7.1.3", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", - "tmp-promise": "^1.0.5" + "commander": "^5.0.0", + "glob": "^7.1.6", + "minimatch": "^3.0.4" }, "dependencies": { "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", "dev": true + }, + "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" + } } } }, @@ -1986,6 +1879,15 @@ "safe-buffer": "^5.1.1" } }, + "block-stream": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", + "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", + "optional": true, + "requires": { + "inherits": "~2.0.0" + } + }, "bluebird": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", @@ -2341,9 +2243,9 @@ "dev": true }, "chokidar": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.0.tgz", - "integrity": "sha512-aXAaho2VJtisB/1fg1+3nlLJqGOuewTzQpd/Tz0yTg2R0e4IGtshYvtjowyEumcBv2z+y4+kc75Mz7j5xJskcQ==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.1.tgz", + "integrity": "sha512-TQTJyr2stihpC4Sya9hs2Xh+O2wf+igjL36Y75xx2WdHuiICcn/XJza46Jwt0eT5hVpQOzo3FpY3cj3RVYLX0g==", "dev": true, "requires": { "anymatch": "~3.1.1", @@ -2582,9 +2484,9 @@ } }, "yargs": { - "version": "15.3.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.1.tgz", - "integrity": "sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA==", + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", "requires": { "cliui": "^6.0.0", "decamelize": "^1.2.0", @@ -2596,7 +2498,7 @@ "string-width": "^4.2.0", "which-module": "^2.0.0", "y18n": "^4.0.0", - "yargs-parser": "^18.1.1" + "yargs-parser": "^18.1.2" } }, "yargs-parser": { @@ -3056,26 +2958,6 @@ } } }, - "cross-zip": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cross-zip/-/cross-zip-3.1.0.tgz", - "integrity": "sha512-aX02l0SD3KE27pMl69gkxDdDM5D3u9Ic4Je+2b1B2fP0dWnlWWY6ns2Vk5DEgCXJRhL3GasSpicNQRNbDkq0+w==", - "dev": true, - "requires": { - "rimraf": "^3.0.0" - }, - "dependencies": { - "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" - } - } - } - }, "crypto-browserify": { "version": "3.12.0", "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", @@ -3128,9 +3010,9 @@ "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==" }, "cssstyle": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.2.0.tgz", - "integrity": "sha512-sEb3XFPx3jNnCAMtqrXPDeSgQr+jojtCeNf8cvMNMh1cG970+lljssvQDzPq6lmmJu2Vhqood/gtEomBiHOGnA==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", "requires": { "cssom": "~0.3.6" }, @@ -3146,7 +3028,8 @@ "version": "0.2.2", "resolved": "https://registry.npmjs.org/cuint/-/cuint-0.2.2.tgz", "integrity": "sha1-QICG1AlVDCYxFVYZ6fp7ytw7mRs=", - "dev": true + "dev": true, + "optional": true }, "currently-unhandled": { "version": "0.4.1", @@ -3471,9 +3354,9 @@ "dev": true }, "electron": { - "version": "8.3.1", - "resolved": "https://registry.npmjs.org/electron/-/electron-8.3.1.tgz", - "integrity": "sha512-VZpgLVFyD2SwFDkO9rwUcNgrAMah+g38FEtALGxli8bRVTbcHl8bt21szfa0YUWpc6hWcaf6JdZjqDS5q73Bsg==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/electron/-/electron-8.4.0.tgz", + "integrity": "sha512-SpgyccM5rjDJSGcpQjiviUBT44fZlSyhcjy8RpKSnAad+co4xY1vYj6T25U1CfSk0PH/dhvcp63P2sdXHCwq/Q==", "dev": true, "requires": { "@electron/get": "^1.0.1", @@ -3554,13 +3437,13 @@ } }, "electron-notarize": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/electron-notarize/-/electron-notarize-0.1.1.tgz", - "integrity": "sha512-TpKfJcz4LXl5jiGvZTs5fbEx+wUFXV5u8voeG5WCHWfY/cdgdD8lDZIZRqLVOtR3VO+drgJ9aiSHIO9TYn/fKg==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/electron-notarize/-/electron-notarize-1.0.0.tgz", + "integrity": "sha512-dsib1IAquMn0onCrNMJ6gtEIZn/azG8hZMCYOuZIMVMUeRMgBYHK1s5TK9P8xAcrAjh/2aN5WYHzgVSWX314og==", "dev": true, "requires": { "debug": "^4.1.1", - "fs-extra": "^8.0.1" + "fs-extra": "^9.0.1" }, "dependencies": { "debug": { @@ -3571,24 +3454,13 @@ "requires": { "ms": "^2.1.1" } - }, - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } } } }, "electron-osx-sign": { - "version": "0.4.16", - "resolved": "https://registry.npmjs.org/electron-osx-sign/-/electron-osx-sign-0.4.16.tgz", - "integrity": "sha512-ziMWfc3NmQlwnWLW6EaZq8nH2BWVng/atX5GWsGwhexJYpdW6hsg//MkAfRTRx1kR3Veiqkeiog1ibkbA4x0rg==", + "version": "0.4.17", + "resolved": "https://registry.npmjs.org/electron-osx-sign/-/electron-osx-sign-0.4.17.tgz", + "integrity": "sha512-wUJPmZJQCs1zgdlQgeIpRcvrf7M5/COQaOV68Va1J/SgmWx5KL2otgg+fAae7luw6qz9R8Gvu/Qpe9tAOu/3xQ==", "dev": true, "requires": { "bluebird": "^3.5.0", @@ -3617,18 +3489,19 @@ } }, "electron-packager": { - "version": "14.2.1", - "resolved": "https://registry.npmjs.org/electron-packager/-/electron-packager-14.2.1.tgz", - "integrity": "sha512-g6y3BVrAOz/iavKD+VMFbehrQcwCWuA3CZvVbmmbQuCfegGA1ytwWn0BNIDDrEdbuz31Fti7mnNHhb5L+3Wq9A==", + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/electron-packager/-/electron-packager-15.0.0.tgz", + "integrity": "sha512-J0yQP7/fKPkjxo9Yz5+vsQVig0dBbSXW8LQYA1pvNMvi+bL00hfI2SAyORP6EU7XaeiXGUIBSG2Px01EkKfGCw==", "dev": true, "requires": { "@electron/get": "^1.6.0", - "asar": "^2.0.1", - "cross-zip": "^3.0.0", + "asar": "^3.0.0", "debug": "^4.0.1", - "electron-notarize": "^0.2.0", + "electron-notarize": "^1.0.0", "electron-osx-sign": "^0.4.11", - "fs-extra": "^8.1.0", + "extract-zip": "^2.0.0", + "filenamify": "^4.1.0", + "fs-extra": "^9.0.0", "galactus": "^0.2.1", "get-package-info": "^1.0.0", "junk": "^3.1.0", @@ -3636,9 +3509,8 @@ "plist": "^3.0.0", "rcedit": "^2.0.0", "resolve": "^1.1.6", - "sanitize-filename": "^1.6.0", - "semver": "^6.0.0", - "yargs-parser": "^16.0.0" + "semver": "^7.1.3", + "yargs-parser": "^18.0.0" }, "dependencies": { "debug": { @@ -3650,37 +3522,37 @@ "ms": "^2.1.1" } }, - "electron-notarize": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/electron-notarize/-/electron-notarize-0.2.1.tgz", - "integrity": "sha512-oZ6/NhKeXmEKNROiFmRNfytqu3cxqC95sjooG7kBXQVEUSQkZnbiAhxVh5jXngL881G197pbwpeVPJyM7Ikmxw==", + "extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", "dev": true, "requires": { + "@types/yauzl": "^2.9.1", "debug": "^4.1.1", - "fs-extra": "^8.1.0" + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" } }, - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "get-stream": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", + "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", "dev": true, "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" + "pump": "^3.0.0" } }, "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", "dev": true }, "yargs-parser": { - "version": "16.1.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-16.1.0.tgz", - "integrity": "sha512-H/V41UNZQPkUMIT5h5hiwg4QKIY1RPvoBV4XcjUbRM8Bk2oKqqyZ0DIEbTFZB0XjbtSPG8SAa/0DxCQmiRgzKg==", + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", "dev": true, "requires": { "camelcase": "^5.0.0", @@ -3845,9 +3717,9 @@ } }, "electron-winstaller": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/electron-winstaller/-/electron-winstaller-4.0.0.tgz", - "integrity": "sha512-Rq5YUQ/zBiGiDW3ezVaRigF3QbohVjDtfcpZpzmhJxX/1jndc96OQJw2x1HulHmhPV7n9R4WEsMkzkHObufU9g==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/electron-winstaller/-/electron-winstaller-4.0.1.tgz", + "integrity": "sha512-wgdABzcMFpREjFCHZKQ5g5JF5jGqa8YCAsVD5Tb3sJhdj63AtuCu/2o++nVESlZZugKDv6Hxo6Wi8c3knEkbgA==", "dev": true, "optional": true, "requires": { @@ -3858,6 +3730,30 @@ "temp": "^0.9.0" }, "dependencies": { + "asar": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/asar/-/asar-2.1.0.tgz", + "integrity": "sha512-d2Ovma+bfqNpvBzY/KU8oPY67ZworixTpkjSx0PCXnQi67c2cXmssaTxpFDUM0ttopXoGx/KRxNg/GDThYbXQA==", + "dev": true, + "optional": true, + "requires": { + "@types/glob": "^7.1.1", + "chromium-pickle-js": "^0.2.0", + "commander": "^2.20.0", + "cuint": "^0.2.2", + "glob": "^7.1.3", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "tmp-promise": "^1.0.5" + } + }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "optional": true + }, "debug": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", @@ -3947,6 +3843,23 @@ } } }, + "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" + }, + "dependencies": { + "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 + } + } + }, "env-paths": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.0.tgz", @@ -4021,9 +3934,9 @@ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, "escodegen": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.1.tgz", - "integrity": "sha512-Bmt7NcRySdIfNPfU2ZoXDrrXsG9ZjvDxcAlMfDUgRBjLOWTuIACXPBFJH7Z+cLb40JeQco5toikyc9t9P8E9SQ==", + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", "requires": { "esprima": "^4.0.1", "estraverse": "^4.2.0", @@ -4033,22 +3946,23 @@ } }, "eslint": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", - "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.5.0.tgz", + "integrity": "sha512-vlUP10xse9sWt9SGRtcr1LAC67BENcQMFeV+w5EvLEoFe3xJ8cF1Skd0msziRx/VMC+72B4DxreCE+OR12OA6Q==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", "ajv": "^6.10.0", - "chalk": "^2.1.0", - "cross-spawn": "^6.0.5", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", "debug": "^4.0.1", "doctrine": "^3.0.0", - "eslint-scope": "^5.0.0", - "eslint-utils": "^1.4.3", - "eslint-visitor-keys": "^1.1.0", - "espree": "^6.1.2", - "esquery": "^1.0.1", + "enquirer": "^2.3.5", + "eslint-scope": "^5.1.0", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^1.3.0", + "espree": "^7.2.0", + "esquery": "^1.2.0", "esutils": "^2.0.2", "file-entry-cache": "^5.0.1", "functional-red-black-tree": "^1.0.1", @@ -4057,53 +3971,65 @@ "ignore": "^4.0.6", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", - "inquirer": "^7.0.0", "is-glob": "^4.0.0", "js-yaml": "^3.13.1", "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.3.0", - "lodash": "^4.17.14", + "levn": "^0.4.1", + "lodash": "^4.17.19", "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", "natural-compare": "^1.4.0", - "optionator": "^0.8.3", + "optionator": "^0.9.1", "progress": "^2.0.0", - "regexpp": "^2.0.1", - "semver": "^6.1.2", - "strip-ansi": "^5.2.0", - "strip-json-comments": "^3.0.1", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", "table": "^5.2.3", "text-table": "^0.2.0", "v8-compile-cache": "^2.0.3" }, "dependencies": { "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", "dev": true }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", "dev": true, "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" } }, + "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" + } + }, + "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 + }, "debug": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", @@ -4114,40 +4040,88 @@ } }, "globals": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-12.3.0.tgz", - "integrity": "sha512-wAfjdLgFsPZsklLJvOBUBmzYE8/CwhEqSBEMRXA3qxIiNtyqvjYurAtIfDh6chlEPUfmTY3MnZh5Hfh4q0UlIw==", + "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" } }, - "regexpp": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", - "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", + "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 + }, + "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" + } + }, + "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" + } + }, + "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 }, "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", "dev": true }, "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "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": "^4.1.0" + "ansi-regex": "^5.0.0" } }, "strip-json-comments": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", - "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "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" + } } } }, @@ -4169,9 +4143,9 @@ } }, "eslint-import-resolver-node": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.3.tgz", - "integrity": "sha512-b8crLDo0M5RSe5YG8Pu2DYBj71tSB6OvXkfzwbJU2w7y8P4/yo0MyF8jU26IEuEuHF2K5/gcAJE3LhQGqBBbVg==", + "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", @@ -4194,9 +4168,9 @@ "dev": true }, "resolve": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", - "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", "dev": true, "requires": { "path-parse": "^1.0.6" @@ -4284,23 +4258,24 @@ } }, "eslint-plugin-import": { - "version": "2.20.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.20.2.tgz", - "integrity": "sha512-FObidqpXrR8OnCh4iNsxy+WACztJLXAHBO5hK79T1Hc77PgQZkyDGA5Ag9xAvRpglvLNxhH/zSmZ70/pZ31dHg==", + "version": "2.22.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.22.0.tgz", + "integrity": "sha512-66Fpf1Ln6aIS5Gr/55ts19eUuoDhAbZgnr6UxK5hbDx6l/QgQgx61AePq+BV4PP2uXQFClgMVzep5zZ94qqsxg==", "dev": true, "requires": { - "array-includes": "^3.0.3", - "array.prototype.flat": "^1.2.1", + "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.2", - "eslint-module-utils": "^2.4.1", + "eslint-import-resolver-node": "^0.3.3", + "eslint-module-utils": "^2.6.0", "has": "^1.0.3", "minimatch": "^3.0.4", - "object.values": "^1.1.0", + "object.values": "^1.1.1", "read-pkg-up": "^2.0.0", - "resolve": "^1.12.0" + "resolve": "^1.17.0", + "tsconfig-paths": "^3.9.0" }, "dependencies": { "debug": { @@ -4329,9 +4304,9 @@ "dev": true }, "resolve": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", - "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", "dev": true, "requires": { "path-parse": "^1.0.6" @@ -4340,9 +4315,9 @@ } }, "eslint-scope": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", - "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.0.tgz", + "integrity": "sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w==", "dev": true, "requires": { "esrecurse": "^4.1.0", @@ -4350,29 +4325,37 @@ } }, "eslint-utils": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", - "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", + "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" } }, "eslint-visitor-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", - "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", "dev": true }, "espree": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.0.tgz", - "integrity": "sha512-Xs8airJ7RQolnDIbLtRutmfvSsAe0xqMMAantCN/GMoqf81TFbeI1T7Jpd56qYu1uuh32dOG5W/X9uO+ghPXzA==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.2.0.tgz", + "integrity": "sha512-H+cQ3+3JYRMEIOl87e7QdHX70ocly5iW4+dttuR8iYSPr/hXKFb+7dBsZ7+u1adC4VrnPlTkv0+OwuPnDop19g==", "dev": true, "requires": { - "acorn": "^7.1.0", + "acorn": "^7.3.1", "acorn-jsx": "^5.2.0", - "eslint-visitor-keys": "^1.1.0" + "eslint-visitor-keys": "^1.3.0" + }, + "dependencies": { + "acorn": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.3.1.tgz", + "integrity": "sha512-tLc0wSnatxAQHVHUapaHdz72pi9KUyHjq5KyHjGg9Y8Ifdc79pTh2XvI6I1/chZbnM7QtNKzh66ooDogPZSleA==", + "dev": true + } } }, "esprima": { @@ -4381,12 +4364,20 @@ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" }, "esquery": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.1.0.tgz", - "integrity": "sha512-MxYW9xKmROWF672KqjO75sszsA8Mxhw06YFeS5VHlB98KDHbOSurm3ArsjO60Eaf3QmGMCP1yn+0JQkNLo/97Q==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", + "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==", "dev": true, "requires": { - "estraverse": "^4.0.0" + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.1.0.tgz", + "integrity": "sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw==", + "dev": true + } } }, "esrecurse": { @@ -4548,17 +4539,6 @@ "chardet": "^0.7.0", "iconv-lite": "^0.4.24", "tmp": "^0.0.33" - }, - "dependencies": { - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "requires": { - "os-tmpdir": "~1.0.2" - } - } } }, "extglob": { @@ -4661,13 +4641,21 @@ "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" }, "fast-check": { - "version": "1.24.2", - "resolved": "https://registry.npmjs.org/fast-check/-/fast-check-1.24.2.tgz", - "integrity": "sha512-ZL48cyZZLJnVsUj127Zi1mfFLM98yzw0LlSSH8CMeVmpL5RCfSRcZSZZ0kJWrRK4eOgNFnXXKNDbzuRb3Vsdhg==", + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/fast-check/-/fast-check-1.26.0.tgz", + "integrity": "sha512-B1AjSfe0bmi6FdFIzmrrGSjrsF6e2MCmZiM6zJaRbBMP+gIvdNakle5FIMKi0xbS9KlN9BZho1R7oB/qoNIQuA==", "dev": true, "requires": { "pure-rand": "^2.0.0", - "tslib": "^1.10.0" + "tslib": "^2.0.0" + }, + "dependencies": { + "tslib": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.0.tgz", + "integrity": "sha512-lTqkx847PI7xEDYJntxZH89L2/aXInsyF2luSafe/+0fHOMjlBNXdH6th7f70qxLDhul7KZK0zC8V5ZIyHl0/g==", + "dev": true + } } }, "fast-deep-equal": { @@ -4701,9 +4689,9 @@ "dev": true }, "figlet": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/figlet/-/figlet-1.4.0.tgz", - "integrity": "sha512-CxxIjEKHlqGosgXaIA+sikGDdV6KZOOlzPJnYuPgQlOSHZP5h9WIghYI30fyXnwEVeSH7Hedy72gC6zJrFC+SQ==" + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/figlet/-/figlet-1.5.0.tgz", + "integrity": "sha512-ZQJM4aifMpz6H19AW1VqvZ7l4pOE9p7i/3LyxgO2kp+PO/VcDYNqIHEMtkccqIhTXMKci4kjueJr/iCQEaT/Ww==" }, "figures": { "version": "3.2.0", @@ -4730,6 +4718,23 @@ "dev": true, "optional": true }, + "filename-reserved-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz", + "integrity": "sha1-q/c9+rc10EVECr/qLZHzieu/oik=", + "dev": true + }, + "filenamify": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-4.1.0.tgz", + "integrity": "sha512-KQV/uJDI9VQgN7sHH1Zbk6+42cD6mnQ2HONzkXUfPJ+K2FC8GZ1dpewbbHw0Sz8Tf5k3EVdHVayM4DoAwWlmtg==", + "dev": true, + "requires": { + "filename-reserved-regex": "^2.0.0", + "strip-outer": "^1.0.1", + "trim-repeated": "^1.0.0" + } + }, "fill-range": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", @@ -4857,9 +4862,9 @@ } }, "flatted": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.1.tgz", - "integrity": "sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", + "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", "dev": true }, "flora-colossus": { @@ -5025,6 +5030,18 @@ "dev": true, "optional": true }, + "fstream": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", + "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", + "optional": true, + "requires": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + } + }, "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", @@ -5716,21 +5733,21 @@ "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" }, "inquirer": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.0.5.tgz", - "integrity": "sha512-6Z5cP+LAO0rzNE7xWjWtT84jxKa5ScLEGLgegPXeO3dGeU8lNe5Ii7SlXH6KVtLGlDuaEhsvsFjrjWjw8j5lFg==", + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.2.tgz", + "integrity": "sha512-DF4osh1FM6l0RJc5YWYhSDB6TawiBRlbV9Cox8MWlidU218Tb7fm3lQTULyUJDfJ0tjbzl0W4q651mrCCEM55w==", "dev": true, "requires": { "ansi-escapes": "^4.2.1", - "chalk": "^3.0.0", + "chalk": "^4.1.0", "cli-cursor": "^3.1.0", - "cli-width": "^2.0.0", + "cli-width": "^3.0.0", "external-editor": "^3.0.3", "figures": "^3.0.0", - "lodash": "^4.17.15", + "lodash": "^4.17.16", "mute-stream": "0.0.8", "run-async": "^2.4.0", - "rxjs": "^6.5.3", + "rxjs": "^6.6.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0", "through": "^2.3.6" @@ -5753,9 +5770,9 @@ } }, "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "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", @@ -5771,6 +5788,12 @@ "restore-cursor": "^3.1.0" } }, + "cli-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "dev": true + }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -5829,13 +5852,13 @@ "signal-exit": "^3.0.2" } }, - "run-async": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.0.tgz", - "integrity": "sha512-xJTbh/d7Lm7SBhc1tNvTpeCHaEzoyxPrqNlvSdMfBTYwaY++UJFyXUOxAtsRUXjlqOfj8luNaR9vjCh4KeV+pg==", + "rxjs": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.0.tgz", + "integrity": "sha512-3HMA8z/Oz61DUHe+SdOiQyzIf4tOx5oQHmMir7IZEu6TMqCLHT4LRcmNaUS0NwOz8VLvmmBduMsoaUvMaIiqzg==", "dev": true, "requires": { - "is-promise": "^2.1.0" + "tslib": "^1.9.0" } }, "string-width": { @@ -5870,9 +5893,9 @@ } }, "interpret": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", - "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", "dev": true }, "inversify": { @@ -5880,12 +5903,6 @@ "resolved": "https://registry.npmjs.org/inversify/-/inversify-5.0.1.tgz", "integrity": "sha512-Ieh06s48WnEYGcqHepdsJUIJUXpwH5o5vodAX+DK2JA/gjy4EbEcQZxw+uFfzysmKjiLXGYwNG3qDZsKVMcINQ==" }, - "invert-kv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", - "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", - "dev": true - }, "ip-regex": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", @@ -6146,8 +6163,7 @@ "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" }, "isobject": { "version": "3.0.1", @@ -6315,9 +6331,9 @@ "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" }, "jsdom": { - "version": "16.2.2", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.2.2.tgz", - "integrity": "sha512-pDFQbcYtKBHxRaP55zGXCJWgFHkDAYbKcsXEK/3Icu9nKYZkutUXfLBwbD+09XDutkYSHcgfQLZ0qvpAAm9mvg==", + "version": "16.3.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.3.0.tgz", + "integrity": "sha512-zggeX5UuEknpdZzv15+MS1dPYG0J/TftiiNunOeNxSl3qr8Z6cIlQpN0IdJa44z9aFxZRIVqRncvEhQ7X5DtZg==", "requires": { "abab": "^2.0.3", "acorn": "^7.1.1", @@ -6339,7 +6355,7 @@ "tough-cookie": "^3.0.1", "w3c-hr-time": "^1.0.2", "w3c-xmlserializer": "^2.0.0", - "webidl-conversions": "^6.0.0", + "webidl-conversions": "^6.1.0", "whatwg-encoding": "^1.0.5", "whatwg-mimetype": "^2.3.0", "whatwg-url": "^8.0.0", @@ -6347,11 +6363,6 @@ "xml-name-validator": "^3.0.0" }, "dependencies": { - "acorn": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", - "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==" - }, "request": { "version": "2.88.2", "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", @@ -6509,15 +6520,6 @@ "readable-stream": "^2.0.5" } }, - "lcid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", - "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", - "dev": true, - "requires": { - "invert-kv": "^2.0.0" - } - }, "levn": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", @@ -6572,9 +6574,10 @@ } }, "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" + "version": "4.17.19", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", + "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==", + "dev": true }, "lodash._reinterpolate": { "version": "3.0.0", @@ -6650,9 +6653,9 @@ } }, "chalk": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.0.0.tgz", - "integrity": "sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A==", + "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", @@ -7321,7 +7324,9 @@ "nan": { "version": "2.14.0", "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", - "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==" + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", + "dev": true, + "optional": true }, "nanomatch": { "version": "1.2.13", @@ -7415,6 +7420,11 @@ "semver": "^5.4.1" } }, + "node-addon-api": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.0.tgz", + "integrity": "sha512-ASCL5U13as7HhOExbT6OlWJJUV/lLzL2voOSP1UVehpRD8FbSrSDjfScK/KwAvVTI5AS6r4VwbOMlIqtvRidnA==" + }, "node-environment-flags": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.6.tgz", @@ -7991,9 +8001,9 @@ } }, "open": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/open/-/open-7.0.4.tgz", - "integrity": "sha512-brSA+/yq+b08Hsr4c8fsEW2CRzk1BmfN3SAK/5VCHQ9bdoZJ4qa/+AfR0xHjlbbZUyPkUHs1b8x1RqdyZdkVqQ==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/open/-/open-7.1.0.tgz", + "integrity": "sha512-lLPI5KgOwEYCDKXf4np7y1PBEkj7HYIyP2DY8mVDRnx0VIIu6bNrRB0R66TuO7Mack6EnTNLm4uvcl1UoklTpA==", "dev": true, "requires": { "is-docker": "^2.0.0", @@ -8044,9 +8054,9 @@ } }, "ora": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/ora/-/ora-4.0.4.tgz", - "integrity": "sha512-77iGeVU1cIdRhgFzCK8aw1fbtT1B/iZAvWjS+l/o1x0RShMgxHUZaD2yDpWsNCPwXg9z1ZA78Kbdvr8kBmG/Ww==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/ora/-/ora-4.0.5.tgz", + "integrity": "sha512-jCDgm9DqvRcNIAEv2wZPrh7E5PcQiDUnbnWbAfu4NGAE2ZNqPFbDixmWldy1YG2QfLeQhuiu6/h5VRrk6cG50w==", "dev": true, "requires": { "chalk": "^3.0.0", @@ -8232,17 +8242,6 @@ "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" }, - "os-locale": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", - "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", - "dev": true, - "requires": { - "execa": "^1.0.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" - } - }, "os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", @@ -8597,9 +8596,9 @@ } }, "pretty-ms": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-6.0.1.tgz", - "integrity": "sha512-ke4njoVmlotekHlHyCZ3wI/c5AMT8peuHs8rKJqekj/oR5G8lND2dVpicFlUz5cbZgE290vvkMuDwfj/OcW1kw==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-7.0.0.tgz", + "integrity": "sha512-J3aPWiC5e9ZeZFuSeBraGxSkGMOvulSWsxDByOcbD1Pr75YL3LSNIKIb52WXbCLE1sS5s4inBBbryjF4Y05Ceg==", "dev": true, "requires": { "parse-ms": "^2.1.0" @@ -8961,7 +8960,6 @@ "version": "2.88.0", "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", - "dev": true, "requires": { "aws-sign2": "~0.7.0", "aws4": "^1.8.0", @@ -8988,14 +8986,12 @@ "punycode": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" }, "tough-cookie": { "version": "2.4.3", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", - "dev": true, "requires": { "psl": "^1.1.24", "punycode": "^1.4.1" @@ -9004,25 +9000,31 @@ "uuid": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "dev": true + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" } } }, "request-promise-core": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.3.tgz", - "integrity": "sha512-QIs2+ArIGQVp5ZYbWD5ZLCY29D5CfWizP8eWnm8FoGD1TX61veauETVQbrV60662V0oFBkrDOuaBI8XgtuyYAQ==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", + "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", "requires": { - "lodash": "^4.17.15" + "lodash": "^4.17.19" + }, + "dependencies": { + "lodash": { + "version": "4.17.19", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", + "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==" + } } }, "request-promise-native": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.8.tgz", - "integrity": "sha512-dapwLGqkHtwL5AEbfenuzjTYg35Jd6KPytsC2/TLkVMz8rm+tNt72MGUWT1RP/aYawMpN6HqbNGBQaRcBtjQMQ==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz", + "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", "requires": { - "request-promise-core": "1.1.3", + "request-promise-core": "1.1.4", "stealthy-require": "^1.1.1", "tough-cookie": "^2.3.3" }, @@ -9131,9 +9133,9 @@ "dev": true }, "rewiremock": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/rewiremock/-/rewiremock-3.14.2.tgz", - "integrity": "sha512-oNdLZhl9wcs1PRI/tukZCgNkKSyC8y74a0WBC2w0eRfB1kSh16ckAxtqYh8LeZBogXZQhLA4qHFa8uq5/8wK9w==", + "version": "3.14.3", + "resolved": "https://registry.npmjs.org/rewiremock/-/rewiremock-3.14.3.tgz", + "integrity": "sha512-6BaUGfp7NtxBjisxcGN73nNiA2fS2AwhEk/9DMUqxfv5v0aDM1wpOYpj5GSArqsJi07YCfLhkD8C74LAN7+FkQ==", "dev": true, "requires": { "babel-runtime": "^6.26.0", @@ -9270,9 +9272,9 @@ "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" }, "saxes": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.0.tgz", - "integrity": "sha512-LXTZygxhf8lfwKaTP/8N9CsVdjTlea3teze4lL6u37ivbgGbV0GGMuNtS/I9rnD/HC2/txUM7Df4S2LVl1qhiA==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", "requires": { "xmlchars": "^2.2.0" } @@ -9777,12 +9779,61 @@ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" }, "sqlite3": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-4.2.0.tgz", - "integrity": "sha512-roEOz41hxui2Q7uYnWsjMOTry6TcNUNmp8audCx18gF10P2NknwdpF+E+HKvz/F2NvPKGGBF4NGc+ZPQ+AABwg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-5.0.0.tgz", + "integrity": "sha512-rjvqHFUaSGnzxDy2AHCwhHy6Zp6MNJzCPGYju4kD8yi6bze4d1/zMTg6C7JI49b7/EM7jKMTvyfN/4ylBKdwfw==", "requires": { - "nan": "^2.12.1", + "node-addon-api": "2.0.0", + "node-gyp": "3.x", "node-pre-gyp": "^0.11.0" + }, + "dependencies": { + "node-gyp": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz", + "integrity": "sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==", + "optional": true, + "requires": { + "fstream": "^1.0.0", + "glob": "^7.0.3", + "graceful-fs": "^4.1.2", + "mkdirp": "^0.5.0", + "nopt": "2 || 3", + "npmlog": "0 || 1 || 2 || 3 || 4", + "osenv": "0", + "request": "^2.87.0", + "rimraf": "2", + "semver": "~5.3.0", + "tar": "^2.0.0", + "which": "1" + } + }, + "nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "optional": true, + "requires": { + "abbrev": "1" + } + }, + "semver": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", + "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", + "optional": true + }, + "tar": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.2.tgz", + "integrity": "sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==", + "optional": true, + "requires": { + "block-stream": "*", + "fstream": "^1.0.12", + "inherits": "2" + } + } } }, "sshpk": { @@ -9984,6 +10035,15 @@ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" }, + "strip-outer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz", + "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.2" + } + }, "sudo-prompt": { "version": "9.2.1", "resolved": "https://registry.npmjs.org/sudo-prompt/-/sudo-prompt-9.2.1.tgz", @@ -10019,9 +10079,9 @@ } }, "svelte": { - "version": "3.23.0", - "resolved": "https://registry.npmjs.org/svelte/-/svelte-3.23.0.tgz", - "integrity": "sha512-cnyd96bK/Nw5DnYuB1hzm5cl6+I1fpmdKOteA7KLzU9KGLsLmvWsSkSKbcntzODCLmSySN3HjcgTHRo6/rJNTw==", + "version": "3.24.0", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-3.24.0.tgz", + "integrity": "sha512-VFXom6EP2DK83kxy4ZlBbaZklSbZIrpNH3oNXlPYHJUuW4q1OuAr3ZoYbfIVTVYPDgrI7Yq0gQcOhDlAtO4qfw==", "dev": true }, "svelte-dev-helper": { @@ -10263,9 +10323,9 @@ "dev": true }, "thenify": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.0.tgz", - "integrity": "sha1-5p44obq+lpsBCCB5eLn2K4hgSDk=", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", "requires": { "any-promise": "^1.0.0" } @@ -10336,12 +10396,12 @@ } }, "tmp": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.1.0.tgz", - "integrity": "sha512-J7Z2K08jbGcdA1kkQpJSqLF6T0tdQqpR2pnSUXsIchbPdTI9v3e85cLW0d6WDhwuAleOV71j2xWs8qMPfK7nKw==", + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", "dev": true, "requires": { - "rimraf": "^2.6.3" + "os-tmpdir": "~1.0.2" } }, "tmp-promise": { @@ -10349,9 +10409,22 @@ "resolved": "https://registry.npmjs.org/tmp-promise/-/tmp-promise-1.1.0.tgz", "integrity": "sha512-8+Ah9aB1IRXCnIOxXZ0uFozV1nMU5xiu7hhFVUSxZ3bYu+psD4TzagCzVbexUCgNNGJnsmNDQlS4nG3mTyoNkw==", "dev": true, + "optional": true, "requires": { "bluebird": "^3.5.0", "tmp": "0.1.0" + }, + "dependencies": { + "tmp": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.1.0.tgz", + "integrity": "sha512-J7Z2K08jbGcdA1kkQpJSqLF6T0tdQqpR2pnSUXsIchbPdTI9v3e85cLW0d6WDhwuAleOV71j2xWs8qMPfK7nKw==", + "dev": true, + "optional": true, + "requires": { + "rimraf": "^2.6.3" + } + } } }, "to-arraybuffer": { @@ -10450,6 +10523,15 @@ "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", "dev": true }, + "trim-repeated": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz", + "integrity": "sha1-42RqLqTokTEr9+rObPsFOAvAHCE=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.2" + } + }, "truncate-utf8-bytes": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", @@ -10523,6 +10605,18 @@ } } }, + "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.10.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", @@ -10636,9 +10730,9 @@ } }, "typescript": { - "version": "3.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.5.tgz", - "integrity": "sha512-hSAifV3k+i6lEoCJ2k6R2Z/rp/H3+8sdmcn5NrS3/3kE7+RyZXm9aqvxWqjEXHAd8b0pShatpcdMTvEdvAJltQ==", + "version": "3.9.7", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.7.tgz", + "integrity": "sha512-BLbiRkiBzAwsjut4x/dsibSTB6yWpwT5qWmC2OfuCg3GgVQCSgMs4vEctYPhsaGtd0AeuuHMkjZ2h2WG8MSzRw==", "dev": true }, "uglify-js": { @@ -10834,9 +10928,9 @@ "integrity": "sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==" }, "v8-compile-cache": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz", - "integrity": "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz", + "integrity": "sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ==", "dev": true }, "validate-npm-package-license": { @@ -11708,9 +11802,9 @@ } }, "webidl-conversions": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.0.0.tgz", - "integrity": "sha512-jTZAeJnc6D+yAOjygbJOs33kVQIk5H6fj9SFDOhIKjsf9HiAzL/c+tAJsc8ASWafvhNkH+wJZms47pmajkhatA==" + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==" }, "webpack": { "version": "4.43.0", @@ -11771,22 +11865,22 @@ } }, "webpack-cli": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.11.tgz", - "integrity": "sha512-dXlfuml7xvAFwYUPsrtQAA9e4DOe58gnzSxhgrO/ZM/gyXTBowrsYeubyN4mqGhYdpXMFNyQ6emjJS9M7OBd4g==", + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.12.tgz", + "integrity": "sha512-NVWBaz9k839ZH/sinurM+HcDvJOTXwSjYp1ku+5XKeOC03z8v5QitnK/x+lAxGXFyhdayoIf/GOpv85z3/xPag==", "dev": true, "requires": { - "chalk": "2.4.2", - "cross-spawn": "6.0.5", - "enhanced-resolve": "4.1.0", - "findup-sync": "3.0.0", - "global-modules": "2.0.0", - "import-local": "2.0.0", - "interpret": "1.2.0", - "loader-utils": "1.2.3", - "supports-color": "6.1.0", - "v8-compile-cache": "2.0.3", - "yargs": "13.2.4" + "chalk": "^2.4.2", + "cross-spawn": "^6.0.5", + "enhanced-resolve": "^4.1.1", + "findup-sync": "^3.0.0", + "global-modules": "^2.0.0", + "import-local": "^2.0.0", + "interpret": "^1.4.0", + "loader-utils": "^1.4.0", + "supports-color": "^6.1.0", + "v8-compile-cache": "^2.1.1", + "yargs": "^13.3.2" }, "dependencies": { "ansi-regex": { @@ -11808,16 +11902,11 @@ "which": "^1.2.9" } }, - "enhanced-resolve": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz", - "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.4.0", - "tapable": "^1.0.0" - } + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true }, "find-up": { "version": "3.0.0", @@ -11854,6 +11943,17 @@ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", "dev": true }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, "string-width": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", @@ -11883,29 +11983,32 @@ "has-flag": "^3.0.0" } }, - "v8-compile-cache": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.0.3.tgz", - "integrity": "sha512-CNmdbwQMBjwr9Gsmohvm0pbL954tJrNzf6gWL3K+QMQf00PF7ERGrEiLgjuU3mKreLC2MeGhUsNV9ybTbLgd3w==", - "dev": true - }, "yargs": { - "version": "13.2.4", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.2.4.tgz", - "integrity": "sha512-HG/DWAJa1PAnHT9JAhNa8AbAv3FPaiLzioSjCcmuXXhP8MlpHO5vwls4g4j6n30Z74GVQj8Xa62dWVx1QCGklg==", + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", "dev": true, "requires": { "cliui": "^5.0.0", "find-up": "^3.0.0", "get-caller-file": "^2.0.1", - "os-locale": "^3.1.0", "require-directory": "^2.1.1", "require-main-filename": "^2.0.0", "set-blocking": "^2.0.0", "string-width": "^3.0.0", "which-module": "^2.0.0", "y18n": "^4.0.0", - "yargs-parser": "^13.1.0" + "yargs-parser": "^13.1.2" + } + }, + "yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" } } } @@ -11940,12 +12043,12 @@ "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==" }, "whatwg-url": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.0.0.tgz", - "integrity": "sha512-41ou2Dugpij8/LPO5Pq64K5q++MnRCBpEHvQr26/mArEKTkCV5aoXIqyhuYtE0pkqScXwhf2JP57rkRTYM29lQ==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.1.0.tgz", + "integrity": "sha512-vEIkwNi9Hqt4TV9RdnaBPNt+E2Sgmo3gePebCRgZ1R7g6d23+53zCTnuB0amKI4AXq6VM8jj2DUAa0S1vjJxkw==", "requires": { "lodash.sortby": "^4.7.0", - "tr46": "^2.0.0", + "tr46": "^2.0.2", "webidl-conversions": "^5.0.0" }, "dependencies": { @@ -11960,7 +12063,6 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, "requires": { "isexe": "^2.0.0" } @@ -12086,9 +12188,9 @@ } }, "ws": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.2.3.tgz", - "integrity": "sha512-HTDl9G9hbkNDk98naoR/cHDws7+EyYMOdL1BmjsZXRUjf7d+MficC4B7HLUPlSiho0vg+CWKrGIt/VJBd1xunQ==" + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.1.tgz", + "integrity": "sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA==" }, "xml-name-validator": { "version": "3.0.0", diff --git a/package.json b/package.json index 66f45d2..5c81e76 100644 --- a/package.json +++ b/package.json @@ -52,50 +52,50 @@ "minimist": "^1.2.5", "node-fetch": "^2.6.0", "reflect-metadata": "^0.1.13", - "sqlite3": "^4.2.0", + "sqlite3": "^5.0.0", "typeorm": "^0.2.25", "uuid": "^7.0.3" }, "devDependencies": { - "@electron-forge/cli": "^6.0.0-beta.51", - "@electron-forge/maker-squirrel": "^6.0.0-beta.51", + "@electron-forge/cli": "^6.0.0-beta.52", + "@electron-forge/maker-squirrel": "^6.0.0-beta.52", "@types/chai": "^4.2.11", "@types/fs-extra": "^9.0.1", "@types/jsdom": "^16.2.3", "@types/minimist": "^1.2.0", "@types/mocha": "^7.0.2", - "@types/node": "^12.12.44", + "@types/node": "^12.12.51", "@types/node-fetch": "^2.5.7", "@types/sinon": "^9.0.4", "@types/uuid": "^7.0.4", - "@types/webpack": "^4.41.17", - "@typescript-eslint/eslint-plugin": "^2.34.0", - "@typescript-eslint/parser": "^2.34.0", + "@types/webpack": "^4.41.21", + "@typescript-eslint/eslint-plugin": "^3.7.0", + "@typescript-eslint/parser": "^3.7.0", "chai": "^4.2.0", - "chokidar": "^3.4.0", + "chokidar": "^3.4.1", "concurrently": "^5.2.0", - "electron": "^8.3.1", + "electron": "^8.4.0", "electron-rebuild": "^1.11.0", - "eslint": "^6.8.0", + "eslint": "^7.5.0", "eslint-config-prettier": "^6.11.0", - "eslint-plugin-import": "^2.20.2", - "fast-check": "^1.24.2", + "eslint-plugin-import": "^2.22.0", + "fast-check": "^1.26.0", "handlebars": "^4.7.6", "husky": "^4.2.5", - "lodash": "^4.17.15", + "lodash": "^4.17.19", "mocha": "^7.2.0", "nock": "^12.0.3", "nyc": "^15.1.0", "prettier": "^2.0.5", - "rewiremock": "^3.14.2", + "rewiremock": "^3.14.3", "sinon": "^9.0.2", "spectron": "^10.0.1", - "svelte": "^3.23.0", + "svelte": "^3.24.0", "svelte-loader": "^2.13.6", "ts-loader": "^7.0.5", - "typescript": "^3.9.5", + "typescript": "^3.9.7", "webpack": "^4.43.0", - "webpack-cli": "^3.3.11" + "webpack-cli": "^3.3.12" }, "repository": "https://git.fuwafuwa.moe/Xymorot/RenaiApp", "bugs": "https://git.fuwafuwa.moe/Xymorot/RenaiApp/issues", diff --git a/src/main.spec.ts b/src/main.spec.ts index 12740aa..05047cf 100644 --- a/src/main.spec.ts +++ b/src/main.spec.ts @@ -1,5 +1,6 @@ import * as electron from 'electron'; import { expect } from 'chai'; +import { Context } from 'mocha'; import rewiremock from 'rewiremock'; import 'mocha'; @@ -11,23 +12,33 @@ rewiremock.disable(); describe('Application @slow', function () { this.timeout(20000); - before(function () { - this.app = new Application({ - // @ts-ignore this does give the path to electron executable (hopefully platform agnostic) - path: electron.default, + interface IApplicationContext extends Context { + app: Application; + } + + before(function (this, done): void { + const context = this as IApplicationContext; + context.app = new Application({ + // @ts-ignore this does give the path to electron executable when this script is running outside of electron (which it does in the test files) + path: ((electron as unknown) as { default: string }).default, args: [packageJson.main], }); - return this.app.start(); + context.app + .start() + .then(() => done()) + .catch((reason) => done(reason)); }); - after(function () { - if (this.app && this.app.isRunning()) { - return this.app.stop(); + after(function (this) { + const context = this as IApplicationContext; + if (context.app && context.app.isRunning()) { + return context.app.stop(); } }); - it('shows an initial window', function () { - return this.app.client.getWindowCount().then((count: number) => { + it('shows an initial window', function (this: Context) { + const context = this as IApplicationContext; + return context.app.client.getWindowCount().then((count: number) => { expect(count).to.be.gte(1); }); }); diff --git a/src/main.ts b/src/main.ts index 87a434c..43c94bd 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,9 +1,4 @@ -/* eslint-disable import/order */ -/** - * Disable Reasons - * - * import/order: this is the entry point for the application and some things have to happen before others - */ +/* eslint-disable import/order -- this is the entry point for the application and some things have to happen before others */ import { container } from './main/core/container'; import './main/core/install'; @@ -23,7 +18,8 @@ async function createWindow(): Promise { // Open the DevTools. if (isDev()) { - appWindowMain.window.webContents.openDevTools(); + // eslint-disable-next-line no-unused-expressions -- eslint can't handle optional chaining, yet + appWindowMain.window?.webContents.openDevTools(); } } diff --git a/src/main/core/container.ts b/src/main/core/container.ts index 894c4f5..3ac079b 100644 --- a/src/main/core/container.ts +++ b/src/main/core/container.ts @@ -2,17 +2,28 @@ import 'reflect-metadata'; import { Container } from 'inversify'; import { MainAppWindow } from '../modules/app-window/main-app-window'; import { NhentaiApi } from '../modules/nhentai/nhentai-api'; -import { NhentaiIpcServer } from '../modules/nhentai/nhentai-ipc-server'; +import '../modules/nhentai/nhentai-ipc-controller'; import { Session } from '../modules/session/session'; +import { Store } from '../modules/store/store'; +import { StoreMock } from '../modules/store/store.mock'; import { WebCrawler } from '../modules/web-crawler/web-crawler'; export const container = new Container({ defaultScope: 'Singleton' }); +container.bind(Symbol.for('store')).to(Store); +export function mockStore(unMock = false): void { + if (unMock) { + container.unbind(Symbol.for('store')); + container.bind(Symbol.for('store')).to(Store); + } else { + container.unbind(Symbol.for('store')); + container.bind(Symbol.for('store')).to(StoreMock); + } +} + container.bind(Symbol.for('web-crawler')).to(WebCrawler); container.bind(Symbol.for('nhentai-api')).to(NhentaiApi); -container.bind(Symbol.for('nhentai-ipc-server')).to(NhentaiIpcServer); -container.get(Symbol.for('nhentai-ipc-server')); container.bind(Symbol.for('app-window-main')).to(MainAppWindow); diff --git a/src/main/core/database.spec.ts b/src/main/core/database.spec.ts index e0efe51..43e3676 100644 --- a/src/main/core/database.spec.ts +++ b/src/main/core/database.spec.ts @@ -3,7 +3,7 @@ import '../../../mocks/electron'; import { expect } from 'chai'; import 'mocha'; -import { Databases, getConnection } from './database'; +import { Database, getConnection } from './database'; describe('Database Service', () => { before(() => { @@ -15,7 +15,7 @@ describe('Database Service', () => { }); it('returns a connection', async () => { - const libraryConnection = await getConnection(Databases.LIBRARY); + const libraryConnection = await getConnection(Database.LIBRARY); expect(libraryConnection).to.not.equal(undefined); }); }); diff --git a/src/main/core/database.ts b/src/main/core/database.ts index 503a206..476b99f 100644 --- a/src/main/core/database.ts +++ b/src/main/core/database.ts @@ -3,48 +3,49 @@ import { Connection, createConnection as ormCreateConnection } from 'typeorm'; import { SqliteConnectionOptions } from 'typeorm/driver/sqlite/SqliteConnectionOptions'; import { appPath } from './app-path'; -export enum Databases { +export enum Database { LIBRARY = 'library', STORE = 'store', } -type MyConnectionOptions = { [key in Databases]?: SqliteConnectionOptions }; +type MyConnectionOptions = { [key in Database]: SqliteConnectionOptions }; const databaseDir = path.resolve(appPath, 'database'); -const connectionOptions: MyConnectionOptions = Object.values(Databases).reduce( - (prev: MyConnectionOptions, database: Databases) => { - prev[database] = { - name: database, - type: 'sqlite', - database: path.resolve(databaseDir, `${database}.db`), - cache: true, - entities: [`./src/main/entities/${database}/*.js`], - migrations: [`./src/main/migrations/${database}/*.js`], - cli: { - migrationsDir: `./src/main/migrations/${database}`, - }, - }; - return prev; - }, - {} -); -const connections: { - [key in Databases]?: Connection; -} = {}; - -function createConnection(database: Databases): Promise { - return ormCreateConnection(connectionOptions[database]) - .then((connection: Connection) => { - connections[database] = connection; - return connection.runMigrations(); - }) - .then(() => connections[database]); +function getConnectionOptionsFor(database: Database): SqliteConnectionOptions { + return { + name: database, + type: 'sqlite', + database: path.resolve(databaseDir, `${database}.db`), + cache: true, + entities: [`./src/main/entities/${database}/*.js`], + migrations: [`./src/main/migrations/${database}/*.js`], + cli: { + migrationsDir: `./src/main/migrations/${database}`, + }, + }; } -export function getConnection(database: Databases): Promise { - if (connections[database] === undefined) { - return createConnection(database); - } +const connectionOptions: MyConnectionOptions = { + [Database.LIBRARY]: getConnectionOptionsFor(Database.LIBRARY), + [Database.STORE]: getConnectionOptionsFor(Database.STORE), +}; + +function createConnection(database: Database): Promise { + let connection: Connection; + return ormCreateConnection(connectionOptions[database]) + .then((c) => { + connection = c; + return c.runMigrations(); + }) + .then(() => connection); +} + +const connections = { + [Database.LIBRARY]: createConnection(Database.LIBRARY), + [Database.STORE]: createConnection(Database.STORE), +}; + +export function getConnection(database: Database): Promise { return Promise.resolve(connections[database]); } diff --git a/src/main/core/error.ts b/src/main/core/error.ts deleted file mode 100644 index bf66e3b..0000000 --- a/src/main/core/error.ts +++ /dev/null @@ -1,19 +0,0 @@ -export const enum Errors { - ENOLOGIN = 'ENOLOGIN', - ELOGINFAIL = 'ELOGINFAIL', - EINITFAIL = 'EINITFAIL', - ECOOKIESAVEFAIL = 'ECOOKIESAVEFAIL', -} - -const messages = { - [Errors.ENOLOGIN]: 'no login form found', - [Errors.ELOGINFAIL]: 'login failed', - [Errors.EINITFAIL]: 'initialization failed', - [Errors.ECOOKIESAVEFAIL]: 'failed to save cookies', -}; - -export class RenaiError extends Error { - public constructor(eno: Errors, msg: string = '') { - super(`${messages[eno]}.${msg ? ` ${msg}` : ''}`); - } -} diff --git a/src/main/entities/decorators/percent-check.ts b/src/main/entities/decorators/percent-check.ts index 21560bc..3bfb05f 100644 --- a/src/main/entities/decorators/percent-check.ts +++ b/src/main/entities/decorators/percent-check.ts @@ -6,6 +6,7 @@ export const maxValue = Number.MAX_SAFE_INTEGER; /** * @param column the column which needs to be checked */ +// eslint-disable-next-line @typescript-eslint/ban-types -- the type would be "(classOrObject: object, propertyName: string) => object" but typeorm does not provide it export function PercentCheck(column: string): Function { return Check( `${column} needs to be between ${minValue} and ${maxValue}`, diff --git a/src/main/entities/library/author-name.ts b/src/main/entities/library/author-name.ts index a3f6a8b..2431649 100644 --- a/src/main/entities/library/author-name.ts +++ b/src/main/entities/library/author-name.ts @@ -4,17 +4,17 @@ import { Author } from './author'; @Entity() export class AuthorName implements IIdentifiableEntity, INameEntity { @PrimaryGeneratedColumn() - public id: number; + public id!: number; @ManyToOne(() => Author, (author: Author) => author.names, { nullable: false, onDelete: 'CASCADE', onUpdate: 'CASCADE', }) - public entity: Promise; + public entity!: Promise; @Column({ nullable: false, }) - public name: string; + public name!: string; } diff --git a/src/main/entities/library/author-role-name.ts b/src/main/entities/library/author-role-name.ts index 80f727f..3e99d4d 100644 --- a/src/main/entities/library/author-role-name.ts +++ b/src/main/entities/library/author-role-name.ts @@ -4,17 +4,17 @@ import { AuthorRole } from './author-role'; @Entity() export class AuthorRoleName implements IIdentifiableEntity, INameEntity { @PrimaryGeneratedColumn() - public id: number; + public id!: number; @ManyToOne(() => AuthorRole, (authorRole: AuthorRole) => authorRole.names, { nullable: false, onDelete: 'CASCADE', onUpdate: 'CASCADE', }) - public entity: Promise; + public entity!: Promise; @Column({ nullable: false, }) - public name: string; + public name!: string; } diff --git a/src/main/entities/library/author-role.ts b/src/main/entities/library/author-role.ts index d7b1948..6cb9520 100644 --- a/src/main/entities/library/author-role.ts +++ b/src/main/entities/library/author-role.ts @@ -9,22 +9,22 @@ import { WorkAuthor } from './work-author'; @Entity() export class AuthorRole implements IIdentifiableEntity, IMultiNamedEntity, IDescribableEntity { @PrimaryGeneratedColumn() - public id: number; + public id!: number; @Column({ nullable: false, }) - public nameCanonical: string; + public nameCanonical!: string; @OneToMany(() => AuthorRoleName, (authorRoleName: AuthorRoleName) => authorRoleName.entity) - public names: Promise; + public names!: Promise; /** * relation to the entity connecting with the author and work */ @ManyToMany(() => WorkAuthor, (workAuthor: WorkAuthor) => workAuthor.authorRoles) - public workAuthors: Promise; + public workAuthors!: Promise; @Column() - public description: string; + public description!: string; } diff --git a/src/main/entities/library/author.ts b/src/main/entities/library/author.ts index 2afc4f0..0a26df6 100644 --- a/src/main/entities/library/author.ts +++ b/src/main/entities/library/author.ts @@ -8,19 +8,19 @@ import { WorkAuthor } from './work-author'; @Entity() export class Author implements IIdentifiableEntity, IMultiNamedEntity { @PrimaryGeneratedColumn() - public id: number; + public id!: number; @Column({ nullable: false, }) - public nameCanonical: string; + public nameCanonical!: string; @OneToMany(() => AuthorName, (authorName: AuthorName) => authorName.entity) - public names: Promise; + public names!: Promise; /** * ultimately connects the author with a work and their role in that work */ @OneToMany(() => WorkAuthor, (workAuthor: WorkAuthor) => workAuthor.author) - public workAuthors: Promise; + public workAuthors!: Promise; } diff --git a/src/main/entities/library/character-tag.ts b/src/main/entities/library/character-tag.ts index efdb6d8..922c185 100644 --- a/src/main/entities/library/character-tag.ts +++ b/src/main/entities/library/character-tag.ts @@ -10,7 +10,7 @@ import { WorkCharacter } from './work-character'; @PercentCheck('weight') export class CharacterTag implements IIdentifiableEntity, IWeightedEntity { @PrimaryGeneratedColumn() - public id: number; + public id!: number; /** * the character ina work this tag describes @@ -20,7 +20,7 @@ export class CharacterTag implements IIdentifiableEntity, IWeightedEntity { onDelete: 'CASCADE', onUpdate: 'CASCADE', }) - public workCharacter: Promise; + public workCharacter!: Promise; /** * the describing tag @@ -30,8 +30,8 @@ export class CharacterTag implements IIdentifiableEntity, IWeightedEntity { onDelete: 'CASCADE', onUpdate: 'CASCADE', }) - public tag: Promise; + public tag!: Promise; @Column() - public weight: number; + public weight!: number; } diff --git a/src/main/entities/library/collection-name.ts b/src/main/entities/library/collection-name.ts index 227d6b2..fe1ea92 100644 --- a/src/main/entities/library/collection-name.ts +++ b/src/main/entities/library/collection-name.ts @@ -4,17 +4,17 @@ import { Collection } from './collection'; @Entity() export class CollectionName implements IIdentifiableEntity, INameEntity { @PrimaryGeneratedColumn() - public id: number; + public id!: number; @ManyToOne(() => Collection, (collection: Collection) => collection.names, { nullable: false, onDelete: 'CASCADE', onUpdate: 'CASCADE', }) - public entity: Promise; + public entity!: Promise; @Column({ nullable: false, }) - public name: string; + public name!: string; } diff --git a/src/main/entities/library/collection-part.ts b/src/main/entities/library/collection-part.ts index 78c0323..3125879 100644 --- a/src/main/entities/library/collection-part.ts +++ b/src/main/entities/library/collection-part.ts @@ -9,7 +9,7 @@ import { Work } from './work'; @Entity() export class CollectionPart implements IIdentifiableEntity, IOrderableEntity { @PrimaryGeneratedColumn() - public id: number; + public id!: number; /** * the collection thw work is a part of @@ -19,7 +19,7 @@ export class CollectionPart implements IIdentifiableEntity, IOrderableEntity { onDelete: 'CASCADE', onUpdate: 'CASCADE', }) - public collection: Promise; + public collection!: Promise; /** * the work inside the collection @@ -29,11 +29,11 @@ export class CollectionPart implements IIdentifiableEntity, IOrderableEntity { onDelete: 'CASCADE', onUpdate: 'CASCADE', }) - public work: Promise; + public work!: Promise; @Column({ nullable: false, default: 0, }) - public order: number; + public order!: number; } diff --git a/src/main/entities/library/collection.ts b/src/main/entities/library/collection.ts index c1196c6..5abdc34 100644 --- a/src/main/entities/library/collection.ts +++ b/src/main/entities/library/collection.ts @@ -13,17 +13,17 @@ import { CollectionPart } from './collection-part'; @Entity() export class Collection implements IIdentifiableEntity, IMultiNamedEntity { @PrimaryGeneratedColumn() - public id: number; + public id!: number; @Column() - public nameCanonical: string; + public nameCanonical!: string; @OneToMany(() => CollectionName, (collectionName: CollectionName) => collectionName.entity) - public names: Promise; + public names!: Promise; /** * the connecting entity between this collection and the work */ @OneToMany(() => CollectionPart, (collectionPart: CollectionPart) => collectionPart.collection) - public parts: Promise; + public parts!: Promise; } diff --git a/src/main/entities/library/copy.ts b/src/main/entities/library/copy.ts index 887ba88..cca08b9 100644 --- a/src/main/entities/library/copy.ts +++ b/src/main/entities/library/copy.ts @@ -11,7 +11,7 @@ import { Work } from './work'; @Entity() export class Copy implements IIdentifiableEntity { @PrimaryGeneratedColumn() - public id: number; + public id!: number; /** * the work this entity is a copy of @@ -21,14 +21,14 @@ export class Copy implements IIdentifiableEntity { onDelete: 'CASCADE', onUpdate: 'CASCADE', }) - public original: Promise; + public original!: Promise; /** * where to find this specific copy */ @ManyToMany(() => Source, (source: Source) => source.copies) @JoinTable() - public sources: Promise; + public sources!: Promise; /** * identifying hash of the file contents @@ -36,7 +36,7 @@ export class Copy implements IIdentifiableEntity { @Column({ nullable: false, }) - public hash: string; + public hash!: string; /** * device location of the copy @@ -44,7 +44,7 @@ export class Copy implements IIdentifiableEntity { @Column({ nullable: true, }) - public location: string; + public location!: string; /** * the ordering of the copies belonging to the same work, @@ -54,5 +54,5 @@ export class Copy implements IIdentifiableEntity { nullable: false, default: 0, }) - public ranking: number; + public ranking!: number; } diff --git a/src/main/entities/library/interaction-tag.ts b/src/main/entities/library/interaction-tag.ts index 89c0587..ec58d6c 100644 --- a/src/main/entities/library/interaction-tag.ts +++ b/src/main/entities/library/interaction-tag.ts @@ -10,7 +10,7 @@ import { WorkCharacter } from './work-character'; @PercentCheck('weight') export class InteractionTag implements IIdentifiableEntity, IWeightedEntity { @PrimaryGeneratedColumn() - public id: number; + public id!: number; /** * the describing tag @@ -20,20 +20,20 @@ export class InteractionTag implements IIdentifiableEntity, IWeightedEntity { onDelete: 'CASCADE', onUpdate: 'CASCADE', }) - public tag: Promise; + public tag!: Promise; /** * the actors of this interaction */ @ManyToMany(() => WorkCharacter, (workCharacter: WorkCharacter) => workCharacter.interactWith) - public subjectCharacters: Promise; + public subjectCharacters!: Promise; /** * the receivers of this interaction */ @ManyToMany(() => WorkCharacter, (workCharacter: WorkCharacter) => workCharacter.interactedBy) - public objectCharacters: Promise; + public objectCharacters!: Promise; @Column() - public weight: number; + public weight!: number; } diff --git a/src/main/entities/library/language.ts b/src/main/entities/library/language.ts index ec526f7..c9dfc85 100644 --- a/src/main/entities/library/language.ts +++ b/src/main/entities/library/language.ts @@ -10,11 +10,11 @@ export class Language { * ISO 639-1 two-letter language code */ @PrimaryColumn() - public code: string; + public code!: string; /** * the works using this language */ @ManyToMany(() => Work, (work: Work) => work.languages) - public works: Promise; + public works!: Promise; } diff --git a/src/main/entities/library/site-name.ts b/src/main/entities/library/site-name.ts index af64866..9948567 100644 --- a/src/main/entities/library/site-name.ts +++ b/src/main/entities/library/site-name.ts @@ -4,17 +4,17 @@ import { Site } from './site'; @Entity() export class SiteName implements IIdentifiableEntity, INameEntity { @PrimaryGeneratedColumn() - public id: number; + public id!: number; @ManyToOne(() => Site, (site: Site) => site.names, { nullable: false, onDelete: 'CASCADE', onUpdate: 'CASCADE', }) - public entity: Promise; + public entity!: Promise; @Column({ nullable: false, }) - public name: string; + public name!: string; } diff --git a/src/main/entities/library/site.ts b/src/main/entities/library/site.ts index f32d538..3f00616 100644 --- a/src/main/entities/library/site.ts +++ b/src/main/entities/library/site.ts @@ -8,19 +8,19 @@ import { Source } from './source'; @Entity() export class Site implements IIdentifiableEntity, IMultiNamedEntity { @PrimaryGeneratedColumn() - public id: number; + public id!: number; @Column({ nullable: false, }) - public nameCanonical: string; + public nameCanonical!: string; @OneToMany(() => SiteName, (siteName: SiteName) => siteName.entity) - public names: Promise; + public names!: Promise; /** * sources belonging to this site */ @OneToMany(() => Source, (source: Source) => source.site) - public sources: Promise; + public sources!: Promise; } diff --git a/src/main/entities/library/source.ts b/src/main/entities/library/source.ts index 85e344f..ce84b1e 100644 --- a/src/main/entities/library/source.ts +++ b/src/main/entities/library/source.ts @@ -8,7 +8,7 @@ import { Site } from './site'; @Entity() export class Source implements IIdentifiableEntity { @PrimaryGeneratedColumn() - public id: number; + public id!: number; /** * the uri to the sauce @@ -16,7 +16,7 @@ export class Source implements IIdentifiableEntity { @Column({ nullable: false, }) - public uri: string; + public uri!: string; /** * the site connected to the source @@ -26,11 +26,11 @@ export class Source implements IIdentifiableEntity { onDelete: 'RESTRICT', onUpdate: 'CASCADE', }) - public site: Promise; + public site!: Promise; /** * the copies which can be found here */ @ManyToMany(() => Copy, (copy: Copy) => copy.sources) - public copies: Promise; + public copies!: Promise; } diff --git a/src/main/entities/library/tag-name.ts b/src/main/entities/library/tag-name.ts index a7a26ac..ddb750b 100644 --- a/src/main/entities/library/tag-name.ts +++ b/src/main/entities/library/tag-name.ts @@ -4,17 +4,17 @@ import { Tag } from './tag'; @Entity() export class TagName implements IIdentifiableEntity, INameEntity { @PrimaryGeneratedColumn() - public id: number; + public id!: number; @ManyToOne(() => Tag, (tag: Tag) => tag.names, { nullable: false, onDelete: 'CASCADE', onUpdate: 'CASCADE', }) - public entity: Promise; + public entity!: Promise; @Column({ nullable: false, }) - public name: string; + public name!: string; } diff --git a/src/main/entities/library/tag.ts b/src/main/entities/library/tag.ts index 88f0e38..06ae411 100644 --- a/src/main/entities/library/tag.ts +++ b/src/main/entities/library/tag.ts @@ -13,43 +13,43 @@ import { WorkTag } from './work-tag'; @Entity() export class Tag implements IIdentifiableEntity, IMultiNamedEntity, IDescribableEntity, IHierachicalEntity { @PrimaryGeneratedColumn() - public id: number; + public id!: number; @Column({ nullable: false, }) - public nameCanonical: string; + public nameCanonical!: string; @OneToMany(() => TagName, (tagName: TagName) => tagName.entity) - public names: Promise; + public names!: Promise; /** * this tag tagging a work */ @OneToMany(() => WorkTag, (workTag: WorkTag) => workTag.tag) - public workTags: Promise; + public workTags!: Promise; /** * this tag tagging characters */ @OneToMany(() => CharacterTag, (characterTag: CharacterTag) => characterTag.tag) - public characterTags: Promise; + public characterTags!: Promise; /** * this tag tagging a character interaction */ @OneToMany(() => InteractionTag, (interactionTag: InteractionTag) => interactionTag.tag) - public interactionTags: Promise; + public interactionTags!: Promise; @ManyToMany(() => Tag, (tag: Tag) => tag.children) @JoinTable() - public parents: Promise; + public parents!: Promise; @ManyToMany(() => Tag, (tag: Tag) => tag.parents) - public children: Promise; + public children!: Promise; @Column({ nullable: true, }) - public description: string; + public description!: string; } diff --git a/src/main/entities/library/transformation-type-name.ts b/src/main/entities/library/transformation-type-name.ts index 970453a..fc0d34c 100644 --- a/src/main/entities/library/transformation-type-name.ts +++ b/src/main/entities/library/transformation-type-name.ts @@ -4,17 +4,17 @@ import { TransformationType } from './transformation-type'; @Entity() export class TransformationTypeName implements IIdentifiableEntity, INameEntity { @PrimaryGeneratedColumn() - public id: number; + public id!: number; @ManyToOne(() => TransformationType, (transformationType: TransformationType) => transformationType.names, { nullable: false, onDelete: 'CASCADE', onUpdate: 'CASCADE', }) - public entity: Promise; + public entity!: Promise; @Column({ nullable: false, }) - public name: string; + public name!: string; } diff --git a/src/main/entities/library/transformation-type.ts b/src/main/entities/library/transformation-type.ts index 3a850f3..cb4819b 100644 --- a/src/main/entities/library/transformation-type.ts +++ b/src/main/entities/library/transformation-type.ts @@ -9,29 +9,29 @@ import { TransformationTypeName } from './transformation-type-name'; @Entity() export class TransformationType implements IIdentifiableEntity, IMultiNamedEntity, IDescribableEntity { @PrimaryGeneratedColumn() - public id: number; + public id!: number; @Column({ nullable: false, }) - public nameCanonical: string; + public nameCanonical!: string; @OneToMany( () => TransformationTypeName, (transformationTypeName: TransformationTypeName) => transformationTypeName.entity ) - public names: Promise; + public names!: Promise; @Column({ nullable: true, }) - public description: string; + public description!: string; /** * the transformations of this type */ @OneToMany(() => Transformation, (transformation: Transformation) => transformation.type) - public transformations: Promise; + public transformations!: Promise; /** * if that transformation conserves the tags of the original work @@ -40,5 +40,5 @@ export class TransformationType implements IIdentifiableEntity, IMultiNamedEntit nullable: false, default: false, }) - public conservesTags: boolean; + public conservesTags!: boolean; } diff --git a/src/main/entities/library/transformation.ts b/src/main/entities/library/transformation.ts index 84cddac..fe7c2c1 100644 --- a/src/main/entities/library/transformation.ts +++ b/src/main/entities/library/transformation.ts @@ -8,7 +8,7 @@ import { Work } from './work'; @Entity() export class Transformation implements IIdentifiableEntity, IOrderableEntity { @PrimaryGeneratedColumn() - public id: number; + public id!: number; /** * the work based on the original @@ -18,7 +18,7 @@ export class Transformation implements IIdentifiableEntity, IOrderableEntity { onDelete: 'CASCADE', onUpdate: 'CASCADE', }) - public byWork: Promise; + public byWork!: Promise; /** * the transformation type @@ -28,7 +28,7 @@ export class Transformation implements IIdentifiableEntity, IOrderableEntity { onDelete: 'RESTRICT', onUpdate: 'CASCADE', }) - public type: Promise; + public type!: Promise; /** * the original work @@ -38,11 +38,11 @@ export class Transformation implements IIdentifiableEntity, IOrderableEntity { onDelete: 'CASCADE', onUpdate: 'CASCADE', }) - public ofWork: Promise; + public ofWork!: Promise; @Column({ nullable: false, default: 0, }) - public order: number; + public order!: number; } diff --git a/src/main/entities/library/work-author.ts b/src/main/entities/library/work-author.ts index 700c9c6..28cce24 100644 --- a/src/main/entities/library/work-author.ts +++ b/src/main/entities/library/work-author.ts @@ -9,7 +9,7 @@ import { Work } from './work'; @Entity() export class WorkAuthor implements IIdentifiableEntity, IOrderableEntity { @PrimaryGeneratedColumn() - public id: number; + public id!: number; /** * the work @@ -19,14 +19,14 @@ export class WorkAuthor implements IIdentifiableEntity, IOrderableEntity { onDelete: 'CASCADE', onUpdate: 'CASCADE', }) - public work: Promise; + public work!: Promise; /** * the roles of the author in the work */ @ManyToMany(() => AuthorRole, (authorRole: AuthorRole) => authorRole.workAuthors) @JoinTable() - public authorRoles: Promise; + public authorRoles!: Promise; /** * the author @@ -36,11 +36,11 @@ export class WorkAuthor implements IIdentifiableEntity, IOrderableEntity { onDelete: 'RESTRICT', onUpdate: 'CASCADE', }) - public author: Promise; + public author!: Promise; @Column({ nullable: false, default: 0, }) - public order: number; + public order!: number; } diff --git a/src/main/entities/library/work-character-name.ts b/src/main/entities/library/work-character-name.ts index 7652121..018d3f6 100644 --- a/src/main/entities/library/work-character-name.ts +++ b/src/main/entities/library/work-character-name.ts @@ -4,17 +4,17 @@ import { WorkCharacter } from './work-character'; @Entity() export class WorkCharacterName implements IIdentifiableEntity, INameEntity { @PrimaryGeneratedColumn() - public id: number; + public id!: number; @ManyToOne(() => WorkCharacter, (workCharacter: WorkCharacter) => workCharacter.names, { nullable: false, onDelete: 'CASCADE', onUpdate: 'CASCADE', }) - public entity: Promise; + public entity!: Promise; @Column({ nullable: false, }) - public name: string; + public name!: string; } diff --git a/src/main/entities/library/work-character.ts b/src/main/entities/library/work-character.ts index 982689e..97dae19 100644 --- a/src/main/entities/library/work-character.ts +++ b/src/main/entities/library/work-character.ts @@ -12,15 +12,15 @@ import { WorldCharacter } from './world-character'; @Entity() export class WorkCharacter implements IIdentifiableEntity, IMultiNamedEntity { @PrimaryGeneratedColumn() - public id: number; + public id!: number; @Column({ nullable: false, }) - public nameCanonical: string; + public nameCanonical!: string; @OneToMany(() => WorkCharacterName, (workCharacterName: WorkCharacterName) => workCharacterName.entity) - public names: Promise; + public names!: Promise; /** * the work the character is a part of @@ -30,32 +30,32 @@ export class WorkCharacter implements IIdentifiableEntity, IMultiNamedEntity { onDelete: 'CASCADE', onUpdate: 'CASCADE', }) - public work: Promise; + public work!: Promise; /** * interaction with other characters as actor */ @ManyToMany(() => InteractionTag, (interactionTag: InteractionTag) => interactionTag.subjectCharacters) @JoinTable() - public interactWith: Promise; + public interactWith!: Promise; /** * interaction with other characters as receiver */ @ManyToMany(() => InteractionTag, (interactionTag: InteractionTag) => interactionTag.objectCharacters) @JoinTable() - public interactedBy: Promise; + public interactedBy!: Promise; /** * tags connected to the character */ @OneToMany(() => CharacterTag, (characterTag: CharacterTag) => characterTag.workCharacter) - public characterTags: Promise; + public characterTags!: Promise; /** * existing characters character is based on */ @ManyToMany(() => WorldCharacter, (worldCharacter: WorldCharacter) => worldCharacter.workCharacters) @JoinTable() - public worldCharacters: Promise; + public worldCharacters!: Promise; } diff --git a/src/main/entities/library/work-name.ts b/src/main/entities/library/work-name.ts index 8f54d90..4404cd9 100644 --- a/src/main/entities/library/work-name.ts +++ b/src/main/entities/library/work-name.ts @@ -4,17 +4,17 @@ import { Work } from './work'; @Entity() export class WorkName implements IIdentifiableEntity, INameEntity { @PrimaryGeneratedColumn() - public id: number; + public id!: number; @ManyToOne(() => Work, (work: Work) => work.names, { nullable: false, onDelete: 'CASCADE', onUpdate: 'CASCADE', }) - public entity: Promise; + public entity!: Promise; @Column({ nullable: false, }) - public name: string; + public name!: string; } diff --git a/src/main/entities/library/work-tag.ts b/src/main/entities/library/work-tag.ts index 0ee12a8..5a3ef6d 100644 --- a/src/main/entities/library/work-tag.ts +++ b/src/main/entities/library/work-tag.ts @@ -10,7 +10,7 @@ import { Work } from './work'; @PercentCheck('weight') export class WorkTag implements IIdentifiableEntity, IWeightedEntity { @PrimaryGeneratedColumn() - public id: number; + public id!: number; /** * the describing tag @@ -20,7 +20,7 @@ export class WorkTag implements IIdentifiableEntity, IWeightedEntity { onDelete: 'CASCADE', onUpdate: 'CASCADE', }) - public tag: Promise; + public tag!: Promise; /** * the tagged work @@ -30,8 +30,8 @@ export class WorkTag implements IIdentifiableEntity, IWeightedEntity { onDelete: 'CASCADE', onUpdate: 'CASCADE', }) - public work: Promise; + public work!: Promise; @Column() - public weight: number; + public weight!: number; } diff --git a/src/main/entities/library/work.ts b/src/main/entities/library/work.ts index ad237ce..c54b99c 100644 --- a/src/main/entities/library/work.ts +++ b/src/main/entities/library/work.ts @@ -19,58 +19,58 @@ import { World } from './world'; @PercentCheck('rating') export class Work implements IIdentifiableEntity, IMultiNamedEntity { @PrimaryGeneratedColumn() - public id: number; + public id!: number; @Column({ nullable: false, }) - public nameCanonical: string; + public nameCanonical!: string; @OneToMany(() => WorkName, (workName: WorkName) => workName.entity) - public names: Promise; + public names!: Promise; /** * digital representations of this work */ @OneToMany(() => Copy, (copy: Copy) => copy.original) - public copies: Promise; + public copies!: Promise; /** * other works this work is a transformation of */ @OneToMany(() => Transformation, (transformation: Transformation) => transformation.byWork) - public transformationOf: Promise; + public transformationOf!: Promise; /** * other works this work is transformed by */ @OneToMany(() => Transformation, (transformation: Transformation) => transformation.ofWork) - public transformedBy: Promise; + public transformedBy!: Promise; /** * the authors/publishers of this work */ @OneToMany(() => WorkAuthor, (workAuthor: WorkAuthor) => workAuthor.work) - public workAuthors: Promise; + public workAuthors!: Promise; /** * tags describing this work */ @OneToMany(() => WorkTag, (workTag: WorkTag) => workTag.work) - public workTags: Promise; + public workTags!: Promise; /** * characters in this work */ @OneToMany(() => WorkCharacter, (workCharacter: WorkCharacter) => workCharacter.work) - public workCharacters: Promise; + public workCharacters!: Promise; /** * fictional worlds in which this work takes place */ @ManyToMany(() => World, (world: World) => world.works) @JoinTable() - public worlds: Promise; + public worlds!: Promise; /** * if this work i canon in above fictional world @@ -79,7 +79,7 @@ export class Work implements IIdentifiableEntity, IMultiNamedEntity { nullable: false, default: false, }) - public isCanonical: boolean; + public isCanonical!: boolean; /** * the user rating of this work @@ -87,7 +87,7 @@ export class Work implements IIdentifiableEntity, IMultiNamedEntity { @Column({ nullable: true, }) - public rating: number; + public rating!: number; /** * the release date of the work @@ -95,18 +95,18 @@ export class Work implements IIdentifiableEntity, IMultiNamedEntity { @Column({ nullable: true, }) - public releaseDate: Date; + public releaseDate!: Date; /** * the languages of the work (if applicable) */ @ManyToMany(() => Language, (language: Language) => language.works) @JoinTable() - public languages: Promise; + public languages!: Promise; /** * the collections this work is a part of */ @OneToMany(() => CollectionPart, (collectionPart: CollectionPart) => collectionPart.work) - public collectionParts: Promise; + public collectionParts!: Promise; } diff --git a/src/main/entities/library/world-character-name.ts b/src/main/entities/library/world-character-name.ts index 6bf6755..24fef3c 100644 --- a/src/main/entities/library/world-character-name.ts +++ b/src/main/entities/library/world-character-name.ts @@ -4,17 +4,17 @@ import { WorldCharacter } from './world-character'; @Entity() export class WorldCharacterName implements IIdentifiableEntity, INameEntity { @PrimaryGeneratedColumn() - public id: number; + public id!: number; @ManyToOne(() => WorldCharacter, (worldCharacter: WorldCharacter) => worldCharacter.names, { nullable: false, onDelete: 'CASCADE', onUpdate: 'CASCADE', }) - public entity: Promise; + public entity!: Promise; @Column({ nullable: false, }) - public name: string; + public name!: string; } diff --git a/src/main/entities/library/world-character.ts b/src/main/entities/library/world-character.ts index 21d9d84..a17e72e 100644 --- a/src/main/entities/library/world-character.ts +++ b/src/main/entities/library/world-character.ts @@ -9,32 +9,32 @@ import { WorldCharacterName } from './world-character-name'; @Entity() export class WorldCharacter implements IIdentifiableEntity, IMultiNamedEntity, IHierachicalEntity { @PrimaryGeneratedColumn() - public id: number; + public id!: number; @Column({ nullable: false, }) - public nameCanonical: string; + public nameCanonical!: string; @OneToMany(() => WorldCharacterName, (worldCharacterName: WorldCharacterName) => worldCharacterName.entity) - public names: Promise; + public names!: Promise; /** * the characters in works which are based on this one */ @ManyToMany(() => WorkCharacter, (workCharacter: WorkCharacter) => workCharacter.worldCharacters) - public workCharacters: Promise; + public workCharacters!: Promise; /** * the fictional worlds this character is a part of */ @ManyToMany(() => World, (world: World) => world.worldCharacters) - public worlds: Promise; + public worlds!: Promise; @ManyToMany(() => WorldCharacter, (worldCharacter: WorldCharacter) => worldCharacter.children) @JoinTable() - public parents: Promise; + public parents!: Promise; @ManyToMany(() => WorldCharacter, (worldCharacter: WorldCharacter) => worldCharacter.parents) - public children: Promise; + public children!: Promise; } diff --git a/src/main/entities/library/world-name.ts b/src/main/entities/library/world-name.ts index bf37d79..9113825 100644 --- a/src/main/entities/library/world-name.ts +++ b/src/main/entities/library/world-name.ts @@ -4,17 +4,17 @@ import { World } from './world'; @Entity() export class WorldName implements IIdentifiableEntity, INameEntity { @PrimaryGeneratedColumn() - public id: number; + public id!: number; @ManyToOne(() => World, (world: World) => world.names, { nullable: false, onDelete: 'CASCADE', onUpdate: 'CASCADE', }) - public entity: Promise; + public entity!: Promise; @Column({ nullable: false, }) - public name: string; + public name!: string; } diff --git a/src/main/entities/library/world.ts b/src/main/entities/library/world.ts index 13a2999..26d3966 100644 --- a/src/main/entities/library/world.ts +++ b/src/main/entities/library/world.ts @@ -9,33 +9,33 @@ import { WorldName } from './world-name'; @Entity() export class World implements IIdentifiableEntity, IMultiNamedEntity, IHierachicalEntity { @PrimaryGeneratedColumn() - public id: number; + public id!: number; @Column({ nullable: false, }) - public nameCanonical: string; + public nameCanonical!: string; @OneToMany(() => WorldName, (worldName: WorldName) => worldName.entity) - public names: Promise; + public names!: Promise; /** * works taking place in this world */ @ManyToMany(() => Work, (work: Work) => work.worlds) - public works: Promise; + public works!: Promise; /** * canon characters in this world */ @ManyToMany(() => WorldCharacter, (worldCharacter: WorldCharacter) => worldCharacter.worlds) @JoinTable() - public worldCharacters: Promise; + public worldCharacters!: Promise; @ManyToMany(() => World, (world: World) => world.parents) - public children: Promise; + public children!: Promise; @ManyToMany(() => World, (world: World) => world.children) @JoinTable() - public parents: Promise; + public parents!: Promise; } diff --git a/src/main/entities/store/store-value.ts b/src/main/entities/store/store-value.ts index 2980ade..68184be 100644 --- a/src/main/entities/store/store-value.ts +++ b/src/main/entities/store/store-value.ts @@ -9,11 +9,11 @@ export class StoreValue { * the key */ @PrimaryColumn() - public key: StoreKey; + public key: StoreKey | string = ''; /** * the value */ @Column('simple-json') - public value: any; + public value: unknown; } diff --git a/src/main/modules/app-window/app-window.ts b/src/main/modules/app-window/app-window.ts index 550793c..2a52d63 100644 --- a/src/main/modules/app-window/app-window.ts +++ b/src/main/modules/app-window/app-window.ts @@ -27,13 +27,13 @@ switch (os.platform()) { @injectable() export abstract class AppWindow implements IAppWindow { - protected _window: BrowserWindow | null; + protected _window: BrowserWindow | null = null; protected constructor(options: BrowserWindowConstructorOptions = {}) { this.initialize(options); } - public get window(): BrowserWindow { + public get window(): BrowserWindow | null { return this._window; } @@ -42,7 +42,11 @@ export abstract class AppWindow implements IAppWindow { this.initialize(); } - return this._window.loadFile('frontend/index.html'); + if (this._window) { + return this._window.loadFile('frontend/index.html'); + } else { + return Promise.reject(new Error('the window was not initialized')); + } } public isClosed(): boolean { diff --git a/src/main/modules/app-window/i-app-window.ts b/src/main/modules/app-window/i-app-window.ts index e90a575..307e0a7 100644 --- a/src/main/modules/app-window/i-app-window.ts +++ b/src/main/modules/app-window/i-app-window.ts @@ -1,7 +1,7 @@ import BrowserWindow = Electron.BrowserWindow; export interface IAppWindow { - window: BrowserWindow; + window: BrowserWindow | null; open(): Promise; isClosed(): boolean; } diff --git a/src/main/modules/error/cookie-save-error.ts b/src/main/modules/error/cookie-save-error.ts new file mode 100644 index 0000000..6829f20 --- /dev/null +++ b/src/main/modules/error/cookie-save-error.ts @@ -0,0 +1,8 @@ +/** + * Error thrown when cookies could not be saved. + */ +export class CookieSaveError extends Error { + public constructor(message: string = 'failed to save cookies') { + super(message); + } +} diff --git a/src/main/modules/error/initialization-error.ts b/src/main/modules/error/initialization-error.ts new file mode 100644 index 0000000..ca33f0e --- /dev/null +++ b/src/main/modules/error/initialization-error.ts @@ -0,0 +1,10 @@ +/** + * Error thrown when there is an error while initializing services or the app in general. + * + * You're pretty much fucked at this point, try to avoid unstable code on initialization + */ +export class InitializationError extends Error { + public constructor(message: string = 'initialization failed') { + super(message); + } +} diff --git a/src/main/modules/error/web-crawler-error.ts b/src/main/modules/error/web-crawler-error.ts new file mode 100644 index 0000000..03dbe84 --- /dev/null +++ b/src/main/modules/error/web-crawler-error.ts @@ -0,0 +1,8 @@ +/** + * generic web crawler error + */ +export class WebCrawlerError extends Error { + public constructor(message: string = 'web crawler failed') { + super(message); + } +} diff --git a/src/main/modules/error/web-crawler-form-error.ts b/src/main/modules/error/web-crawler-form-error.ts new file mode 100644 index 0000000..5909a54 --- /dev/null +++ b/src/main/modules/error/web-crawler-form-error.ts @@ -0,0 +1,10 @@ +import { WebCrawlerError } from './web-crawler-error'; + +/** + * Error thrown when the web crawler can't work with the provided form. + */ +export class WebCrawlerFormError extends WebCrawlerError { + public constructor(message: string = 'web crawler failed') { + super(message); + } +} diff --git a/src/main/modules/error/web-crawler-login-error.ts b/src/main/modules/error/web-crawler-login-error.ts new file mode 100644 index 0000000..8b01009 --- /dev/null +++ b/src/main/modules/error/web-crawler-login-error.ts @@ -0,0 +1,10 @@ +import { WebCrawlerError } from './web-crawler-error'; + +/** + * Error thrown when the web crawler can't login + */ +export class WebCrawlerLoginError extends WebCrawlerError { + public constructor(message: string = 'login failed') { + super(message); + } +} diff --git a/src/main/modules/ipc/annotations/answer.ts b/src/main/modules/ipc/annotations/answer.ts new file mode 100644 index 0000000..6ecefd4 --- /dev/null +++ b/src/main/modules/ipc/annotations/answer.ts @@ -0,0 +1,7 @@ +import { registerHandler } from '../ipc-server'; + +export function answer(channel: IpcChannel): DecoratorFactory { + return function (target: IIpcController, propertyKey): void { + registerHandler(channel, target, propertyKey); + }; +} diff --git a/src/main/modules/ipc/ipc-server.ts b/src/main/modules/ipc/ipc-server.ts index 5e9555a..d33221a 100644 --- a/src/main/modules/ipc/ipc-server.ts +++ b/src/main/modules/ipc/ipc-server.ts @@ -1,33 +1,25 @@ import { ipcMain } from 'electron'; -import { injectable } from 'inversify'; import IpcMainEvent = Electron.IpcMainEvent; -import BrowserWindow = Electron.BrowserWindow; -@injectable() -export abstract class IpcServer { - protected answer(channel: IpcChannels, handler: (data?: any) => Promise): void { - ipcMain.on(channel, (event: IpcMainEvent, payload: IIpcPayload) => { - handler(payload.data) - .then((result: any) => { - const response: IIpcResponse = { - id: payload.id, - success: true, - data: result, - }; - event.reply(channel, response); - }) - .catch((reason: any) => { - const response: IIpcResponse = { - id: payload.id, - success: false, - error: reason.toString(), - }; - event.reply(channel, response); - }); - }); - } - - protected send(window: BrowserWindow, channel: IpcChannels, data: any): void { - window.webContents.send(channel, data); - } +export function registerHandler(channel: IpcChannel, controller: IIpcController, handler: string): void { + ipcMain.on(channel, (event: IpcMainEvent, payload: IIpcPayload) => { + ((controller.get() as unknown) as { [x: string]: IpcHandler }) + [handler](payload.data) + .then((result: unknown) => { + const response: IIpcResponse = { + id: payload.id, + success: true, + data: result, + }; + event.reply(channel, response); + }) + .catch((reason: Error) => { + const response: IIpcResponse = { + id: payload.id, + success: false, + error: reason.message, + }; + event.reply(channel, response); + }); + }); } diff --git a/src/main/modules/nhentai/nhentai-api.ts b/src/main/modules/nhentai/nhentai-api.ts index 119f84e..afe018a 100644 --- a/src/main/modules/nhentai/nhentai-api.ts +++ b/src/main/modules/nhentai/nhentai-api.ts @@ -1,7 +1,8 @@ import { inject, injectable } from 'inversify'; import { JSDOM } from 'jsdom'; import { RequestInit, Response } from 'node-fetch'; -import { Errors, RenaiError } from '../../core/error'; +import { WebCrawlerFormError } from '../error/web-crawler-form-error'; +import { WebCrawlerLoginError } from '../error/web-crawler-login-error'; import { IWebCrawler } from '../web-crawler/i-web-crawler'; import { INhentaiApi } from './i-nhentai-api'; @@ -66,7 +67,7 @@ export class NhentaiApi implements INhentaiApi { }); }) .then(() => {}) - .catch(() => Promise.reject(new RenaiError(Errors.ELOGINFAIL))); + .catch(() => Promise.reject(new WebCrawlerLoginError())); } private getNHentai(path: string): Promise { @@ -111,14 +112,17 @@ export class NhentaiApi implements INhentaiApi { if (name === usernameInput || name === passwordInput) { isLoginForm = true; } else if (name) { - valueStore[name] = input.getAttribute('value'); + const value = input.getAttribute('value'); + if (value) { + valueStore[name] = value; + } } } if (isLoginForm) { return valueStore; } } - return Promise.reject(new RenaiError(Errors.ENOLOGIN)); + return Promise.reject(new WebCrawlerFormError()); }); } } diff --git a/src/main/modules/nhentai/nhentai-ipc-controller.ts b/src/main/modules/nhentai/nhentai-ipc-controller.ts new file mode 100644 index 0000000..bc64295 --- /dev/null +++ b/src/main/modules/nhentai/nhentai-ipc-controller.ts @@ -0,0 +1,26 @@ +import { container } from '../../core/container'; +import { answer } from '../ipc/annotations/answer'; +import { INhentaiApi } from './i-nhentai-api'; + +export class NhentaiIpcController implements IIpcController { + private nhentaiApi: INhentaiApi; + + public constructor(nhentaiApi: INhentaiApi) { + this.nhentaiApi = nhentaiApi; + } + + @answer(IpcChannel.LOGIN) + public login(credentials: ICredentials): Promise { + return this.nhentaiApi.login(credentials.name, credentials.password); + } + + @answer(IpcChannel.LOGGED_IN) + public loggedIn(): Promise { + return this.nhentaiApi.isLoggedIn(); + } + + public get(): NhentaiIpcController { + const nhentaiApi: INhentaiApi = container.get(Symbol.for('nhentai-api')); + return new NhentaiIpcController(nhentaiApi); + } +} diff --git a/src/main/modules/nhentai/nhentai-ipc-server.ts b/src/main/modules/nhentai/nhentai-ipc-server.ts deleted file mode 100644 index 8351b86..0000000 --- a/src/main/modules/nhentai/nhentai-ipc-server.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { inject, injectable } from 'inversify'; -import { IpcServer } from '../ipc/ipc-server'; -import { INhentaiApi } from './i-nhentai-api'; - -@injectable() -export class NhentaiIpcServer extends IpcServer { - private nhentaiApi: INhentaiApi; - - public constructor(@inject(Symbol.for('nhentai-api')) nhentaiApi: INhentaiApi) { - super(); - this.nhentaiApi = nhentaiApi; - - this.answer(IpcChannels.LOGIN, (credentials: ICredentials) => - this.nhentaiApi.login(credentials.name, credentials.password) - ); - this.answer(IpcChannels.LOGGED_IN, () => this.nhentaiApi.isLoggedIn()); - } -} diff --git a/src/main/modules/session/session.ts b/src/main/modules/session/session.ts index b8c8ee6..47c7eeb 100644 --- a/src/main/modules/session/session.ts +++ b/src/main/modules/session/session.ts @@ -2,29 +2,26 @@ import { session } from 'electron'; import { injectable } from 'inversify'; import { isDev } from '../../core/dev'; import { ISession } from './i-session'; -import OnHeadersReceivedListenerDetails = Electron.OnHeadersReceivedListenerDetails; @injectable() export class Session implements ISession { public setHeaders(): void { // these headers only work on web requests, file:// protocol is handled via meta tags in the html - session.defaultSession.webRequest.onHeadersReceived( - (details: OnHeadersReceivedListenerDetails, callback: (response: {}) => void) => { - callback({ - responseHeaders: { - ...details.responseHeaders, - 'Content-Security-Policy': isDev() - ? [ - 'default-src devtools:;' + - "script-src 'unsafe-eval';" + - "script-src-elem devtools: 'sha256-hl04hLzKBpmsfWF2wIA/0Vs6ZNV5T9ZNFY//3uXrgSk=';" + - "style-src devtools: 'unsafe-inline';" + - 'connect-src devtools: data:', - ] - : ["default-src 'none'"], - }, - }); - } - ); + session.defaultSession.webRequest.onHeadersReceived((details, callback) => { + callback({ + responseHeaders: { + ...details.responseHeaders, + 'Content-Security-Policy': isDev() + ? [ + 'default-src devtools:;' + + "script-src 'unsafe-eval';" + + "script-src-elem devtools: 'sha256-hl04hLzKBpmsfWF2wIA/0Vs6ZNV5T9ZNFY//3uXrgSk=';" + + "style-src devtools: 'unsafe-inline';" + + 'connect-src devtools: data:', + ] + : ["default-src 'none'"], + }, + }); + }); } } diff --git a/src/main/modules/store/i-store.ts b/src/main/modules/store/i-store.ts new file mode 100644 index 0000000..30fe859 --- /dev/null +++ b/src/main/modules/store/i-store.ts @@ -0,0 +1,4 @@ +export interface IStore { + load: (key: StoreKey) => Promise; + save: (key: StoreKey, data: unknown) => Promise; +} diff --git a/src/main/modules/store/store.mock.ts b/src/main/modules/store/store.mock.ts index 92e230c..314aad3 100644 --- a/src/main/modules/store/store.mock.ts +++ b/src/main/modules/store/store.mock.ts @@ -1,33 +1,19 @@ -import { load, save } from './store'; -const store = require('./store'); +import { injectable } from 'inversify'; +import { IStore } from './i-store'; -interface IStoreMock extends IMock { - original: { - load: typeof load; - save: typeof save; - }; - mock: { - load: (mock: typeof load) => void; - save: (mock: typeof save) => void; - }; - restore: () => void; +/** + * This mock store saves the data in memory. + */ +@injectable() +export class StoreMock implements IStore { + private store: { [x in StoreKey]?: unknown } = {}; + + public load(key: StoreKey): Promise { + return Promise.resolve(this.store[key]); + } + + public save(key: StoreKey, data: unknown): Promise { + this.store[key] = data; + return Promise.resolve(); + } } - -export const storeMock: IStoreMock = { - original: { - load: store.load, - save: store.save, - }, - mock: { - load(mock) { - store.load = mock; - }, - save(mock) { - store.save = mock; - }, - }, - restore() { - store.load = this.original.load; - store.save = this.original.save; - }, -}; diff --git a/src/main/modules/store/store.spec.ts b/src/main/modules/store/store.spec.ts index d722ab5..c806bbf 100644 --- a/src/main/modules/store/store.spec.ts +++ b/src/main/modules/store/store.spec.ts @@ -3,7 +3,8 @@ import '../../../../mocks/electron'; import { expect } from 'chai'; import 'mocha'; -import { load, save } from './store'; +import { container } from '../../core/container'; +import { IStore } from './i-store'; describe('Store Service', function () { this.timeout(10000); @@ -17,7 +18,8 @@ describe('Store Service', function () { }); it('loads saved data', () => { - const testData: any = { + const store: IStore = container.get(Symbol.for('store')); + const testData = { something: 'gaga', somethingElse: 0, deepObject: { @@ -32,11 +34,12 @@ describe('Store Service', function () { }, }; const expectedJson = JSON.stringify(testData); - return save(StoreKey.COOKIES, testData) - .then(() => load(StoreKey.COOKIES)) + return store + .save(StoreKey.COOKIES, testData) + .then(() => store.load(StoreKey.COOKIES)) .then((data) => { expect(JSON.stringify(data)).to.equal(expectedJson, 'store does not save and load data correctly'); - return load(StoreKey.COOKIES); + return store.load(StoreKey.COOKIES); }) .then((data) => { expect(JSON.stringify(data)).to.equal(expectedJson, 'store does not load data correctly when loaded twice'); diff --git a/src/main/modules/store/store.ts b/src/main/modules/store/store.ts index 0d51520..0ac9e76 100644 --- a/src/main/modules/store/store.ts +++ b/src/main/modules/store/store.ts @@ -1,26 +1,31 @@ -import { Databases, getConnection } from '../../core/database'; +import { injectable } from 'inversify'; +import { Database, getConnection } from '../../core/database'; import { StoreValue } from '../../entities/store/store-value'; +import { IStore } from './i-store'; const CACHE_ID = 'store'; -export async function load(key: StoreKey): Promise { - const c = await getConnection(Databases.STORE); - const repository = c.getRepository(StoreValue); - const storeValue = await repository.findOne(key, { - cache: { - id: CACHE_ID, - milliseconds: 0, - }, - }); - return storeValue.value; -} +@injectable() +export class Store implements IStore { + public async load(key: StoreKey): Promise { + const c = await getConnection(Database.STORE); + const repository = c.getRepository(StoreValue); + const storeValue = await repository.findOne(key, { + cache: { + id: CACHE_ID, + milliseconds: 0, + }, + }); + return storeValue?.value; + } -export async function save(key: StoreKey, data: any): Promise { - const c = await getConnection(Databases.STORE); - const manager = c.manager; - const storeValue = new StoreValue(); - storeValue.key = key; - storeValue.value = data; - await manager.save(storeValue); - await c.queryResultCache.remove([CACHE_ID]); + public async save(key: StoreKey, data: unknown): Promise { + const c = await getConnection(Database.STORE); + const manager = c.manager; + const storeValue = new StoreValue(); + storeValue.key = key; + storeValue.value = data; + await manager.save(storeValue); + await c.queryResultCache?.remove([CACHE_ID]); + } } diff --git a/src/main/modules/web-crawler/web-crawler.spec.ts b/src/main/modules/web-crawler/web-crawler.spec.ts index 73f3291..ef4e349 100644 --- a/src/main/modules/web-crawler/web-crawler.spec.ts +++ b/src/main/modules/web-crawler/web-crawler.spec.ts @@ -2,13 +2,12 @@ import rewiremock from 'rewiremock'; import '../../../../mocks/electron'; import { expect } from 'chai'; -import { CookieJar } from 'jsdom'; import 'mocha'; import nock from 'nock'; import { Response } from 'node-fetch'; import sinon from 'sinon'; -import { WebCrawler } from './web-crawler'; -import { storeMock } from '../store/store.mock'; +import { container, mockStore } from '../../core/container'; +import { IWebCrawler } from './i-web-crawler'; describe('Web Crawler', function () { this.timeout(2000); @@ -16,9 +15,7 @@ describe('Web Crawler', function () { before(() => { rewiremock.enable(); - storeMock.mock.load(() => Promise.resolve(new CookieJar().serializeSync())); - - storeMock.mock.save(() => Promise.resolve()); + mockStore(); }); beforeEach(() => { @@ -33,7 +30,7 @@ describe('Web Crawler', function () { after(() => { rewiremock.disable(); - storeMock.restore(); + mockStore(true); }); it('fetches websites', async () => { @@ -52,11 +49,11 @@ describe('Web Crawler', function () { ) .persist(); - const webCrawler = new WebCrawler(); + const webCrawler: IWebCrawler = container.get(Symbol.for('web-crawler')); const res: Response = await webCrawler.fetch(testUrl); expect(callback.callCount).to.equal(1, 'multiple requests (or none) are sent when only one should be'); - const json = await res.json(); + const json = (await res.json()) as unknown; expect(json).to.deep.equal([{ id: 12, comment: 'Hey there' }], 'response body is incorrect'); }); }); diff --git a/src/main/modules/web-crawler/web-crawler.ts b/src/main/modules/web-crawler/web-crawler.ts index a09a5f1..3438aed 100644 --- a/src/main/modules/web-crawler/web-crawler.ts +++ b/src/main/modules/web-crawler/web-crawler.ts @@ -1,8 +1,8 @@ -import { injectable } from 'inversify'; +import { inject, injectable } from 'inversify'; import { CookieJar } from 'jsdom'; import nodeFetch, { RequestInit, Response } from 'node-fetch'; -import { Errors, RenaiError } from '../../core/error'; -import { load, save } from '../store/store'; +import { CookieSaveError } from '../error/cookie-save-error'; +import { IStore } from '../store/i-store'; import { IWebCrawler } from './i-web-crawler'; @injectable() @@ -11,9 +11,12 @@ export class WebCrawler implements IWebCrawler { private initialized: boolean; - public constructor() { + private store: IStore; + + public constructor(@inject(Symbol.for('store')) store: IStore) { this.initialized = false; this.cookieJar = new CookieJar(); + this.store = store; } public fetch(url: string, requestInit: RequestInit = {}): Promise { @@ -30,8 +33,8 @@ export class WebCrawler implements IWebCrawler { }, }; return nodeFetch(url, cookiedInit).then((res: Response) => { - this.setCookies(res.headers.raw()['set-cookie'], url).catch((reason: any) => { - throw new RenaiError(Errors.ECOOKIESAVEFAIL, reason); + this.setCookies(res.headers.raw()['set-cookie'], url).catch((reason: Error) => { + throw new CookieSaveError(reason.message); }); return res; }); @@ -40,9 +43,9 @@ export class WebCrawler implements IWebCrawler { private init(): Promise { if (!this.initialized) { - return load(StoreKey.COOKIES).then((cookies: any) => { + return this.store.load(StoreKey.COOKIES).then((cookies: unknown) => { if (cookies !== undefined) { - this.cookieJar = CookieJar.deserializeSync(cookies); + this.cookieJar = CookieJar.deserializeSync(cookies as string); } this.initialized = true; }); @@ -56,8 +59,8 @@ export class WebCrawler implements IWebCrawler { header.forEach((cookie: string) => { this.cookieJar.setCookieSync(cookie, url); }); - return save(StoreKey.COOKIES, this.cookieJar.serializeSync()).catch((reason: any) => { - throw new RenaiError(Errors.ECOOKIESAVEFAIL, reason); + return this.store.save(StoreKey.COOKIES, this.cookieJar.serializeSync()).catch((reason: Error) => { + throw new CookieSaveError(reason.message); }); } return Promise.resolve(); diff --git a/src/renderer.ts b/src/renderer.ts index b414bdd..acee806 100644 --- a/src/renderer.ts +++ b/src/renderer.ts @@ -5,6 +5,7 @@ import App from './renderer/App.svelte'; ((): void => + // eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-return -- fis this together with the typescript support of svelte new App({ target: document.querySelector('#app'), props: { diff --git a/src/renderer/services/api.ts b/src/renderer/services/api.ts index 9ed7ab5..a6221c1 100644 --- a/src/renderer/services/api.ts +++ b/src/renderer/services/api.ts @@ -3,20 +3,20 @@ import { uuid } from '../../services/uuid'; import IpcRendererEvent = Electron.IpcRendererEvent; const ipcClient: IIpcClient = { - ask: (channel: IpcChannels, data?: any): Promise => { + ask: (channel: IpcChannel, data?: unknown): Promise => { const id = uuid(); const payload: IIpcPayload = { id, data, }; - return new Promise((resolve: (value?: any) => void, reject: (reason?: any) => void): void => { + return new Promise((resolve: (value?: unknown) => void, reject: (reason?: Error) => void): void => { const listener = (event: IpcRendererEvent, response: IIpcResponse): void => { if (response.id === id) { if (response.success) { resolve(response.data); } else { - reject(response.error); + reject(new Error(response.error)); } ipcRenderer.removeListener(channel, listener); } @@ -28,9 +28,9 @@ const ipcClient: IIpcClient = { }; export function login(credentials: ICredentials): Promise { - return ipcClient.ask(IpcChannels.LOGIN, credentials); + return ipcClient.ask(IpcChannel.LOGIN, credentials) as Promise; } export function isLoggedIn(): Promise { - return ipcClient.ask(IpcChannels.LOGGED_IN); + return ipcClient.ask(IpcChannel.LOGGED_IN) as Promise; } diff --git a/src/renderer/services/store.ts b/src/renderer/services/store.ts index 389facc..ada4959 100644 --- a/src/renderer/services/store.ts +++ b/src/renderer/services/store.ts @@ -1,16 +1,21 @@ -import { writable } from 'svelte/store'; +import { writable, Readable } from 'svelte/store'; import * as api from './api'; const { subscribe, set } = writable(false); -export const loggedIn = { +interface ILoggedIn extends Readable { + fetchIsLoggedIn(): Promise; + fetchLogin(credentials: ICredentials): Promise; +} + +export const loggedIn: ILoggedIn = { subscribe, fetchIsLoggedIn(): Promise { return api.isLoggedIn().then((isLoggedIn: boolean) => { set(isLoggedIn); }); }, - fetchLogin(credentials: ICredentials): Promise { + fetchLogin(this: ILoggedIn, credentials: ICredentials): Promise { return api.login(credentials).then(this.fetchIsLoggedIn); }, }; diff --git a/src/services/uuid.ts b/src/services/uuid.ts index b7966ca..480f9b1 100644 --- a/src/services/uuid.ts +++ b/src/services/uuid.ts @@ -1,4 +1,4 @@ -import { v1 as uuidv1 } from 'uuid'; +import { v1 as uuidV1 } from 'uuid'; const R = 0x52; const e = 0x65; @@ -13,7 +13,7 @@ const nice = 0x45; * see RFC 4122 4.2.1. */ export function uuid(): string { - return uuidv1({ + return uuidV1({ node: [R, e, n, a, i, nice], }); } diff --git a/tsconfig.json b/tsconfig.json index 7c330fe..879e63a 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -8,6 +8,7 @@ "esModuleInterop": true, "resolveJsonModule": true, "noImplicitAny": true, + "strict": true, "removeComments": true, "sourceMap": true, "preserveConstEnums": false, diff --git a/types/decorator-factory.d.ts b/types/decorator-factory.d.ts new file mode 100644 index 0000000..018a9aa --- /dev/null +++ b/types/decorator-factory.d.ts @@ -0,0 +1 @@ +type DecoratorFactory = (target: T, propertyKey: string, descriptor: PropertyDescriptor) => void; diff --git a/types/ipc.d.ts b/types/ipc.d.ts index 67cd3b8..ed5a03b 100644 --- a/types/ipc.d.ts +++ b/types/ipc.d.ts @@ -1,19 +1,19 @@ -declare const enum IpcChannels { - ERROR = 'ERROR', +declare const enum IpcChannel { LOGIN = 'LOGIN', LOGGED_IN = 'LOGGED_IN', } interface IIpcPayload { id: string; - data: any; + data: unknown; } interface IIpcResponse { id: string; success: boolean; - data?: any; - error?: any; + data?: unknown; + // just the error message + error?: string; } interface ICredentials { @@ -22,10 +22,11 @@ interface ICredentials { } interface IIpcClient { - ask: (channel: IpcChannels, data?: any) => Promise; + ask: (channel: IpcChannel, data?: unknown) => Promise; } -interface IIpcServer { - answer: (channel: IpcChannels, handler: (data?: any) => Promise) => void; - send: (channel: IpcChannels, data: any) => void; +type IpcHandler = (data?: unknown) => Promise; + +interface IIpcController { + get(): IIpcController; } diff --git a/types/mock.d.ts b/types/mock.d.ts deleted file mode 100644 index 7ac64c5..0000000 --- a/types/mock.d.ts +++ /dev/null @@ -1,7 +0,0 @@ -interface IMock { - original: object; - mock: { - [key: string]: (mock: any) => void; - }; - restore: () => void; -}