diff --git a/.stylelintrc.json b/.stylelintrc.json index 8e0fc9bbe3..cbe6ed5186 100644 --- a/.stylelintrc.json +++ b/.stylelintrc.json @@ -24,7 +24,7 @@ "unit-case": "lower", "unit-no-unknown": true, - "unit-blacklist": ["rem"], + "unit-disallowed-list": ["rem"], "value-no-vendor-prefix": true, diff --git a/CHANGELOG.md b/CHANGELOG.md index 96f903fe6a..27ee6078bb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,19 @@ +# 2.11.0 + +[All items](https://github.com/Azure/BatchExplorer/milestone/45?closed=1) + +### feature + +* Dynamically show/hide cloud services deprecation warning [\#2360](https://github.com/Azure/BatchExplorer/issues/2360) +* Add fpga to vm size categories [\#2359](https://github.com/Azure/BatchExplorer/issues/2359) + +### bug + +* Fix resize error name wasn't being displayed properly [\#2361](https://github.com/Azure/BatchExplorer/issues/2361) +* Fix accessibility issues regarding luminosity contrast, screen-reader, and keyboard shortcuts [\#2358](https://github.com/Azure/BatchExplorer/issues/2358) +* Fix login with personal account [\#2344](https://github.com/Azure/BatchExplorer/issues/2344) +* Fix user button tooltip showing as 'undefined' instead of username [\#2334](https://github.com/Azure/BatchExplorer/issues/2334) + # 2.10.0 [All items](https://github.com/Azure/BatchExplorer/milestone/44?closed=1) diff --git a/ThirdPartyNotices.txt b/ThirdPartyNotices.txt index e962c254b2..20dab571e3 100644 --- a/ThirdPartyNotices.txt +++ b/ThirdPartyNotices.txt @@ -20,49 +20,48 @@ Microsoft reserves all other rights not expressly granted under this agreement, 10. @angular/router(https://github.com/angular/angular/tree/master/packages/router) - MIT 11. @azure/msal-node(https://github.com/AzureAD/microsoft-authentication-library-for-js#readme) - MIT 12. @azure/storage-blob(https://github.com/Azure/azure-sdk-for-js#readme) - MIT -13. @types/keytar(https://github.com/node-keytar) - MIT -14. applicationinsights(https://github.com/microsoft/ApplicationInsights-node.js#readme) - MIT -15. azure-storage(http://github.com/Azure/azure-storage-node) - Apache-2.0 -16. chart.js(https://www.chartjs.org) - MIT -17. chokidar(https://github.com/paulmillr/chokidar) - MIT -18. commander(https://github.com/tj/commander.js#readme) - MIT -19. d3(https://d3js.org) - BSD-3-Clause -20. decode-uri-component(https://github.com/SamVerschueren/decode-uri-component#readme) - MIT -21. download(https://github.com/kevva/download#readme) - MIT -22. electron-updater(https://github.com/electron-userland/electron-builder) - MIT -23. element-resize-detector(https://github.com/wnr/element-resize-detector) - MIT -24. extract-zip(https://github.com/maxogden/extract-zip#readme) - BSD-2-Clause -25. focus-visible(https://github.com/WICG/focus-visible) - W3C -26. font-awesome(http://fontawesome.io/) - (OFL-1.1 AND MIT) -27. get-proxy-settings(https://github.com/Azure/get-proxy-settings) - MIT -28. glob(https://github.com/isaacs/node-glob#readme) - ISC -29. hammerjs(http://hammerjs.github.io/) - MIT -30. https-proxy-agent(https://github.com/TooTallNate/node-https-proxy-agent#readme) - MIT -31. immutable(https://facebook.github.com/immutable-js) - MIT -32. inflection(https://github.com/dreamerslab/node.inflection#readme) - MIT -33. js-yaml(https://github.com/nodeca/js-yaml) - MIT -34. jschardet(https://github.com/aadsm/jschardet#readme) - LGPL-2.1+ -35. keytar(http://atom.github.io/node-keytar) - MIT -36. load-json-file(https://github.com/sindresorhus/load-json-file#readme) - MIT -37. luxon(https://github.com/moment/luxon#readme) - MIT -38. make-dir(https://github.com/sindresorhus/make-dir#readme) - MIT -39. node-abi(https://github.com/lgeiger/node-abi#readme) - MIT -40. node-forge(https://github.com/digitalbazaar/forge) - (BSD-3-Clause OR GPL-2.0) -41. patternomaly(https://github.com/ashiguruma/patternomaly#readme) - MIT -42. reflect-metadata(http://rbuckton.github.io/reflect-metadata) - Apache-2.0 -43. rxjs(https://github.com/ReactiveX/RxJS) - Apache-2.0 -44. strip-json-comments(https://github.com/sindresorhus/strip-json-comments#readme) - MIT -45. tinycolor2(https://github.com/bgrins/TinyColor#readme) - MIT -46. winston(https://github.com/winstonjs/winston#readme) - MIT -47. winston-daily-rotate-file(https://github.com/winstonjs/winston-daily-rotate-file#readme) - MIT -48. write-file-webpack-plugin(https://github.com/gajus/write-file-webpack-plugin#readme) - BSD-3-Clause -49. xml2js(https://github.com/Leonidas-from-XIV/node-xml2js) - MIT -50. zone.js(https://github.com/angular/angular#readme) - MIT -51. websockets(https://github.com/aaugustin/websockets) - BSD-3-Clause -52. azure-batch-cli-extensions(https://github.com/Azure/azure-batch-cli-extensions) - MIT -53. node.js(https://nodejs.org/en/) - MIT -54. python(https://www.python.org/) - PSF -55. Electron(https://electronjs.org/) - electron +13. applicationinsights(https://github.com/microsoft/ApplicationInsights-node.js#readme) - MIT +14. azure-storage(http://github.com/Azure/azure-storage-node) - Apache-2.0 +15. chart.js(https://www.chartjs.org) - MIT +16. chokidar(https://github.com/paulmillr/chokidar) - MIT +17. commander(https://github.com/tj/commander.js#readme) - MIT +18. d3(https://d3js.org) - BSD-3-Clause +19. decode-uri-component(https://github.com/SamVerschueren/decode-uri-component#readme) - MIT +20. download(https://github.com/kevva/download#readme) - MIT +21. electron-updater(https://github.com/electron-userland/electron-builder) - MIT +22. element-resize-detector(https://github.com/wnr/element-resize-detector) - MIT +23. extract-zip(https://github.com/maxogden/extract-zip#readme) - BSD-2-Clause +24. focus-visible(https://github.com/WICG/focus-visible) - W3C +25. font-awesome(http://fontawesome.io/) - (OFL-1.1 AND MIT) +26. get-proxy-settings(https://github.com/Azure/get-proxy-settings) - MIT +27. glob(https://github.com/isaacs/node-glob#readme) - ISC +28. hammerjs(http://hammerjs.github.io/) - MIT +29. https-proxy-agent(https://github.com/TooTallNate/node-https-proxy-agent#readme) - MIT +30. immutable(https://facebook.github.com/immutable-js) - MIT +31. inflection(https://github.com/dreamerslab/node.inflection#readme) - MIT +32. js-yaml(https://github.com/nodeca/js-yaml) - MIT +33. jschardet(https://github.com/aadsm/jschardet#readme) - LGPL-2.1+ +34. keytar(http://atom.github.io/node-keytar) - MIT +35. load-json-file(https://github.com/sindresorhus/load-json-file#readme) - MIT +36. luxon(https://github.com/moment/luxon#readme) - MIT +37. make-dir(https://github.com/sindresorhus/make-dir#readme) - MIT +38. node-abi(https://github.com/lgeiger/node-abi#readme) - MIT +39. node-forge(https://github.com/digitalbazaar/forge) - (BSD-3-Clause OR GPL-2.0) +40. patternomaly(https://github.com/ashiguruma/patternomaly#readme) - MIT +41. reflect-metadata(http://rbuckton.github.io/reflect-metadata) - Apache-2.0 +42. rxjs(https://github.com/ReactiveX/RxJS) - Apache-2.0 +43. strip-json-comments(https://github.com/sindresorhus/strip-json-comments#readme) - MIT +44. tinycolor2(https://github.com/bgrins/TinyColor#readme) - MIT +45. winston(https://github.com/winstonjs/winston#readme) - MIT +46. winston-daily-rotate-file(https://github.com/winstonjs/winston-daily-rotate-file#readme) - MIT +47. write-file-webpack-plugin(https://github.com/gajus/write-file-webpack-plugin#readme) - BSD-3-Clause +48. xml2js(https://github.com/Leonidas-from-XIV/node-xml2js) - MIT +49. zone.js(https://github.com/angular/angular#readme) - MIT +50. websockets(https://github.com/aaugustin/websockets) - BSD-3-Clause +51. azure-batch-cli-extensions(https://github.com/Azure/azure-batch-cli-extensions) - MIT +52. node.js(https://nodejs.org/en/) - MIT +53. python(https://www.python.org/) - PSF +54. Electron(https://electronjs.org/) - electron ============================================================ Start license for @angular/animations @@ -386,6 +385,32 @@ THE SOFTWARE. ============================================================ Start license for @azure/msal-node ------------------------------------------------------------ +MIT License + +Copyright (c) Microsoft Corporation. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE + +------------------------------------------------------------ + End license for @azure/msal-node +============================================================ + ============================================================ Start license for @azure/storage-blob ------------------------------------------------------------ @@ -414,9 +439,6 @@ SOFTWARE. End license for @azure/storage-blob ============================================================ -============================================================ - Start license for @types/keytar ------------------------------------------------------------- ============================================================ Start license for applicationinsights ------------------------------------------------------------ @@ -448,208 +470,182 @@ SOFTWARE. ============================================================ Start license for azure-storage ------------------------------------------------------------ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright (c) 2015-2018 Google, Inc., Netflix, Inc., Microsoft Corp. and contributors - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS ------------------------------------------------------------ End license for azure-storage ============================================================ @@ -733,33 +729,19 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ============================================================ Start license for d3 ------------------------------------------------------------ -Copyright 2010-2020 Mike Bostock -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. +Copyright 2010-2021 Mike Bostock -* Neither the name of the author nor the names of contributors may be used to - endorse or promote products derived from this software without specific prior - written permission. +Permission to use, copy, modify, and/or distribute this software for any purpose +with or without fee is hereby granted, provided that the above copyright notice +and this permission notice appear in all copies. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF +THIS SOFTWARE. ------------------------------------------------------------ End license for d3 @@ -1039,7 +1021,7 @@ THE SOFTWARE. ------------------------------------------------------------ MIT License -Copyright (c) 2014-present, Facebook, Inc. +Copyright (c) 2014-present, Lee Byron and other contributors. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -2452,6 +2434,33 @@ THE SOFTWARE. ============================================================ Start license for winston-daily-rotate-file ------------------------------------------------------------ +The MIT License (MIT) + +Copyright (c) 2015 winstonjs + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +------------------------------------------------------------ + End license for winston-daily-rotate-file +============================================================ + ============================================================ Start license for write-file-webpack-plugin ------------------------------------------------------------ @@ -2654,30 +2663,7 @@ The externally maintained libraries used by Node.js are: """ MIT License - Copyright (C) 2012-2018 by various contributors (see AUTHORS) - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - THE SOFTWARE. - """ - -- Acorn plugins, located at deps/acorn-plugins, is licensed as follows: - """ - Copyright (C) 2017-2018 by Adrian Heine + Copyright (C) 2012-2020 by various contributors (see AUTHORS) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -3873,7 +3859,7 @@ The externally maintained libraries used by Node.js are: WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. """ -- gtest, located at test/cctest/gtest, is licensed as follows: +- gtest, located at deps/googletest, is licensed as follows: """ Copyright 2008, Google Inc. All rights reserved. @@ -4407,9 +4393,9 @@ version prepared by Licensee. Alternately, in lieu of CNRI's License Agreement, Licensee may substitute the following text (omitting the quotes): "Python 1.6.1 is made available subject to the terms and conditions in CNRI's License Agreement. This Agreement together with -Python 1.6.1 may be located on the Internet using the following +Python 1.6.1 may be located on the internet using the following unique, persistent identifier (known as a handle): 1895.22/1013. This -Agreement may also be obtained from a proxy server on the Internet +Agreement may also be obtained from a proxy server on the internet using the following URL: http://hdl.handle.net/1895.22/1013". 3. In the event Licensee prepares a derivative work that is based on diff --git a/package-lock.json b/package-lock.json index cc58709420..d24c3597a1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "batch-explorer", - "version": "2.10.0", + "version": "2.11.0", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -183,29 +183,19 @@ } }, "@azure/msal-common": { - "version": "4.1.1", - "resolved": "https://msazure.pkgs.visualstudio.com/_packaging/AzurePortal/npm/registry/@azure/msal-common/-/msal-common-4.1.1.tgz", - "integrity": "sha1-w9LEO4B40oCYLETzsnU7wZ6X1mw=", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-4.5.0.tgz", + "integrity": "sha512-eXI3GamyjU29Mttn+5mWU47Su4DtgAZF6xmIrnIq271dz6VKJDBmU1dEbUUYqZeVSzxdcraX7BR85kKof11Tig==", "requires": { "debug": "^4.1.1" - }, - "dependencies": { - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "requires": { - "ms": "2.1.2" - } - } } }, "@azure/msal-node": { - "version": "1.0.1", - "resolved": "https://msazure.pkgs.visualstudio.com/_packaging/AzurePortal/npm/registry/@azure/msal-node/-/msal-node-1.0.1.tgz", - "integrity": "sha1-lPALj/RPsX0d0YQeuvtxg/Y5ol4=", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-1.3.0.tgz", + "integrity": "sha512-BM5S5sMB6N0aPux4l85NnRNO/5/G+w3oT+JtLbMDBsc/aUxLVYoWMmxVECrYzlQRm5QZzFWRo04Rv5AnAF7z2g==", "requires": { - "@azure/msal-common": "^4.0.2", + "@azure/msal-common": "^4.5.0", "axios": "^0.21.1", "jsonwebtoken": "^8.5.1", "uuid": "^8.3.0" @@ -213,8 +203,8 @@ "dependencies": { "uuid": { "version": "8.3.2", - "resolved": "https://msazure.pkgs.visualstudio.com/_packaging/AzurePortal/npm/registry/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha1-gNW1ztJxu5r2xEXyGhoExgbO++I=" + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" } } }, @@ -1690,6 +1680,7 @@ "version": "4.4.2", "resolved": "https://registry.npmjs.org/@types/keytar/-/keytar-4.4.2.tgz", "integrity": "sha512-xtQcDj9ruGnMwvSu1E2BH4SFa5Dv2PvSPd0CKEBLN5hEj/v5YpXJY+B6hAfuKIbvEomD7vJTc/P1s1xPNh2kRw==", + "dev": true, "requires": { "keytar": "*" } @@ -3190,8 +3181,8 @@ }, "axios": { "version": "0.21.1", - "resolved": "https://msazure.pkgs.visualstudio.com/_packaging/AzurePortal/npm/registry/axios/-/axios-0.21.1.tgz", - "integrity": "sha1-IlY0gZYvTWvemnbVFu8OXTwJsrg=", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz", + "integrity": "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==", "requires": { "follow-redirects": "^1.10.0" } @@ -3203,9 +3194,9 @@ "dev": true }, "azure-storage": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/azure-storage/-/azure-storage-2.10.3.tgz", - "integrity": "sha512-IGLs5Xj6kO8Ii90KerQrrwuJKexLgSwYC4oLWmc11mzKe7Jt2E5IVg+ZQ8K53YWZACtVTMBNO3iGuA+4ipjJxQ==", + "version": "2.10.4", + "resolved": "https://registry.npmjs.org/azure-storage/-/azure-storage-2.10.4.tgz", + "integrity": "sha512-zlfRPl4js92JC6+79C2EUmNGYjSknRl8pOiHQF78zy+pbOFOHtlBF6BU/OxPeHQX3gaa6NdEZnVydFxhhndkEw==", "requires": { "browserify-mime": "~1.2.9", "extend": "^3.0.2", @@ -3213,7 +3204,7 @@ "md5.js": "1.3.4", "readable-stream": "~2.0.0", "request": "^2.86.0", - "underscore": "~1.8.3", + "underscore": "^1.12.1", "uuid": "^3.0.0", "validator": "~9.4.1", "xml2js": "0.2.8", @@ -3951,7 +3942,7 @@ }, "buffer-equal-constant-time": { "version": "1.0.1", - "resolved": "https://msazure.pkgs.visualstudio.com/_packaging/AzurePortal/npm/registry/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" }, "buffer-fill": { @@ -5441,18 +5432,6 @@ } } }, - "css-select": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", - "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", - "dev": true, - "requires": { - "boolbase": "^1.0.0", - "css-what": "^3.2.1", - "domutils": "^1.7.0", - "nth-check": "^1.0.2" - } - }, "css-shorthand-properties": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/css-shorthand-properties/-/css-shorthand-properties-1.1.1.tgz", @@ -5465,12 +5444,6 @@ "integrity": "sha1-Xv1sLupeof1rasV+wEJ7GEUkJOo=", "dev": true }, - "css-what": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", - "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", - "dev": true - }, "cssesc": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", @@ -5792,7 +5765,6 @@ "version": "4.3.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dev": true, "requires": { "ms": "2.1.2" } @@ -6529,8 +6501,8 @@ }, "ecdsa-sig-formatter": { "version": "1.0.11", - "resolved": "https://msazure.pkgs.visualstudio.com/_packaging/AzurePortal/npm/registry/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", - "integrity": "sha1-rg8PothQRe8UqBfao86azQSJ5b8=", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", "requires": { "safe-buffer": "^5.0.1" } @@ -9014,9 +8986,9 @@ } }, "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "requires": { "is-glob": "^4.0.1" } @@ -10656,8 +10628,8 @@ }, "jsonwebtoken": { "version": "8.5.1", - "resolved": "https://msazure.pkgs.visualstudio.com/_packaging/AzurePortal/npm/registry/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz", - "integrity": "sha1-AOceC431TCEhofJhN98igGc7zA0=", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz", + "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==", "requires": { "jws": "^3.2.2", "lodash.includes": "^4.3.0", @@ -10673,8 +10645,8 @@ "dependencies": { "semver": { "version": "5.7.1", - "resolved": "https://msazure.pkgs.visualstudio.com/_packaging/AzurePortal/npm/registry/semver/-/semver-5.7.1.tgz", - "integrity": "sha1-qVT5Ma66UI0we78Gnv8MAclhFvc=" + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" } } }, @@ -10691,8 +10663,8 @@ }, "jwa": { "version": "1.4.1", - "resolved": "https://msazure.pkgs.visualstudio.com/_packaging/AzurePortal/npm/registry/jwa/-/jwa-1.4.1.tgz", - "integrity": "sha1-dDwymFy56YZVUw1TZBtmyGRbA5o=", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", "requires": { "buffer-equal-constant-time": "1.0.1", "ecdsa-sig-formatter": "1.0.11", @@ -10701,8 +10673,8 @@ }, "jws": { "version": "3.2.2", - "resolved": "https://msazure.pkgs.visualstudio.com/_packaging/AzurePortal/npm/registry/jws/-/jws-3.2.2.tgz", - "integrity": "sha1-ABCZ82OUaMlBQADpmZX6UvtHgwQ=", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", "requires": { "jwa": "^1.4.1", "safe-buffer": "^5.0.1" @@ -11247,12 +11219,12 @@ }, "lodash.includes": { "version": "4.3.0", - "resolved": "https://msazure.pkgs.visualstudio.com/_packaging/AzurePortal/npm/registry/lodash.includes/-/lodash.includes-4.3.0.tgz", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=" }, "lodash.isboolean": { "version": "3.0.3", - "resolved": "https://msazure.pkgs.visualstudio.com/_packaging/AzurePortal/npm/registry/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=" }, "lodash.isequal": { @@ -11262,12 +11234,12 @@ }, "lodash.isinteger": { "version": "4.0.4", - "resolved": "https://msazure.pkgs.visualstudio.com/_packaging/AzurePortal/npm/registry/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M=" }, "lodash.isnumber": { "version": "3.0.3", - "resolved": "https://msazure.pkgs.visualstudio.com/_packaging/AzurePortal/npm/registry/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", "integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w=" }, "lodash.isobject": { @@ -11283,7 +11255,7 @@ }, "lodash.isstring": { "version": "4.0.1", - "resolved": "https://msazure.pkgs.visualstudio.com/_packaging/AzurePortal/npm/registry/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" }, "lodash.memoize": { @@ -11300,7 +11272,7 @@ }, "lodash.once": { "version": "4.1.1", - "resolved": "https://msazure.pkgs.visualstudio.com/_packaging/AzurePortal/npm/registry/lodash.once/-/lodash.once-4.1.1.tgz", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=" }, "lodash.truncate": { @@ -12387,15 +12359,6 @@ "set-blocking": "~2.0.0" } }, - "nth-check": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", - "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", - "dev": true, - "requires": { - "boolbase": "~1.0.0" - } - }, "num2fraction": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", @@ -13159,9 +13122,9 @@ "dev": true }, "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, "path-to-regexp": { @@ -13337,9 +13300,9 @@ "dev": true }, "postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", "dev": true, "requires": { "chalk": "^2.4.2", @@ -14287,16 +14250,16 @@ "dev": true }, "renderkid": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.5.tgz", - "integrity": "sha512-ccqoLg+HLOHq1vdfYNm4TBeaCDIi1FLt3wGojTDSvdewUv65oTmI3cnT2E4hRjl1gzKZIPK+KZrXzlUYKnR+vQ==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.7.tgz", + "integrity": "sha512-oCcFyxaMrKsKcTY59qnCAtmDVSLfPbrv6A3tVbPdFMMrv5jaK10V6m40cKsoPNhAqN6rmHW9sswW4o3ruSrwUQ==", "dev": true, "requires": { - "css-select": "^2.0.2", - "dom-converter": "^0.2", - "htmlparser2": "^3.10.1", - "lodash": "^4.17.20", - "strip-ansi": "^3.0.0" + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^3.0.1" }, "dependencies": { "ansi-regex": { @@ -14305,6 +14268,83 @@ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", "dev": true }, + "css-select": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.1.3.tgz", + "integrity": "sha512-gT3wBNd9Nj49rAbmtFHj1cljIAOLYSX1nZ8CB7TBO3INYckygm5B7LISU/szY//YmdiSLbJvDLOx9VnMVpMBxA==", + "dev": true, + "requires": { + "boolbase": "^1.0.0", + "css-what": "^5.0.0", + "domhandler": "^4.2.0", + "domutils": "^2.6.0", + "nth-check": "^2.0.0" + } + }, + "css-what": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.0.1.tgz", + "integrity": "sha512-FYDTSHb/7KXsWICVsxdmiExPjCfRC4qRFBdVwv7Ax9hMnvMmEjP9RfxTEZ3qPZGmADDn2vAKSo9UcN1jKVYscg==", + "dev": true + }, + "dom-serializer": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", + "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + } + }, + "domelementtype": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", + "dev": true + }, + "domhandler": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.2.0.tgz", + "integrity": "sha512-zk7sgt970kzPks2Bf+dwT/PLzghLnsivb9CcxkvR8Mzr66Olr0Ofd8neSbglHJHaHa2MadfoSdNlKYAaafmWfA==", + "dev": true, + "requires": { + "domelementtype": "^2.2.0" + } + }, + "domutils": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.7.0.tgz", + "integrity": "sha512-8eaHa17IwJUPAiB+SoTYBo5mCdeMgdcAoXJ59m6DT1vw+5iLS3gNoqYaRowaBKtGVrOF1Jz4yDTgYKLK2kvfJg==", + "dev": true, + "requires": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + } + }, + "htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "nth-check": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.0.tgz", + "integrity": "sha512-i4sc/Kj8htBrAiH1viZ0TgU8Y5XqCaV/FziYK6TBczxmeKm3AEFWqqF3195yKudrarqy7Zu80Ra5dobFjn9X/Q==", + "dev": true, + "requires": { + "boolbase": "^1.0.0" + } + }, "strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", @@ -16336,12 +16376,6 @@ "has-flag": "^4.0.0" } }, - "trim-newlines": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.0.tgz", - "integrity": "sha512-C4+gOpvmxaSMKuEf9Qc134F1ZuOHVXKRbtEflf4NTtuuJDEIJ9p5PXsalL8SkeRw+qit1Mo+yuvMPAKwWg/1hA==", - "dev": true - }, "write-file-atomic": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", @@ -16496,9 +16530,9 @@ "dev": true }, "tar": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.0.tgz", - "integrity": "sha512-DUCttfhsnLCjwoDoFcI+B2iJgYa93vBnDUATYEeRx6sntCTdN01VnqsIuTlALXla/LWooNg0yEGeB+Y8WdFxGA==", + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.3.tgz", + "integrity": "sha512-3rUqwucgVZXTeyJyL2jqtUau8/8r54SioM1xj3AmTX3HnWQdj2AydfJ2qYYayPyIIznSplcvU9mhBb7dR2XF3w==", "dev": true, "requires": { "chownr": "^2.0.0", @@ -17078,6 +17112,12 @@ "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", "dev": true }, + "trim-newlines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", + "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", + "dev": true + }, "trim-repeated": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz", @@ -17310,9 +17350,9 @@ } }, "underscore": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", - "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=" + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.1.tgz", + "integrity": "sha512-hzSoAVtJF+3ZtiFX0VgfFPHEDRm7Y/QPjGyNo4TVdnDTdft3tr8hEkD25a1jC+TjTuE7tkHGKkhwCgs9dgBB2g==" }, "unified": { "version": "9.2.1", @@ -18786,9 +18826,9 @@ } }, "ws": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", - "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", + "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", "dev": true, "requires": { "async-limiter": "~1.0.0" @@ -19200,9 +19240,9 @@ } }, "ws": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.3.tgz", - "integrity": "sha512-hr6vCR76GsossIRsr8OLR9acVVm1jyfEWvhbNjtgPOrfvAlKzvyeg/P6r8RuDjRyrcQoPQT7K0DGEPc7Ae6jzA==", + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", + "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", "dev": true }, "xdg-basedir": { diff --git a/package.json b/package.json index 7fe22f7d4c..b9927fc14b 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,7 @@ "name": "Microsoft Corporation", "email": "batchexplorer@microsoft.com" }, - "version": "2.10.0", + "version": "2.11.0", "main": "build/client/main.prod.js", "scripts": { "ts": "ts-node --project tsconfig.node.json --files", @@ -85,6 +85,7 @@ "@types/inflection": "^1.5.28", "@types/jasmine": "^3.5.12", "@types/js-yaml": "^3.12.5", + "@types/keytar": "^4.4.2", "@types/luxon": "^1.24.3", "@types/node": "12.12.21", "@types/node-fetch": "^2.5.7", @@ -173,11 +174,10 @@ "@angular/platform-browser-dynamic": "^9.1.12", "@angular/platform-server": "^9.1.12", "@angular/router": "^9.1.12", - "@azure/msal-node": "^1.0.1", + "@azure/msal-node": "^1.3.0", "@azure/storage-blob": "^10.5.0", - "@types/keytar": "^4.4.2", "applicationinsights": "^1.8.5", - "azure-storage": "^2.10.3", + "azure-storage": "^2.10.4", "chart.js": "^2.9.3", "chokidar": "^3.4.3", "commander": "^2.20.3", diff --git a/python/requirements.txt b/python/requirements.txt index 50d7ef2498..a3268e3dd6 100644 --- a/python/requirements.txt +++ b/python/requirements.txt @@ -1,4 +1,4 @@ -websockets==7.0 +websockets==9.1 pylint==2.3.0 azure-batch-extensions==7.0.0 pyinstaller==3.6 diff --git a/scripts/lca/generate-third-party.ts b/scripts/lca/generate-third-party.ts index abf28b4114..a83fa01f0f 100644 --- a/scripts/lca/generate-third-party.ts +++ b/scripts/lca/generate-third-party.ts @@ -15,7 +15,7 @@ const defaultThirdPartyNoticeOptions: ThirdPartyNoticeOptions = { const thirdPartyNoticeFile = path.join(Constants.root, "ThirdPartyNotices.txt"); const output: string[] = []; -const gitUrlRegex = /(?:git|ssh|https?|git@[-\w.]+):(\/\/[-\w.]+\/)?(.*?)(\.git)?(\/?|\#[-\d\w._]+?)$/; +const gitUrlRegex = /(?:git|ssh|https?|git@[-\w.]+):(\/\/[-\w@.]+\/)?(.*?)(\.git)?(\/?|\#[-\d\w._]+?)$/; const repoNameRegex = /https?:\/\/github\.com\/(.*)/; const innerSeparator = "-".repeat(60); const outerSeparator = "=".repeat(60); @@ -86,7 +86,6 @@ function listDependencies(): string[] { function loadDependency(name: string) { const contents = fs.readFileSync(`node_modules/${name}/package.json`).toString(); const dependency = JSON.parse(contents); - const repoUrl = getRepoUrl(dependency); const url = dependency.homepage || repoUrl; return { @@ -120,16 +119,23 @@ function getRepoName(repoUrl: string | null): string | null { return value.split("/").slice(0, 2).join("/"); } -function loadLicense(repoUrl: string | null): Promise { +function loadLicense(repoUrl: string | null, anonymous = false): Promise { const repoName = getRepoName(repoUrl); - return fetch(`https://api.github.com/repos/${repoName}/license`, { - headers: { - Authorization: `token ${process.env.GH_TOKEN}`, - }, - }).then((res) => { + const licenseUrl = `https://api.github.com/repos/${repoName}/license`; + const headers = anonymous ? {} : { Authorization: `token ${process.env.GH_TOKEN}`} + + return fetch(licenseUrl, {headers}).then((res) => { + /** Will look up default license if cannot find a license */ + if (!anonymous && res.status === 403) { + console.warn(`Access denied, retrying request anonymously. Url: ${licenseUrl}`); + return loadLicense(repoUrl, anonymous = true); + } else if (res.status >= 300 && res.status != 404) { + throw new Error(`Response status ${res.status} ${res.statusText} with url: ${licenseUrl}`); + } return res.json(); }).catch((error) => { console.error(`Error loading license for ${repoName}`, error); + process.exit(1) }); } diff --git a/scripts/publish/publish.ts b/scripts/publish/publish.ts index 309ee76d5d..c9bb718c18 100644 --- a/scripts/publish/publish.ts +++ b/scripts/publish/publish.ts @@ -7,6 +7,8 @@ import { createIssue, createPullRequest, getMilestone, githubToken, listMilestoneIssues, listPullRequests, } from "./github-api"; +const MAIN_BRANCH = "master"; + const root = path.resolve(path.join(__dirname, "../..")); const allMessages: string[] = []; const repoName = "Azure/BatchExplorer"; @@ -54,14 +56,14 @@ function checkGithubToken() { /** * This goes back to master and pull */ -async function gotoMaster() { - await run("git checkout master"); +async function gotoMainBranch() { + await run(`git checkout ${MAIN_BRANCH}`); await run("git pull"); - success("Checkout to master branch and pulled latest"); + success(`Checkout to ${MAIN_BRANCH} branch and pulled latest`); } -async function loadMillestone(millestoneId: number) { - return getMilestone(repoName, millestoneId); +async function loadMilestone(milestoneId: number) { + return getMilestone(repoName, milestoneId); } async function getCurrentBranch(): Promise { @@ -69,42 +71,56 @@ async function getCurrentBranch(): Promise { return stdout.trim(); } -function getMillestoneId() { +function getMilestoneId() { if (process.argv.length < 3) { - throw new Error("No millestone id was provided."); + throw new Error("No milestone id was provided."); } return parseInt(process.argv[2], 10); } async function confirmVersion(version: string) { return new Promise((resolve, reject) => { - ask(`Up program to be version ${version} (From millestone title) [Y/n]`, true, (ok) => { + ask(`Up program to be version ${version} (From milestone title) [Y/n]`, true, (ok) => { if (ok) { success(`A new release for version ${version} will be prepared`); resolve(null); } else { - reject(new Error("Millestone version wasn't confirmed. Please change millestone title")); + reject(new Error("milestone version wasn't confirmed. Please change milestone title")); } }); }); } +function calcNextVersion(version: string) { + const match = /^(\d+\.)(\d+)(\.\d+)$/.exec(version); + return `${match[1]}${parseInt(match[2], 10) + 1}${match[3]}`; +} + function getPreparationBranchName(version: string) { return `release/prepare-${version}`; } async function switchToNewBranch(branchName: string) { - await run(`git checkout -b ${branchName}`); + await run(`git checkout -B ${branchName}`); success(`Created a new branch ${branchName}`); } async function bumpVersion(version) { - await run(`npm version --no-git-tag-version --allow-same-version ${version}`); - success(`Updated version in package.json to ${version}`); + const currentBranch = await getCurrentBranch(); + const nextVersion = calcNextVersion(version); + const bumpBranch = `release/bump-${nextVersion}`; + await gotoMainBranch(); + await switchToNewBranch(bumpBranch); + await run(`npm version --no-git-tag-version --allow-same-version ${nextVersion}`); + + await run(`git commit -am "Bump version to ${nextVersion}"`); + await run(`git push origin ${bumpBranch}`); + await run(`git checkout "${currentBranch}"`); + success(`Updated version in package.json to ${nextVersion} (branch: ${bumpBranch})`); } -async function updateChangeLog(version, millestoneId) { - const { stdout } = await run(`gh-changelog-gen --repo ${repoName} ${millestoneId} --formatter markdown`); +async function updateChangeLog(version, milestoneId) { + const { stdout } = await run(`gh-changelog-gen --repo ${repoName} ${milestoneId} --formatter markdown`); const changelogFile = path.join(root, "CHANGELOG.md"); const changelogContent = fs.readFileSync(changelogFile); @@ -129,14 +145,14 @@ async function push(branchName: string) { await run(`git push --set-upstream origin ${branchName}`); } -async function createIssueIfNot(millestoneId, version) { +async function createIssueIfNot(milestoneId, version) { const title = `Prepare for release of version ${version}`; - const issues = await listMilestoneIssues(repoName, millestoneId); + const issues = await listMilestoneIssues(repoName, milestoneId); let issue = issues.filter(x => x.title === title)[0]; if (issue) { success(`Issue was already created earlier ${issue.html_url}`); } else { - issue = await createIssue(repoName, title, newIssueBody, millestoneId); + issue = await createIssue(repoName, title, newIssueBody, milestoneId); success(`Created a new issue ${issue.html_url}`); } return issue; @@ -166,27 +182,27 @@ async function buildApp() { async function startPublish() { checkGithubToken(); - const millestoneId = getMillestoneId(); - const millestone = await loadMillestone(millestoneId); - if (!millestone.title && millestone["message"]) { - throw new Error(`Error fetching milestone: ${millestone["message"]}`); + const milestoneId = getMilestoneId(); + const milestone = await loadMilestone(milestoneId); + if (!milestone.title && milestone["message"]) { + throw new Error(`Error fetching milestone: ${milestone["message"]}`); } - const version = millestone.title; + const version = milestone.title; await confirmVersion(version); const releaseBranch = getPreparationBranchName(version); const branch = await getCurrentBranch(); if (branch !== releaseBranch) { - await gotoMaster(); + await gotoMainBranch(); await switchToNewBranch(releaseBranch); } - await bumpVersion(version); - await updateChangeLog(version, millestoneId); + await updateChangeLog(version, milestoneId); await updateThirdParty(); await commitChanges(); await push(releaseBranch); - const issue = await createIssueIfNot(millestoneId, version); + const issue = await createIssueIfNot(milestoneId, version); await createPullrequestIfNot(version, releaseBranch, issue); await buildApp(); + await bumpVersion(version); } startPublish().then(() => { diff --git a/src/@batch-flask/core/data-store/user-specific-data-store/user-specific-data-store.spec.ts b/src/@batch-flask/core/data-store/user-specific-data-store/user-specific-data-store.spec.ts index 94c96e790d..5adff1d971 100644 --- a/src/@batch-flask/core/data-store/user-specific-data-store/user-specific-data-store.spec.ts +++ b/src/@batch-flask/core/data-store/user-specific-data-store/user-specific-data-store.spec.ts @@ -29,12 +29,12 @@ describe("UserSpecificDataStore", () => { expect(spy).not.toHaveBeenCalled(); - userServiceSpy.currentUser.next({ unique_name: "foo@example.com" }); + userServiceSpy.currentUser.next({ username: "foo@example.com" }); }); describe("when the user is loaded", () => { beforeEach(() => { - userServiceSpy.currentUser.next({ unique_name: "foo@example.com" }); + userServiceSpy.currentUser.next({ username: "foo@example.com" }); }); it("defaults to null when there is no value", async () => { @@ -85,7 +85,7 @@ describe("UserSpecificDataStore", () => { }); it("it gets value for the new user when switching", async () => { - userServiceSpy.currentUser.next({ unique_name: "other@example.com" }); + userServiceSpy.currentUser.next({ username: "other@example.com" }); expect(await store.getItem("key-1")).toEqual("my-value-2"); expect(await store.getItem("key-2")).toEqual(null); diff --git a/src/@batch-flask/core/data-store/user-specific-data-store/user-specific-data-store.ts b/src/@batch-flask/core/data-store/user-specific-data-store/user-specific-data-store.ts index f7dcea5eb4..b2d8923ff5 100644 --- a/src/@batch-flask/core/data-store/user-specific-data-store/user-specific-data-store.ts +++ b/src/@batch-flask/core/data-store/user-specific-data-store/user-specific-data-store.ts @@ -8,7 +8,7 @@ import { GlobalStorage } from "../global-storage"; export const USER_SERVICE = "USER_SERVICE"; export interface User { - unique_name: string; + username: string; } export interface UserService { @@ -34,7 +34,7 @@ export class UserSpecificDataStore implements DataStore, OnDestroy { this._currentUser = this.userService.currentUser.pipe( takeUntil(this._destroy), filter(isNotNullOrUndefined), - map(x => x.unique_name), + map(x => x.username), publishReplay(1), refCount(), ); diff --git a/src/@batch-flask/ui/buttons/button.component.spec.ts b/src/@batch-flask/ui/buttons/button.component.spec.ts index aff2086f5d..543a813bc6 100644 --- a/src/@batch-flask/ui/buttons/button.component.spec.ts +++ b/src/@batch-flask/ui/buttons/button.component.spec.ts @@ -1,6 +1,5 @@ import { Component, DebugElement, NO_ERRORS_SCHEMA } from "@angular/core"; import { ComponentFixture, TestBed } from "@angular/core/testing"; -import { MatTooltip } from "@angular/material/tooltip"; import { By } from "@angular/platform-browser"; import { NoopAnimationsModule } from "@angular/platform-browser/animations"; import { MaterialModule } from "@batch-flask/core"; @@ -54,8 +53,7 @@ describe("ButtonComponent", () => { it("Should have the tooltip specified with title", () => { const el = de.query(By.css(".action-btn")); - const tooltip = el.injector.get(MatTooltip); - expect(tooltip.message).toBe("Stop"); + expect(el.nativeElement.title).toBe("Stop"); }); it("should change color", () => { diff --git a/src/@batch-flask/ui/buttons/button.html b/src/@batch-flask/ui/buttons/button.html index 696280e384..858330a355 100644 --- a/src/@batch-flask/ui/buttons/button.html +++ b/src/@batch-flask/ui/buttons/button.html @@ -1,4 +1,4 @@ -
+
diff --git a/src/@batch-flask/ui/buttons/refresh-btn/refresh-btn.component.ts b/src/@batch-flask/ui/buttons/refresh-btn/refresh-btn.component.ts index 2987d2388f..9cd819298f 100644 --- a/src/@batch-flask/ui/buttons/refresh-btn/refresh-btn.component.ts +++ b/src/@batch-flask/ui/buttons/refresh-btn/refresh-btn.component.ts @@ -59,6 +59,7 @@ export class RefreshButtonComponent implements OnDestroy { @autobind() public onClick() { this.status = RefreshStatus.Refreshing; + this.liveAnnouncer.announce("Refreshing in progress"); this._refreshSub = this.refresh().subscribe( () => { this.status = RefreshStatus.Succeeded; diff --git a/src/@batch-flask/ui/property-list/table-property/table-property.component.ts b/src/@batch-flask/ui/property-list/table-property/table-property.component.ts index 79d50c1cd7..2ec400f663 100644 --- a/src/@batch-flask/ui/property-list/table-property/table-property.component.ts +++ b/src/@batch-flask/ui/property-list/table-property/table-property.component.ts @@ -38,7 +38,7 @@ let idCounter = 0; @Component({ selector: "bl-tp-cell", template: ` -
+
{{value}}
diff --git a/src/@batch-flask/ui/table/table.scss b/src/@batch-flask/ui/table/table.scss index c3bd54672e..adca2e2021 100644 --- a/src/@batch-flask/ui/table/table.scss +++ b/src/@batch-flask/ui/table/table.scss @@ -174,7 +174,6 @@ bl-table { .sort-icon { margin-left: 3px; - color: $main-background; } &:hover:not(.sorting) > .sort-icon { diff --git a/src/app/components/layout/main-navigation/profile-button/profile-button.component.spec.ts b/src/app/components/layout/main-navigation/profile-button/profile-button.component.spec.ts index c4600e1cb2..c8fb3489bc 100644 --- a/src/app/components/layout/main-navigation/profile-button/profile-button.component.spec.ts +++ b/src/app/components/layout/main-navigation/profile-button/profile-button.component.spec.ts @@ -79,7 +79,7 @@ describe("ProfileButtonComponent", () => { it("shows the current user info in tooltip", () => { authServiceSpy.currentUser.next({ name: "Some Name", - unique_name: "some.name@example.com", + username: "some.name@example.com", }); fixture.detectChanges(); const tooltip: MatTooltip = clickableEl.injector.get(MatTooltip); diff --git a/src/app/components/layout/main-navigation/profile-button/profile-button.component.ts b/src/app/components/layout/main-navigation/profile-button/profile-button.component.ts index 6e13d05a45..5ce364d742 100644 --- a/src/app/components/layout/main-navigation/profile-button/profile-button.component.ts +++ b/src/app/components/layout/main-navigation/profile-button/profile-button.component.ts @@ -53,9 +53,9 @@ export class ProfileButtonComponent implements OnDestroy, OnInit { private fs: FileSystemService, private router: Router) { - authService.currentUser.pipe(takeUntil(this._destroy)).subscribe((user) => { + authService.currentUser.pipe(takeUntil(this._destroy)).subscribe(user => { if (user) { - this.currentUserName = `${user.name} (${user.unique_name})`; + this.currentUserName = `${user.name} (${user.username})`; } else { this.currentUserName = ""; } diff --git a/src/app/components/pool/action/add/pool-create-basic-dialog.component.ts b/src/app/components/pool/action/add/pool-create-basic-dialog.component.ts index efb2a15800..346ff6dbe2 100644 --- a/src/app/components/pool/action/add/pool-create-basic-dialog.component.ts +++ b/src/app/components/pool/action/add/pool-create-basic-dialog.component.ts @@ -33,6 +33,11 @@ export class PoolCreateBasicDialogComponent extends DynamicForm - -
- Cloud Services pools are deprecated and will be retired on 29 February 2024. Existing ‘CloudServiceConfiguration’ pools will need to be deleted and new - ‘VirtualMachineConfiguration’ pools created. - For new pools, select either a different ‘Distributions‘ or ‘Custom Image’ option. -
-
+ + +
+ Cloud Services pools are deprecated and will be retired on 29 February 2024. Existing ‘CloudServiceConfiguration’ pools will need to be deleted and new + ‘VirtualMachineConfiguration’ pools created. + For new pools, select either a different ‘Distributions‘ or ‘Custom Image’ option. +
+
+
diff --git a/src/app/components/pool/action/add/vm-size-picker/vm-size-picker.component.ts b/src/app/components/pool/action/add/vm-size-picker/vm-size-picker.component.ts index 5cf69fd2d8..5e67256686 100644 --- a/src/app/components/pool/action/add/vm-size-picker/vm-size-picker.component.ts +++ b/src/app/components/pool/action/add/vm-size-picker/vm-size-picker.component.ts @@ -24,8 +24,9 @@ const categoriesDisplayName = { compute: "Compute optimized", memory: "Memory optimized", storage: "Storage optimized", - gpu: "GPU", + gpu: "GPU - accelerated compute", hpc: "High performance compute", + fpga: "FPGA - accelerated compute", }; export class VmSizeDecorator { diff --git a/src/app/components/pool/details/error-display/pool-error-display.component.spec.ts b/src/app/components/pool/details/error-display/pool-error-display.component.spec.ts index 1ed7c6f282..c55cadbeac 100644 --- a/src/app/components/pool/details/error-display/pool-error-display.component.spec.ts +++ b/src/app/components/pool/details/error-display/pool-error-display.component.spec.ts @@ -4,9 +4,10 @@ import { By } from "@angular/platform-browser"; import { ElectronShell } from "@batch-flask/electron"; import { ElectronTestingModule, MockElectronShell } from "@batch-flask/electron/testing"; import { PoolErrorDisplayComponent } from "app/components/pool/details"; -import { Pool, ResizeErrorCode } from "app/models"; +import { NameValuePair, Pool, ResizeErrorCode } from "app/models"; import { BatchAccountService, PoolService } from "app/services"; import { Constants } from "common"; +import { List } from "immutable"; import { of } from "rxjs"; import * as Fixtures from "test/fixture"; import { BannerMockComponent } from "test/utils/mocks/components"; @@ -59,6 +60,9 @@ describe("PoolErrorDisplayComponent", () => { resizeErrors: [{ code: ResizeErrorCode.accountCoreQuotaReached, message: "Reached account core quota", + values: List([ + new NameValuePair({name: "details", value: "Regional quota reached"}) + ]) }], }); fixture.detectChanges(); @@ -68,10 +72,11 @@ describe("PoolErrorDisplayComponent", () => { expect(fixture.debugElement.queryAll(By.css("bl-banner")).length).toBe(1); }); - it("Should show the code and message", () => { + it("Should show the code, message, and details", () => { const banner = fixture.debugElement.query(By.css("bl-banner")); expect(banner.nativeElement.textContent).toContain(ResizeErrorCode.accountCoreQuotaReached); expect(banner.nativeElement.textContent).toContain("Reached account core quota"); + expect(banner.nativeElement.textContent).toContain("details: Regional quota reached"); }); it("should propose increase quota as a first fix", () => { diff --git a/src/app/components/pool/details/error-display/pool-error-display.html b/src/app/components/pool/details/error-display/pool-error-display.html index af72f352be..57c00b9684 100644 --- a/src/app/components/pool/details/error-display/pool-error-display.html +++ b/src/app/components/pool/details/error-display/pool-error-display.html @@ -7,7 +7,7 @@ {{resizeError.message}} ({{dedicatedQuota | async}} cores)
-
{{entry.key}}: {{entry.value}}
+
{{entry.name}}: {{entry.value}}
@@ -18,7 +18,7 @@ {{resizeError.message}} ({{lowPriorityQuota | async}} cores)
-
{{entry.key}}: {{entry.value}}
+
{{entry.name}}: {{entry.value}}
@@ -27,7 +27,7 @@ {{resizeError.message}}
-
{{entry.key}}: {{entry.value}}
+
{{entry.name}}: {{entry.value}}
diff --git a/src/client/core/aad/aad-constants.ts b/src/client/core/aad/aad-constants.ts index 22be2bd00f..5af060f73e 100644 --- a/src/client/core/aad/aad-constants.ts +++ b/src/client/core/aad/aad-constants.ts @@ -1,4 +1,4 @@ -export const defaultTenant = "common"; +export const defaultTenant = "organizations"; export interface AuthorizeUrlParams { response_type: string; diff --git a/src/client/core/aad/auth-provider.ts b/src/client/core/aad/auth-provider.ts index cdf694670c..c39223bfa5 100644 --- a/src/client/core/aad/auth-provider.ts +++ b/src/client/core/aad/auth-provider.ts @@ -6,6 +6,7 @@ import { } from "@azure/msal-node"; import { BatchExplorerApplication } from ".."; import { AADConfig } from "./aad-config"; +import { defaultTenant } from "./aad-constants"; const MSAL_SCOPES = ["user_impersonation"]; @@ -36,7 +37,7 @@ export default class AuthProvider { tenantId?: string, authCodeCallback: (url: string, silent?: boolean) => Promise }): Promise { - const { resourceURI, tenantId = "common", authCodeCallback } = options; + const { resourceURI, tenantId = defaultTenant, authCodeCallback } = options; /** * KLUDGE: msal.js does not handle well access tokens across multiple diff --git a/src/client/core/aad/auth/aad-user.ts b/src/client/core/aad/auth/aad-user.ts index c1176d39f9..48d6455880 100644 --- a/src/client/core/aad/auth/aad-user.ts +++ b/src/client/core/aad/auth/aad-user.ts @@ -45,15 +45,6 @@ export interface AADUser { */ amr?: string[]; - /** - * Last name of user - */ - family_name?: string; - - /** - * First name of user - */ - given_name: string; ipaddr: string; /** @@ -73,22 +64,19 @@ export interface AADUser { tid?: string; /** - * Unique name * Provides a human readable value that identifies the subject of the token. - * This value is not guaranteed to be unique within a tenant and is designed to be used only for display purposes. - */ - unique_name: string; - - /** - * User principal name - * Stores the user name of the user principal. * @example "frankm@contoso.com" */ - upn?: string; + preferred_username: string; /** * Version * @example 1.0 */ ver?: string; + + /** + * The calculated username + */ + username?: string; } diff --git a/src/client/core/aad/auth/aad.service.spec.ts b/src/client/core/aad/auth/aad.service.spec.ts index fb4b4e239a..7648c53899 100644 --- a/src/client/core/aad/auth/aad.service.spec.ts +++ b/src/client/core/aad/auth/aad.service.spec.ts @@ -16,8 +16,6 @@ const sampleUser: AADUser = { nbf: 1483372574, exp: 1483376474, amr: ["pwd", "mfa"], - family_name: "Smith", - given_name: "Frank", ipaddr: "198.217.117.26", name: "Frank Smith", nonce: "be4e7843-305e-42ab-988d-7ee109989d70", @@ -25,8 +23,8 @@ const sampleUser: AADUser = { platf: "5", sub: "0WzjD2jhHJVb-3h2PbwUDCJOIPPIJmQQYE832uFqiII", tid: "72f988bf-86f1-41af-91ab-2d7cd011db47", - unique_name: "frank.smith@example.com", - upn: "frank.smith@example.com", + preferred_username: "frank.smith@example.com", + username: "frank.smith@example.com", ver: "1.0", }; @@ -93,7 +91,7 @@ describe("AADService", () => { let user: AADUser | null = null; tmpService.currentUser.subscribe(x => user = x); expect(user).not.toBeNull(); - expect(user.upn).toEqual("frank.smith@example.com"); + expect(user.username).toEqual("frank.smith@example.com"); done(); }); diff --git a/src/client/core/aad/auth/aad.service.ts b/src/client/core/aad/auth/aad.service.ts index 2494e2d6f5..8709bb8e8e 100644 --- a/src/client/core/aad/auth/aad.service.ts +++ b/src/client/core/aad/auth/aad.service.ts @@ -15,6 +15,7 @@ import { Deferred } from "common/deferred"; import { dialog } from "electron"; import { BehaviorSubject, Observable } from "rxjs"; import { AADConfig } from "../aad-config"; +import { defaultTenant } from "../aad-constants"; import AuthProvider from "../auth-provider"; import { AuthenticationService, AuthenticationState, AuthorizeResult, LogoutError @@ -110,7 +111,7 @@ export class AADService { private async _loginInCurrentCloud() { try { - await this.accessTokenData("common"); + await this.accessTokenData(defaultTenant); this._authenticationState.next(AuthenticationState.Authenticated); } catch (error) { if (error instanceof LogoutError) { @@ -199,7 +200,7 @@ export class AADService { private _processUserToken(idToken: string) { const user = this._userDecoder.decode(idToken); const prevUser = this._currentUser.value; - if (!prevUser || prevUser.unique_name !== user.unique_name) { + if (!prevUser || prevUser.username !== user.username) { this._clearUserSpecificCache(); } this._currentUser.next(user); @@ -207,7 +208,7 @@ export class AADService { } private async _loadTenants(): Promise { - const token = await this.accessTokenData("common"); + const token = await this.accessTokenData(defaultTenant); const headers = { Authorization: `${token.token_type} ${token.access_token}`, diff --git a/src/client/core/aad/auth/user-decoder.ts b/src/client/core/aad/auth/user-decoder.ts index f0d04fc6d4..a2efeec8bf 100644 --- a/src/client/core/aad/auth/user-decoder.ts +++ b/src/client/core/aad/auth/user-decoder.ts @@ -16,7 +16,7 @@ export class UserDecoder { const decodedPayLoad = this.safeDecodeBase64(jwtDecoded.JWSPayload); const user = JSON.parse(decodedPayLoad); - + user.username = user.preferred_username; return user as AADUser; }