diff --git a/durablefunctionsmonitor-vscodeext/CHANGELOG.md b/durablefunctionsmonitor-vscodeext/CHANGELOG.md index 44da05d..332e70b 100644 --- a/durablefunctionsmonitor-vscodeext/CHANGELOG.md +++ b/durablefunctionsmonitor-vscodeext/CHANGELOG.md @@ -1,5 +1,9 @@ # Change Log +# Version 6.5.1 + +- Decoupled from (soon deprecated) [Azure Account extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode.azure-account). NOTE: you might need to re-authenticate to Azure. + # Version 6.5 - New feature - `Execute Batch Operations...` (https://github.com/microsoft/DurableFunctionsMonitor/issues/169). Prepare a list of instances in the main screen, and then use this context menu to execute operations against all of them: diff --git a/durablefunctionsmonitor-vscodeext/package-lock.json b/durablefunctionsmonitor-vscodeext/package-lock.json index bb6da90..512c2f5 100644 --- a/durablefunctionsmonitor-vscodeext/package-lock.json +++ b/durablefunctionsmonitor-vscodeext/package-lock.json @@ -1,17 +1,19 @@ { "name": "durablefunctionsmonitor", - "version": "6.4.1", + "version": "6.5.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "durablefunctionsmonitor", - "version": "6.4.1", + "version": "6.5.0", "license": "MIT", "dependencies": { "@azure/arm-resourcegraph": "^4.2.1", "@azure/arm-storage": "^18.1.0", + "@azure/identity": "^4.4.1", "@azure/ms-rest-nodeauth": "^3.1.0", + "@microsoft/vscode-azext-azureauth": "^2.5.0", "@types/crypto-js": "^3.1.47", "@types/rimraf": "^3.0.0", "axios": "1.6.2", @@ -64,6 +66,26 @@ "tslib": "^1.10.0" } }, + "node_modules/@azure/arm-resources-subscriptions": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@azure/arm-resources-subscriptions/-/arm-resources-subscriptions-2.1.0.tgz", + "integrity": "sha512-vKiu/3Yh84IV3IuJJ+0Fgs/ZQpvuGzoZ3dAoBksIV++Uu/Qz9RcQVz7pj+APWYIuODuR9I0eGKswZvzynzekug==", + "dependencies": { + "@azure/core-auth": "^1.3.0", + "@azure/core-client": "^1.7.0", + "@azure/core-paging": "^1.2.0", + "@azure/core-rest-pipeline": "^1.8.0", + "tslib": "^2.2.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@azure/arm-resources-subscriptions/node_modules/tslib": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", + "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==" + }, "node_modules/@azure/arm-storage": { "version": "18.1.0", "resolved": "https://registry.npmjs.org/@azure/arm-storage/-/arm-storage-18.1.0.tgz", @@ -87,9 +109,9 @@ "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==" }, "node_modules/@azure/core-auth": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/@azure/core-auth/-/core-auth-1.7.2.tgz", - "integrity": "sha512-Igm/S3fDYmnMq1uKS38Ae1/m37B3zigdlZw+kocwEhh5GjyKjPrXKO2J6rzpC1wAxrNil/jX9BJRqBshyjnF3g==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@azure/core-auth/-/core-auth-1.8.0.tgz", + "integrity": "sha512-YvFMowkXzLbXNM11yZtVLhUCmuG0ex7JKOH366ipjmHBhL3vpDcPAeWF+jf0X+jVXwFqo3UhsWUq4kH0ZPdu/g==", "dependencies": { "@azure/abort-controller": "^2.0.0", "@azure/core-util": "^1.1.0", @@ -116,26 +138,37 @@ "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, "node_modules/@azure/core-client": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/@azure/core-client/-/core-client-1.7.3.tgz", - "integrity": "sha512-kleJ1iUTxcO32Y06dH9Pfi9K4U+Tlb111WXEnbt7R/ne+NLRwppZiTGJuTD5VVoxTMK5NTbEtm5t2vcdNCFe2g==", + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/@azure/core-client/-/core-client-1.9.2.tgz", + "integrity": "sha512-kRdry/rav3fUKHl/aDLd/pDLcB+4pOFwPPTVEExuMyaI5r+JBbMWqRbCY1pn5BniDaU3lRxO9eaQ1AmSMehl/w==", "dependencies": { - "@azure/abort-controller": "^1.0.0", + "@azure/abort-controller": "^2.0.0", "@azure/core-auth": "^1.4.0", "@azure/core-rest-pipeline": "^1.9.1", "@azure/core-tracing": "^1.0.0", - "@azure/core-util": "^1.0.0", + "@azure/core-util": "^1.6.1", "@azure/logger": "^1.0.0", - "tslib": "^2.2.0" + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" + } + }, + "node_modules/@azure/core-client/node_modules/@azure/abort-controller": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-2.1.2.tgz", + "integrity": "sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, "node_modules/@azure/core-client/node_modules/tslib": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz", - "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==" + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", + "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==" }, "node_modules/@azure/core-lro": { "version": "2.5.3", @@ -173,62 +206,73 @@ "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==" }, "node_modules/@azure/core-rest-pipeline": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.11.0.tgz", - "integrity": "sha512-nB4KXl6qAyJmBVLWA7SakT4tzpYZTCk4pvRBeI+Ye0WYSOrlTqlMhc4MSS/8atD3ufeYWdkN380LLoXlUUzThw==", + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.17.0.tgz", + "integrity": "sha512-62Vv8nC+uPId3j86XJ0WI+sBf0jlqTqPUFCBNrGtlaUeQUIXWV/D8GE5A1d+Qx8H7OQojn2WguC8kChD6v0shA==", "dependencies": { - "@azure/abort-controller": "^1.0.0", - "@azure/core-auth": "^1.4.0", + "@azure/abort-controller": "^2.0.0", + "@azure/core-auth": "^1.8.0", "@azure/core-tracing": "^1.0.1", - "@azure/core-util": "^1.3.0", + "@azure/core-util": "^1.9.0", "@azure/logger": "^1.0.0", - "form-data": "^4.0.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "tslib": "^2.2.0" + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, - "node_modules/@azure/core-rest-pipeline/node_modules/@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "node_modules/@azure/core-rest-pipeline/node_modules/@azure/abort-controller": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-2.1.2.tgz", + "integrity": "sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA==", + "dependencies": { + "tslib": "^2.6.2" + }, "engines": { - "node": ">= 10" + "node": ">=18.0.0" } }, - "node_modules/@azure/core-rest-pipeline/node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "node_modules/@azure/core-rest-pipeline/node_modules/agent-base": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", + "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" + "debug": "^4.3.4" }, "engines": { - "node": ">= 6" + "node": ">= 14" } }, "node_modules/@azure/core-rest-pipeline/node_modules/http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@azure/core-rest-pipeline/node_modules/https-proxy-agent": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", + "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", + "dependencies": { + "agent-base": "^7.0.2", "debug": "4" }, "engines": { - "node": ">= 6" + "node": ">= 14" } }, "node_modules/@azure/core-rest-pipeline/node_modules/tslib": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz", - "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==" + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", + "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==" }, "node_modules/@azure/core-tracing": { "version": "1.0.1", @@ -247,37 +291,47 @@ "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==" }, "node_modules/@azure/core-util": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.3.2.tgz", - "integrity": "sha512-2bECOUh88RvL1pMZTcc6OzfobBeWDBf5oBbhjIhT1MV9otMVWCzpOJkkiKtrnO88y5GGBelgY8At73KGAdbkeQ==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.10.0.tgz", + "integrity": "sha512-dqLWQsh9Nro1YQU+405POVtXnwrIVqPyfUzc4zXCbThTg7+vNNaiMkwbX9AMXKyoFYFClxmB3s25ZFr3+jZkww==", "dependencies": { - "@azure/abort-controller": "^1.0.0", - "tslib": "^2.2.0" + "@azure/abort-controller": "^2.0.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" + } + }, + "node_modules/@azure/core-util/node_modules/@azure/abort-controller": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-2.1.2.tgz", + "integrity": "sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, "node_modules/@azure/core-util/node_modules/tslib": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz", - "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==" + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", + "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==" }, "node_modules/@azure/identity": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@azure/identity/-/identity-4.2.0.tgz", - "integrity": "sha512-ve3aYv79qXOJ8wRxQ5jO0eIz2DZ4o0TyME4m4vlGV5YyePddVZ+pFMzusAMODNAflYAAv1cBIhKnd4xytmXyig==", - "dev": true, + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@azure/identity/-/identity-4.4.1.tgz", + "integrity": "sha512-DwnG4cKFEM7S3T+9u05NstXU/HN0dk45kPOinUyNKsn5VWwpXd9sbPKEg6kgJzGbm1lMuhx9o31PVbCtM5sfBA==", "dependencies": { "@azure/abort-controller": "^1.0.0", "@azure/core-auth": "^1.5.0", - "@azure/core-client": "^1.4.0", + "@azure/core-client": "^1.9.2", "@azure/core-rest-pipeline": "^1.1.0", "@azure/core-tracing": "^1.0.0", "@azure/core-util": "^1.3.0", "@azure/logger": "^1.0.0", - "@azure/msal-browser": "^3.11.1", - "@azure/msal-node": "^2.6.6", + "@azure/msal-browser": "^3.14.0", + "@azure/msal-node": "^2.9.2", "events": "^3.0.0", "jws": "^4.0.0", "open": "^8.0.0", @@ -292,7 +346,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", - "dev": true, "dependencies": { "buffer-equal-constant-time": "1.0.1", "ecdsa-sig-formatter": "1.0.11", @@ -303,7 +356,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", - "dev": true, "dependencies": { "jwa": "^2.0.0", "safe-buffer": "^5.0.1" @@ -312,8 +364,7 @@ "node_modules/@azure/identity/node_modules/tslib": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", - "dev": true + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, "node_modules/@azure/logger": { "version": "1.0.4", @@ -387,7 +438,6 @@ "version": "3.14.0", "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-3.14.0.tgz", "integrity": "sha512-Un85LhOoecJ3HDTS3Uv3UWnXC9/43ZSO+Kc+anSqpZvcEt58SiO/3DuVCAe1A3I5UIBYJNMgTmZPGXQ0MVYrwA==", - "dev": true, "dependencies": { "@azure/msal-common": "14.10.0" }, @@ -399,18 +449,16 @@ "version": "14.10.0", "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-14.10.0.tgz", "integrity": "sha512-Zk6DPDz7e1wPgLoLgAp0349Yay9RvcjPM5We/ehuenDNsz/t9QEFI7tRoHpp/e47I4p20XE3FiDlhKwAo3utDA==", - "dev": true, "engines": { "node": ">=0.8.0" } }, "node_modules/@azure/msal-node": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-2.8.1.tgz", - "integrity": "sha512-VcZZM+5VvCWRBTOF7SxMKaxrz+EXjntx2u5AQe7QE06e6FuPJElGBrImgNgCh5QmFaNCfVFO+3qNR7UoFD/Gfw==", - "dev": true, + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-2.13.1.tgz", + "integrity": "sha512-sijfzPNorKt6+9g1/miHwhj6Iapff4mPQx1azmmZExgzUROqWTM1o3ACyxDja0g47VpowFy/sxTM/WsuCyXTiw==", "dependencies": { - "@azure/msal-common": "14.10.0", + "@azure/msal-common": "14.14.2", "jsonwebtoken": "^9.0.0", "uuid": "^8.3.0" }, @@ -418,6 +466,14 @@ "node": ">=16" } }, + "node_modules/@azure/msal-node/node_modules/@azure/msal-common": { + "version": "14.14.2", + "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-14.14.2.tgz", + "integrity": "sha512-XV0P5kSNwDwCA/SjIxTe9mEAsKB0NqGNSuaVrkCCE2lAyBr/D6YtD80Vkdp4tjWnPFwjzkwldjr1xU/facOJog==", + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/@babel/code-frame": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", @@ -524,6 +580,17 @@ "node": ">=4" } }, + "node_modules/@microsoft/vscode-azext-azureauth": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@microsoft/vscode-azext-azureauth/-/vscode-azext-azureauth-2.5.0.tgz", + "integrity": "sha512-5XZhKg5JJv74sVRurvtCbtBPqTnXcJ3H0+GyTYwFcrW4v5kedYiXHyZqvaRQ4p33/U4J1uwr9xQkaBVB+TjhPQ==", + "dependencies": { + "@azure/arm-resources-subscriptions": "^2.1.0", + "@azure/core-client": "^1.9.2", + "@azure/core-rest-pipeline": "^1.16.0", + "@azure/ms-rest-azure-env": "^2.0.0" + } + }, "node_modules/@tootallnate/once": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", @@ -858,6 +925,7 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, "dependencies": { "debug": "4" }, @@ -1319,11 +1387,11 @@ } }, "node_modules/debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -1334,11 +1402,6 @@ } } }, - "node_modules/debug/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, "node_modules/decamelize": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", @@ -1549,7 +1612,6 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true, "engines": { "node": ">=0.8.x" } @@ -1826,6 +1888,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, "dependencies": { "agent-base": "6", "debug": "4" @@ -2033,7 +2096,6 @@ "version": "9.0.2", "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", - "dev": true, "dependencies": { "jws": "^3.2.2", "lodash.includes": "^4.3.0", @@ -2052,10 +2114,9 @@ } }, "node_modules/jsonwebtoken/node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", - "dev": true, + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "bin": { "semver": "bin/semver.js" }, @@ -2186,14 +2247,12 @@ "node_modules/lodash.includes": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", - "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==", - "dev": true + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==" }, "node_modules/lodash.isboolean": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", - "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==", - "dev": true + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==" }, "node_modules/lodash.isfinite": { "version": "3.3.2", @@ -2203,32 +2262,27 @@ "node_modules/lodash.isinteger": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", - "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==", - "dev": true + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==" }, "node_modules/lodash.isnumber": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", - "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==", - "dev": true + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==" }, "node_modules/lodash.isplainobject": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", - "dev": true + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" }, "node_modules/lodash.isstring": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", - "dev": true + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==" }, "node_modules/lodash.once": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", - "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", - "dev": true + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==" }, "node_modules/log-symbols": { "version": "4.1.0", @@ -2489,8 +2543,7 @@ "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/mute-stream": { "version": "0.0.8", @@ -3047,7 +3100,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/stoppable/-/stoppable-1.1.0.tgz", "integrity": "sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==", - "dev": true, "engines": { "node": ">=4", "npm": ">=6" @@ -3586,6 +3638,25 @@ "tslib": "^1.10.0" } }, + "@azure/arm-resources-subscriptions": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@azure/arm-resources-subscriptions/-/arm-resources-subscriptions-2.1.0.tgz", + "integrity": "sha512-vKiu/3Yh84IV3IuJJ+0Fgs/ZQpvuGzoZ3dAoBksIV++Uu/Qz9RcQVz7pj+APWYIuODuR9I0eGKswZvzynzekug==", + "requires": { + "@azure/core-auth": "^1.3.0", + "@azure/core-client": "^1.7.0", + "@azure/core-paging": "^1.2.0", + "@azure/core-rest-pipeline": "^1.8.0", + "tslib": "^2.2.0" + }, + "dependencies": { + "tslib": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", + "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==" + } + } + }, "@azure/arm-storage": { "version": "18.1.0", "resolved": "https://registry.npmjs.org/@azure/arm-storage/-/arm-storage-18.1.0.tgz", @@ -3608,9 +3679,9 @@ } }, "@azure/core-auth": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/@azure/core-auth/-/core-auth-1.7.2.tgz", - "integrity": "sha512-Igm/S3fDYmnMq1uKS38Ae1/m37B3zigdlZw+kocwEhh5GjyKjPrXKO2J6rzpC1wAxrNil/jX9BJRqBshyjnF3g==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@azure/core-auth/-/core-auth-1.8.0.tgz", + "integrity": "sha512-YvFMowkXzLbXNM11yZtVLhUCmuG0ex7JKOH366ipjmHBhL3vpDcPAeWF+jf0X+jVXwFqo3UhsWUq4kH0ZPdu/g==", "requires": { "@azure/abort-controller": "^2.0.0", "@azure/core-util": "^1.1.0", @@ -3633,23 +3704,31 @@ } }, "@azure/core-client": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/@azure/core-client/-/core-client-1.7.3.tgz", - "integrity": "sha512-kleJ1iUTxcO32Y06dH9Pfi9K4U+Tlb111WXEnbt7R/ne+NLRwppZiTGJuTD5VVoxTMK5NTbEtm5t2vcdNCFe2g==", + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/@azure/core-client/-/core-client-1.9.2.tgz", + "integrity": "sha512-kRdry/rav3fUKHl/aDLd/pDLcB+4pOFwPPTVEExuMyaI5r+JBbMWqRbCY1pn5BniDaU3lRxO9eaQ1AmSMehl/w==", "requires": { - "@azure/abort-controller": "^1.0.0", + "@azure/abort-controller": "^2.0.0", "@azure/core-auth": "^1.4.0", "@azure/core-rest-pipeline": "^1.9.1", "@azure/core-tracing": "^1.0.0", - "@azure/core-util": "^1.0.0", + "@azure/core-util": "^1.6.1", "@azure/logger": "^1.0.0", - "tslib": "^2.2.0" + "tslib": "^2.6.2" }, "dependencies": { + "@azure/abort-controller": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-2.1.2.tgz", + "integrity": "sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA==", + "requires": { + "tslib": "^2.6.2" + } + }, "tslib": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz", - "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==" + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", + "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==" } } }, @@ -3687,50 +3766,58 @@ } }, "@azure/core-rest-pipeline": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.11.0.tgz", - "integrity": "sha512-nB4KXl6qAyJmBVLWA7SakT4tzpYZTCk4pvRBeI+Ye0WYSOrlTqlMhc4MSS/8atD3ufeYWdkN380LLoXlUUzThw==", + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.17.0.tgz", + "integrity": "sha512-62Vv8nC+uPId3j86XJ0WI+sBf0jlqTqPUFCBNrGtlaUeQUIXWV/D8GE5A1d+Qx8H7OQojn2WguC8kChD6v0shA==", "requires": { - "@azure/abort-controller": "^1.0.0", - "@azure/core-auth": "^1.4.0", + "@azure/abort-controller": "^2.0.0", + "@azure/core-auth": "^1.8.0", "@azure/core-tracing": "^1.0.1", - "@azure/core-util": "^1.3.0", + "@azure/core-util": "^1.9.0", "@azure/logger": "^1.0.0", - "form-data": "^4.0.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "tslib": "^2.2.0" + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.0", + "tslib": "^2.6.2" }, "dependencies": { - "@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==" + "@azure/abort-controller": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-2.1.2.tgz", + "integrity": "sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA==", + "requires": { + "tslib": "^2.6.2" + } }, - "form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "agent-base": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", + "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" + "debug": "^4.3.4" } }, "http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", "requires": { - "@tootallnate/once": "2", - "agent-base": "6", + "agent-base": "^7.1.0", + "debug": "^4.3.4" + } + }, + "https-proxy-agent": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", + "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", + "requires": { + "agent-base": "^7.0.2", "debug": "4" } }, "tslib": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz", - "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==" + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", + "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==" } } }, @@ -3750,36 +3837,43 @@ } }, "@azure/core-util": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.3.2.tgz", - "integrity": "sha512-2bECOUh88RvL1pMZTcc6OzfobBeWDBf5oBbhjIhT1MV9otMVWCzpOJkkiKtrnO88y5GGBelgY8At73KGAdbkeQ==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.10.0.tgz", + "integrity": "sha512-dqLWQsh9Nro1YQU+405POVtXnwrIVqPyfUzc4zXCbThTg7+vNNaiMkwbX9AMXKyoFYFClxmB3s25ZFr3+jZkww==", "requires": { - "@azure/abort-controller": "^1.0.0", - "tslib": "^2.2.0" + "@azure/abort-controller": "^2.0.0", + "tslib": "^2.6.2" }, "dependencies": { + "@azure/abort-controller": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-2.1.2.tgz", + "integrity": "sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA==", + "requires": { + "tslib": "^2.6.2" + } + }, "tslib": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz", - "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==" + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", + "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==" } } }, "@azure/identity": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@azure/identity/-/identity-4.2.0.tgz", - "integrity": "sha512-ve3aYv79qXOJ8wRxQ5jO0eIz2DZ4o0TyME4m4vlGV5YyePddVZ+pFMzusAMODNAflYAAv1cBIhKnd4xytmXyig==", - "dev": true, + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@azure/identity/-/identity-4.4.1.tgz", + "integrity": "sha512-DwnG4cKFEM7S3T+9u05NstXU/HN0dk45kPOinUyNKsn5VWwpXd9sbPKEg6kgJzGbm1lMuhx9o31PVbCtM5sfBA==", "requires": { "@azure/abort-controller": "^1.0.0", "@azure/core-auth": "^1.5.0", - "@azure/core-client": "^1.4.0", + "@azure/core-client": "^1.9.2", "@azure/core-rest-pipeline": "^1.1.0", "@azure/core-tracing": "^1.0.0", "@azure/core-util": "^1.3.0", "@azure/logger": "^1.0.0", - "@azure/msal-browser": "^3.11.1", - "@azure/msal-node": "^2.6.6", + "@azure/msal-browser": "^3.14.0", + "@azure/msal-node": "^2.9.2", "events": "^3.0.0", "jws": "^4.0.0", "open": "^8.0.0", @@ -3791,7 +3885,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", - "dev": true, "requires": { "buffer-equal-constant-time": "1.0.1", "ecdsa-sig-formatter": "1.0.11", @@ -3802,7 +3895,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", - "dev": true, "requires": { "jwa": "^2.0.0", "safe-buffer": "^5.0.1" @@ -3811,8 +3903,7 @@ "tslib": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", - "dev": true + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" } } }, @@ -3886,7 +3977,6 @@ "version": "3.14.0", "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-3.14.0.tgz", "integrity": "sha512-Un85LhOoecJ3HDTS3Uv3UWnXC9/43ZSO+Kc+anSqpZvcEt58SiO/3DuVCAe1A3I5UIBYJNMgTmZPGXQ0MVYrwA==", - "dev": true, "requires": { "@azure/msal-common": "14.10.0" } @@ -3894,18 +3984,23 @@ "@azure/msal-common": { "version": "14.10.0", "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-14.10.0.tgz", - "integrity": "sha512-Zk6DPDz7e1wPgLoLgAp0349Yay9RvcjPM5We/ehuenDNsz/t9QEFI7tRoHpp/e47I4p20XE3FiDlhKwAo3utDA==", - "dev": true + "integrity": "sha512-Zk6DPDz7e1wPgLoLgAp0349Yay9RvcjPM5We/ehuenDNsz/t9QEFI7tRoHpp/e47I4p20XE3FiDlhKwAo3utDA==" }, "@azure/msal-node": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-2.8.1.tgz", - "integrity": "sha512-VcZZM+5VvCWRBTOF7SxMKaxrz+EXjntx2u5AQe7QE06e6FuPJElGBrImgNgCh5QmFaNCfVFO+3qNR7UoFD/Gfw==", - "dev": true, + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-2.13.1.tgz", + "integrity": "sha512-sijfzPNorKt6+9g1/miHwhj6Iapff4mPQx1azmmZExgzUROqWTM1o3ACyxDja0g47VpowFy/sxTM/WsuCyXTiw==", "requires": { - "@azure/msal-common": "14.10.0", + "@azure/msal-common": "14.14.2", "jsonwebtoken": "^9.0.0", "uuid": "^8.3.0" + }, + "dependencies": { + "@azure/msal-common": { + "version": "14.14.2", + "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-14.14.2.tgz", + "integrity": "sha512-XV0P5kSNwDwCA/SjIxTe9mEAsKB0NqGNSuaVrkCCE2lAyBr/D6YtD80Vkdp4tjWnPFwjzkwldjr1xU/facOJog==" + } } }, "@babel/code-frame": { @@ -3992,6 +4087,17 @@ } } }, + "@microsoft/vscode-azext-azureauth": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@microsoft/vscode-azext-azureauth/-/vscode-azext-azureauth-2.5.0.tgz", + "integrity": "sha512-5XZhKg5JJv74sVRurvtCbtBPqTnXcJ3H0+GyTYwFcrW4v5kedYiXHyZqvaRQ4p33/U4J1uwr9xQkaBVB+TjhPQ==", + "requires": { + "@azure/arm-resources-subscriptions": "^2.1.0", + "@azure/core-client": "^1.9.2", + "@azure/core-rest-pipeline": "^1.16.0", + "@azure/ms-rest-azure-env": "^2.0.0" + } + }, "@tootallnate/once": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", @@ -4270,6 +4376,7 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, "requires": { "debug": "4" } @@ -4615,18 +4722,11 @@ "integrity": "sha512-wJMBjqlwXR0Iv0wUo/lFbhSQ7MmG1hl36iuxuE91kW+5b5sWbase73manEqNH9sOLFAMG83B4ffNKq9/Iq0FVA==" }, "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", "requires": { - "ms": "2.1.2" - }, - "dependencies": { - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - } + "ms": "^2.1.3" } }, "decamelize": { @@ -4768,8 +4868,7 @@ "events": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==" }, "expand-template": { "version": "2.0.3", @@ -4961,6 +5060,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, "requires": { "agent-base": "6", "debug": "4" @@ -5109,7 +5209,6 @@ "version": "9.0.2", "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", - "dev": true, "requires": { "jws": "^3.2.2", "lodash.includes": "^4.3.0", @@ -5124,10 +5223,9 @@ }, "dependencies": { "semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", - "dev": true + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==" } } }, @@ -5246,14 +5344,12 @@ "lodash.includes": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", - "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==", - "dev": true + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==" }, "lodash.isboolean": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", - "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==", - "dev": true + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==" }, "lodash.isfinite": { "version": "3.3.2", @@ -5263,32 +5359,27 @@ "lodash.isinteger": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", - "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==", - "dev": true + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==" }, "lodash.isnumber": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", - "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==", - "dev": true + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==" }, "lodash.isplainobject": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", - "dev": true + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" }, "lodash.isstring": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", - "dev": true + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==" }, "lodash.once": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", - "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", - "dev": true + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==" }, "log-symbols": { "version": "4.1.0", @@ -5489,8 +5580,7 @@ "ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "mute-stream": { "version": "0.0.8", @@ -5885,8 +5975,7 @@ "stoppable": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/stoppable/-/stoppable-1.1.0.tgz", - "integrity": "sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==", - "dev": true + "integrity": "sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==" }, "string_decoder": { "version": "1.3.0", diff --git a/durablefunctionsmonitor-vscodeext/package.json b/durablefunctionsmonitor-vscodeext/package.json index a4be515..532873a 100644 --- a/durablefunctionsmonitor-vscodeext/package.json +++ b/durablefunctionsmonitor-vscodeext/package.json @@ -2,7 +2,7 @@ "name": "durablefunctionsmonitor", "displayName": "Durable Functions Monitor", "description": "Monitoring/debugging UI tool for Azure Durable Functions", - "version": "6.5.0", + "version": "6.5.1", "engines": { "vscode": "^1.39.0" }, @@ -30,13 +30,13 @@ "license": "MIT", "activationEvents": [ "onView:durableFunctionsMonitorTreeView", - "onCommand:extension.durableFunctionsMonitor", - "onCommand:extension.durableFunctionsMonitorPurgeHistory", - "onCommand:extension.durableFunctionsMonitorCleanEntityStorage", - "onCommand:extension.durableFunctionsMonitorBatchOps", + "onCommand:durable-functions-monitor.durableFunctionsMonitor", + "onCommand:durable-functions-monitor.durableFunctionsMonitorPurgeHistory", + "onCommand:durable-functions-monitor.durableFunctionsMonitorCleanEntityStorage", + "onCommand:durable-functions-monitor.durableFunctionsMonitorBatchOps", "onCommand:durableFunctionsMonitorTreeView.attachToAnotherTaskHub", - "onCommand:extension.durableFunctionsMonitorGotoInstanceId", - "onCommand:extension.durableFunctionsMonitorVisualizeAsGraph", + "onCommand:durable-functions-monitor.durableFunctionsMonitorGotoInstanceId", + "onCommand:durable-functions-monitor.durableFunctionsMonitorVisualizeAsGraph", "onCommand:durableFunctionsMonitorTreeView.startNewInstance", "onDebug" ], @@ -52,27 +52,31 @@ }, "commands": [ { - "command": "extension.durableFunctionsMonitor", + "command": "durable-functions-monitor.signInToAzure", + "title": "Sign in to Azure..." + }, + { + "command": "durable-functions-monitor.durableFunctionsMonitor", "title": "Durable Functions Monitor" }, { - "command": "extension.durableFunctionsMonitorPurgeHistory", + "command": "durable-functions-monitor.durableFunctionsMonitorPurgeHistory", "title": "Durable Functions Monitor: Purge History..." }, { - "command": "extension.durableFunctionsMonitorCleanEntityStorage", + "command": "durable-functions-monitor.durableFunctionsMonitorCleanEntityStorage", "title": "Durable Functions Monitor: Clean Entity Storage..." }, { - "command": "extension.durableFunctionsMonitorBatchOps", + "command": "durable-functions-monitor.durableFunctionsMonitorBatchOps", "title": "Durable Functions Monitor: Execute Batch Operations..." }, { - "command": "extension.durableFunctionsMonitorGotoInstanceId", + "command": "durable-functions-monitor.durableFunctionsMonitorGotoInstanceId", "title": "Durable Functions Monitor: Go to instanceId..." }, { - "command": "extension.durableFunctionsMonitorVisualizeAsGraph", + "command": "durable-functions-monitor.durableFunctionsMonitorVisualizeAsGraph", "title": "Visualize Functions as a Graph..." }, { @@ -147,32 +151,32 @@ "menus": { "explorer/context": [ { - "command": "extension.durableFunctionsMonitor", + "command": "durable-functions-monitor.durableFunctionsMonitor", "when": "resourceFilename == host.json", "group": "DurableFunctionMonitorGroup@1" }, { - "command": "extension.durableFunctionsMonitorPurgeHistory", + "command": "durable-functions-monitor.durableFunctionsMonitorPurgeHistory", "when": "resourceFilename == host.json", "group": "DurableFunctionMonitorGroup@2" }, { - "command": "extension.durableFunctionsMonitorCleanEntityStorage", + "command": "durable-functions-monitor.durableFunctionsMonitorCleanEntityStorage", "when": "resourceFilename == host.json", "group": "DurableFunctionMonitorGroup@3" }, { - "command": "extension.durableFunctionsMonitorBatchOps", + "command": "durable-functions-monitor.durableFunctionsMonitorBatchOps", "when": "resourceFilename == host.json", "group": "DurableFunctionMonitorGroup@4" }, { - "command": "extension.durableFunctionsMonitorGotoInstanceId", + "command": "durable-functions-monitor.durableFunctionsMonitorGotoInstanceId", "when": "resourceFilename == host.json", "group": "DurableFunctionMonitorGroup@5" }, { - "command": "extension.durableFunctionsMonitorVisualizeAsGraph", + "command": "durable-functions-monitor.durableFunctionsMonitorVisualizeAsGraph", "when": "resourceFilename == host.json", "group": "DurableFunctionMonitorGroup@6" } @@ -341,16 +345,18 @@ "@types/node": "^14.6.4", "@types/vscode": "^1.39.0", "@vscode/test-electron": "^2.3.5", + "@vscode/vsce": "^2.26.1", "glob": "^7.1.4", "mocha": "^10.0.0", "tslint": "^5.12.1", - "typescript": "^4.4.4", - "@vscode/vsce": "^2.26.1" + "typescript": "^4.4.4" }, "dependencies": { "@azure/arm-resourcegraph": "^4.2.1", "@azure/arm-storage": "^18.1.0", + "@azure/identity": "^4.4.1", "@azure/ms-rest-nodeauth": "^3.1.0", + "@microsoft/vscode-azext-azureauth": "^2.5.0", "@types/crypto-js": "^3.1.47", "@types/rimraf": "^3.0.0", "axios": "1.6.2", @@ -360,7 +366,5 @@ "portscanner": "^2.2.0", "rimraf": "^3.0.2" }, - "extensionDependencies": [ - "ms-vscode.azure-account" - ] + "extensionDependencies": [] } diff --git a/durablefunctionsmonitor-vscodeext/src/ConnStringUtils.ts b/durablefunctionsmonitor-vscodeext/src/ConnStringUtils.ts index 5aa4a0c..5abecd0 100644 --- a/durablefunctionsmonitor-vscodeext/src/ConnStringUtils.ts +++ b/durablefunctionsmonitor-vscodeext/src/ConnStringUtils.ts @@ -4,7 +4,7 @@ import { StorageAccount } from '@azure/arm-storage'; import { Settings } from './Settings'; import { ResourceGraphClient } from '@azure/arm-resourcegraph'; -import { DeviceTokenCredentials } from '@azure/ms-rest-nodeauth'; +import { TokenCredential } from '@azure/identity'; export class ConnStringUtils { @@ -105,7 +105,7 @@ export class ConnStringUtils { } // Queries Azure Resource Manager API for the list of resources of a given type - static async getAzureResources(creds: DeviceTokenCredentials, subscriptionId: string, resourceType: string, resourceName?: string): Promise{ + static async getAzureResources(creds: TokenCredential, subscriptionId: string, resourceType: string, resourceName?: string): Promise{ const resourceGraphClient = new ResourceGraphClient(creds); const response = await resourceGraphClient.resources({ @@ -115,14 +115,4 @@ export class ConnStringUtils { return response.data ?? []; } - - // Polyfills ADAL's and MSAL's getToken() - static async getAccessTokenForAzureResourceManager(creds: any): Promise{ - - const tokenWrapper = await creds.getToken(); - // Depending on whether ADAL or MSAL is used, the field is called either 'accessToken' or 'token' - const accessToken = tokenWrapper.accessToken ?? tokenWrapper.token; - - return accessToken; - } } \ No newline at end of file diff --git a/durablefunctionsmonitor-vscodeext/src/EventHubPicker.ts b/durablefunctionsmonitor-vscodeext/src/EventHubPicker.ts index 7a5d930..90fd0ef 100644 --- a/durablefunctionsmonitor-vscodeext/src/EventHubPicker.ts +++ b/durablefunctionsmonitor-vscodeext/src/EventHubPicker.ts @@ -3,10 +3,9 @@ import * as vscode from 'vscode'; import axios from 'axios'; -import { ConnStringUtils } from './ConnStringUtils'; +import { AzureSubscription } from '@microsoft/vscode-azext-azureauth'; -// Full typings for this can be found here: https://github.com/microsoft/vscode-azure-account/blob/master/src/azure-account.api.d.ts -export type AzureSubscription = { session: { credentials2: any }, subscription: { subscriptionId: string, displayName: string } }; +import { ConnStringUtils } from './ConnStringUtils'; export class EventHubPicker { @@ -15,9 +14,8 @@ export class EventHubPicker { // Asks user to choose an Event Hub connection string async pickEventHubConnectionString(subscription: AzureSubscription): Promise { - // Depending on whether ADAL or MSAL is used, this will contain either DeviceTokenCredentials or TokenCredential - const creds: any = subscription.session.credentials2; - const subscriptionId = subscription.subscription.subscriptionId; + const creds = subscription.credential; + const subscriptionId = subscription.subscriptionId; const namespaces = await ConnStringUtils.getAzureResources( creds, @@ -46,7 +44,7 @@ export class EventHubPicker { return; } - const accessToken = await ConnStringUtils.getAccessTokenForAzureResourceManager(creds); + const accessToken = (await creds.getToken(['https://management.core.windows.net/user_impersonation']))!.token; let authRule: string | undefined = ''; diff --git a/durablefunctionsmonitor-vscodeext/src/MonitorTreeDataProvider.ts b/durablefunctionsmonitor-vscodeext/src/MonitorTreeDataProvider.ts index 7896383..108670d 100644 --- a/durablefunctionsmonitor-vscodeext/src/MonitorTreeDataProvider.ts +++ b/durablefunctionsmonitor-vscodeext/src/MonitorTreeDataProvider.ts @@ -6,8 +6,9 @@ import * as fs from 'fs'; import * as path from 'path'; import { StorageManagementClient } from '@azure/arm-storage'; import { StorageAccount, StorageAccountKey } from '@azure/arm-storage/src/models'; +import { VSCodeAzureSubscriptionProvider, AzureSubscription } from '@microsoft/vscode-azext-azureauth'; -import { AzureConnectionInfo, MonitorView } from './MonitorView'; +import { MonitorView } from './MonitorView'; import { MonitorViewList } from './MonitorViewList'; import { FunctionGraphList } from './FunctionGraphList'; import { Settings, UpdateSetting } from './Settings'; @@ -15,21 +16,19 @@ import { StorageConnectionSettings } from './StorageConnectionSettings'; import { ConnStringUtils } from './ConnStringUtils'; import { ConnStringRepository } from './ConnStringRepository'; import { StorageType, TaskHubsCollector } from './TaskHubsCollector'; -import { AzureSubscription, EventHubPicker } from './EventHubPicker'; +import { EventHubPicker } from './EventHubPicker'; // Root object in the hierarchy. Also serves data for the TreeView. export class MonitorTreeDataProvider implements vscode.TreeDataProvider { - constructor(private _context: vscode.ExtensionContext, functionGraphList: FunctionGraphList, logChannel?: vscode.OutputChannel) { + constructor( + private _azureProvider: VSCodeAzureSubscriptionProvider, + private _context: vscode.ExtensionContext, + functionGraphList: FunctionGraphList, + logChannel?: vscode.OutputChannel) { this._log = !logChannel ? () => { } : (l) => logChannel.append(l); - // Using Azure Account extension to connect to Azure, get subscriptions etc. - const azureAccountExtension = vscode.extensions.getExtension('ms-vscode.azure-account'); - - // Typings for azureAccount are here: https://github.com/microsoft/vscode-azure-account/blob/master/src/azure-account.api.d.ts - this._azureAccount = !!azureAccountExtension ? azureAccountExtension.exports : undefined; - this._connStringRepo = new ConnStringRepository(this._context); this._monitorViews = new MonitorViewList(this._context, @@ -40,31 +39,6 @@ export class MonitorTreeDataProvider implements vscode.TreeDataProvider this.refresh())); - } - - if (!!this._azureAccount.onFiltersChanged) { - - this._context.subscriptions.push(this._azureAccount.onFiltersChanged(() => this.refresh())); - } - - if (!!this._azureAccount.onSessionsChanged) { - - this._context.subscriptions.push(this._azureAccount.onSessionsChanged(() => this.refresh())); - } - - if (!!this._azureAccount.onSubscriptionsChanged) { - - this._context.subscriptions.push(this._azureAccount.onSubscriptionsChanged(() => this.refresh())); - } - } this._eventHubPicker = new EventHubPicker(this._log); } @@ -132,27 +106,29 @@ export class MonitorTreeDataProvider implements vscode.TreeDataProvider { // Caching storage accounts, to speed up refresh - let result = this._storageAccountMap[subscription.subscription.subscriptionId]; + let result = this._storageAccountMap[subscription.subscriptionId]; if (!!result) { return result; } result = []; - const storageManagementClient = new StorageManagementClient(subscription.session.credentials2, subscription!.subscription.subscriptionId); + const storageManagementClient = new StorageManagementClient(subscription.credential, subscription.subscriptionId); const storageAccounts = await this.fetchAllStorageAccounts(storageManagementClient); @@ -852,7 +827,7 @@ export class MonitorTreeDataProvider implements vscode.TreeDataProvider { + private async getTokenCredentialsForGivenConnectionString(connString: string): Promise { const storageAccountName = ConnStringUtils.GetAccountName(connString); if (!storageAccountName) { return; } - for (const subscription of this._azureAccount.filters) { + const subscriptions = await this._azureProvider.getSubscriptions(true); + for (const subscription of subscriptions) { const storageAccounts = await this.getStorageAccountsAndTaskHubs(subscription); @@ -905,11 +881,7 @@ export class MonitorTreeDataProvider implements vscode.TreeDataProvider Promise, + private _getTokenCredentialsForGivenConnectionString: (connString: string) => Promise, private _onViewStatusChanged: () => void, private _log: (line: string) => void, private _functionProjectPath?: string @@ -562,9 +560,9 @@ export class MonitorView } } - private async navigateToStorageBlob(creds: AzureConnectionInfo, storageAccountName: string, blobPath: string): Promise { + private async navigateToStorageBlob(subscription: AzureSubscription, storageAccountName: string, blobPath: string): Promise { - const storageAccounts = await ConnStringUtils.getAzureResources(creds.credentials, creds.subscriptionId, 'microsoft.storage/storageaccounts', storageAccountName?.toLowerCase()) as { id: string }[]; + const storageAccounts = await ConnStringUtils.getAzureResources(subscription.credential, subscription.subscriptionId, 'microsoft.storage/storageaccounts', storageAccountName?.toLowerCase()) as { id: string }[]; if (storageAccounts.length !== 1) { return; } @@ -574,9 +572,9 @@ export class MonitorView await open(portalUrl); } - private async navigateToStorageQueue(creds: AzureConnectionInfo, storageAccountName: string, queueName: string): Promise { + private async navigateToStorageQueue(subscription: AzureSubscription, storageAccountName: string, queueName: string): Promise { - const storageAccounts = await ConnStringUtils.getAzureResources(creds.credentials, creds.subscriptionId, 'microsoft.storage/storageaccounts', storageAccountName?.toLowerCase()) as { id: string }[]; + const storageAccounts = await ConnStringUtils.getAzureResources(subscription.credential, subscription.subscriptionId, 'microsoft.storage/storageaccounts', storageAccountName?.toLowerCase()) as { id: string }[]; if (storageAccounts.length !== 1) { return; } @@ -586,9 +584,9 @@ export class MonitorView await open(portalUrl); } - private async navigateToStorageTable(creds: AzureConnectionInfo, storageAccountName: string, tableName: string): Promise { + private async navigateToStorageTable(subscription: AzureSubscription, storageAccountName: string, tableName: string): Promise { - const storageAccounts = await ConnStringUtils.getAzureResources(creds.credentials, creds.subscriptionId, 'microsoft.storage/storageaccounts', storageAccountName?.toLowerCase()) as { id: string }[]; + const storageAccounts = await ConnStringUtils.getAzureResources(subscription.credential, subscription.subscriptionId, 'microsoft.storage/storageaccounts', storageAccountName?.toLowerCase()) as { id: string }[]; if (storageAccounts.length !== 1) { return; } @@ -608,26 +606,26 @@ export class MonitorView root: { storageAccountId: storageAccounts[0].id, // This works with older versions of Azure Storage ext - subscriptionId: creds.subscriptionId + subscriptionId: subscription.subscriptionId }, subscription: { // This works with newer versions of Azure Storage ext - subscriptionId: creds.subscriptionId + subscriptionId: subscription.subscriptionId }, tableName }); } - private async navigateToServiceBusQueueOrTopic(creds: AzureConnectionInfo, queueOrTopicName: string): Promise { + private async navigateToServiceBusQueueOrTopic(subscription: AzureSubscription, queueOrTopicName: string): Promise { - const namespaces = await ConnStringUtils.getAzureResources(creds.credentials, creds.subscriptionId, 'microsoft.servicebus/namespaces') as { id: string, name: string, sku: any, location: string }[]; + const namespaces = await ConnStringUtils.getAzureResources(subscription.credential, subscription.subscriptionId, 'microsoft.servicebus/namespaces') as { id: string, name: string, sku: any, location: string }[]; if (!namespaces.length) { return; } - const accessToken = await ConnStringUtils.getAccessTokenForAzureResourceManager(creds.credentials); + const accessToken = (await subscription.credential.getToken(['https://management.core.windows.net/user_impersonation']))!.token; const promises = namespaces.map(async ns => { @@ -684,19 +682,19 @@ export class MonitorView } const resourceId = namespace.matchedQueueId ?? namespace.matchedTopicId; - const portalUrl = `https://ms.portal.azure.com/#@${creds.tenantId}/resource/${resourceId}`; + const portalUrl = `https://ms.portal.azure.com/#@${subscription.tenantId}/resource/${resourceId}`; await open(portalUrl); } - private async navigateToEventHub(creds: AzureConnectionInfo, hubName: string): Promise { + private async navigateToEventHub(subscription: AzureSubscription, hubName: string): Promise { - const namespaces = await ConnStringUtils.getAzureResources(creds.credentials, creds.subscriptionId, 'microsoft.eventhub/namespaces') as { id: string, name: string, sku: any, location: string }[]; + const namespaces = await ConnStringUtils.getAzureResources(subscription.credential, subscription.subscriptionId, 'microsoft.eventhub/namespaces') as { id: string, name: string, sku: any, location: string }[]; if (!namespaces.length) { return; } - const accessToken = await ConnStringUtils.getAccessTokenForAzureResourceManager(creds.credentials); + const accessToken = await subscription.credential.getToken(['https://management.core.windows.net/user_impersonation']); const promises = namespaces.map(async ns => { @@ -745,7 +743,7 @@ export class MonitorView return; } - const portalUrl = `https://ms.portal.azure.com/#@${creds.tenantId}/resource/${namespace.matchedHubId}`; + const portalUrl = `https://ms.portal.azure.com/#@${subscription.tenantId}/resource/${namespace.matchedHubId}`; await open(portalUrl); } diff --git a/durablefunctionsmonitor-vscodeext/src/MonitorViewList.ts b/durablefunctionsmonitor-vscodeext/src/MonitorViewList.ts index 97e8d6b..47ede07 100644 --- a/durablefunctionsmonitor-vscodeext/src/MonitorViewList.ts +++ b/durablefunctionsmonitor-vscodeext/src/MonitorViewList.ts @@ -7,12 +7,13 @@ import * as path from 'path'; import { ConnStringUtils } from "./ConnStringUtils"; -import { AzureConnectionInfo, MonitorView } from "./MonitorView"; +import { MonitorView } from "./MonitorView"; import { BackendProcess } from './BackendProcess'; import { StorageConnectionSettings } from "./StorageConnectionSettings"; import { FunctionGraphList } from './FunctionGraphList'; import { ConnStringRepository } from './ConnStringRepository'; import { TaskHubsCollector } from './TaskHubsCollector'; +import { AzureSubscription } from '@microsoft/vscode-azext-azureauth'; type HostJsonInfo = { hubName?: string, @@ -28,7 +29,7 @@ export class MonitorViewList { constructor(private _context: vscode.ExtensionContext, private _functionGraphList: FunctionGraphList, private _connStringRepo: ConnStringRepository, - private _getTokenCredentialsForGivenConnectionString: (connString: string) => Promise, + private _getTokenCredentialsForGivenConnectionString: (connString: string) => Promise, private _onViewStatusChanged: () => void, private _log: (line: string) => void) { } diff --git a/durablefunctionsmonitor-vscodeext/src/TaskHubsCollector.ts b/durablefunctionsmonitor-vscodeext/src/TaskHubsCollector.ts index 8b0b59a..631f79c 100644 --- a/durablefunctionsmonitor-vscodeext/src/TaskHubsCollector.ts +++ b/durablefunctionsmonitor-vscodeext/src/TaskHubsCollector.ts @@ -1,12 +1,12 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT license. +import * as vscode from 'vscode'; import axios from 'axios'; import * as CryptoJS from 'crypto-js'; -import { Environment } from '@azure/ms-rest-azure-env'; -import { TokenResponse } from 'adal-node'; -import { DeviceTokenCredentials } from '@azure/ms-rest-nodeauth'; +import { TokenCredential } from '@azure/identity'; +import { AzureSubscription } from '@microsoft/vscode-azext-azureauth'; export type StorageType = 'default' | 'netherite'; @@ -42,10 +42,10 @@ export class TaskHubsCollector { return { hubNames: defaultHubs ?? [], storageType: 'default' }; } - async getTaskHubNamesWithUserToken(tokenCredential: any): Promise<{ hubNames: string[], storageType: StorageType }> { + async getTaskHubNamesWithUserToken(azureSubscription: AzureSubscription): Promise<{ hubNames: string[], storageType: StorageType }> { - const netheriteHubsPromise = this.getTaskHubNamesFromNetheriteStorageWithUserToken(tokenCredential); - const defaultHubsPromise = this.getTaskHubNamesFromTableStorageWithUserToken(tokenCredential); + const netheriteHubsPromise = this.getTaskHubNamesFromNetheriteStorageWithUserToken(azureSubscription); + const defaultHubsPromise = this.getTaskHubNamesFromTableStorageWithUserToken(azureSubscription); const netheriteHubs = await netheriteHubsPromise; @@ -64,9 +64,9 @@ export class TaskHubsCollector { return this.getTaskHubNamesFromTableStorage(this.CreateAuthHeadersForTableStorage(this._accountName, accountKey, this._tableEndpointUrl)); } - async getTaskHubNamesFromTableStorageWithUserToken(tokenCredential: any): Promise { + async getTaskHubNamesFromTableStorageWithUserToken(azureSubscription: AzureSubscription): Promise { - return this.getTaskHubNamesFromTableStorage(await this.CreateIdentityBasedAuthHeadersForTableStorage(tokenCredential)); + return this.getTaskHubNamesFromTableStorage(await this.CreateIdentityBasedAuthHeadersForTableStorage(azureSubscription)); } async getTaskHubNamesFromNetheriteStorageWithKey(accountKey: string): Promise { @@ -74,9 +74,9 @@ export class TaskHubsCollector { return this.getTaskHubNamesFromNetheriteStorage(this.CreateAuthHeadersForTableStorage(this._accountName, accountKey, this._tableEndpointUrl, `DurableTaskPartitions()`)); } - async getTaskHubNamesFromNetheriteStorageWithUserToken(tokenCredential: any): Promise { + async getTaskHubNamesFromNetheriteStorageWithUserToken(azureSubscription: AzureSubscription): Promise { - return this.getTaskHubNamesFromNetheriteStorage(await this.CreateIdentityBasedAuthHeadersForTableStorage(tokenCredential)); + return this.getTaskHubNamesFromNetheriteStorage(await this.CreateIdentityBasedAuthHeadersForTableStorage(azureSubscription)); } private readonly _tableEndpointUrl: string; @@ -171,48 +171,30 @@ export class TaskHubsCollector { } // Creates a user-specific access token for accessing Storage, also adds other needed headers - private async CreateIdentityBasedAuthHeadersForTableStorage(tokenCredential: any): Promise<{}> { + private async CreateIdentityBasedAuthHeadersForTableStorage(azureSubscription: AzureSubscription): Promise<{}> { - let token = ''; + // Looks like azureSubscription.credential.getToken(scopes) does not respect scopes (getting a token with default 'https://management.core.windows.net' audience instead of Storage-specific scope) + // Issue: https://github.com/microsoft/vscode-azuretools/issues/1596 + // So will have to use vscode.authentication directly - if (!tokenCredential.environment && !tokenCredential.clientId && !tokenCredential.username) { + const providerId = 'microsoft'; - // It looks like MSAL is being used + const scopes = [ + 'https://storage.azure.com/user_impersonation', + `VSCODE_TENANT:${azureSubscription.tenantId}` + ]; - const scope = 'https://storage.azure.com/user_impersonation'; - - token = (await tokenCredential.getToken(scope)).token; - - } else { - - // It looks like ADAL is being used - - // The default resourceId ('https://management.core.windows.net/') doesn't work for Storage. - // So we need to replace it with the proper one. - const storageResourceId = 'https://storage.azure.com'; - - const environment = tokenCredential.environment; + // First trying silent mode + let authSession = await vscode.authentication.getSession(providerId, scopes, { silent: true }); - const credentials = new SequentialDeviceTokenCredentials( - - tokenCredential.clientId, - tokenCredential.domain, - tokenCredential.username, - tokenCredential.tokenAudience, - new Environment({ - name: environment.name, - portalUrl: environment.portalUrl, - managementEndpointUrl: environment.managementEndpointUrl, - resourceManagerEndpointUrl: environment.resourceManagerEndpointUrl, - activeDirectoryEndpointUrl: environment.activeDirectoryEndpointUrl, - activeDirectoryResourceId: storageResourceId - }), - tokenCredential.tokenCache - ); - - token = (await credentials.getToken()).accessToken; + if (!authSession) { + + // Now asking to authenticate, if needed + authSession = await vscode.authentication.getSession(providerId, scopes, { createIfNone: true }); } + const token = authSession.accessToken; + const dateInUtc = new Date().toUTCString(); return { @@ -222,27 +204,4 @@ export class TaskHubsCollector { 'Accept': 'application/json;odata=nometadata' }; } -} - -// Parallel execution of super.getToken() leads to https://github.com/microsoft/vscode-azure-account/issues/53 -// Therefore we need to make sure the super.getToken() is always invoked sequentially, and we're doing that -// with this simple Active Object pattern implementation -export class SequentialDeviceTokenCredentials extends DeviceTokenCredentials { - - public getToken(): Promise { - - return SequentialDeviceTokenCredentials.executeSequentially(() => super.getToken()); - } - - private static _workQueue: Promise = Promise.resolve(); - - private static executeSequentially(action: () => Promise): Promise { - - // What goes to _workQueue should never throw (otherwise that exception will always get re-thrown later). - // That's why we wrap it all with a new Promise(). This promise will resolve only _after_ action completes (or fails). - return new Promise((resolve, reject) => { - - this._workQueue = this._workQueue.then(() => action().then(resolve, reject)); - }); - } -} +} \ No newline at end of file diff --git a/durablefunctionsmonitor-vscodeext/src/extension.ts b/durablefunctionsmonitor-vscodeext/src/extension.ts index aaf9740..214fe46 100644 --- a/durablefunctionsmonitor-vscodeext/src/extension.ts +++ b/durablefunctionsmonitor-vscodeext/src/extension.ts @@ -5,6 +5,7 @@ import * as vscode from 'vscode'; import { MonitorTreeDataProvider } from './MonitorTreeDataProvider'; import { FunctionGraphList } from './FunctionGraphList'; +import { VSCodeAzureSubscriptionProvider } from '@microsoft/vscode-azext-azureauth'; var monitorTreeDataProvider: MonitorTreeDataProvider; var functionGraphList: FunctionGraphList; @@ -18,8 +19,10 @@ export function activate(context: vscode.ExtensionContext) { const logChannel = vscode.window.createOutputChannel(OutputChannelName); context.subscriptions.push(logChannel); + const azureProvider = new VSCodeAzureSubscriptionProvider(); + functionGraphList = new FunctionGraphList(context, logChannel); - monitorTreeDataProvider = new MonitorTreeDataProvider(context, functionGraphList, logChannel); + monitorTreeDataProvider = new MonitorTreeDataProvider(azureProvider, context, functionGraphList, logChannel); context.subscriptions.push( @@ -27,19 +30,25 @@ export function activate(context: vscode.ExtensionContext) { vscode.window.registerTreeDataProvider('durableFunctionsMonitorTreeView', monitorTreeDataProvider), - vscode.commands.registerCommand('extension.durableFunctionsMonitor', + vscode.commands.registerCommand('durable-functions-monitor.signInToAzure', + async () => { + await azureProvider.signIn(); + monitorTreeDataProvider.refresh(); + }), + + vscode.commands.registerCommand('durable-functions-monitor.durableFunctionsMonitor', () => monitorTreeDataProvider.createOrActivateMonitorView(false)), - vscode.commands.registerCommand('extension.durableFunctionsMonitorPurgeHistory', + vscode.commands.registerCommand('durable-functions-monitor.durableFunctionsMonitorPurgeHistory', () => monitorTreeDataProvider.createOrActivateMonitorView(false, { id: 'purgeHistory' })), - vscode.commands.registerCommand('extension.durableFunctionsMonitorCleanEntityStorage', + vscode.commands.registerCommand('durable-functions-monitor.durableFunctionsMonitorCleanEntityStorage', () => monitorTreeDataProvider.createOrActivateMonitorView(false, { id: 'cleanEntityStorage' })), - vscode.commands.registerCommand('extension.durableFunctionsMonitorBatchOps', + vscode.commands.registerCommand('durable-functions-monitor.durableFunctionsMonitorBatchOps', () => monitorTreeDataProvider.createOrActivateMonitorView(false, { id: 'batchOps' })), - vscode.commands.registerCommand('extension.durableFunctionsMonitorGotoInstanceId', + vscode.commands.registerCommand('durable-functions-monitor.durableFunctionsMonitorGotoInstanceId', () => monitorTreeDataProvider.gotoInstanceId(null)), vscode.commands.registerCommand('durableFunctionsMonitorTreeView.purgeHistory', @@ -75,7 +84,7 @@ export function activate(context: vscode.ExtensionContext) { vscode.commands.registerCommand('durableFunctionsMonitorTreeView.detachFromAllTaskHubs', () => monitorTreeDataProvider.detachFromAllTaskHubs()), - vscode.commands.registerCommand('extension.durableFunctionsMonitorVisualizeAsGraph', + vscode.commands.registerCommand('durable-functions-monitor.durableFunctionsMonitorVisualizeAsGraph', (item) => functionGraphList.visualize(item)), vscode.commands.registerCommand('durableFunctionsMonitorTreeView.openInstancesInStorageExplorer', @@ -86,6 +95,8 @@ export function activate(context: vscode.ExtensionContext) { vscode.commands.registerCommand('durableFunctionsMonitorTreeView.forgetConnectionString', (item) => monitorTreeDataProvider.forgetConnectionString(item)), + + azureProvider, ); }