From a77040ccb9834329b60d63654f3d92526c7e0615 Mon Sep 17 00:00:00 2001 From: Stanislav Lvovsky Date: Sun, 13 Jun 2021 11:25:15 +0300 Subject: [PATCH] fix: notification error displayed after closing Explore and Install Gens pane --- packages/backend/src/exploregens.ts | 18 ++++- packages/backend/test/exploregens.spec.ts | 40 +++++++--- yarn.lock | 96 +++++++++++++++++------ 3 files changed, 112 insertions(+), 42 deletions(-) diff --git a/packages/backend/src/exploregens.ts b/packages/backend/src/exploregens.ts index ea76bc388..a6ac5356e 100644 --- a/packages/backend/src/exploregens.ts +++ b/packages/backend/src/exploregens.ts @@ -148,9 +148,13 @@ export class ExploreGens { return { packages: filteredGenerators, total: packagesData.total }; } + private getErrorMessage(error: Error): string { + return _.get(error, "stack", _.get(error, "message", error.toString())); + } + private showAndLogError(messagePrefix: string, error?: Error) { if (error) { - const errorMessage = error.toString(); + const errorMessage = this.getErrorMessage(error); this.logger.error(errorMessage); } @@ -233,7 +237,7 @@ export class ExploreGens { } catch (error) { this.updateBeingHandledGenerator(genName, GenState.notInstalled); if (isAutoUpdate) { - this.logger.error(error); + this.logger.error(this.getErrorMessage(error)); return genName; } this.showAndLogError(messages.failed_to_update(genName), error); @@ -251,8 +255,14 @@ export class ExploreGens { } private updateBeingHandledGenerator(genName: string, state: GenState) { - if (this.rpc) { - void this.rpc.invoke("updateBeingHandledGenerator", [genName, state]); + try { + if (this.rpc) { + void this.rpc.invoke("updateBeingHandledGenerator", [genName, state]); + } + } catch (error) { + // error could happen in case that panel was closed by an user but action is still in progress + // in this case webview is already disposed + this.logger.debug(this.getErrorMessage(error)); } } diff --git a/packages/backend/test/exploregens.spec.ts b/packages/backend/test/exploregens.spec.ts index 7dd72a9e6..0506a0402 100644 --- a/packages/backend/test/exploregens.spec.ts +++ b/packages/backend/test/exploregens.spec.ts @@ -167,12 +167,13 @@ describe("exploregens unit test", () => { it("an error is thrown", async () => { const errorMessage = "npm install failed"; + const error = new Error(errorMessage); loggerMock.expects("debug").withExactArgs(messages.updating(genName)); - loggerMock.expects("error").withExactArgs(errorMessage); + loggerMock.expects("error").withExactArgs(error.stack); rpcMock.expects("invoke").withExactArgs("updateBeingHandledGenerator", [genName, GenState.updating]); rpcMock.expects("invoke").withExactArgs("updateBeingHandledGenerator", [genName, GenState.notInstalled]); - npmUtilsMock.expects("install").throws(errorMessage); + npmUtilsMock.expects("install").throws(error); windowMock.expects("showErrorMessage").withExactArgs(messages.failed_to_update(genName)).resolves(); windowMock .expects("setStatusBarMessage") @@ -218,12 +219,13 @@ describe("exploregens unit test", () => { it("an error is thrown", async () => { const errorMessage = "npm install failed"; + const error = new Error(errorMessage); loggerMock.expects("debug").withExactArgs(messages.installing(genName)); - loggerMock.expects("error").withExactArgs(errorMessage); + loggerMock.expects("error").withExactArgs(error.stack); rpcMock.expects("invoke").withExactArgs("updateBeingHandledGenerator", [genName, GenState.installing]); rpcMock.expects("invoke").withExactArgs("updateBeingHandledGenerator", [genName, GenState.notInstalled]); npmUtilsMock.expects("checkAccessAndSetGeneratorsPath").resolves(); - npmUtilsMock.expects("install").throws(errorMessage); + npmUtilsMock.expects("install").throws(error); windowMock.expects("showErrorMessage").withExactArgs(messages.failed_to_install(genName)).resolves(); windowMock .expects("setStatusBarMessage") @@ -383,9 +385,10 @@ describe("exploregens unit test", () => { globalStateMock.expects("update").withArgs(exploregens["LAST_AUTO_UPDATE_DATE"]); workspaceConfigMock.expects("get").withExactArgs(exploregens["AUTO_UPDATE"], true).returns(true); NpmCommand["isInBAS"] = false; - const expectedErrorMessage = "Error: Action cancelled"; - loggerMock.expects("error").withExactArgs(expectedErrorMessage); - npmUtilsMock.expects("checkAccessAndSetGeneratorsPath").throws(new Error("Action cancelled")); + const expectedErrorMessage = "Action cancelled"; + const error = new Error(expectedErrorMessage); + loggerMock.expects("error").withExactArgs(error.stack); + npmUtilsMock.expects("checkAccessAndSetGeneratorsPath").throws(error); windowMock.expects("showErrorMessage").withExactArgs(messages.failed_to_update_gens()).resolves(); await exploregens["doGeneratorsUpdate"](); }); @@ -407,9 +410,21 @@ describe("exploregens unit test", () => { }); }); - it("updateBeingHandledGenerator", () => { - rpcMock.expects("invoke").withExactArgs("updateBeingHandledGenerator", ["generator-aa", GenState.installed]); - exploregens["updateBeingHandledGenerator"]("generator-aa", GenState.installed); + describe("updateBeingHandledGenerator", () => { + it("success", () => { + rpcMock + .expects("invoke") + .withExactArgs("updateBeingHandledGenerator", ["generator-aa", GenState.installed]) + .resolves(); + exploregens["updateBeingHandledGenerator"]("generator-aa", GenState.installed); + }); + + it("failure", () => { + const error = new Error("rpc invoke error"); + rpcMock.expects("invoke").throws(error); + loggerMock.expects("debug").withExactArgs(error.stack); + exploregens["updateBeingHandledGenerator"]("generator-aa", GenState.installed); + }); }); describe("uninstall", () => { @@ -448,12 +463,13 @@ describe("exploregens unit test", () => { const genName = gen.package.name; const uninstallingMessage = messages.uninstalling(genName); const errorMessage = `uninstall failure.`; + const error = new Error(errorMessage); loggerMock.expects("debug").withExactArgs(uninstallingMessage); - loggerMock.expects("error").withExactArgs(errorMessage); + loggerMock.expects("error").withExactArgs(error.stack); rpcMock.expects("invoke").withExactArgs("updateBeingHandledGenerator", [genName, GenState.uninstalling]); rpcMock.expects("invoke").withExactArgs("updateBeingHandledGenerator", [genName, GenState.installed]); - npmUtilsMock.expects("uninstall").throws(errorMessage); + npmUtilsMock.expects("uninstall").throws(error); windowMock .expects("setStatusBarMessage") diff --git a/yarn.lock b/yarn.lock index 353c9b7f5..240b06217 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3680,22 +3680,22 @@ "@webassemblyjs/wast-parser" "1.9.0" "@xtuc/long" "4.2.2" -"@webpack-cli/configtest@^1.0.3": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-1.0.3.tgz#204bcff87cda3ea4810881f7ea96e5f5321b87b9" - integrity sha512-WQs0ep98FXX2XBAfQpRbY0Ma6ADw8JR6xoIkaIiJIzClGOMqVRvPCWqndTxf28DgFopWan0EKtHtg/5W1h0Zkw== +"@webpack-cli/configtest@^1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-1.0.4.tgz#f03ce6311c0883a83d04569e2c03c6238316d2aa" + integrity sha512-cs3XLy+UcxiP6bj0A6u7MLLuwdXJ1c3Dtc0RkKg+wiI1g/Ti1om8+/2hc2A2B60NbBNAbMgyBMHvyymWm/j4wQ== -"@webpack-cli/info@^1.2.4": - version "1.2.4" - resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-1.2.4.tgz#7381fd41c9577b2d8f6c2594fad397ef49ad5573" - integrity sha512-ogE2T4+pLhTTPS/8MM3IjHn0IYplKM4HbVNMCWA9N4NrdPzunwenpCsqKEXyejMfRu6K8mhauIPYf8ZxWG5O6g== +"@webpack-cli/info@^1.3.0": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-1.3.0.tgz#9d78a31101a960997a4acd41ffd9b9300627fe2b" + integrity sha512-ASiVB3t9LOKHs5DyVUcxpraBXDOKubYu/ihHhU+t1UPpxsivg6Od2E2qU4gJCekfEddzRBzHhzA/Acyw/mlK/w== dependencies: envinfo "^7.7.3" -"@webpack-cli/serve@^1.4.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-1.4.0.tgz#f84fd07bcacefe56ce762925798871092f0f228e" - integrity sha512-xgT/HqJ+uLWGX+Mzufusl3cgjAcnqYYskaB7o0vRcwOEfuu6hMzSILQpnIzFMGsTaeaX4Nnekl+6fadLbl1/Vg== +"@webpack-cli/serve@^1.5.1": + version "1.5.1" + resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-1.5.1.tgz#b5fde2f0f79c1e120307c415a4c1d5eb15a6f278" + integrity sha512-4vSVUiOPJLmr45S8rMGy7WDvpWxfFxfP/Qx/cxZFCfvoypTYpPPL1X8VIZMe0WTA+Jr7blUxwUSEZNkjoMTgSw== "@xtuc/ieee754@^1.2.0": version "1.2.0" @@ -4857,6 +4857,29 @@ cacache@^15.0.3, cacache@^15.0.5: tar "^6.0.2" unique-filename "^1.1.1" +cacache@^15.2.0: + version "15.2.0" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-15.2.0.tgz#73af75f77c58e72d8c630a7a2858cb18ef523389" + integrity sha512-uKoJSHmnrqXgthDFx/IU6ED/5xd+NNGe+Bb+kLZy7Ku4P+BaiWEUflAKPZ7eAzsYGcsAGASJZsybXp+quEcHTw== + dependencies: + "@npmcli/move-file" "^1.0.1" + chownr "^2.0.0" + fs-minipass "^2.0.0" + glob "^7.1.4" + infer-owner "^1.0.4" + lru-cache "^6.0.0" + minipass "^3.1.1" + minipass-collect "^1.0.2" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.2" + mkdirp "^1.0.3" + p-map "^4.0.0" + promise-inflight "^1.0.1" + rimraf "^3.0.2" + ssri "^8.0.1" + tar "^6.0.2" + unique-filename "^1.1.1" + cache-base@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" @@ -11042,6 +11065,28 @@ make-fetch-happen@^8.0.9: socks-proxy-agent "^5.0.0" ssri "^8.0.0" +make-fetch-happen@^9.0.1: + version "9.0.2" + resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-9.0.2.tgz#aa8c0e4a5e3a5f2be86c54d3abed44fe5a32ad5d" + integrity sha512-UkAWAuXPXSSlVviTjH2We20mtj1NnZW2Qq/oTY2dyMbRQ5CR3Xed3akCDMnM7j6axrMY80lhgM7loNE132PfAw== + dependencies: + agentkeepalive "^4.1.3" + cacache "^15.2.0" + http-cache-semantics "^4.1.0" + http-proxy-agent "^4.0.1" + https-proxy-agent "^5.0.0" + is-lambda "^1.0.1" + lru-cache "^6.0.0" + minipass "^3.1.3" + minipass-collect "^1.0.2" + minipass-fetch "^1.3.2" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.4" + negotiator "^0.6.2" + promise-retry "^2.0.1" + socks-proxy-agent "^5.0.0" + ssri "^8.0.0" + makeerror@1.0.x: version "1.0.11" resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" @@ -11729,7 +11774,7 @@ natural-compare@^1.4.0: resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= -negotiator@0.6.2: +negotiator@0.6.2, negotiator@^0.6.2: version "0.6.2" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== @@ -12074,13 +12119,12 @@ npm-pick-manifest@^6.0.0, npm-pick-manifest@^6.1.0, npm-pick-manifest@^6.1.1: npm-package-arg "^8.1.2" semver "^7.3.4" -npm-registry-fetch@10.1.2: - version "10.1.2" - resolved "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-10.1.2.tgz#11ffe03d813c653e768bdf762cfc5f1afe91b8bd" - integrity sha512-KsM/TdPmntqgBFlfsbkOLkkE9ovZo7VpVcd+/eTdYszCrgy5zFl5JzWm+OxavFaEWlbkirpkou+ZYI00RmOBFA== +npm-registry-fetch@11.0.0: + version "11.0.0" + resolved "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-11.0.0.tgz#68c1bb810c46542760d62a6a965f85a702d43a76" + integrity sha512-jmlgSxoDNuhAtxUIG6pVwwtz840i994dL14FoNVZisrmZW5kWd63IUTNv1m/hyRSGSqWjCUp/YZlS1BJyNp9XA== dependencies: - lru-cache "^6.0.0" - make-fetch-happen "^8.0.9" + make-fetch-happen "^9.0.1" minipass "^3.1.3" minipass-fetch "^1.3.0" minipass-json-stream "^1.0.1" @@ -16641,15 +16685,15 @@ webpack-chain@^6.4.0: deepmerge "^1.5.2" javascript-stringify "^2.0.1" -webpack-cli@4.7.0: - version "4.7.0" - resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-4.7.0.tgz#3195a777f1f802ecda732f6c95d24c0004bc5a35" - integrity sha512-7bKr9182/sGfjFm+xdZSwgQuFjgEcy0iCTIBxRUeteJ2Kr8/Wz0qNJX+jw60LU36jApt4nmMkep6+W5AKhok6g== +webpack-cli@4.7.2: + version "4.7.2" + resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-4.7.2.tgz#a718db600de6d3906a4357e059ae584a89f4c1a5" + integrity sha512-mEoLmnmOIZQNiRl0ebnjzQ74Hk0iKS5SiEEnpq3dRezoyR3yPaeQZCMCe+db4524pj1Pd5ghZXjT41KLzIhSLw== dependencies: "@discoveryjs/json-ext" "^0.5.0" - "@webpack-cli/configtest" "^1.0.3" - "@webpack-cli/info" "^1.2.4" - "@webpack-cli/serve" "^1.4.0" + "@webpack-cli/configtest" "^1.0.4" + "@webpack-cli/info" "^1.3.0" + "@webpack-cli/serve" "^1.5.1" colorette "^1.2.1" commander "^7.0.0" execa "^5.0.0"