diff --git a/.azure-pipelines/common-steps.yml b/.azure-pipelines/common-steps.yml index 21940d46..a708a058 100644 --- a/.azure-pipelines/common-steps.yml +++ b/.azure-pipelines/common-steps.yml @@ -35,8 +35,8 @@ steps: # Acquire the `vsce` tool and use it to package - script: | - npm install -g vsce - vsce package --githubBranch main + npm install -g @vscode/vsce + vsce package displayName: Create VSIX - script: | diff --git a/.gitignore b/.gitignore index c27f8984..af649f80 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +coverage dist out node_modules diff --git a/.vscode-test.mjs b/.vscode-test.mjs new file mode 100644 index 00000000..5396a3ba --- /dev/null +++ b/.vscode-test.mjs @@ -0,0 +1,16 @@ +// @ts-check + +import { defineConfig } from '@vscode/test-cli'; +import path from 'path'; + +export default defineConfig({ + files: 'out/test/**/*.test.js', + workspaceFolder: path.join(import.meta.dirname, 'src', 'test', 'workspace'), + mocha: { + timeout: 100000, + }, + coverage: { + reporter: ['cobertura', 'text', 'html'], + output: './coverage', + } +}); diff --git a/.vscode/extensions.json b/.vscode/extensions.json index 3ac9aeb6..186459d5 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -2,6 +2,7 @@ // See http://go.microsoft.com/fwlink/?LinkId=827846 // for the documentation about the extensions.json format "recommendations": [ - "dbaeumer.vscode-eslint" + "dbaeumer.vscode-eslint", + "ms-vscode.extension-test-runner" ] } diff --git a/.vscode/launch.json b/.vscode/launch.json index 037293b8..febd3e7a 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -21,7 +21,7 @@ "name": "Extension Tests", "type": "extensionHost", "request": "launch", - "runtimeExecutable": "${execPath}", + "testConfiguration": "${workspaceFolder}/.vscode-test.js", "args": [ "${workspaceFolder}/src/test/workspace", "--extensionDevelopmentPath=${workspaceFolder}", diff --git a/.vscodeignore b/.vscodeignore index 05952e68..b9be09e9 100644 --- a/.vscodeignore +++ b/.vscodeignore @@ -1,12 +1,13 @@ - .gitattributes .gitignore +.vscode-test.mjs tsconfig.json tslint.json webpack.config.js .azure-pipelines/ .vscode/ .vscode-test/ +coverage/ dist/**/*.map examples/ node_modules/ diff --git a/README.md b/README.md index 9435fc2b..3fd20586 100644 --- a/README.md +++ b/README.md @@ -56,38 +56,10 @@ Add this to your `settings.json`: Both format on save and the `Format document` command should now work! -## Pipeline configuration - -![Configure Pipeline Demo](https://raw.githubusercontent.com/microsoft/azure-pipelines-vscode/main/resources/configure-pipeline.gif) - -To set up a pipeline, choose *Azure Pipelines: Configure Pipeline* from the command palette (Ctrl/Cmd + Shift + P) or right-click in the file explorer. The guided workflow will generate a starter YAML file defining the build and deploy process. - -You can customize the pipeline using all the features offered by [Azure Pipelines.](https://azure.microsoft.com/services/devops/pipelines/). - -Once the setup is completed, an automatic CI/CD trigger will fire for every code push. To set this up, the extension will ask for a GitHub PAT with *repo* and *admin:repo_hook* scope. - -![GitHub PAT scope](resources/gitHubPatScope.png) - ## Telemetry VS Code collects usage data and sends it to Microsoft to help improve our products and services. Read our [privacy statement](https://go.microsoft.com/fwlink/?LinkID=528096&clcid=0x409) to learn more. If you don’t wish to send usage data to Microsoft, you can set the `telemetry.enableTelemetry` setting to `false`. Learn more in our [FAQ](https://code.visualstudio.com/docs/supporting/faq#_how-to-disable-telemetry-reporting). -## Troubleshooting failures - -- **Selected workspace is not a Git repository**: You can configure a pipeline for a Git repository backed by GitHub or Azure Repos. Initialize your workspace as a Git repo, commit your files, and add a remote to GitHub or Azure Repos. Run the following commands to configure git repository: - - `git init` - - `git add *` - - `git commit -m ` - - `git remote add ` - -- **The current branch doesn't have a tracking branch, and the selected repository has no remotes**: You can configure a pipeline for a Git repository backed by GitHub or Azure Repos. To add a new remote Git repository, run `git remote add ` - -- **Failed to determine Azure Repo details from remote url**: If you're configuring a pipeline for a Git repository backed by Azure Repos, ensure that it has a remote pointing to a valid Azure Repos Git repo URL. - ## Extension Development If you are only working on the extension (i.e. syntax highlighting, configure pipeline, and the language client): diff --git a/package-lock.json b/package-lock.json index 3ae9bf85..6e56308b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,33 +9,21 @@ "version": "1.237.0", "license": "MIT", "dependencies": { - "@azure/arm-appservice": "^6.1.0", - "@azure/arm-subscriptions": "^3.0.0", - "@azure/ms-rest-azure-env": "^2.0.0", - "@azure/ms-rest-nodeauth": "^3.0.6", "@vscode/extension-telemetry": "^0.5.1", "azure-devops-node-api": "^11.0.1", "azure-pipelines-language-server": "0.8.0", - "html-to-text": "^5.1.1", - "mustache": "^4.2.0", - "uuid": "^8.3.2", "vscode-languageclient": "^7.0.0", "vscode-uri": "^3.0.2" }, "devDependencies": { - "@types/glob": "^7.2.0", - "@types/html-to-text": "^5.1.2", "@types/mocha": "^9.0.0", - "@types/mustache": "0.8.32", - "@types/node": "^14.16.0", - "@types/uuid": "^8.3.4", - "@types/vscode": "~1.64.0", + "@types/node": "~20.15.0", + "@types/vscode": "~1.82.0", "@typescript-eslint/eslint-plugin": "^6.11.0", "@typescript-eslint/parser": "^6.11.0", - "@vscode/test-electron": "^1.6.2", - "copy-webpack-plugin": "^10.2.0", + "@vscode/test-cli": "^0.0.10", + "@vscode/test-electron": "^2.4.1", "eslint": "^8.54.0", - "glob": "^7.1.6", "mocha": "^9.1.1", "ts-loader": "^8.0.14", "typescript": "~5.2.2", @@ -43,135 +31,14 @@ "webpack-cli": "^4.4.0" }, "engines": { - "node": ">=12.20.0", - "vscode": "^1.64.0" + "vscode": "^1.82.0" } }, - "node_modules/@azure/abort-controller": { - "version": "2.1.2", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@azure/abort-controller/-/abort-controller-2.1.2.tgz", - "integrity": "sha1-Qv4MyrI4QdmQWBLFjxCC0neEVm0=", - "license": "MIT", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@azure/abort-controller/node_modules/tslib": { - "version": "2.6.3", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha1-BDj4EK16ntzeeiQcPYDbaTyMv+A=", - "license": "0BSD" - }, - "node_modules/@azure/arm-appservice": { - "version": "6.1.0", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@azure/arm-appservice/-/arm-appservice-6.1.0.tgz", - "integrity": "sha1-wsTE1QvZ8OzL2Bomjh9uxkmqfKo=", - "deprecated": "Please note, versions of this package with version numbers 9.0.0 and below have been deprecated as of 31-March-2022. We strongly encourage you to upgrade to version 10.0.0 or above to continue receiving updates. Refer to our deprecation policy: https://azure.github.io/azure-sdk/policies_support.html for more details.", - "license": "MIT", - "dependencies": { - "@azure/ms-rest-azure-js": "^2.0.1", - "@azure/ms-rest-js": "^2.0.4", - "tslib": "^1.10.0" - } - }, - "node_modules/@azure/arm-subscriptions": { - "version": "3.1.2", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@azure/arm-subscriptions/-/arm-subscriptions-3.1.2.tgz", - "integrity": "sha1-avsHVHiZQvGQwtjiRKUhyeLNuIY=", - "deprecated": "Please note, versions of this package with version numbers 3.1.2 and below have been deprecated as of 31-March-2022. We strongly encourage you to upgrade to version 4.0.0 or above to continue receiving updates. Refer to our deprecation policy: https://azure.github.io/azure-sdk/policies_support.html for more details.", - "license": "MIT", - "dependencies": { - "@azure/core-auth": "^1.1.4", - "@azure/ms-rest-azure-js": "^2.1.0", - "@azure/ms-rest-js": "^2.2.0", - "tslib": "^1.10.0" - } - }, - "node_modules/@azure/core-auth": { - "version": "1.7.2", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@azure/core-auth/-/core-auth-1.7.2.tgz", - "integrity": "sha1-VYt8t90SsAvuwHrl31kH103x69k=", - "license": "MIT", - "dependencies": { - "@azure/abort-controller": "^2.0.0", - "@azure/core-util": "^1.1.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@azure/core-auth/node_modules/tslib": { - "version": "2.6.3", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha1-BDj4EK16ntzeeiQcPYDbaTyMv+A=", - "license": "0BSD" - }, - "node_modules/@azure/core-util": { - "version": "1.9.2", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@azure/core-util/-/core-util-1.9.2.tgz", - "integrity": "sha1-HcN9xbDa40xXi+Ys+YkFunwMr+c=", - "license": "MIT", - "dependencies": { - "@azure/abort-controller": "^2.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@azure/core-util/node_modules/tslib": { - "version": "2.6.3", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha1-BDj4EK16ntzeeiQcPYDbaTyMv+A=", - "license": "0BSD" - }, - "node_modules/@azure/ms-rest-azure-env": { - "version": "2.0.0", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@azure/ms-rest-azure-env/-/ms-rest-azure-env-2.0.0.tgz", - "integrity": "sha1-RYCfiXY6SAkk4h08YgzUCGZ3FiU=", - "license": "MIT" - }, - "node_modules/@azure/ms-rest-azure-js": { - "version": "2.1.0", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@azure/ms-rest-azure-js/-/ms-rest-azure-js-2.1.0.tgz", - "integrity": "sha1-jJCzFGiuyjFGsGxxRLOG/Ugn9kw=", - "license": "MIT", - "dependencies": { - "@azure/core-auth": "^1.1.4", - "@azure/ms-rest-js": "^2.2.0", - "tslib": "^1.10.0" - } - }, - "node_modules/@azure/ms-rest-js": { - "version": "2.7.0", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@azure/ms-rest-js/-/ms-rest-js-2.7.0.tgz", - "integrity": "sha1-hjkGVXf/30lGlR4dJGM06/1y1Tc=", - "license": "MIT", - "dependencies": { - "@azure/core-auth": "^1.1.4", - "abort-controller": "^3.0.0", - "form-data": "^2.5.0", - "node-fetch": "^2.6.7", - "tslib": "^1.10.0", - "tunnel": "0.0.6", - "uuid": "^8.3.2", - "xml2js": "^0.5.0" - } - }, - "node_modules/@azure/ms-rest-nodeauth": { - "version": "3.1.1", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@azure/ms-rest-nodeauth/-/ms-rest-nodeauth-3.1.1.tgz", - "integrity": "sha1-JiQiLwaFrlgIAdbxq+qyCSOBRpM=", - "license": "MIT", - "dependencies": { - "@azure/ms-rest-azure-env": "^2.0.0", - "@azure/ms-rest-js": "^2.0.4", - "adal-node": "^0.2.2" - } + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha1-daLotRy3WKdVPWgEpZMteqznXDk=", + "dev": true }, "node_modules/@discoveryjs/json-ext": { "version": "0.5.7", @@ -349,6 +216,111 @@ "dev": true, "license": "BSD-3-Clause" }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha1-s3Znt7wYHBaHgiWbq0JHT79StVA=", + "dev": true, + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha1-lexAnGlhnWyxuLNPFLZg7yjr1lQ=", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha1-DmIyDPmcIa//OzASGSVGqsv7BcU=", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha1-hAyIA7DYBH9P8M+WMXazLU7z7XI=", + "dev": true + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha1-FPja7G2B5yIdKjV+Zoyrc728p5Q=", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha1-1bZWjKaJ2FYTcLBwdoXSJDT6/0U=", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha1-VtwiNo7lcPrOG0mBmXXZuaXq0hQ=", + "dev": true, + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha1-5F44TkuOwWvOL9kDr3hFD2v37Jg=", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.5", "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", @@ -451,14 +423,14 @@ "node": ">= 8" } }, - "node_modules/@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha1-zLkURTYBeaBOf+av94wA/8Hur4I=", + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha1-p36nQvqyV3UUVDTrHSMoz1ATrDM=", "dev": true, - "license": "MIT", + "optional": true, "engines": { - "node": ">= 6" + "node": ">=14" } }, "node_modules/@types/estree": { @@ -468,23 +440,11 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/glob": { - "version": "7.2.0", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@types/glob/-/glob-7.2.0.tgz", - "integrity": "sha1-vBtb86qS8lvV3TnzXFc2G9zlsus=", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/minimatch": "*", - "@types/node": "*" - } - }, - "node_modules/@types/html-to-text": { - "version": "5.1.2", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@types/html-to-text/-/html-to-text-5.1.2.tgz", - "integrity": "sha1-WacjzOQbVzt/pgZBTizqqIYDgJg=", - "dev": true, - "license": "MIT" + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha1-dznCMqH+6bTTzomF8xTAxtM1Sdc=", + "dev": true }, "node_modules/@types/json-schema": { "version": "7.0.15", @@ -493,13 +453,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/minimatch": { - "version": "5.1.2", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@types/minimatch/-/minimatch-5.1.2.tgz", - "integrity": "sha1-B1CLRXl8uB7D8nMBGwVM0HVe3co=", - "dev": true, - "license": "MIT" - }, "node_modules/@types/mocha": { "version": "9.1.1", "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@types/mocha/-/mocha-9.1.1.tgz", @@ -507,19 +460,15 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/mustache": { - "version": "0.8.32", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@types/mustache/-/mustache-0.8.32.tgz", - "integrity": "sha1-fbO4Hyv0UL04gF9ZbSDsqXxO1ZU=", - "dev": true, - "license": "MIT" - }, "node_modules/@types/node": { - "version": "14.18.63", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@types/node/-/node-14.18.63.tgz", - "integrity": "sha1-F4j6jag427X56plLg0J4IF22yis=", + "version": "20.15.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@types/node/-/node-20.15.0.tgz", + "integrity": "sha1-cwX3/nxizTEEftjWXFCS8LDhxV0=", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "undici-types": "~6.13.0" + } }, "node_modules/@types/semver": { "version": "7.5.8", @@ -528,17 +477,10 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/uuid": { - "version": "8.3.4", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@types/uuid/-/uuid-8.3.4.tgz", - "integrity": "sha1-vYakNhffBZR4fTi3NfVcgFvs8bw=", - "dev": true, - "license": "MIT" - }, "node_modules/@types/vscode": { - "version": "1.64.0", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@types/vscode/-/vscode-1.64.0.tgz", - "integrity": "sha1-v9gsjZLceCTBvghL4atGziDX+1U=", + "version": "1.82.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@types/vscode/-/vscode-1.82.0.tgz", + "integrity": "sha1-ibCyEXnc9ejO4WZKmgXF9sYNONA=", "dev": true, "license": "MIT" }, @@ -760,23 +702,284 @@ "integrity": "sha1-sAiIjL+7693h8qyGv/50BXrdjCU=", "license": "MIT", "engines": { - "vscode": "^1.60.0" + "vscode": "^1.60.0" + } + }, + "node_modules/@vscode/test-cli": { + "version": "0.0.10", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@vscode/test-cli/-/test-cli-0.0.10.tgz", + "integrity": "sha1-NfDoHC4P+NrOsiPpnRtlMGwVgiw=", + "dev": true, + "dependencies": { + "@types/mocha": "^10.0.2", + "c8": "^9.1.0", + "chokidar": "^3.5.3", + "enhanced-resolve": "^5.15.0", + "glob": "^10.3.10", + "minimatch": "^9.0.3", + "mocha": "^10.2.0", + "supports-color": "^9.4.0", + "yargs": "^17.7.2" + }, + "bin": { + "vscode-test": "out/bin.mjs" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@vscode/test-cli/node_modules/@types/mocha": { + "version": "10.0.8", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@types/mocha/-/mocha-10.0.8.tgz", + "integrity": "sha1-p+/1gW4HDDtNgD8dPNeAxOQpNKE=", + "dev": true + }, + "node_modules/@vscode/test-cli/node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha1-N2ETQOsiQ+cMxgTK011jJw1IeBs=", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@vscode/test-cli/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha1-JG9Q88p4oyQPbJl+ipvR6sSeSzg=", + "dev": true + }, + "node_modules/@vscode/test-cli/node_modules/diff": { + "version": "5.2.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/diff/-/diff-5.2.0.tgz", + "integrity": "sha1-Jt7QR80RebeLlTfV73JVA84a5TE=", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/@vscode/test-cli/node_modules/enhanced-resolve": { + "version": "5.17.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", + "integrity": "sha1-Z7+7zC+B1RG+d9aGqQJn73+JihU=", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@vscode/test-cli/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha1-wftl+PUBeQHN0slRhkuhhFihBgI=", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@vscode/test-cli/node_modules/mocha": { + "version": "10.7.3", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/mocha/-/mocha-10.7.3.tgz", + "integrity": "sha1-rjIAPKu9UrWa7OF4RgVqaOtLB1I=", + "dev": true, + "dependencies": { + "ansi-colors": "^4.1.3", + "browser-stdout": "^1.3.1", + "chokidar": "^3.5.3", + "debug": "^4.3.5", + "diff": "^5.2.0", + "escape-string-regexp": "^4.0.0", + "find-up": "^5.0.0", + "glob": "^8.1.0", + "he": "^1.2.0", + "js-yaml": "^4.1.0", + "log-symbols": "^4.1.0", + "minimatch": "^5.1.6", + "ms": "^2.1.3", + "serialize-javascript": "^6.0.2", + "strip-json-comments": "^3.1.1", + "supports-color": "^8.1.1", + "workerpool": "^6.5.1", + "yargs": "^16.2.0", + "yargs-parser": "^20.2.9", + "yargs-unparser": "^2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha.js" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@vscode/test-cli/node_modules/mocha/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/glob/-/glob-8.1.0.tgz", + "integrity": "sha1-04j2Vlk+9wjuPjRkD9+5mp/Rwz4=", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@vscode/test-cli/node_modules/mocha/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha1-HPy4z1Ui6mmVLNKvla4JR38SKpY=", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@vscode/test-cli/node_modules/mocha/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha1-zW/BfihQDP9WwbhsCn/UpUpzAFw=", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/@vscode/test-cli/node_modules/mocha/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha1-HIK/D2tqZur85+8w43b0mhJHf2Y=", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@vscode/test-cli/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/ms/-/ms-2.1.3.tgz", + "integrity": "sha1-V0yBOM4dK1hh8LRFedut1gxmFbI=", + "dev": true + }, + "node_modules/@vscode/test-cli/node_modules/supports-color": { + "version": "9.4.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/supports-color/-/supports-color-9.4.0.tgz", + "integrity": "sha1-F7/PaGKI9THbPeoyFVEGIcy1WVQ=", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/@vscode/test-cli/node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha1-GWenPvQGCoLxKrlq+G1S/bdu7KA=", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@vscode/test-cli/node_modules/workerpool": { + "version": "6.5.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/workerpool/-/workerpool-6.5.1.tgz", + "integrity": "sha1-Bg9zs50Mr5fG22TaAEzQG0wJlUQ=", + "dev": true + }, + "node_modules/@vscode/test-cli/node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha1-mR3zmspnWhkrgW4eA2P5110qomk=", + "dev": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@vscode/test-cli/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha1-LrfcOwKJcY/ClfNidThFxBoMlO4=", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/@vscode/test-cli/node_modules/yargs/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha1-DASwddsCy/5g3I5s8vVIaxo2CKo=", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@vscode/test-cli/node_modules/yargs/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha1-kJa87r+ZDSG7MfqVFuDt4pSnfTU=", + "dev": true, + "engines": { + "node": ">=12" } }, "node_modules/@vscode/test-electron": { - "version": "1.6.2", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@vscode/test-electron/-/test-electron-1.6.2.tgz", - "integrity": "sha1-9jnKsZoAE5SQFQedz9L/DBqoihs=", + "version": "2.4.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@vscode/test-electron/-/test-electron-2.4.1.tgz", + "integrity": "sha1-XCdgZAv2ku+9qhi6/NNftRloiUE=", "dev": true, - "license": "MIT", "dependencies": { - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "rimraf": "^3.0.2", - "unzipper": "^0.10.11" + "http-proxy-agent": "^7.0.2", + "https-proxy-agent": "^7.0.5", + "jszip": "^3.10.1", + "ora": "^7.0.1", + "semver": "^7.6.2" }, "engines": { - "node": ">=8.9.3" + "node": ">=16" } }, "node_modules/@webassemblyjs/ast": { @@ -979,15 +1182,6 @@ } } }, - "node_modules/@xmldom/xmldom": { - "version": "0.8.10", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@xmldom/xmldom/-/xmldom-0.8.10.tgz", - "integrity": "sha1-oTN8pCaqYc75/hW1so40CnL2+pk=", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - } - }, "node_modules/@xtuc/ieee754": { "version": "1.2.0", "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@xtuc/ieee754/-/ieee754-1.2.0.tgz", @@ -1002,18 +1196,6 @@ "dev": true, "license": "Apache-2.0" }, - "node_modules/abort-controller": { - "version": "3.0.0", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha1-6vVNU7YrrkE46AnKIlyEOabvs5I=", - "license": "MIT", - "dependencies": { - "event-target-shim": "^5.0.0" - }, - "engines": { - "node": ">=6.5" - } - }, "node_modules/acorn": { "version": "8.12.1", "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/acorn/-/acorn-8.12.1.tgz", @@ -1047,47 +1229,16 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/adal-node": { - "version": "0.2.4", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/adal-node/-/adal-node-0.2.4.tgz", - "integrity": "sha1-iBvu2dSTt2qGcGrVyNxvYO/wRSA=", - "deprecated": "This package is no longer supported. Please migrate to @azure/msal-node.", - "license": "Apache-2.0", - "dependencies": { - "@xmldom/xmldom": "^0.8.3", - "async": "^2.6.3", - "axios": "^0.21.1", - "date-utils": "*", - "jws": "3.x.x", - "underscore": ">= 1.3.1", - "uuid": "^3.1.0", - "xpath.js": "~1.1.0" - }, - "engines": { - "node": ">= 0.6.15" - } - }, - "node_modules/adal-node/node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha1-sj5DWK+oogL+ehAK8fX4g/AgB+4=", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "license": "MIT", - "bin": { - "uuid": "bin/uuid" - } - }, "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha1-Sf/1hXfP7j83F2/qtMIuAPhtf3c=", + "version": "7.1.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/agent-base/-/agent-base-7.1.1.tgz", + "integrity": "sha1-vb3tffsJa3UaKgh+7rlmRyWy4xc=", "dev": true, - "license": "MIT", "dependencies": { - "debug": "4" + "debug": "^4.3.4" }, "engines": { - "node": ">= 6.0.0" + "node": ">= 14" } }, "node_modules/ajv": { @@ -1107,48 +1258,6 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/ajv-formats": { - "version": "2.1.1", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha1-bmaUAGWet0lzu/LjMycYCgmWtSA=", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/ajv-formats/node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha1-N9mlx3ava8ktf0+VEOukwKYNEaY=", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha1-rnvLNlard6c7pcSb9lTzjmtoYOI=", - "dev": true, - "license": "MIT" - }, "node_modules/ajv-keywords": { "version": "3.5.2", "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/ajv-keywords/-/ajv-keywords-3.5.2.tgz", @@ -1228,30 +1337,6 @@ "node": ">=8" } }, - "node_modules/async": { - "version": "2.6.4", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/async/-/async-2.6.4.tgz", - "integrity": "sha1-cGt/9ghGZM1+rnE/b5ZUM7VQQiE=", - "license": "MIT", - "dependencies": { - "lodash": "^4.17.14" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "license": "MIT" - }, - "node_modules/axios": { - "version": "0.21.4", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/axios/-/axios-0.21.4.tgz", - "integrity": "sha1-xnuQ3AVo5cHPKwuFjEO6KOLtpXU=", - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.14.0" - } - }, "node_modules/azure-devops-node-api": { "version": "11.2.0", "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/azure-devops-node-api/-/azure-devops-node-api-11.2.0.tgz", @@ -1307,15 +1392,25 @@ "integrity": "sha1-6D46fj8wCzTLnYf2FfoMvzV2kO4=", "license": "MIT" }, - "node_modules/big-integer": { - "version": "1.6.52", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/big-integer/-/big-integer-1.6.52.tgz", - "integrity": "sha1-YKiH8wR2FKjhv/5dcXNJCpfcjIU=", + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha1-GxtEAWClv3rUC2UPCVljSBkDkwo=", "dev": true, - "license": "Unlicense", - "engines": { - "node": ">=0.6" - } + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] }, "node_modules/big.js": { "version": "5.2.2", @@ -1327,20 +1422,6 @@ "node": "*" } }, - "node_modules/binary": { - "version": "0.3.0", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/binary/-/binary-0.3.0.tgz", - "integrity": "sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk=", - "dev": true, - "license": "MIT", - "dependencies": { - "buffers": "~0.1.1", - "chainsaw": "~0.1.0" - }, - "engines": { - "node": "*" - } - }, "node_modules/binary-extensions": { "version": "2.3.0", "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/binary-extensions/-/binary-extensions-2.3.0.tgz", @@ -1354,12 +1435,30 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/bluebird": { - "version": "3.4.7", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/bluebird/-/bluebird-3.4.7.tgz", - "integrity": "sha1-9y12C+Cbf3bQjtj66Ysomo0F+rM=", + "node_modules/bl": { + "version": "5.1.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/bl/-/bl-5.1.0.tgz", + "integrity": "sha1-GDcV9njHGI7O+f5HXZAglABiQnM=", "dev": true, - "license": "MIT" + "dependencies": { + "buffer": "^6.0.3", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bl/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha1-VqmzbqllwAxak+8x6xEaDxEFaWc=", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } }, "node_modules/brace-expansion": { "version": "2.0.1", @@ -1424,11 +1523,29 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "node_modules/buffer-equal-constant-time": { - "version": "1.0.1", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", - "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=", - "license": "BSD-3-Clause" + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha1-Ks5XhFnMj74qcKqo9S7mO2p0xsY=", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } }, "node_modules/buffer-from": { "version": "1.1.2", @@ -1437,23 +1554,70 @@ "dev": true, "license": "MIT" }, - "node_modules/buffer-indexof-polyfill": { - "version": "1.0.2", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz", - "integrity": "sha1-0nMhNcWZnGSyd/z5savjSYJUcpw=", + "node_modules/c8": { + "version": "9.1.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/c8/-/c8-9.1.0.tgz", + "integrity": "sha1-Dle6Ornllgqx1lC0qG9x5Ty2gRI=", "dev": true, - "license": "MIT", + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@istanbuljs/schema": "^0.1.3", + "find-up": "^5.0.0", + "foreground-child": "^3.1.1", + "istanbul-lib-coverage": "^3.2.0", + "istanbul-lib-report": "^3.0.1", + "istanbul-reports": "^3.1.6", + "test-exclude": "^6.0.0", + "v8-to-istanbul": "^9.0.0", + "yargs": "^17.7.2", + "yargs-parser": "^21.1.1" + }, + "bin": { + "c8": "bin/c8.js" + }, "engines": { - "node": ">=0.10" + "node": ">=14.14.0" + } + }, + "node_modules/c8/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha1-DASwddsCy/5g3I5s8vVIaxo2CKo=", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/c8/node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha1-mR3zmspnWhkrgW4eA2P5110qomk=", + "dev": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" } }, - "node_modules/buffers": { - "version": "0.1.1", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/buffers/-/buffers-0.1.1.tgz", - "integrity": "sha1-skV5w77U1tOWru5tmorn9Ugqt7s=", + "node_modules/c8/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha1-kJa87r+ZDSG7MfqVFuDt4pSnfTU=", "dev": true, "engines": { - "node": ">=0.2.0" + "node": ">=12" } }, "node_modules/call-bind": { @@ -1519,19 +1683,6 @@ ], "license": "CC-BY-4.0" }, - "node_modules/chainsaw": { - "version": "0.1.0", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/chainsaw/-/chainsaw-0.1.0.tgz", - "integrity": "sha1-XqtQsor+WAdNDVgpE4iCi15fvJg=", - "dev": true, - "license": "MIT/X11", - "dependencies": { - "traverse": ">=0.3.0 <0.4" - }, - "engines": { - "node": "*" - } - }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/chalk/-/chalk-4.1.2.tgz", @@ -1600,6 +1751,33 @@ "node": ">=6.0" } }, + "node_modules/cli-cursor": { + "version": "4.0.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/cli-cursor/-/cli-cursor-4.0.0.tgz", + "integrity": "sha1-POz+NzS/T+Aqg2HL3A9v4oxqV+o=", + "dev": true, + "dependencies": { + "restore-cursor": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha1-F3Oo9LnE1qwxVj31Oz/B15Ri/kE=", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/cliui": { "version": "7.0.4", "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/cliui/-/cliui-7.0.4.tgz", @@ -1654,18 +1832,6 @@ "dev": true, "license": "MIT" }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha1-w9RaizT9cwYxoRCoolIGgrMdWn8=", - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/commander": { "version": "2.20.3", "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/commander/-/commander-2.20.3.tgz", @@ -1679,77 +1845,11 @@ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "license": "MIT" }, - "node_modules/copy-webpack-plugin": { - "version": "10.2.4", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/copy-webpack-plugin/-/copy-webpack-plugin-10.2.4.tgz", - "integrity": "sha1-bIVL4/2q4iAl2jS5ESzPgcYzCP4=", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-glob": "^3.2.7", - "glob-parent": "^6.0.1", - "globby": "^12.0.2", - "normalize-path": "^3.0.0", - "schema-utils": "^4.0.0", - "serialize-javascript": "^6.0.0" - }, - "engines": { - "node": ">= 12.20.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - } - }, - "node_modules/copy-webpack-plugin/node_modules/array-union": { - "version": "3.0.1", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/array-union/-/array-union-3.0.1.tgz", - "integrity": "sha1-2lJjDTJ/i4jPv7V3KOKvXNm2uXU=", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/copy-webpack-plugin/node_modules/globby": { - "version": "12.2.0", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/globby/-/globby-12.2.0.tgz", - "integrity": "sha1-KrgEa0+6T/bu3oNbKfZ4+Q49PCI=", - "dev": true, - "license": "MIT", - "dependencies": { - "array-union": "^3.0.1", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.7", - "ignore": "^5.1.9", - "merge2": "^1.4.1", - "slash": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/copy-webpack-plugin/node_modules/slash": { - "version": "4.0.0", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/slash/-/slash-4.0.0.tgz", - "integrity": "sha1-JCI3IXbExsWt214q2oha+YSzlqc=", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha1-S1YPZJ/E6RjdCrdc9JYei8iC2Co=", + "dev": true }, "node_modules/core-util-is": { "version": "1.0.3", @@ -1773,15 +1873,6 @@ "node": ">= 8" } }, - "node_modules/date-utils": { - "version": "1.2.21", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/date-utils/-/date-utils-1.2.21.tgz", - "integrity": "sha1-YfsWzcEnSzyayq/+n8ad+HIKK2Q=", - "license": "MIT", - "engines": { - "node": ">0.4.0" - } - }, "node_modules/debug": { "version": "4.3.6", "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/debug/-/debug-4.3.6.tgz", @@ -1831,19 +1922,10 @@ "gopd": "^1.0.1" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "license": "MIT", - "engines": { - "node": ">=0.4.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/diff": { @@ -1882,113 +1964,11 @@ "node": ">=6.0.0" } }, - "node_modules/dom-serializer": { - "version": "0.2.2", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/dom-serializer/-/dom-serializer-0.2.2.tgz", - "integrity": "sha1-GvuB9TNxcXXUeGVd68XjMtn5u1E=", - "license": "MIT", - "dependencies": { - "domelementtype": "^2.0.1", - "entities": "^2.0.0" - } - }, - "node_modules/dom-serializer/node_modules/domelementtype": { - "version": "2.3.0", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha1-XEXo6GmVJiYzHXqrMm0B2vZdWJ0=", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "BSD-2-Clause" - }, - "node_modules/dom-serializer/node_modules/entities": { - "version": "2.2.0", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/entities/-/entities-2.2.0.tgz", - "integrity": "sha1-CY3JDruD2N/6CJ1VJWs1HTTE2lU=", - "license": "BSD-2-Clause", - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/domelementtype": { - "version": "1.3.1", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha1-0EjESzew0Qp/Kj1f7j9DM9eQSB8=", - "license": "BSD-2-Clause" - }, - "node_modules/domhandler": { - "version": "2.4.2", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/domhandler/-/domhandler-2.4.2.tgz", - "integrity": "sha1-iAUJfpM9ZehVRvcm1g9euItE+AM=", - "license": "BSD-2-Clause", - "dependencies": { - "domelementtype": "1" - } - }, - "node_modules/domutils": { - "version": "1.7.0", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/domutils/-/domutils-1.7.0.tgz", - "integrity": "sha1-Vuo0HoNOBuZ0ivehyyXaZ+qfjCo=", - "license": "BSD-2-Clause", - "dependencies": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "node_modules/duplexer2": { - "version": "0.1.4", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/duplexer2/-/duplexer2-0.1.4.tgz", - "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "readable-stream": "^2.0.2" - } - }, - "node_modules/duplexer2/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha1-kRJegEK7obmIf0k0X2J3Anzovps=", - "dev": true, - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/duplexer2/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha1-mR7GnSluAxN0fVm9/St0XDX4go0=", - "dev": true, - "license": "MIT" - }, - "node_modules/duplexer2/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/ecdsa-sig-formatter": { - "version": "1.0.11", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", - "integrity": "sha1-rg8PothQRe8UqBfao86azQSJ5b8=", - "license": "Apache-2.0", - "dependencies": { - "safe-buffer": "^5.0.1" - } + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha1-aWzi7Aqg5uqTo5f/zySqeEDIJ8s=", + "dev": true }, "node_modules/electron-to-chromium": { "version": "1.5.13", @@ -2028,12 +2008,6 @@ "node": ">=6.9.0" } }, - "node_modules/entities": { - "version": "1.1.2", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/entities/-/entities-1.1.2.tgz", - "integrity": "sha1-vfpzUplmTfr9NFKe1PhSKidf6lY=", - "license": "BSD-2-Clause" - }, "node_modules/envinfo": { "version": "7.13.0", "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/envinfo/-/envinfo-7.13.0.tgz", @@ -2333,15 +2307,6 @@ "node": ">=0.10.0" } }, - "node_modules/event-target-shim": { - "version": "5.0.1", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha1-XU0+vflYPWOlMzzi3rdICrKwV4k=", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/events": { "version": "3.3.0", "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/events/-/events-3.3.0.tgz", @@ -2403,13 +2368,6 @@ "dev": true, "license": "MIT" }, - "node_modules/fast-uri": { - "version": "3.0.1", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/fast-uri/-/fast-uri-3.0.1.tgz", - "integrity": "sha1-zd0u7PyDpxwb4swu8gYTMb6KcTQ=", - "dev": true, - "license": "MIT" - }, "node_modules/fastest-levenshtein": { "version": "1.0.16", "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", @@ -2505,38 +2463,20 @@ "dev": true, "license": "ISC" }, - "node_modules/follow-redirects": { - "version": "1.15.6", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/follow-redirects/-/follow-redirects-1.15.6.tgz", - "integrity": "sha1-f4FcDNpCScdP8J6V75fCO1/QOZs=", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "license": "MIT", - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/form-data": { - "version": "2.5.1", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/form-data/-/form-data-2.5.1.tgz", - "integrity": "sha1-8svsV7XlniNxbhKP5E1OXdI4lfQ=", - "license": "MIT", + "node_modules/foreground-child": { + "version": "3.3.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/foreground-child/-/foreground-child-3.3.0.tgz", + "integrity": "sha1-CshkTAbkMUOfhWHbjs8pp7VRnHc=", + "dev": true, "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" }, "engines": { - "node": ">= 0.12" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/fs.realpath": { @@ -2560,37 +2500,6 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/fstream": { - "version": "1.0.12", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/fstream/-/fstream-1.0.12.tgz", - "integrity": "sha1-Touo7i1Ivk99DeUFRVVI6uWTIEU=", - "deprecated": "This package is no longer supported.", - "dev": true, - "license": "ISC", - "dependencies": { - "graceful-fs": "^4.1.2", - "inherits": "~2.0.0", - "mkdirp": ">=0.5 0", - "rimraf": "2" - }, - "engines": { - "node": ">=0.6" - } - }, - "node_modules/fstream/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha1-NXl/E6f9rcVmFCwp1PB8ytSD4+w=", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, "node_modules/function-bind": { "version": "1.1.2", "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/function-bind/-/function-bind-1.1.2.tgz", @@ -2630,22 +2539,20 @@ } }, "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/glob/-/glob-7.2.3.tgz", - "integrity": "sha1-uN8PuAK7+o6JvR2Ti04WV47UTys=", - "deprecated": "Glob versions prior to v9 are no longer supported", + "version": "10.4.5", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/glob/-/glob-10.4.5.tgz", + "integrity": "sha1-9NnwuQ/9urCcnXf18ptCYlF7CVY=", "dev": true, - "license": "ISC", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" }, - "engines": { - "node": "*" + "bin": { + "glob": "dist/esm/bin.mjs" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -2671,28 +2578,19 @@ "dev": true, "license": "BSD-2-Clause" }, - "node_modules/glob/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0=", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, "node_modules/glob/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha1-Gc0ZS/0+Qo8EmnCBfAONiatL41s=", + "version": "9.0.5", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha1-10+d1rV9g9jpjPuCEzsDl4vJKeU=", "dev": true, - "license": "ISC", "dependencies": { - "brace-expansion": "^1.1.7" + "brace-expansion": "^2.0.1" }, "engines": { - "node": "*" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/globals": { @@ -2830,72 +2728,64 @@ "version": "1.2.0", "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/he/-/he-1.2.0.tgz", "integrity": "sha1-hK5l+n6vsWX922FWauFLrwVmTw8=", + "dev": true, "license": "MIT", "bin": { "he": "bin/he" } }, - "node_modules/html-to-text": { - "version": "5.1.1", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/html-to-text/-/html-to-text-5.1.1.tgz", - "integrity": "sha1-LYnbe/NLx7y31UaxsiiZGhaSboc=", - "license": "MIT", - "dependencies": { - "he": "^1.2.0", - "htmlparser2": "^3.10.1", - "lodash": "^4.17.11", - "minimist": "^1.2.0" - }, - "bin": { - "html-to-text": "bin/cli.js" - }, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/htmlparser2": { - "version": "3.10.1", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/htmlparser2/-/htmlparser2-3.10.1.tgz", - "integrity": "sha1-vWedw/WYl7ajS7EHSchVu1OpOS8=", - "license": "MIT", - "dependencies": { - "domelementtype": "^1.3.1", - "domhandler": "^2.3.0", - "domutils": "^1.5.1", - "entities": "^1.1.1", - "inherits": "^2.0.1", - "readable-stream": "^3.1.1" - } + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha1-39YAJ9o2o238viNiYsAKWCJoFFM=", + "dev": true }, "node_modules/http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha1-ioyO9/WTLM+VPClsqCkblap0qjo=", + "version": "7.0.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha1-mosfJGhmwChQlIZYX2K48sGMJw4=", "dev": true, - "license": "MIT", "dependencies": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" + "agent-base": "^7.1.0", + "debug": "^4.3.4" }, "engines": { - "node": ">= 6" + "node": ">= 14" } }, "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha1-xZ7yJKBP6LdU89sAY6Jeow0ABdY=", + "version": "7.0.5", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", + "integrity": "sha1-notQE4cymeEfq2/VSEBdotbGArI=", "dev": true, - "license": "MIT", "dependencies": { - "agent-base": "6", + "agent-base": "^7.0.2", "debug": "4" }, "engines": { - "node": ">= 6" + "node": ">= 14" } }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha1-jrehCmP/8l0VpXsAFYbRd9Gw01I=", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/ignore": { "version": "5.3.2", "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/ignore/-/ignore-5.3.2.tgz", @@ -2906,6 +2796,12 @@ "node": ">= 4" } }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=", + "dev": true + }, "node_modules/import-fresh": { "version": "3.3.0", "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/import-fresh/-/import-fresh-3.3.0.tgz", @@ -2969,6 +2865,7 @@ "version": "2.0.4", "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/inherits/-/inherits-2.0.4.tgz", "integrity": "sha1-D6LGT5MpF8NDOg3tVTY6rjdBa3w=", + "dev": true, "license": "ISC" }, "node_modules/interpret": { @@ -3043,6 +2940,18 @@ "node": ">=0.10.0" } }, + "node_modules/is-interactive": { + "version": "2.0.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/is-interactive/-/is-interactive-2.0.0.tgz", + "integrity": "sha1-QMV2FFk4JtoRAK3mBZd41ZfxbpA=", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/is-number/-/is-number-7.0.0.tgz", @@ -3123,6 +3032,57 @@ "node": ">=0.10.0" } }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha1-LRZsSwZE1Do58Ev2wu3R5YXzF1Y=", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha1-kIMFusmlvRdaxqdEier9D8JEWn0=", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.7", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha1-2u0SueHcpRjhXAVuHlN+dBKA+gs=", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha1-iDOp2Jq0rN5hiJQr0cU7Y5DtWoo=", + "dev": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, "node_modules/jest-worker": { "version": "27.5.1", "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/jest-worker/-/jest-worker-27.5.1.tgz", @@ -3214,25 +3174,16 @@ "integrity": "sha1-Qvz1bXCFKgQ/ra/eUd20qFZJl40=", "license": "MIT" }, - "node_modules/jwa": { - "version": "1.4.1", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/jwa/-/jwa-1.4.1.tgz", - "integrity": "sha1-dDwymFy56YZVUw1TZBtmyGRbA5o=", - "license": "MIT", - "dependencies": { - "buffer-equal-constant-time": "1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/jws": { - "version": "3.2.2", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/jws/-/jws-3.2.2.tgz", - "integrity": "sha1-ABCZ82OUaMlBQADpmZX6UvtHgwQ=", - "license": "MIT", + "node_modules/jszip": { + "version": "3.10.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha1-NK7nDrGOofrsL1iSCKFX0f6wkcI=", + "dev": true, "dependencies": { - "jwa": "^1.4.1", - "safe-buffer": "^5.0.1" + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" } }, "node_modules/keyv": { @@ -3269,12 +3220,14 @@ "node": ">= 0.8.0" } }, - "node_modules/listenercount": { - "version": "1.0.1", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/listenercount/-/listenercount-1.0.1.tgz", - "integrity": "sha1-hMinKrWcRyUyFIDJdeZQg0LnCTc=", + "node_modules/lie": { + "version": "3.3.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/lie/-/lie-3.3.0.tgz", + "integrity": "sha1-3Pgt7lRfRgdNryAMfBxaCOD0D2o=", "dev": true, - "license": "ISC" + "dependencies": { + "immediate": "~3.0.5" + } }, "node_modules/loader-runner": { "version": "4.3.0", @@ -3317,12 +3270,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha1-Z5WRxWTDv/quhFTPCz3zcMPWkRw=", - "license": "MIT" - }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -3347,6 +3294,27 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha1-QQ/IoXtw5ZgBPfJXwkRrfzOD8Rk=", + "dev": true + }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha1-w8IwencSd82WODBfkVwprnQbYU4=", + "dev": true, + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/memory-fs": { "version": "0.5.0", "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/memory-fs/-/memory-fs-0.5.0.tgz", @@ -3361,39 +3329,6 @@ "node": ">=4.3.0 <5.0.0 || >=5.10" } }, - "node_modules/memory-fs/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha1-kRJegEK7obmIf0k0X2J3Anzovps=", - "dev": true, - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/memory-fs/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha1-mR7GnSluAxN0fVm9/St0XDX4go0=", - "dev": true, - "license": "MIT" - }, - "node_modules/memory-fs/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/merge-stream/-/merge-stream-2.0.0.tgz", @@ -3429,6 +3364,7 @@ "version": "1.52.0", "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha1-u6vNwChZ9JhzAchW4zh85exDv3A=", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.6" @@ -3438,6 +3374,7 @@ "version": "2.1.35", "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha1-OBqHG2KnNEUGYK497uRIE/cNlZo=", + "dev": true, "license": "MIT", "dependencies": { "mime-db": "1.52.0" @@ -3446,6 +3383,15 @@ "node": ">= 0.6" } }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha1-ftLCzMyvhNP/y3pptXcR/CCDQBs=", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/minimatch": { "version": "9.0.3", "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/minimatch/-/minimatch-9.0.3.tgz", @@ -3462,26 +3408,13 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha1-waRk52kzAuCCoHXO4MBXdBrEdyw=", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha1-fe8D0kMtyuS6HWEURcSDlgYiVfY=", + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha1-k6libOXl5mvU24aEnnUV6SNApwc=", "dev": true, - "license": "MIT", - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" + "engines": { + "node": ">=16 || 14 >=14.17" } }, "node_modules/mocha": { @@ -3672,15 +3605,6 @@ "dev": true, "license": "MIT" }, - "node_modules/mustache": { - "version": "4.2.0", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/mustache/-/mustache-4.2.0.tgz", - "integrity": "sha1-5YkjJNYKEuycKnM1ntylKXK/b2Q=", - "license": "MIT", - "bin": { - "mustache": "bin/mustache" - } - }, "node_modules/nanoid": { "version": "3.3.1", "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/nanoid/-/nanoid-3.3.1.tgz", @@ -3708,26 +3632,6 @@ "dev": true, "license": "MIT" }, - "node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha1-0PD6bj4twdJ+/NitmdVQvalNGH0=", - "license": "MIT", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, "node_modules/node-releases": { "version": "2.0.18", "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/node-releases/-/node-releases-2.0.18.tgz", @@ -3767,6 +3671,21 @@ "wrappy": "1" } }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha1-0Oluu1awdHbfHdnEgG5SN5hcpF4=", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/optionator": { "version": "0.9.4", "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/optionator/-/optionator-0.9.4.tgz", @@ -3785,6 +3704,119 @@ "node": ">= 0.8.0" } }, + "node_modules/ora": { + "version": "7.0.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/ora/-/ora-7.0.1.tgz", + "integrity": "sha1-zdUw7Nhl/jnkUaDnaXhlZpyxGTA=", + "dev": true, + "dependencies": { + "chalk": "^5.3.0", + "cli-cursor": "^4.0.0", + "cli-spinners": "^2.9.0", + "is-interactive": "^2.0.0", + "is-unicode-supported": "^1.3.0", + "log-symbols": "^5.1.0", + "stdin-discarder": "^0.1.0", + "string-width": "^6.1.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha1-lexAnGlhnWyxuLNPFLZg7yjr1lQ=", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ora/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha1-Z8IKfr73Dn85cKAfkPohDLaGA4U=", + "dev": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/ora/node_modules/emoji-regex": { + "version": "10.4.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/emoji-regex/-/emoji-regex-10.4.0.tgz", + "integrity": "sha1-A1U6/qgLOXV0nPyzb3dsomjkE9Q=", + "dev": true + }, + "node_modules/ora/node_modules/is-unicode-supported": { + "version": "1.3.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", + "integrity": "sha1-2CSYS2FsKSouGYIH1KYJmDhC9xQ=", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/log-symbols": { + "version": "5.1.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/log-symbols/-/log-symbols-5.1.0.tgz", + "integrity": "sha1-og47ml9T+sauuOK7IsB88sjxbZM=", + "dev": true, + "dependencies": { + "chalk": "^5.0.0", + "is-unicode-supported": "^1.1.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/string-width": { + "version": "6.1.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/string-width/-/string-width-6.1.0.tgz", + "integrity": "sha1-lkiNbtI/mtXYLRNSKvnkxMP9dRg=", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^10.2.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha1-1bZWjKaJ2FYTcLBwdoXSJDT6/0U=", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/p-limit/-/p-limit-3.1.0.tgz", @@ -3827,6 +3859,18 @@ "node": ">=6" } }, + "node_modules/package-json-from-dist": { + "version": "1.0.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", + "integrity": "sha1-5QHNMJSyeEletCWNTJ9tWsMBnwA=", + "dev": true + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/pako/-/pako-1.0.11.tgz", + "integrity": "sha1-bJWZ00DVTf05RjgCUqNXBaa5kr8=", + "dev": true + }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/parent-module/-/parent-module-1.0.1.tgz", @@ -3877,6 +3921,22 @@ "dev": true, "license": "MIT" }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha1-eWCmaIiFlKByCxKpEdGnQqufEdI=", + "dev": true, + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/path-type/-/path-type-4.0.0.tgz", @@ -4057,19 +4117,26 @@ } }, "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha1-VqmzbqllwAxak+8x6xEaDxEFaWc=", - "license": "MIT", + "version": "2.3.8", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha1-kRJegEK7obmIf0k0X2J3Anzovps=", + "dev": true, "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, + "node_modules/readable-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha1-mR7GnSluAxN0fVm9/St0XDX4go0=", + "dev": true + }, "node_modules/readdirp": { "version": "3.6.0", "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/readdirp/-/readdirp-3.6.0.tgz", @@ -4176,16 +4243,6 @@ "node": ">=0.10.0" } }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha1-iaf92TgmEmcxjq/hT5wy5ZjDaQk=", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/resolve": { "version": "1.22.8", "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/resolve/-/resolve-1.22.8.tgz", @@ -4237,6 +4294,28 @@ "node": ">=4" } }, + "node_modules/restore-cursor": { + "version": "4.0.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/restore-cursor/-/restore-cursor-4.0.0.tgz", + "integrity": "sha1-UZVgpDGJdQlt725gnUQQDtqkzLk=", + "dev": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/restore-cursor/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha1-qaF2f4r4QVURTqq9c/mSc8j1mtk=", + "dev": true + }, "node_modules/reusify": { "version": "1.0.4", "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/reusify/-/reusify-1.0.4.tgz", @@ -4248,23 +4327,66 @@ "node": ">=0.10.0" } }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha1-8aVAK6YiCtUswSgrrBrjqkn9Bho=", - "deprecated": "Rimraf versions prior to v4 are no longer supported", + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha1-8aVAK6YiCtUswSgrrBrjqkn9Bho=", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0=", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/glob/-/glob-7.2.3.tgz", + "integrity": "sha1-uN8PuAK7+o6JvR2Ti04WV47UTys=", + "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, - "license": "ISC", "dependencies": { - "glob": "^7.1.3" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" }, - "bin": { - "rimraf": "bin.js" + "engines": { + "node": "*" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/rimraf/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha1-Gc0ZS/0+Qo8EmnCBfAONiatL41s=", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/run-parallel/-/run-parallel-1.2.0.tgz", @@ -4293,6 +4415,7 @@ "version": "5.2.1", "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha1-Hq+fqb2x/dTsdfWPnNtOa3gn7sY=", + "dev": true, "funding": [ { "type": "github", @@ -4309,69 +4432,6 @@ ], "license": "MIT" }, - "node_modules/sax": { - "version": "1.4.1", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/sax/-/sax-1.4.1.tgz", - "integrity": "sha1-RMyJiDd/EmME07P8EBDHM7kp7w8=", - "license": "ISC" - }, - "node_modules/schema-utils": { - "version": "4.2.0", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/schema-utils/-/schema-utils-4.2.0.tgz", - "integrity": "sha1-cNfJPhU6JzqAWAGILr07/yDYnIs=", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/schema-utils/node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha1-N9mlx3ava8ktf0+VEOukwKYNEaY=", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/schema-utils/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha1-adTThaRzPNvqtElkoRcKiPh/DhY=", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/schema-utils/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha1-rnvLNlard6c7pcSb9lTzjmtoYOI=", - "dev": true, - "license": "MIT" - }, "node_modules/semver": { "version": "7.6.3", "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/semver/-/semver-7.6.3.tgz", @@ -4415,8 +4475,7 @@ "version": "1.0.5", "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/setimmediate/-/setimmediate-1.0.5.tgz", "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/shallow-clone": { "version": "3.0.1", @@ -4472,6 +4531,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha1-lSGIwcvVRgcOLdIND0HArgUwywQ=", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/slash/-/slash-3.0.0.tgz", @@ -4509,15 +4580,36 @@ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "license": "BSD-3-Clause" }, + "node_modules/stdin-discarder": { + "version": "0.1.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/stdin-discarder/-/stdin-discarder-0.1.0.tgz", + "integrity": "sha1-IrPkADk6jijr9T+ZWPOIBiLv3iE=", + "dev": true, + "dependencies": { + "bl": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha1-QvEUWUpGzxqOMLCoT1bHjD7awh4=", - "license": "MIT", + "version": "1.1.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", + "dev": true, "dependencies": { - "safe-buffer": "~5.2.0" + "safe-buffer": "~5.1.0" } }, + "node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha1-mR7GnSluAxN0fVm9/St0XDX4go0=", + "dev": true + }, "node_modules/string-width": { "version": "4.2.3", "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/string-width/-/string-width-4.2.3.tgz", @@ -4533,6 +4625,21 @@ "node": ">=8" } }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha1-JpxxF9J7Ba0uU2gwqOyJXvnG0BA=", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -4546,6 +4653,19 @@ "node": ">=8" } }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha1-nibGPTD1NEPpSJSVshBdN7Z6hdk=", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -4668,6 +4788,63 @@ "url": "https://opencollective.com/webpack" } }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha1-BKhphmHYBepvopO2y55jrARO8V4=", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/test-exclude/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0=", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/test-exclude/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/glob/-/glob-7.2.3.tgz", + "integrity": "sha1-uN8PuAK7+o6JvR2Ti04WV47UTys=", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/test-exclude/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha1-Gc0ZS/0+Qo8EmnCBfAONiatL41s=", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/text-table/-/text-table-0.2.0.tgz", @@ -4688,22 +4865,6 @@ "node": ">=8.0" } }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=", - "license": "MIT" - }, - "node_modules/traverse": { - "version": "0.3.9", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/traverse/-/traverse-0.3.9.tgz", - "integrity": "sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk=", - "dev": true, - "license": "MIT/X11", - "engines": { - "node": "*" - } - }, "node_modules/ts-api-utils": { "version": "1.3.0", "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/ts-api-utils/-/ts-api-utils-1.3.0.tgz", @@ -4738,12 +4899,6 @@ "webpack": "*" } }, - "node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha1-zy04vcNKE0vK8QkcQfZhni9nLQA=", - "license": "0BSD" - }, "node_modules/tunnel": { "version": "0.0.6", "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/tunnel/-/tunnel-0.0.6.tgz", @@ -4810,58 +4965,13 @@ "integrity": "sha1-lw4zljr5p92iKPF+voOZ5fvmOhA=", "license": "MIT" }, - "node_modules/unzipper": { - "version": "0.10.14", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/unzipper/-/unzipper-0.10.14.tgz", - "integrity": "sha1-0rM8l3cU2g+8D4J3StNUcKfJYrE=", - "dev": true, - "license": "MIT", - "dependencies": { - "big-integer": "^1.6.17", - "binary": "~0.3.0", - "bluebird": "~3.4.1", - "buffer-indexof-polyfill": "~1.0.0", - "duplexer2": "~0.1.4", - "fstream": "^1.0.12", - "graceful-fs": "^4.2.2", - "listenercount": "~1.0.1", - "readable-stream": "~2.3.6", - "setimmediate": "~1.0.4" - } - }, - "node_modules/unzipper/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha1-kRJegEK7obmIf0k0X2J3Anzovps=", - "dev": true, - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/unzipper/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha1-mR7GnSluAxN0fVm9/St0XDX4go0=", + "node_modules/undici-types": { + "version": "6.13.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/undici-types/-/undici-types-6.13.0.tgz", + "integrity": "sha1-4+eSIKuMge0UlrWBJHGv188HXqU=", "dev": true, "license": "MIT" }, - "node_modules/unzipper/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, "node_modules/update-browserslist-db": { "version": "1.1.0", "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", @@ -4907,15 +5017,21 @@ "version": "1.0.2", "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true, "license": "MIT" }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha1-gNW1ztJxu5r2xEXyGhoExgbO++I=", - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" + "node_modules/v8-to-istanbul": { + "version": "9.3.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", + "integrity": "sha1-uVcqv6Yr1VbBbXX968GkEdX/MXU=", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" + }, + "engines": { + "node": ">=10.12.0" } }, "node_modules/vscode-json-languageservice": { @@ -5048,12 +5164,6 @@ "node": ">=10.13.0" } }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=", - "license": "BSD-2-Clause" - }, "node_modules/webpack": { "version": "5.94.0", "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/webpack/-/webpack-5.94.0.tgz", @@ -5251,16 +5361,6 @@ "node": ">=6" } }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", - "license": "MIT", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, "node_modules/which": { "version": "2.0.2", "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/which/-/which-2.0.2.tgz", @@ -5291,22 +5391,40 @@ "dev": true, "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=0.10.0" + } + }, + "node_modules/workerpool": { + "version": "6.2.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/workerpool/-/workerpool-6.2.0.tgz", + "integrity": "sha1-gn2Tyboj7iAZw/+v9cJ/zOoonos=", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha1-Z+FFz/UQpqaYS98RUpEdadLrnkM=", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/workerpool": { - "version": "6.2.0", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/workerpool/-/workerpool-6.2.0.tgz", - "integrity": "sha1-gn2Tyboj7iAZw/+v9cJ/zOoonos=", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/wrap-ansi": { + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", "version": "7.0.0", "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha1-Z+FFz/UQpqaYS98RUpEdadLrnkM=", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -5326,37 +5444,6 @@ "dev": true, "license": "ISC" }, - "node_modules/xml2js": { - "version": "0.5.0", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/xml2js/-/xml2js-0.5.0.tgz", - "integrity": "sha1-2UQGMfuy7YACA/rRBvJyT2LEk7c=", - "license": "MIT", - "dependencies": { - "sax": ">=0.6.0", - "xmlbuilder": "~11.0.0" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/xmlbuilder": { - "version": "11.0.1", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha1-vpuuHIoEbnazESdyY0fQrXACvrM=", - "license": "MIT", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/xpath.js": { - "version": "1.1.0", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/xpath.js/-/xpath.js-1.1.0.tgz", - "integrity": "sha1-OBakTtS7NSCRCD0AKjg91RBKX/E=", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/y18n/-/y18n-5.0.8.tgz", @@ -5433,114 +5520,11 @@ } }, "dependencies": { - "@azure/abort-controller": { - "version": "2.1.2", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@azure/abort-controller/-/abort-controller-2.1.2.tgz", - "integrity": "sha1-Qv4MyrI4QdmQWBLFjxCC0neEVm0=", - "requires": { - "tslib": "^2.6.2" - }, - "dependencies": { - "tslib": { - "version": "2.6.3", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha1-BDj4EK16ntzeeiQcPYDbaTyMv+A=" - } - } - }, - "@azure/arm-appservice": { - "version": "6.1.0", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@azure/arm-appservice/-/arm-appservice-6.1.0.tgz", - "integrity": "sha1-wsTE1QvZ8OzL2Bomjh9uxkmqfKo=", - "requires": { - "@azure/ms-rest-azure-js": "^2.0.1", - "@azure/ms-rest-js": "^2.0.4", - "tslib": "^1.10.0" - } - }, - "@azure/arm-subscriptions": { - "version": "3.1.2", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@azure/arm-subscriptions/-/arm-subscriptions-3.1.2.tgz", - "integrity": "sha1-avsHVHiZQvGQwtjiRKUhyeLNuIY=", - "requires": { - "@azure/core-auth": "^1.1.4", - "@azure/ms-rest-azure-js": "^2.1.0", - "@azure/ms-rest-js": "^2.2.0", - "tslib": "^1.10.0" - } - }, - "@azure/core-auth": { - "version": "1.7.2", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@azure/core-auth/-/core-auth-1.7.2.tgz", - "integrity": "sha1-VYt8t90SsAvuwHrl31kH103x69k=", - "requires": { - "@azure/abort-controller": "^2.0.0", - "@azure/core-util": "^1.1.0", - "tslib": "^2.6.2" - }, - "dependencies": { - "tslib": { - "version": "2.6.3", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha1-BDj4EK16ntzeeiQcPYDbaTyMv+A=" - } - } - }, - "@azure/core-util": { - "version": "1.9.2", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@azure/core-util/-/core-util-1.9.2.tgz", - "integrity": "sha1-HcN9xbDa40xXi+Ys+YkFunwMr+c=", - "requires": { - "@azure/abort-controller": "^2.0.0", - "tslib": "^2.6.2" - }, - "dependencies": { - "tslib": { - "version": "2.6.3", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha1-BDj4EK16ntzeeiQcPYDbaTyMv+A=" - } - } - }, - "@azure/ms-rest-azure-env": { - "version": "2.0.0", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@azure/ms-rest-azure-env/-/ms-rest-azure-env-2.0.0.tgz", - "integrity": "sha1-RYCfiXY6SAkk4h08YgzUCGZ3FiU=" - }, - "@azure/ms-rest-azure-js": { - "version": "2.1.0", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@azure/ms-rest-azure-js/-/ms-rest-azure-js-2.1.0.tgz", - "integrity": "sha1-jJCzFGiuyjFGsGxxRLOG/Ugn9kw=", - "requires": { - "@azure/core-auth": "^1.1.4", - "@azure/ms-rest-js": "^2.2.0", - "tslib": "^1.10.0" - } - }, - "@azure/ms-rest-js": { - "version": "2.7.0", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@azure/ms-rest-js/-/ms-rest-js-2.7.0.tgz", - "integrity": "sha1-hjkGVXf/30lGlR4dJGM06/1y1Tc=", - "requires": { - "@azure/core-auth": "^1.1.4", - "abort-controller": "^3.0.0", - "form-data": "^2.5.0", - "node-fetch": "^2.6.7", - "tslib": "^1.10.0", - "tunnel": "0.0.6", - "uuid": "^8.3.2", - "xml2js": "^0.5.0" - } - }, - "@azure/ms-rest-nodeauth": { - "version": "3.1.1", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@azure/ms-rest-nodeauth/-/ms-rest-nodeauth-3.1.1.tgz", - "integrity": "sha1-JiQiLwaFrlgIAdbxq+qyCSOBRpM=", - "requires": { - "@azure/ms-rest-azure-env": "^2.0.0", - "@azure/ms-rest-js": "^2.0.4", - "adal-node": "^0.2.2" - } + "@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha1-daLotRy3WKdVPWgEpZMteqznXDk=", + "dev": true }, "@discoveryjs/json-ext": { "version": "0.5.7", @@ -5666,6 +5650,77 @@ "integrity": "sha1-Siho111taWPkI7z5C3/RvjQ0CdM=", "dev": true }, + "@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha1-s3Znt7wYHBaHgiWbq0JHT79StVA=", + "dev": true, + "requires": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "6.1.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha1-lexAnGlhnWyxuLNPFLZg7yjr1lQ=", + "dev": true + }, + "ansi-styles": { + "version": "6.2.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha1-DmIyDPmcIa//OzASGSVGqsv7BcU=", + "dev": true + }, + "emoji-regex": { + "version": "9.2.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha1-hAyIA7DYBH9P8M+WMXazLU7z7XI=", + "dev": true + }, + "string-width": { + "version": "5.1.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha1-FPja7G2B5yIdKjV+Zoyrc728p5Q=", + "dev": true, + "requires": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + } + }, + "strip-ansi": { + "version": "7.1.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha1-1bZWjKaJ2FYTcLBwdoXSJDT6/0U=", + "dev": true, + "requires": { + "ansi-regex": "^6.0.1" + } + }, + "wrap-ansi": { + "version": "8.1.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha1-VtwiNo7lcPrOG0mBmXXZuaXq0hQ=", + "dev": true, + "requires": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + } + } + } + }, + "@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha1-5F44TkuOwWvOL9kDr3hFD2v37Jg=", + "dev": true + }, "@jridgewell/gen-mapping": { "version": "0.3.5", "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", @@ -5741,11 +5796,12 @@ "fastq": "^1.6.0" } }, - "@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha1-zLkURTYBeaBOf+av94wA/8Hur4I=", - "dev": true + "@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha1-p36nQvqyV3UUVDTrHSMoz1ATrDM=", + "dev": true, + "optional": true }, "@types/estree": { "version": "1.0.5", @@ -5753,20 +5809,10 @@ "integrity": "sha1-ps4+VW4A/ZiV3Yct0XKtDUvWh/Q=", "dev": true }, - "@types/glob": { - "version": "7.2.0", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@types/glob/-/glob-7.2.0.tgz", - "integrity": "sha1-vBtb86qS8lvV3TnzXFc2G9zlsus=", - "dev": true, - "requires": { - "@types/minimatch": "*", - "@types/node": "*" - } - }, - "@types/html-to-text": { - "version": "5.1.2", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@types/html-to-text/-/html-to-text-5.1.2.tgz", - "integrity": "sha1-WacjzOQbVzt/pgZBTizqqIYDgJg=", + "@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha1-dznCMqH+6bTTzomF8xTAxtM1Sdc=", "dev": true }, "@types/json-schema": { @@ -5775,29 +5821,20 @@ "integrity": "sha1-WWoXRyM2lNUPatinhp/Lb1bPWEE=", "dev": true }, - "@types/minimatch": { - "version": "5.1.2", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@types/minimatch/-/minimatch-5.1.2.tgz", - "integrity": "sha1-B1CLRXl8uB7D8nMBGwVM0HVe3co=", - "dev": true - }, "@types/mocha": { "version": "9.1.1", "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@types/mocha/-/mocha-9.1.1.tgz", "integrity": "sha1-58TxAB7vpLivvR7uJ6I3/uO/KcQ=", "dev": true }, - "@types/mustache": { - "version": "0.8.32", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@types/mustache/-/mustache-0.8.32.tgz", - "integrity": "sha1-fbO4Hyv0UL04gF9ZbSDsqXxO1ZU=", - "dev": true - }, "@types/node": { - "version": "14.18.63", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@types/node/-/node-14.18.63.tgz", - "integrity": "sha1-F4j6jag427X56plLg0J4IF22yis=", - "dev": true + "version": "20.15.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@types/node/-/node-20.15.0.tgz", + "integrity": "sha1-cwX3/nxizTEEftjWXFCS8LDhxV0=", + "dev": true, + "requires": { + "undici-types": "~6.13.0" + } }, "@types/semver": { "version": "7.5.8", @@ -5805,16 +5842,10 @@ "integrity": "sha1-gmioxXo+Sr0lwWXs02I323lIpV4=", "dev": true }, - "@types/uuid": { - "version": "8.3.4", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@types/uuid/-/uuid-8.3.4.tgz", - "integrity": "sha1-vYakNhffBZR4fTi3NfVcgFvs8bw=", - "dev": true - }, "@types/vscode": { - "version": "1.64.0", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@types/vscode/-/vscode-1.64.0.tgz", - "integrity": "sha1-v9gsjZLceCTBvghL4atGziDX+1U=", + "version": "1.82.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@types/vscode/-/vscode-1.82.0.tgz", + "integrity": "sha1-ibCyEXnc9ejO4WZKmgXF9sYNONA=", "dev": true }, "@typescript-eslint/eslint-plugin": { @@ -5935,16 +5966,219 @@ "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@vscode/extension-telemetry/-/extension-telemetry-0.5.2.tgz", "integrity": "sha1-sAiIjL+7693h8qyGv/50BXrdjCU=" }, + "@vscode/test-cli": { + "version": "0.0.10", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@vscode/test-cli/-/test-cli-0.0.10.tgz", + "integrity": "sha1-NfDoHC4P+NrOsiPpnRtlMGwVgiw=", + "dev": true, + "requires": { + "@types/mocha": "^10.0.2", + "c8": "^9.1.0", + "chokidar": "^3.5.3", + "enhanced-resolve": "^5.15.0", + "glob": "^10.3.10", + "minimatch": "^9.0.3", + "mocha": "^10.2.0", + "supports-color": "^9.4.0", + "yargs": "^17.7.2" + }, + "dependencies": { + "@types/mocha": { + "version": "10.0.8", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@types/mocha/-/mocha-10.0.8.tgz", + "integrity": "sha1-p+/1gW4HDDtNgD8dPNeAxOQpNKE=", + "dev": true + }, + "ansi-colors": { + "version": "4.1.3", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha1-N2ETQOsiQ+cMxgTK011jJw1IeBs=", + "dev": true + }, + "argparse": { + "version": "2.0.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha1-JG9Q88p4oyQPbJl+ipvR6sSeSzg=", + "dev": true + }, + "diff": { + "version": "5.2.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/diff/-/diff-5.2.0.tgz", + "integrity": "sha1-Jt7QR80RebeLlTfV73JVA84a5TE=", + "dev": true + }, + "enhanced-resolve": { + "version": "5.17.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", + "integrity": "sha1-Z7+7zC+B1RG+d9aGqQJn73+JihU=", + "dev": true, + "requires": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + } + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha1-wftl+PUBeQHN0slRhkuhhFihBgI=", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, + "mocha": { + "version": "10.7.3", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/mocha/-/mocha-10.7.3.tgz", + "integrity": "sha1-rjIAPKu9UrWa7OF4RgVqaOtLB1I=", + "dev": true, + "requires": { + "ansi-colors": "^4.1.3", + "browser-stdout": "^1.3.1", + "chokidar": "^3.5.3", + "debug": "^4.3.5", + "diff": "^5.2.0", + "escape-string-regexp": "^4.0.0", + "find-up": "^5.0.0", + "glob": "^8.1.0", + "he": "^1.2.0", + "js-yaml": "^4.1.0", + "log-symbols": "^4.1.0", + "minimatch": "^5.1.6", + "ms": "^2.1.3", + "serialize-javascript": "^6.0.2", + "strip-json-comments": "^3.1.1", + "supports-color": "^8.1.1", + "workerpool": "^6.5.1", + "yargs": "^16.2.0", + "yargs-parser": "^20.2.9", + "yargs-unparser": "^2.0.0" + }, + "dependencies": { + "glob": { + "version": "8.1.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/glob/-/glob-8.1.0.tgz", + "integrity": "sha1-04j2Vlk+9wjuPjRkD9+5mp/Rwz4=", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + } + }, + "minimatch": { + "version": "5.1.6", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha1-HPy4z1Ui6mmVLNKvla4JR38SKpY=", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + }, + "supports-color": { + "version": "8.1.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha1-zW/BfihQDP9WwbhsCn/UpUpzAFw=", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha1-HIK/D2tqZur85+8w43b0mhJHf2Y=", + "dev": true, + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } + } + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/ms/-/ms-2.1.3.tgz", + "integrity": "sha1-V0yBOM4dK1hh8LRFedut1gxmFbI=", + "dev": true + }, + "supports-color": { + "version": "9.4.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/supports-color/-/supports-color-9.4.0.tgz", + "integrity": "sha1-F7/PaGKI9THbPeoyFVEGIcy1WVQ=", + "dev": true + }, + "tapable": { + "version": "2.2.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha1-GWenPvQGCoLxKrlq+G1S/bdu7KA=", + "dev": true + }, + "workerpool": { + "version": "6.5.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/workerpool/-/workerpool-6.5.1.tgz", + "integrity": "sha1-Bg9zs50Mr5fG22TaAEzQG0wJlUQ=", + "dev": true + }, + "yargs": { + "version": "17.7.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha1-mR3zmspnWhkrgW4eA2P5110qomk=", + "dev": true, + "requires": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "dependencies": { + "cliui": { + "version": "8.0.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha1-DASwddsCy/5g3I5s8vVIaxo2CKo=", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + } + }, + "yargs-parser": { + "version": "21.1.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha1-kJa87r+ZDSG7MfqVFuDt4pSnfTU=", + "dev": true + } + } + }, + "yargs-parser": { + "version": "20.2.9", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha1-LrfcOwKJcY/ClfNidThFxBoMlO4=", + "dev": true + } + } + }, "@vscode/test-electron": { - "version": "1.6.2", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@vscode/test-electron/-/test-electron-1.6.2.tgz", - "integrity": "sha1-9jnKsZoAE5SQFQedz9L/DBqoihs=", + "version": "2.4.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@vscode/test-electron/-/test-electron-2.4.1.tgz", + "integrity": "sha1-XCdgZAv2ku+9qhi6/NNftRloiUE=", "dev": true, "requires": { - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "rimraf": "^3.0.2", - "unzipper": "^0.10.11" + "http-proxy-agent": "^7.0.2", + "https-proxy-agent": "^7.0.5", + "jszip": "^3.10.1", + "ora": "^7.0.1", + "semver": "^7.6.2" } }, "@webassemblyjs/ast": { @@ -6116,11 +6350,6 @@ "dev": true, "requires": {} }, - "@xmldom/xmldom": { - "version": "0.8.10", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@xmldom/xmldom/-/xmldom-0.8.10.tgz", - "integrity": "sha1-oTN8pCaqYc75/hW1so40CnL2+pk=" - }, "@xtuc/ieee754": { "version": "1.2.0", "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/@xtuc/ieee754/-/ieee754-1.2.0.tgz", @@ -6133,14 +6362,6 @@ "integrity": "sha1-0pHGpOl5ibXGHZrPOWrk/hM6cY0=", "dev": true }, - "abort-controller": { - "version": "3.0.0", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha1-6vVNU7YrrkE46AnKIlyEOabvs5I=", - "requires": { - "event-target-shim": "^5.0.0" - } - }, "acorn": { "version": "8.12.1", "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/acorn/-/acorn-8.12.1.tgz", @@ -6161,35 +6382,13 @@ "dev": true, "requires": {} }, - "adal-node": { - "version": "0.2.4", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/adal-node/-/adal-node-0.2.4.tgz", - "integrity": "sha1-iBvu2dSTt2qGcGrVyNxvYO/wRSA=", - "requires": { - "@xmldom/xmldom": "^0.8.3", - "async": "^2.6.3", - "axios": "^0.21.1", - "date-utils": "*", - "jws": "3.x.x", - "underscore": ">= 1.3.1", - "uuid": "^3.1.0", - "xpath.js": "~1.1.0" - }, - "dependencies": { - "uuid": { - "version": "3.4.0", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha1-sj5DWK+oogL+ehAK8fX4g/AgB+4=" - } - } - }, "agent-base": { - "version": "6.0.2", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha1-Sf/1hXfP7j83F2/qtMIuAPhtf3c=", + "version": "7.1.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/agent-base/-/agent-base-7.1.1.tgz", + "integrity": "sha1-vb3tffsJa3UaKgh+7rlmRyWy4xc=", "dev": true, "requires": { - "debug": "4" + "debug": "^4.3.4" } }, "ajv": { @@ -6204,35 +6403,6 @@ "uri-js": "^4.2.2" } }, - "ajv-formats": { - "version": "2.1.1", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha1-bmaUAGWet0lzu/LjMycYCgmWtSA=", - "dev": true, - "requires": { - "ajv": "^8.0.0" - }, - "dependencies": { - "ajv": { - "version": "8.17.1", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha1-N9mlx3ava8ktf0+VEOukwKYNEaY=", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - } - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha1-rnvLNlard6c7pcSb9lTzjmtoYOI=", - "dev": true - } - } - }, "ajv-keywords": { "version": "3.5.2", "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/ajv-keywords/-/ajv-keywords-3.5.2.tgz", @@ -6285,27 +6455,6 @@ "integrity": "sha1-t5hCCtvrHego2ErNii4j0+/oXo0=", "dev": true }, - "async": { - "version": "2.6.4", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/async/-/async-2.6.4.tgz", - "integrity": "sha1-cGt/9ghGZM1+rnE/b5ZUM7VQQiE=", - "requires": { - "lodash": "^4.17.14" - } - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" - }, - "axios": { - "version": "0.21.4", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/axios/-/axios-0.21.4.tgz", - "integrity": "sha1-xnuQ3AVo5cHPKwuFjEO6KOLtpXU=", - "requires": { - "follow-redirects": "^1.14.0" - } - }, "azure-devops-node-api": { "version": "11.2.0", "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/azure-devops-node-api/-/azure-devops-node-api-11.2.0.tgz", @@ -6348,10 +6497,10 @@ "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha1-6D46fj8wCzTLnYf2FfoMvzV2kO4=" }, - "big-integer": { - "version": "1.6.52", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/big-integer/-/big-integer-1.6.52.tgz", - "integrity": "sha1-YKiH8wR2FKjhv/5dcXNJCpfcjIU=", + "base64-js": { + "version": "1.5.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha1-GxtEAWClv3rUC2UPCVljSBkDkwo=", "dev": true }, "big.js": { @@ -6360,27 +6509,35 @@ "integrity": "sha1-ZfCvOC9Xi83HQr2cKB6cstd2gyg=", "dev": true }, - "binary": { - "version": "0.3.0", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/binary/-/binary-0.3.0.tgz", - "integrity": "sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk=", - "dev": true, - "requires": { - "buffers": "~0.1.1", - "chainsaw": "~0.1.0" - } - }, "binary-extensions": { "version": "2.3.0", "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/binary-extensions/-/binary-extensions-2.3.0.tgz", "integrity": "sha1-9uFKl4WNMnJSIAJC1Mz+UixEVSI=", "dev": true }, - "bluebird": { - "version": "3.4.7", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/bluebird/-/bluebird-3.4.7.tgz", - "integrity": "sha1-9y12C+Cbf3bQjtj66Ysomo0F+rM=", - "dev": true + "bl": { + "version": "5.1.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/bl/-/bl-5.1.0.tgz", + "integrity": "sha1-GDcV9njHGI7O+f5HXZAglABiQnM=", + "dev": true, + "requires": { + "buffer": "^6.0.3", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha1-VqmzbqllwAxak+8x6xEaDxEFaWc=", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } }, "brace-expansion": { "version": "2.0.1", @@ -6418,10 +6575,15 @@ "update-browserslist-db": "^1.1.0" } }, - "buffer-equal-constant-time": { - "version": "1.0.1", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", - "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" + "buffer": { + "version": "6.0.3", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha1-Ks5XhFnMj74qcKqo9S7mO2p0xsY=", + "dev": true, + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } }, "buffer-from": { "version": "1.1.2", @@ -6429,17 +6591,58 @@ "integrity": "sha1-KxRqb9cugLT1XSVfNe1Zo6mkG9U=", "dev": true }, - "buffer-indexof-polyfill": { - "version": "1.0.2", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz", - "integrity": "sha1-0nMhNcWZnGSyd/z5savjSYJUcpw=", - "dev": true - }, - "buffers": { - "version": "0.1.1", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/buffers/-/buffers-0.1.1.tgz", - "integrity": "sha1-skV5w77U1tOWru5tmorn9Ugqt7s=", - "dev": true + "c8": { + "version": "9.1.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/c8/-/c8-9.1.0.tgz", + "integrity": "sha1-Dle6Ornllgqx1lC0qG9x5Ty2gRI=", + "dev": true, + "requires": { + "@bcoe/v8-coverage": "^0.2.3", + "@istanbuljs/schema": "^0.1.3", + "find-up": "^5.0.0", + "foreground-child": "^3.1.1", + "istanbul-lib-coverage": "^3.2.0", + "istanbul-lib-report": "^3.0.1", + "istanbul-reports": "^3.1.6", + "test-exclude": "^6.0.0", + "v8-to-istanbul": "^9.0.0", + "yargs": "^17.7.2", + "yargs-parser": "^21.1.1" + }, + "dependencies": { + "cliui": { + "version": "8.0.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha1-DASwddsCy/5g3I5s8vVIaxo2CKo=", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + } + }, + "yargs": { + "version": "17.7.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha1-mR3zmspnWhkrgW4eA2P5110qomk=", + "dev": true, + "requires": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + } + }, + "yargs-parser": { + "version": "21.1.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha1-kJa87r+ZDSG7MfqVFuDt4pSnfTU=", + "dev": true + } + } }, "call-bind": { "version": "1.0.7", @@ -6471,15 +6674,6 @@ "integrity": "sha1-Ut5ZUp6LArGu3Kr1wF2eI8DCgTg=", "dev": true }, - "chainsaw": { - "version": "0.1.0", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/chainsaw/-/chainsaw-0.1.0.tgz", - "integrity": "sha1-XqtQsor+WAdNDVgpE4iCi15fvJg=", - "dev": true, - "requires": { - "traverse": ">=0.3.0 <0.4" - } - }, "chalk": { "version": "4.1.2", "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/chalk/-/chalk-4.1.2.tgz", @@ -6523,6 +6717,21 @@ "integrity": "sha1-Bb/9f/koRlCTMUcIyTvfqb0fD1s=", "dev": true }, + "cli-cursor": { + "version": "4.0.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/cli-cursor/-/cli-cursor-4.0.0.tgz", + "integrity": "sha1-POz+NzS/T+Aqg2HL3A9v4oxqV+o=", + "dev": true, + "requires": { + "restore-cursor": "^4.0.0" + } + }, + "cli-spinners": { + "version": "2.9.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha1-F3Oo9LnE1qwxVj31Oz/B15Ri/kE=", + "dev": true + }, "cliui": { "version": "7.0.4", "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/cliui/-/cliui-7.0.4.tgz", @@ -6566,14 +6775,6 @@ "integrity": "sha1-nreT5oMwZ/cjWQL807CZF6AAqVo=", "dev": true }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha1-w9RaizT9cwYxoRCoolIGgrMdWn8=", - "requires": { - "delayed-stream": "~1.0.0" - } - }, "commander": { "version": "2.20.3", "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/commander/-/commander-2.20.3.tgz", @@ -6585,47 +6786,11 @@ "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, - "copy-webpack-plugin": { - "version": "10.2.4", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/copy-webpack-plugin/-/copy-webpack-plugin-10.2.4.tgz", - "integrity": "sha1-bIVL4/2q4iAl2jS5ESzPgcYzCP4=", - "dev": true, - "requires": { - "fast-glob": "^3.2.7", - "glob-parent": "^6.0.1", - "globby": "^12.0.2", - "normalize-path": "^3.0.0", - "schema-utils": "^4.0.0", - "serialize-javascript": "^6.0.0" - }, - "dependencies": { - "array-union": { - "version": "3.0.1", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/array-union/-/array-union-3.0.1.tgz", - "integrity": "sha1-2lJjDTJ/i4jPv7V3KOKvXNm2uXU=", - "dev": true - }, - "globby": { - "version": "12.2.0", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/globby/-/globby-12.2.0.tgz", - "integrity": "sha1-KrgEa0+6T/bu3oNbKfZ4+Q49PCI=", - "dev": true, - "requires": { - "array-union": "^3.0.1", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.7", - "ignore": "^5.1.9", - "merge2": "^1.4.1", - "slash": "^4.0.0" - } - }, - "slash": { - "version": "4.0.0", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/slash/-/slash-4.0.0.tgz", - "integrity": "sha1-JCI3IXbExsWt214q2oha+YSzlqc=", - "dev": true - } - } + "convert-source-map": { + "version": "2.0.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha1-S1YPZJ/E6RjdCrdc9JYei8iC2Co=", + "dev": true }, "core-util-is": { "version": "1.0.3", @@ -6644,11 +6809,6 @@ "which": "^2.0.1" } }, - "date-utils": { - "version": "1.2.21", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/date-utils/-/date-utils-1.2.21.tgz", - "integrity": "sha1-YfsWzcEnSzyayq/+n8ad+HIKK2Q=" - }, "debug": { "version": "4.3.6", "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/debug/-/debug-4.3.6.tgz", @@ -6680,11 +6840,6 @@ "gopd": "^1.0.1" } }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" - }, "diff": { "version": "5.0.0", "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/diff/-/diff-5.0.0.tgz", @@ -6709,97 +6864,11 @@ "esutils": "^2.0.2" } }, - "dom-serializer": { - "version": "0.2.2", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/dom-serializer/-/dom-serializer-0.2.2.tgz", - "integrity": "sha1-GvuB9TNxcXXUeGVd68XjMtn5u1E=", - "requires": { - "domelementtype": "^2.0.1", - "entities": "^2.0.0" - }, - "dependencies": { - "domelementtype": { - "version": "2.3.0", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha1-XEXo6GmVJiYzHXqrMm0B2vZdWJ0=" - }, - "entities": { - "version": "2.2.0", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/entities/-/entities-2.2.0.tgz", - "integrity": "sha1-CY3JDruD2N/6CJ1VJWs1HTTE2lU=" - } - } - }, - "domelementtype": { - "version": "1.3.1", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha1-0EjESzew0Qp/Kj1f7j9DM9eQSB8=" - }, - "domhandler": { - "version": "2.4.2", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/domhandler/-/domhandler-2.4.2.tgz", - "integrity": "sha1-iAUJfpM9ZehVRvcm1g9euItE+AM=", - "requires": { - "domelementtype": "1" - } - }, - "domutils": { - "version": "1.7.0", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/domutils/-/domutils-1.7.0.tgz", - "integrity": "sha1-Vuo0HoNOBuZ0ivehyyXaZ+qfjCo=", - "requires": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "duplexer2": { - "version": "0.1.4", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/duplexer2/-/duplexer2-0.1.4.tgz", - "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", - "dev": true, - "requires": { - "readable-stream": "^2.0.2" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.8", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha1-kRJegEK7obmIf0k0X2J3Anzovps=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha1-mR7GnSluAxN0fVm9/St0XDX4go0=", - "dev": true - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "ecdsa-sig-formatter": { - "version": "1.0.11", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", - "integrity": "sha1-rg8PothQRe8UqBfao86azQSJ5b8=", - "requires": { - "safe-buffer": "^5.0.1" - } + "eastasianwidth": { + "version": "0.2.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha1-aWzi7Aqg5uqTo5f/zySqeEDIJ8s=", + "dev": true }, "electron-to-chromium": { "version": "1.5.13", @@ -6830,11 +6899,6 @@ "tapable": "^1.0.0" } }, - "entities": { - "version": "1.1.2", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/entities/-/entities-1.1.2.tgz", - "integrity": "sha1-vfpzUplmTfr9NFKe1PhSKidf6lY=" - }, "envinfo": { "version": "7.13.0", "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/envinfo/-/envinfo-7.13.0.tgz", @@ -7038,11 +7102,6 @@ "integrity": "sha1-dNLrTeC42hKTcRkQ1Qd1ubcQ72Q=", "dev": true }, - "event-target-shim": { - "version": "5.0.1", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha1-XU0+vflYPWOlMzzi3rdICrKwV4k=" - }, "events": { "version": "3.3.0", "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/events/-/events-3.3.0.tgz", @@ -7091,12 +7150,6 @@ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, - "fast-uri": { - "version": "3.0.1", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/fast-uri/-/fast-uri-3.0.1.tgz", - "integrity": "sha1-zd0u7PyDpxwb4swu8gYTMb6KcTQ=", - "dev": true - }, "fastest-levenshtein": { "version": "1.0.16", "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", @@ -7163,19 +7216,14 @@ "integrity": "sha1-IdtHBymmc01JlwAvQ5yzCJh/Vno=", "dev": true }, - "follow-redirects": { - "version": "1.15.6", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/follow-redirects/-/follow-redirects-1.15.6.tgz", - "integrity": "sha1-f4FcDNpCScdP8J6V75fCO1/QOZs=" - }, - "form-data": { - "version": "2.5.1", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/form-data/-/form-data-2.5.1.tgz", - "integrity": "sha1-8svsV7XlniNxbhKP5E1OXdI4lfQ=", + "foreground-child": { + "version": "3.3.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/foreground-child/-/foreground-child-3.3.0.tgz", + "integrity": "sha1-CshkTAbkMUOfhWHbjs8pp7VRnHc=", + "dev": true, "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" } }, "fs.realpath": { @@ -7191,29 +7239,6 @@ "dev": true, "optional": true }, - "fstream": { - "version": "1.0.12", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/fstream/-/fstream-1.0.12.tgz", - "integrity": "sha1-Touo7i1Ivk99DeUFRVVI6uWTIEU=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "inherits": "~2.0.0", - "mkdirp": ">=0.5 0", - "rimraf": "2" - }, - "dependencies": { - "rimraf": { - "version": "2.7.1", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha1-NXl/E6f9rcVmFCwp1PB8ytSD4+w=", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, "function-bind": { "version": "1.1.2", "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/function-bind/-/function-bind-1.1.2.tgz", @@ -7238,36 +7263,26 @@ } }, "glob": { - "version": "7.2.3", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/glob/-/glob-7.2.3.tgz", - "integrity": "sha1-uN8PuAK7+o6JvR2Ti04WV47UTys=", + "version": "10.4.5", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/glob/-/glob-10.4.5.tgz", + "integrity": "sha1-9NnwuQ/9urCcnXf18ptCYlF7CVY=", "dev": true, "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" }, "dependencies": { - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0=", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, "minimatch": { - "version": "3.1.2", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha1-Gc0ZS/0+Qo8EmnCBfAONiatL41s=", + "version": "9.0.5", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha1-10+d1rV9g9jpjPuCEzsDl4vJKeU=", "dev": true, "requires": { - "brace-expansion": "^1.1.7" + "brace-expansion": "^2.0.1" } } } @@ -7371,59 +7386,53 @@ "he": { "version": "1.2.0", "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/he/-/he-1.2.0.tgz", - "integrity": "sha1-hK5l+n6vsWX922FWauFLrwVmTw8=" - }, - "html-to-text": { - "version": "5.1.1", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/html-to-text/-/html-to-text-5.1.1.tgz", - "integrity": "sha1-LYnbe/NLx7y31UaxsiiZGhaSboc=", - "requires": { - "he": "^1.2.0", - "htmlparser2": "^3.10.1", - "lodash": "^4.17.11", - "minimist": "^1.2.0" - } + "integrity": "sha1-hK5l+n6vsWX922FWauFLrwVmTw8=", + "dev": true }, - "htmlparser2": { - "version": "3.10.1", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/htmlparser2/-/htmlparser2-3.10.1.tgz", - "integrity": "sha1-vWedw/WYl7ajS7EHSchVu1OpOS8=", - "requires": { - "domelementtype": "^1.3.1", - "domhandler": "^2.3.0", - "domutils": "^1.5.1", - "entities": "^1.1.1", - "inherits": "^2.0.1", - "readable-stream": "^3.1.1" - } + "html-escaper": { + "version": "2.0.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha1-39YAJ9o2o238viNiYsAKWCJoFFM=", + "dev": true }, "http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha1-ioyO9/WTLM+VPClsqCkblap0qjo=", + "version": "7.0.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha1-mosfJGhmwChQlIZYX2K48sGMJw4=", "dev": true, "requires": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" + "agent-base": "^7.1.0", + "debug": "^4.3.4" } }, "https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha1-xZ7yJKBP6LdU89sAY6Jeow0ABdY=", + "version": "7.0.5", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", + "integrity": "sha1-notQE4cymeEfq2/VSEBdotbGArI=", "dev": true, "requires": { - "agent-base": "6", + "agent-base": "^7.0.2", "debug": "4" } }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha1-jrehCmP/8l0VpXsAFYbRd9Gw01I=", + "dev": true + }, "ignore": { "version": "5.3.2", "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/ignore/-/ignore-5.3.2.tgz", "integrity": "sha1-PNQOcp82Q/2HywTlC/DrcivFlvU=", "dev": true }, + "immediate": { + "version": "3.0.6", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=", + "dev": true + }, "import-fresh": { "version": "3.3.0", "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/import-fresh/-/import-fresh-3.3.0.tgz", @@ -7463,7 +7472,8 @@ "inherits": { "version": "2.0.4", "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha1-D6LGT5MpF8NDOg3tVTY6rjdBa3w=" + "integrity": "sha1-D6LGT5MpF8NDOg3tVTY6rjdBa3w=", + "dev": true }, "interpret": { "version": "2.2.0", @@ -7510,6 +7520,12 @@ "is-extglob": "^2.1.1" } }, + "is-interactive": { + "version": "2.0.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/is-interactive/-/is-interactive-2.0.0.tgz", + "integrity": "sha1-QMV2FFk4JtoRAK3mBZd41ZfxbpA=", + "dev": true + }, "is-number": { "version": "7.0.0", "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/is-number/-/is-number-7.0.0.tgz", @@ -7561,6 +7577,43 @@ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", "dev": true }, + "istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha1-LRZsSwZE1Do58Ev2wu3R5YXzF1Y=", + "dev": true + }, + "istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha1-kIMFusmlvRdaxqdEier9D8JEWn0=", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + } + }, + "istanbul-reports": { + "version": "3.1.7", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha1-2u0SueHcpRjhXAVuHlN+dBKA+gs=", + "dev": true, + "requires": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + } + }, + "jackspeak": { + "version": "3.4.3", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha1-iDOp2Jq0rN5hiJQr0cU7Y5DtWoo=", + "dev": true, + "requires": { + "@isaacs/cliui": "^8.0.2", + "@pkgjs/parseargs": "^0.11.0" + } + }, "jest-worker": { "version": "27.5.1", "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/jest-worker/-/jest-worker-27.5.1.tgz", @@ -7627,23 +7680,16 @@ "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/jsonc-parser/-/jsonc-parser-2.0.2.tgz", "integrity": "sha1-Qvz1bXCFKgQ/ra/eUd20qFZJl40=" }, - "jwa": { - "version": "1.4.1", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/jwa/-/jwa-1.4.1.tgz", - "integrity": "sha1-dDwymFy56YZVUw1TZBtmyGRbA5o=", - "requires": { - "buffer-equal-constant-time": "1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "jws": { - "version": "3.2.2", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/jws/-/jws-3.2.2.tgz", - "integrity": "sha1-ABCZ82OUaMlBQADpmZX6UvtHgwQ=", + "jszip": { + "version": "3.10.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha1-NK7nDrGOofrsL1iSCKFX0f6wkcI=", + "dev": true, "requires": { - "jwa": "^1.4.1", - "safe-buffer": "^5.0.1" + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" } }, "keyv": { @@ -7671,11 +7717,14 @@ "type-check": "~0.4.0" } }, - "listenercount": { - "version": "1.0.1", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/listenercount/-/listenercount-1.0.1.tgz", - "integrity": "sha1-hMinKrWcRyUyFIDJdeZQg0LnCTc=", - "dev": true + "lie": { + "version": "3.3.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/lie/-/lie-3.3.0.tgz", + "integrity": "sha1-3Pgt7lRfRgdNryAMfBxaCOD0D2o=", + "dev": true, + "requires": { + "immediate": "~3.0.5" + } }, "loader-runner": { "version": "4.3.0", @@ -7703,11 +7752,6 @@ "p-locate": "^5.0.0" } }, - "lodash": { - "version": "4.17.21", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha1-Z5WRxWTDv/quhFTPCz3zcMPWkRw=" - }, "lodash.merge": { "version": "4.6.2", "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -7724,6 +7768,21 @@ "is-unicode-supported": "^0.1.0" } }, + "lru-cache": { + "version": "10.4.3", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha1-QQ/IoXtw5ZgBPfJXwkRrfzOD8Rk=", + "dev": true + }, + "make-dir": { + "version": "4.0.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha1-w8IwencSd82WODBfkVwprnQbYU4=", + "dev": true, + "requires": { + "semver": "^7.5.3" + } + }, "memory-fs": { "version": "0.5.0", "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/memory-fs/-/memory-fs-0.5.0.tgz", @@ -7732,38 +7791,6 @@ "requires": { "errno": "^0.1.3", "readable-stream": "^2.0.1" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.8", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha1-kRJegEK7obmIf0k0X2J3Anzovps=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha1-mR7GnSluAxN0fVm9/St0XDX4go0=", - "dev": true - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } } }, "merge-stream": { @@ -7791,16 +7818,24 @@ "mime-db": { "version": "1.52.0", "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha1-u6vNwChZ9JhzAchW4zh85exDv3A=" + "integrity": "sha1-u6vNwChZ9JhzAchW4zh85exDv3A=", + "dev": true }, "mime-types": { "version": "2.1.35", "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha1-OBqHG2KnNEUGYK497uRIE/cNlZo=", + "dev": true, "requires": { "mime-db": "1.52.0" } }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha1-ftLCzMyvhNP/y3pptXcR/CCDQBs=", + "dev": true + }, "minimatch": { "version": "9.0.3", "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/minimatch/-/minimatch-9.0.3.tgz", @@ -7810,19 +7845,11 @@ "brace-expansion": "^2.0.1" } }, - "minimist": { - "version": "1.2.8", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha1-waRk52kzAuCCoHXO4MBXdBrEdyw=" - }, - "mkdirp": { - "version": "0.5.6", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha1-fe8D0kMtyuS6HWEURcSDlgYiVfY=", - "dev": true, - "requires": { - "minimist": "^1.2.6" - } + "minipass": { + "version": "7.1.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha1-k6libOXl5mvU24aEnnUV6SNApwc=", + "dev": true }, "mocha": { "version": "9.2.2", @@ -7964,11 +7991,6 @@ "integrity": "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk=", "dev": true }, - "mustache": { - "version": "4.2.0", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/mustache/-/mustache-4.2.0.tgz", - "integrity": "sha1-5YkjJNYKEuycKnM1ntylKXK/b2Q=" - }, "nanoid": { "version": "3.3.1", "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/nanoid/-/nanoid-3.3.1.tgz", @@ -7987,14 +8009,6 @@ "integrity": "sha1-tKr7k+OustgXTKU88WOrfXMIMF8=", "dev": true }, - "node-fetch": { - "version": "2.7.0", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha1-0PD6bj4twdJ+/NitmdVQvalNGH0=", - "requires": { - "whatwg-url": "^5.0.0" - } - }, "node-releases": { "version": "2.0.18", "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/node-releases/-/node-releases-2.0.18.tgz", @@ -8018,7 +8032,16 @@ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, "requires": { - "wrappy": "1" + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha1-0Oluu1awdHbfHdnEgG5SN5hcpF4=", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" } }, "optionator": { @@ -8035,6 +8058,79 @@ "word-wrap": "^1.2.5" } }, + "ora": { + "version": "7.0.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/ora/-/ora-7.0.1.tgz", + "integrity": "sha1-zdUw7Nhl/jnkUaDnaXhlZpyxGTA=", + "dev": true, + "requires": { + "chalk": "^5.3.0", + "cli-cursor": "^4.0.0", + "cli-spinners": "^2.9.0", + "is-interactive": "^2.0.0", + "is-unicode-supported": "^1.3.0", + "log-symbols": "^5.1.0", + "stdin-discarder": "^0.1.0", + "string-width": "^6.1.0", + "strip-ansi": "^7.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "6.1.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha1-lexAnGlhnWyxuLNPFLZg7yjr1lQ=", + "dev": true + }, + "chalk": { + "version": "5.3.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha1-Z8IKfr73Dn85cKAfkPohDLaGA4U=", + "dev": true + }, + "emoji-regex": { + "version": "10.4.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/emoji-regex/-/emoji-regex-10.4.0.tgz", + "integrity": "sha1-A1U6/qgLOXV0nPyzb3dsomjkE9Q=", + "dev": true + }, + "is-unicode-supported": { + "version": "1.3.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", + "integrity": "sha1-2CSYS2FsKSouGYIH1KYJmDhC9xQ=", + "dev": true + }, + "log-symbols": { + "version": "5.1.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/log-symbols/-/log-symbols-5.1.0.tgz", + "integrity": "sha1-og47ml9T+sauuOK7IsB88sjxbZM=", + "dev": true, + "requires": { + "chalk": "^5.0.0", + "is-unicode-supported": "^1.1.0" + } + }, + "string-width": { + "version": "6.1.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/string-width/-/string-width-6.1.0.tgz", + "integrity": "sha1-lkiNbtI/mtXYLRNSKvnkxMP9dRg=", + "dev": true, + "requires": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^10.2.1", + "strip-ansi": "^7.0.1" + } + }, + "strip-ansi": { + "version": "7.1.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha1-1bZWjKaJ2FYTcLBwdoXSJDT6/0U=", + "dev": true, + "requires": { + "ansi-regex": "^6.0.1" + } + } + } + }, "p-limit": { "version": "3.1.0", "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/p-limit/-/p-limit-3.1.0.tgz", @@ -8059,6 +8155,18 @@ "integrity": "sha1-yyhoVA4xPWHeWPr741zpAE1VQOY=", "dev": true }, + "package-json-from-dist": { + "version": "1.0.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", + "integrity": "sha1-5QHNMJSyeEletCWNTJ9tWsMBnwA=", + "dev": true + }, + "pako": { + "version": "1.0.11", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/pako/-/pako-1.0.11.tgz", + "integrity": "sha1-bJWZ00DVTf05RjgCUqNXBaa5kr8=", + "dev": true + }, "parent-module": { "version": "1.0.1", "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/parent-module/-/parent-module-1.0.1.tgz", @@ -8092,6 +8200,16 @@ "integrity": "sha1-+8EUtgykKzDZ2vWFjkvWi77bZzU=", "dev": true }, + "path-scurry": { + "version": "1.11.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha1-eWCmaIiFlKByCxKpEdGnQqufEdI=", + "dev": true, + "requires": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + } + }, "path-type": { "version": "4.0.0", "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/path-type/-/path-type-4.0.0.tgz", @@ -8206,13 +8324,26 @@ } }, "readable-stream": { - "version": "3.6.2", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha1-VqmzbqllwAxak+8x6xEaDxEFaWc=", + "version": "2.3.8", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha1-kRJegEK7obmIf0k0X2J3Anzovps=", + "dev": true, "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha1-mR7GnSluAxN0fVm9/St0XDX4go0=", + "dev": true + } } }, "readdirp": { @@ -8295,12 +8426,6 @@ "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", "dev": true }, - "require-from-string": { - "version": "2.0.2", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha1-iaf92TgmEmcxjq/hT5wy5ZjDaQk=", - "dev": true - }, "resolve": { "version": "1.22.8", "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/resolve/-/resolve-1.22.8.tgz", @@ -8335,6 +8460,24 @@ "integrity": "sha1-SrzYUq0y3Xuqv+m0DgCjbbXzkuY=", "dev": true }, + "restore-cursor": { + "version": "4.0.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/restore-cursor/-/restore-cursor-4.0.0.tgz", + "integrity": "sha1-UZVgpDGJdQlt725gnUQQDtqkzLk=", + "dev": true, + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "dependencies": { + "signal-exit": { + "version": "3.0.7", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha1-qaF2f4r4QVURTqq9c/mSc8j1mtk=", + "dev": true + } + } + }, "reusify": { "version": "1.0.4", "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/reusify/-/reusify-1.0.4.tgz", @@ -8348,6 +8491,41 @@ "dev": true, "requires": { "glob": "^7.1.3" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0=", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "glob": { + "version": "7.2.3", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/glob/-/glob-7.2.3.tgz", + "integrity": "sha1-uN8PuAK7+o6JvR2Ti04WV47UTys=", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha1-Gc0ZS/0+Qo8EmnCBfAONiatL41s=", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + } } }, "run-parallel": { @@ -8362,53 +8540,8 @@ "safe-buffer": { "version": "5.2.1", "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha1-Hq+fqb2x/dTsdfWPnNtOa3gn7sY=" - }, - "sax": { - "version": "1.4.1", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/sax/-/sax-1.4.1.tgz", - "integrity": "sha1-RMyJiDd/EmME07P8EBDHM7kp7w8=" - }, - "schema-utils": { - "version": "4.2.0", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/schema-utils/-/schema-utils-4.2.0.tgz", - "integrity": "sha1-cNfJPhU6JzqAWAGILr07/yDYnIs=", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "dependencies": { - "ajv": { - "version": "8.17.1", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha1-N9mlx3ava8ktf0+VEOukwKYNEaY=", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - } - }, - "ajv-keywords": { - "version": "5.1.0", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha1-adTThaRzPNvqtElkoRcKiPh/DhY=", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.3" - } - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha1-rnvLNlard6c7pcSb9lTzjmtoYOI=", - "dev": true - } - } + "integrity": "sha1-Hq+fqb2x/dTsdfWPnNtOa3gn7sY=", + "dev": true }, "semver": { "version": "7.6.3", @@ -8478,6 +8611,12 @@ "object-inspect": "^1.13.1" } }, + "signal-exit": { + "version": "4.1.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha1-lSGIwcvVRgcOLdIND0HArgUwywQ=", + "dev": true + }, "slash": { "version": "3.0.0", "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/slash/-/slash-3.0.0.tgz", @@ -8505,12 +8644,30 @@ "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" }, + "stdin-discarder": { + "version": "0.1.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/stdin-discarder/-/stdin-discarder-0.1.0.tgz", + "integrity": "sha1-IrPkADk6jijr9T+ZWPOIBiLv3iE=", + "dev": true, + "requires": { + "bl": "^5.0.0" + } + }, "string_decoder": { - "version": "1.3.0", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha1-QvEUWUpGzxqOMLCoT1bHjD7awh4=", + "version": "1.1.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", + "dev": true, "requires": { - "safe-buffer": "~5.2.0" + "safe-buffer": "~5.1.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha1-mR7GnSluAxN0fVm9/St0XDX4go0=", + "dev": true + } } }, "string-width": { @@ -8524,6 +8681,17 @@ "strip-ansi": "^6.0.1" } }, + "string-width-cjs": { + "version": "npm:string-width@4.2.3", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha1-JpxxF9J7Ba0uU2gwqOyJXvnG0BA=", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, "strip-ansi": { "version": "6.0.1", "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -8533,6 +8701,15 @@ "ansi-regex": "^5.0.1" } }, + "strip-ansi-cjs": { + "version": "npm:strip-ansi@6.0.1", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha1-nibGPTD1NEPpSJSVshBdN7Z6hdk=", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, "strip-json-comments": { "version": "3.1.1", "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -8598,6 +8775,52 @@ } } }, + "test-exclude": { + "version": "6.0.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha1-BKhphmHYBepvopO2y55jrARO8V4=", + "dev": true, + "requires": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0=", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "glob": { + "version": "7.2.3", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/glob/-/glob-7.2.3.tgz", + "integrity": "sha1-uN8PuAK7+o6JvR2Ti04WV47UTys=", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha1-Gc0ZS/0+Qo8EmnCBfAONiatL41s=", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, "text-table": { "version": "0.2.0", "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/text-table/-/text-table-0.2.0.tgz", @@ -8613,17 +8836,6 @@ "is-number": "^7.0.0" } }, - "tr46": { - "version": "0.0.3", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" - }, - "traverse": { - "version": "0.3.9", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/traverse/-/traverse-0.3.9.tgz", - "integrity": "sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk=", - "dev": true - }, "ts-api-utils": { "version": "1.3.0", "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/ts-api-utils/-/ts-api-utils-1.3.0.tgz", @@ -8644,11 +8856,6 @@ "semver": "^7.3.4" } }, - "tslib": { - "version": "1.14.1", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha1-zy04vcNKE0vK8QkcQfZhni9nLQA=" - }, "tunnel": { "version": "0.0.6", "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/tunnel/-/tunnel-0.0.6.tgz", @@ -8690,55 +8897,11 @@ "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/underscore/-/underscore-1.13.7.tgz", "integrity": "sha1-lw4zljr5p92iKPF+voOZ5fvmOhA=" }, - "unzipper": { - "version": "0.10.14", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/unzipper/-/unzipper-0.10.14.tgz", - "integrity": "sha1-0rM8l3cU2g+8D4J3StNUcKfJYrE=", - "dev": true, - "requires": { - "big-integer": "^1.6.17", - "binary": "~0.3.0", - "bluebird": "~3.4.1", - "buffer-indexof-polyfill": "~1.0.0", - "duplexer2": "~0.1.4", - "fstream": "^1.0.12", - "graceful-fs": "^4.2.2", - "listenercount": "~1.0.1", - "readable-stream": "~2.3.6", - "setimmediate": "~1.0.4" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.8", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha1-kRJegEK7obmIf0k0X2J3Anzovps=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha1-mR7GnSluAxN0fVm9/St0XDX4go0=", - "dev": true - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } + "undici-types": { + "version": "6.13.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/undici-types/-/undici-types-6.13.0.tgz", + "integrity": "sha1-4+eSIKuMge0UlrWBJHGv188HXqU=", + "dev": true }, "update-browserslist-db": { "version": "1.1.0", @@ -8762,12 +8925,19 @@ "util-deprecate": { "version": "1.0.2", "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true }, - "uuid": { - "version": "8.3.2", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha1-gNW1ztJxu5r2xEXyGhoExgbO++I=" + "v8-to-istanbul": { + "version": "9.3.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", + "integrity": "sha1-uVcqv6Yr1VbBbXX968GkEdX/MXU=", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" + } }, "vscode-json-languageservice": { "version": "4.2.1", @@ -8876,11 +9046,6 @@ "graceful-fs": "^4.1.2" } }, - "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" - }, "webpack": { "version": "5.94.0", "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/webpack/-/webpack-5.94.0.tgz", @@ -9002,15 +9167,6 @@ "integrity": "sha1-LU2quEUf1LJAzCcFX/agwszqDN4=", "dev": true }, - "whatwg-url": { - "version": "5.0.0", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", - "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, "which": { "version": "2.0.2", "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/which/-/which-2.0.2.tgz", @@ -9049,31 +9205,23 @@ "strip-ansi": "^6.0.0" } }, + "wrap-ansi-cjs": { + "version": "npm:wrap-ansi@7.0.0", + "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha1-Z+FFz/UQpqaYS98RUpEdadLrnkM=", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, "wrappy": { "version": "1.0.2", "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, - "xml2js": { - "version": "0.5.0", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/xml2js/-/xml2js-0.5.0.tgz", - "integrity": "sha1-2UQGMfuy7YACA/rRBvJyT2LEk7c=", - "requires": { - "sax": ">=0.6.0", - "xmlbuilder": "~11.0.0" - } - }, - "xmlbuilder": { - "version": "11.0.1", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha1-vpuuHIoEbnazESdyY0fQrXACvrM=" - }, - "xpath.js": { - "version": "1.1.0", - "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/xpath.js/-/xpath.js-1.1.0.tgz", - "integrity": "sha1-OBakTtS7NSCRCD0AKjg91RBKX/E=" - }, "y18n": { "version": "5.0.8", "resolved": "https://pkgs.dev.azure.com/mseng/PipelineTools/_packaging/PipelineTools_PublicPackages/npm/registry/y18n/-/y18n-5.0.8.tgz", diff --git a/package.json b/package.json index 9fe8980b..d524164a 100644 --- a/package.json +++ b/package.json @@ -18,8 +18,7 @@ "theme": "light" }, "engines": { - "vscode": "^1.64.0", - "node": ">=12.20.0" + "vscode": "^1.82.0" }, "categories": [ "Programming Languages", @@ -37,10 +36,6 @@ "continuous integration", "CI/CD" ], - "activationEvents": [ - "onLanguage:azure-pipelines", - "onCommand:azure-pipelines.configure-pipeline" - ], "main": "./dist/extension", "capabilities": { "untrustedWorkspaces": { @@ -83,12 +78,6 @@ "configuration": { "title": "Azure Pipelines", "properties": { - "azure-pipelines.configure": { - "type": "boolean", - "default": true, - "description": "Enable 'Configure Pipeline' feature", - "order": 0 - }, "azure-pipelines.1ESPipelineTemplatesSchemaFile": { "type": "boolean", "default": false, @@ -115,26 +104,12 @@ } }, "commands": [ - { - "command": "azure-pipelines.configure-pipeline", - "title": "Configure Pipeline", - "category": "Azure Pipelines" - }, { "command": "azure-pipelines.reset-state", "title": "Reset 'do not ask again' messages", "category": "Azure Pipelines" } - ], - "menus": { - "explorer/context": [ - { - "command": "azure-pipelines.configure-pipeline", - "group": "Azure Pipelines", - "when": "explorerResourceIsFolder == true" - } - ] - } + ] }, "scripts": { "vscode:prepublish": "npm run compile", @@ -143,22 +118,17 @@ "compile:test": "tsc --project ./tsconfig.test.json", "lint": "eslint .", "watch": "webpack --mode development --progress --color --watch", - "test": "npm run compile:test && node ./out/test/runTest.js" + "test": "npm run compile:test && vscode-test" }, "devDependencies": { - "@types/glob": "^7.2.0", - "@types/html-to-text": "^5.1.2", "@types/mocha": "^9.0.0", - "@types/mustache": "0.8.32", - "@types/node": "^14.16.0", - "@types/uuid": "^8.3.4", - "@types/vscode": "~1.64.0", + "@types/node": "~20.15.0", + "@types/vscode": "~1.82.0", "@typescript-eslint/eslint-plugin": "^6.11.0", "@typescript-eslint/parser": "^6.11.0", - "@vscode/test-electron": "^1.6.2", - "copy-webpack-plugin": "^10.2.0", + "@vscode/test-cli": "^0.0.10", + "@vscode/test-electron": "^2.4.1", "eslint": "^8.54.0", - "glob": "^7.1.6", "mocha": "^9.1.1", "ts-loader": "^8.0.14", "typescript": "~5.2.2", @@ -166,20 +136,10 @@ "webpack-cli": "^4.4.0" }, "dependencies": { - "@azure/arm-appservice": "^6.1.0", - "@azure/arm-subscriptions": "^3.0.0", - "@azure/ms-rest-azure-env": "^2.0.0", - "@azure/ms-rest-nodeauth": "^3.0.6", "@vscode/extension-telemetry": "^0.5.1", "azure-devops-node-api": "^11.0.1", "azure-pipelines-language-server": "0.8.0", - "html-to-text": "^5.1.1", - "mustache": "^4.2.0", - "uuid": "^8.3.2", "vscode-languageclient": "^7.0.0", "vscode-uri": "^3.0.2" - }, - "extensionDependencies": [ - "ms-vscode.azure-account" - ] + } } diff --git a/resources/configure-pipeline.gif b/resources/configure-pipeline.gif deleted file mode 100644 index 5e0352fe..00000000 Binary files a/resources/configure-pipeline.gif and /dev/null differ diff --git a/resources/gitHubPatScope.png b/resources/gitHubPatScope.png deleted file mode 100644 index 9143fedd..00000000 Binary files a/resources/gitHubPatScope.png and /dev/null differ diff --git a/src/clients/devOps/organizationsClient.ts b/src/clients/devOps/organizationsClient.ts new file mode 100644 index 00000000..1b42a98d --- /dev/null +++ b/src/clients/devOps/organizationsClient.ts @@ -0,0 +1,55 @@ +import { ConnectionData } from 'azure-devops-node-api/interfaces/LocationsInterfaces'; + +import { telemetryHelper, extensionVersion } from '../../helpers/telemetryHelper'; + +export interface Organization { + accountId: string; + accountName: string; + accountUri: string; + properties: Record; +} + +export class OrganizationsClient { + private organizations?: Organization[]; + + constructor(private token: string) { } + + public async listOrganizations(forceRefresh?: boolean): Promise { + if (this.organizations && !forceRefresh) { + return this.organizations; + } + + const { authenticatedUser } = await this.fetch("https://app.vssps.visualstudio.com/_apis/connectiondata"); + if (authenticatedUser === undefined) { + return []; + } + + const { value: organizations } = await this.fetch<{ value: Organization[] }>(`https://app.vssps.visualstudio.com/_apis/accounts?memberId=${authenticatedUser.id}&api-version=7.0`); + this.organizations = organizations.sort((org1, org2) => { + const account1 = org1.accountName.toLowerCase(); + const account2 = org2.accountName.toLowerCase(); + if (account1 < account2) { + return -1; + } else if (account1 > account2) { + return 1; + } + return 0; + }); + + return this.organizations; + } + + private async fetch(...[request, init]: Parameters): Promise { + const response = await fetch(request, { + ...init, + headers: { + ...init?.headers, + 'Authorization': `Bearer ${this.token}`, + 'Content-Type': 'application/json', + 'User-Agent': `azure-pipelines-vscode ${extensionVersion}`, + 'X-TFS-Session': telemetryHelper.getJourneyId(), + } + }); + return (await response.json()) as T; + } +} diff --git a/src/configure/activate.ts b/src/configure/activate.ts deleted file mode 100644 index 66b64234..00000000 --- a/src/configure/activate.ts +++ /dev/null @@ -1,12 +0,0 @@ -import * as vscode from 'vscode'; - -import { configurePipeline } from './configure'; -import { telemetryHelper } from '../helpers/telemetryHelper'; - -export function activateConfigurePipeline(): void { - vscode.commands.registerCommand('azure-pipelines.configure-pipeline', async () => { - await telemetryHelper.callWithTelemetryAndErrorHandling('azurePipelines.configure-pipeline', async () => { - await configurePipeline(); - }); - }); -} diff --git a/src/configure/clients/azure/appServiceClient.ts b/src/configure/clients/azure/appServiceClient.ts deleted file mode 100644 index 1c7e558a..00000000 --- a/src/configure/clients/azure/appServiceClient.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { v4 as uuid } from 'uuid'; -import { WebSiteManagementClient, WebSiteManagementModels } from '@azure/arm-appservice'; -import { TokenCredentialsBase } from '@azure/ms-rest-nodeauth'; - -import { WebAppKind, ValidatedSite } from '../../model/models'; - -export class AppServiceClient { - private webSiteManagementClient: WebSiteManagementClient; - - constructor(credentials: TokenCredentialsBase, subscriptionId: string) { - this.webSiteManagementClient = new WebSiteManagementClient(credentials, subscriptionId); - } - - public async getAppServices(filterForResourceKind: WebAppKind): Promise { - const sites = await this.webSiteManagementClient.webApps.list(); - return sites.filter(site => site.kind === filterForResourceKind); - } - - public async getAppServiceConfig(site: ValidatedSite): Promise { - return this.webSiteManagementClient.webApps.getConfiguration(site.resourceGroup, site.name); - } - - public async updateScmType(site: ValidatedSite): Promise { - const siteConfig = await this.getAppServiceConfig(site); - siteConfig.scmType = ScmType.VSTSRM; - return this.webSiteManagementClient.webApps.updateConfiguration(site.resourceGroup, site.name, siteConfig); - } - - public async getAppServiceMetadata(site: ValidatedSite): Promise { - return this.webSiteManagementClient.webApps.listMetadata(site.resourceGroup, site.name); - } - - public async updateAppServiceMetadata(site: ValidatedSite, metadata: WebSiteManagementModels.StringDictionary): Promise { - return this.webSiteManagementClient.webApps.updateMetadata(site.resourceGroup, site.name, metadata); - } - - public async publishDeploymentToAppService(site: ValidatedSite, buildDefinitionUrl: string, releaseDefinitionUrl: string, triggeredBuildUrl: string): Promise { - // create deployment object - const deploymentId = uuid(); - const deployment = this.createDeploymentObject(deploymentId, buildDefinitionUrl, releaseDefinitionUrl, triggeredBuildUrl); - return this.webSiteManagementClient.webApps.createDeployment(site.resourceGroup, site.name, deploymentId, deployment); - } - - private createDeploymentObject(deploymentId: string, buildDefinitionUrl: string, releaseDefinitionUrl: string, triggeredBuildUrl: string): WebSiteManagementModels.Deployment { - const message: DeploymentMessage = { - type: "CDDeploymentConfiguration", - message: "Successfully set up continuous delivery from VS Code and triggered deployment to Azure Web App.", - VSTSRM_BuildDefinitionWebAccessUrl: buildDefinitionUrl, - VSTSRM_ConfiguredCDEndPoint: '', - VSTSRM_BuildWebAccessUrl: triggeredBuildUrl, - }; - - return { - id: deploymentId, - status: 4, - author: 'VSTS', - deployer: 'VSTS', - message: JSON.stringify(message), - }; - } -} - -export enum ScmType { - VSTSRM = 'VSTSRM', - NONE = 'NONE' -} - -interface DeploymentMessage { - type: string; - message: string; - VSTSRM_BuildDefinitionWebAccessUrl: string; - VSTSRM_ConfiguredCDEndPoint: string; - VSTSRM_BuildWebAccessUrl: string; -} diff --git a/src/configure/clients/devOps/organizationsClient.ts b/src/configure/clients/devOps/organizationsClient.ts deleted file mode 100644 index a8d6e63a..00000000 --- a/src/configure/clients/devOps/organizationsClient.ts +++ /dev/null @@ -1,93 +0,0 @@ -import { RequestPrepareOptions } from '@azure/ms-rest-js'; -import { TokenCredentialsBase } from '@azure/ms-rest-nodeauth'; -import { ConnectionData } from 'azure-devops-node-api/interfaces/LocationsInterfaces'; - -import { RestClient } from '../restClient'; -import { Organization } from '../../model/models'; -import { telemetryHelper } from '../../../helpers/telemetryHelper'; - -export class OrganizationsClient { - private restClient: RestClient; - private organizations?: Organization[]; - - constructor(credentials: TokenCredentialsBase) { - this.restClient = new RestClient(credentials); - } - - public async sendRequest(requestPrepareOptions: RequestPrepareOptions): Promise { - if (requestPrepareOptions.headers) { - requestPrepareOptions.headers['X-TFS-Session'] = telemetryHelper.getJourneyId(); - } - else { - requestPrepareOptions.headers = { 'X-TFS-Session': telemetryHelper.getJourneyId() }; - } - - return this.restClient.sendRequest(requestPrepareOptions); - } - - public async listOrganizations(forceRefresh?: boolean): Promise { - if (this.organizations && !forceRefresh) { - return this.organizations; - } - - const { authenticatedUser } = await this.getUserData(); - if (authenticatedUser === undefined) { - return []; - } - - const response = await this.sendRequest<{ value: Organization[] }>({ - url: "https://app.vssps.visualstudio.com/_apis/accounts", - headers: { - "Content-Type": "application/json" - }, - method: "GET", - queryParameters: { - "memberId": authenticatedUser.id, - "api-version": "7.0", - }, - }); - - this.organizations = response.value.sort((org1, org2) => { - const account1 = org1.accountName.toLowerCase(); - const account2 = org2.accountName.toLowerCase(); - if (account1 < account2) { - return -1; - } else if (account1 > account2) { - return 1; - } - return 0; - }); - - return this.organizations; - } - - private async getUserData(): Promise { - try { - return this.getConnectionData(); - } catch { - await this.createUserProfile(); - return this.getConnectionData(); - } - } - - private getConnectionData(): Promise { - return this.sendRequest({ - url: "https://app.vssps.visualstudio.com/_apis/connectiondata", - headers: { - "Content-Type": "application/json" - }, - method: "GET", - }); - } - - // TODO: Need to verify this signature - private createUserProfile(): Promise { - return this.sendRequest({ - url: "https://app.vssps.visualstudio.com/_apis/_AzureProfile/CreateProfile", - headers: { - "Content-Type": "application/json" - }, - method: "POST", - }); - } -} diff --git a/src/configure/clients/devOps/serviceConnectionClient.ts b/src/configure/clients/devOps/serviceConnectionClient.ts deleted file mode 100644 index 9bec2c83..00000000 --- a/src/configure/clients/devOps/serviceConnectionClient.ts +++ /dev/null @@ -1,141 +0,0 @@ -import * as azdev from 'azure-devops-node-api'; -import { AadApplication } from '../../model/models'; - -// Definitive interface at https://github.com/microsoft/azure-devops-node-api/blob/master/api/interfaces/ServiceEndpointInterfaces.ts, -// but it isn't exported :(. -interface ServiceConnection { - allPipelines: { - authorized: boolean; - } - id: string; - isReady: boolean; - type: string; - operationStatus: { - state: string; - statusMessage: string; - }; -} - -export class ServiceConnectionClient { - constructor(private connection: azdev.WebApi, private project: string) { - } - - public async createGitHubServiceConnection(endpointName: string, gitHubPat: string): Promise { - const url = `${this.connection.serverUrl}/${this.project}/_apis/serviceendpoint/endpoints`; - - const response = await this.connection.rest.create(url, { - "administratorsGroup": null, - "authorization": { - "parameters": { - "accessToken": gitHubPat - }, - "scheme": "PersonalAccessToken" - }, - "description": "", - "groupScopeId": null, - "name": endpointName, - "operationStatus": null, - "readersGroup": null, - "type": "github", - "url": "http://github.com" - }, { - acceptHeader: "application/json;api-version=5.1-preview.2;excludeUrls=true", - additionalHeaders: { - "Content-Type": "application/json", - }, - }); - - if (response.result) { - return response.result; - } else { - throw new Error(`Failed to create GitHub service connection: ${response.statusCode}`); - } - } - - public async createAzureServiceConnection(endpointName: string, tenantId: string, subscriptionId: string, scope: string, aadApp: AadApplication): Promise { - const url = `${this.connection.serverUrl}/${this.project}/_apis/serviceendpoint/endpoints`; - - const response = await this.connection.rest.create(url, { - "administratorsGroup": null, - "authorization": { - "parameters": { - "authenticationType": "spnKey", - "scope": scope, - "serviceprincipalid": aadApp.appId, - "serviceprincipalkey": aadApp.secret, - "tenantid": tenantId - }, - "scheme": "ServicePrincipal" - }, - "data": { - "creationMode": "Manual", - "subscriptionId": subscriptionId, - "subscriptionName": subscriptionId - }, - "description": "", - "groupScopeId": null, - "name": endpointName, - "operationStatus": null, - "readersGroup": null, - "type": "azurerm", - "url": "https://management.azure.com/" - }, { - acceptHeader: "application/json;api-version=5.1-preview.2;excludeUrls=true", - additionalHeaders: { - "Content-Type": "application/json", - }, - }); - - if (response.result) { - return response.result; - } else { - throw new Error(`Failed to create Azure service connection: ${response.statusCode}`); - } - } - - public async getEndpointStatus(endpointId: string): Promise { - const url = `${this.connection.serverUrl}/${this.project}/_apis/serviceendpoint/endpoints/${endpointId}`; - - const response = await this.connection.rest.get(url, { - acceptHeader: "application/json;api-version=5.1-preview.2;excludeUrls=true", - additionalHeaders: { - "Content-Type": "application/json", - }, - }); - - if (response.result) { - return response.result; - } else { - throw new Error(`Failed to get service connection status: ${response.statusCode}`); - } - } - - // TODO: Authorize individual pipelines instead of all pipelines. - public async authorizeEndpointForAllPipelines(endpointId: string): Promise { - const url = `${this.connection.serverUrl}/${this.project}/_apis/pipelines/pipelinePermissions/endpoint/${endpointId}`; - - const response = await this.connection.rest.update(url, { - "allPipelines": { - "authorized": true, - "authorizedBy": null, - "authorizedOn": null - }, - "pipelines": null, - "resource": { - "id": endpointId, - "type": "endpoint" - } - }, { - acceptHeader: "application/json;api-version=5.1-preview.1;excludeUrls=true;enumsAsNumbers=true;msDateFormat=true;noArrayWrap=true", - additionalHeaders: { - "Content-Type": "application/json", - }, - }); - - if (response.result) { - return response.result; - } else { - throw new Error(`Failed to authorize service connection: ${response.statusCode}`); - } - } -} diff --git a/src/configure/clients/restClient.ts b/src/configure/clients/restClient.ts deleted file mode 100644 index 1de4d3f3..00000000 --- a/src/configure/clients/restClient.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { ServiceClient, RequestPrepareOptions } from "@azure/ms-rest-js"; - -export class RestClient extends ServiceClient { - public sendRequest(options: RequestPrepareOptions): Promise { - return new Promise((resolve, reject) => { - super.sendRequest(options) - .then(response => { - if (response.status >= 300) { - reject(response.parsedBody as Error); - } - resolve(response.parsedBody as TResult); - }) - .catch(error => { - reject(error as Error); - }); - }); - } -} diff --git a/src/configure/configure.ts b/src/configure/configure.ts deleted file mode 100644 index 2ecd956d..00000000 --- a/src/configure/configure.ts +++ /dev/null @@ -1,791 +0,0 @@ -import { v4 as uuid } from 'uuid'; -import { AppServiceClient } from './clients/azure/appServiceClient'; -import { OrganizationsClient } from './clients/devOps/organizationsClient'; -import * as AzureDevOpsHelper from './helper/devOps/azureDevOpsHelper'; -import * as Messages from '../messages'; -import { ServiceConnectionHelper } from './helper/devOps/serviceConnectionHelper'; -import { SourceOptions, RepositoryProvider, QuickPickItemWithData, GitRepositoryDetails, PipelineTemplate, AzureDevOpsDetails, ValidatedBuild, ValidatedProject, WebAppKind, TargetResourceType, ValidatedSite } from './model/models'; -import * as constants from './resources/constants'; -import * as TracePoints from './resources/tracePoints'; -import { getAzureAccountExtensionApi, getGitExtensionApi } from '../extensionApis'; -import { telemetryHelper } from '../helpers/telemetryHelper'; -import * as TelemetryKeys from '../helpers/telemetryKeys'; -import * as utils from 'util'; -import * as vscode from 'vscode'; -import { URI, Utils } from 'vscode-uri'; -import * as templateHelper from './helper/templateHelper'; -import { getAvailableFileName } from './helper/commonHelper'; -import { showInputBox, showQuickPick } from './helper/controlProvider'; -import { Build } from 'azure-devops-node-api/interfaces/BuildInterfaces'; -import { AzureAccount, AzureSession } from '../typings/azure-account.api'; -import { Repository } from '../typings/git'; -import { AzureSiteDetails } from './model/models'; -import { GraphHelper } from './helper/graphHelper'; -import { TeamProject } from 'azure-devops-node-api/interfaces/CoreInterfaces'; -import { WebApi, getBearerHandler } from 'azure-devops-node-api'; -import * as GitHubHelper from './helper/gitHubHelper'; -import { WebSiteManagementModels } from '@azure/arm-appservice'; - -const Layer: string = 'configure'; - -export async function configurePipeline(): Promise { - const azureAccount = await getAzureAccountExtensionApi(); - if (!(await azureAccount.waitForLogin())) { - telemetryHelper.setTelemetry(TelemetryKeys.AzureLoginRequired, 'true'); - - const signIn = await vscode.window.showInformationMessage(Messages.azureLoginRequired, Messages.signInLabel); - if (signIn?.toLowerCase() === Messages.signInLabel.toLowerCase()) { - await vscode.commands.executeCommand("azure-account.login"); - } else { - void vscode.window.showWarningMessage(Messages.azureLoginRequired); - return; - } - } - - const gitExtension = await getGitExtensionApi(); - const workspaceUri = await getWorkspace(); - if (workspaceUri === undefined) { - return; - } - - const repo = gitExtension.getRepository(workspaceUri); - if (repo === null) { - void vscode.window.showWarningMessage(Messages.notAGitRepository); - return; - } - - // Refresh the repo status so that we have accurate info. - await repo.status(); - - const configurer = new PipelineConfigurer(workspaceUri, repo, azureAccount); - await configurer.configure(); -} - -async function getWorkspace(): Promise { - const workspaceFolders = vscode.workspace.workspaceFolders; - if (workspaceFolders !== undefined) { - telemetryHelper.setTelemetry(TelemetryKeys.SourceRepoLocation, SourceOptions.CurrentWorkspace); - - if (workspaceFolders.length === 1) { - telemetryHelper.setTelemetry(TelemetryKeys.MultipleWorkspaceFolders, 'false'); - return workspaceFolders[0].uri; - } else { - telemetryHelper.setTelemetry(TelemetryKeys.MultipleWorkspaceFolders, 'true'); - - const workspaceFolderOptions: QuickPickItemWithData[] = - workspaceFolders.map(folder => ({ label: folder.name, data: folder })); - const selectedWorkspaceFolder = await showQuickPick( - constants.SelectFromMultipleWorkSpace, - workspaceFolderOptions, - { placeHolder: Messages.selectWorkspaceFolder }); - if (selectedWorkspaceFolder === undefined) { - return undefined; - } - - return selectedWorkspaceFolder.data.uri; - } - } else { - telemetryHelper.setTelemetry(TelemetryKeys.SourceRepoLocation, SourceOptions.BrowseLocalMachine); - const selectedFolders = await vscode.window.showOpenDialog({ - openLabel: Messages.selectFolderLabel, - canSelectFiles: false, - canSelectFolders: true, - canSelectMany: false, - }); - - if (selectedFolders === undefined) { - return undefined; - } - - return selectedFolders[0]; - } -} - -class PipelineConfigurer { - private azureDevOpsClient: WebApi | undefined; - private uniqueResourceNameSuffix: string; - - public constructor( - private workspaceUri: URI, - private repo: Repository, - private azureAccount: AzureAccount) { - this.uniqueResourceNameSuffix = uuid().substring(0, 5); - } - - public async configure(): Promise { - telemetryHelper.setCurrentStep('GetAllRequiredInputs'); - const repoDetails = await this.getGitDetailsFromRepository(); - if (repoDetails === undefined) { - return; - } - - const template = await this.getSelectedPipeline(); - if (template === undefined) { - return; - } - - const adoDetails = await this.getAzureDevOpsDetails(repoDetails); - if (adoDetails === undefined) { - return; - } - - let azureSiteDetails: AzureSiteDetails | undefined; - if (template.target.type !== TargetResourceType.None) { - azureSiteDetails = await this.getAzureResourceDetails(adoDetails.session, template.target.kind); - if (azureSiteDetails === undefined) { - return; - } - } - - telemetryHelper.setCurrentStep('CreatePreRequisites'); - const serviceConnectionHelper = new ServiceConnectionHelper(adoDetails.adoClient, adoDetails.project.name); - - let repositoryProperties: Record | undefined; - if (repoDetails.repositoryProvider === RepositoryProvider.Github) { - const gitHubServiceConnection = await this.createGitHubServiceConnection( - serviceConnectionHelper, - repoDetails, - this.uniqueResourceNameSuffix); - if (gitHubServiceConnection === undefined) { - return; - } - - repositoryProperties = { - apiUrl: `https://api.github.com/repos/${repoDetails.ownerName}/${repoDetails.repositoryName}`, - branchesUrl: `https://api.github.com/repos/${repoDetails.ownerName}/${repoDetails.repositoryName}/branches`, - cloneUrl: repoDetails.remoteUrl, - connectedServiceId: gitHubServiceConnection, - defaultBranch: repoDetails.branch, - fullName: `${repoDetails.ownerName}/${repoDetails.repositoryName}`, - refsUrl: `https://api.github.com/repos/${repoDetails.ownerName}/${repoDetails.repositoryName}/git/refs` - }; - } - - let azureServiceConnection: string | undefined; - if (azureSiteDetails !== undefined) { - azureServiceConnection = await this.createAzureServiceConnection( - serviceConnectionHelper, - adoDetails, - azureSiteDetails, - this.uniqueResourceNameSuffix); - if (azureServiceConnection === undefined) { - return; - } - } - - telemetryHelper.setCurrentStep('CheckInPipeline'); - const pipelineFileName = await this.createPipelineFile( - template, - repoDetails.branch, - azureSiteDetails, - azureServiceConnection); - if (pipelineFileName === undefined) { - return; - } - - const commit = await this.checkInPipelineFileToRepository(pipelineFileName, repoDetails); - if (commit === undefined) { - return; - } - - telemetryHelper.setCurrentStep('CreateAndRunPipeline'); - const queuedPipeline = await this.createAndRunPipeline( - repoDetails, - adoDetails, - template, - azureSiteDetails, - repositoryProperties, - pipelineFileName, - commit); - if (queuedPipeline === undefined) { - return; - } - - telemetryHelper.setCurrentStep('PostPipelineCreation'); - if (azureSiteDetails !== undefined) { - // This step should be determined by the - // - resource target provider type (azure app service, function app, aks) - // - pipeline provider (azure pipeline vs github) - await this.updateScmType(queuedPipeline, adoDetails, azureSiteDetails); - } - - telemetryHelper.setCurrentStep('DisplayCreatedPipeline'); - void vscode.window.showInformationMessage(Messages.pipelineSetupSuccessfully, Messages.browsePipeline) - .then(action => { - if (action === Messages.browsePipeline) { - telemetryHelper.setTelemetry(TelemetryKeys.BrowsePipelineClicked, 'true'); - // _links is weakly typed and it's not worth the effort to verify. - // eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-unsafe-member-access - void vscode.env.openExternal(URI.parse(queuedPipeline._links.web.href)); - } - }); - } - - private async getGitDetailsFromRepository(): Promise { - const { HEAD } = this.repo.state; - if (!HEAD) { - void vscode.window.showWarningMessage(Messages.branchHeadMissing); - return undefined; - } - - const { name } = HEAD; - let { remote } = HEAD; - if (!name) { - void vscode.window.showWarningMessage(Messages.branchNameMissing); - return undefined; - } - - if (!remote) { - // Remote tracking branch is not set, see if we have any remotes we can use. - const remotes = this.repo.state.remotes; - if (remotes.length === 0) { - void vscode.window.showWarningMessage(Messages.branchRemoteMissing); - return undefined; - } else if (remotes.length === 1) { - remote = remotes[0].name; - } else { - // Show an option to user to select remote to be configured - const selectedRemote = await showQuickPick( - constants.SelectRemoteForRepo, - remotes.map(remote => ({ label: remote.name })), - { placeHolder: Messages.selectRemoteForBranch }); - if (selectedRemote === undefined) { - return undefined; - } - - remote = selectedRemote.label; - } - } - - let repoDetails: GitRepositoryDetails; - let remoteUrl = this.repo.state.remotes.find(remoteObj => remoteObj.name === remote)?.fetchUrl; - if (remoteUrl !== undefined) { - if (AzureDevOpsHelper.isAzureReposUrl(remoteUrl)) { - remoteUrl = AzureDevOpsHelper.getFormattedRemoteUrl(remoteUrl); - const { - organizationName, - projectName, - repositoryName - } = AzureDevOpsHelper.getRepositoryDetailsFromRemoteUrl(remoteUrl); - repoDetails = { - repositoryProvider: RepositoryProvider.AzureRepos, - organizationName, - projectName, - repositoryName, - remoteName: remote, - remoteUrl, - branch: name, - }; - } else if (GitHubHelper.isGitHubUrl(remoteUrl)) { - remoteUrl = GitHubHelper.getFormattedRemoteUrl(remoteUrl); - const { ownerName, repositoryName } = GitHubHelper.getRepositoryDetailsFromRemoteUrl(remoteUrl); - repoDetails = { - repositoryProvider: RepositoryProvider.Github, - ownerName, - repositoryName, - remoteName: remote, - remoteUrl, - branch: name, - }; - } else { - void vscode.window.showWarningMessage(Messages.cannotIdentifyRepositoryDetails); - return undefined; - } - } else { - void vscode.window.showWarningMessage(Messages.remoteRepositoryNotConfigured); - return undefined; - } - - telemetryHelper.setTelemetry(TelemetryKeys.RepoProvider, repoDetails.repositoryProvider); - - return repoDetails; - } - - private async getSelectedPipeline(): Promise { - const appropriateTemplates: PipelineTemplate[] = await vscode.window.withProgress( - { location: vscode.ProgressLocation.Notification, title: Messages.analyzingRepo }, - () => templateHelper.analyzeRepoAndListAppropriatePipeline(this.workspaceUri) - ); - - // TODO: Get applicable pipelines for the repo type and azure target type if target already selected - const template = await showQuickPick( - constants.SelectPipelineTemplate, - appropriateTemplates.map((template) => { return { label: template.label, data: template }; }), - { placeHolder: Messages.selectPipelineTemplate }, - TelemetryKeys.PipelineTempateListCount); - - if (template === undefined) { - return undefined; - } - - telemetryHelper.setTelemetry(TelemetryKeys.ChosenTemplate, template.data.label); - return template.data; - } - - private async getAzureDevOpsDetails(repoDetails: GitRepositoryDetails): Promise { - if (repoDetails.repositoryProvider === RepositoryProvider.AzureRepos) { - for (const session of this.azureAccount.filters.map(({ session }) => session)) { - const organizationsClient = new OrganizationsClient(session.credentials2); - const organizations = await organizationsClient.listOrganizations(); - if (organizations.find(org => - org.accountName.toLowerCase() === repoDetails.organizationName.toLowerCase())) { - const adoClient = await this.getAzureDevOpsClient(repoDetails.organizationName, session); - const coreApi = await adoClient.getCoreApi(); - const project = await coreApi.getProject(repoDetails.projectName); - if (isValidProject(project)) { - return { - session, - adoClient, - organizationName: repoDetails.organizationName, - project, - }; - } - } - } - - void vscode.window.showWarningMessage("You are not signed in to the Azure DevOps organization that contains this repository."); - return undefined; - } else { - // Lazily construct list of organizations so that we can immediately show the quick pick, - // then fill in the choices as they come in. - const getOrganizationsAndSessions = async (): Promise[]> => { - return [ - ...(await Promise.all(this.azureAccount.filters.map(async ({ session }) => { - const organizationsClient = new OrganizationsClient(session.credentials2); - const organizations = await organizationsClient.listOrganizations(); - return organizations.map(organization => ({ - label: organization.accountName, - data: session, - })); - }))).flat(), - { - // This is safe because ADO orgs can't have spaces in them. - label: "Create new Azure DevOps organization...", - data: undefined, - } - ]; - }; - - const result = await showQuickPick( - 'organization', - getOrganizationsAndSessions(), { - placeHolder: "Select the Azure DevOps organization to create this pipeline in", - }, TelemetryKeys.OrganizationListCount); - if (result === undefined) { - return undefined; - } - - const { label: organizationName, data: session } = result; - if (session === undefined) { - // Special flag telling us to create a new organization. - await vscode.env.openExternal(vscode.Uri.parse("https://dev.azure.com/")); - return undefined; - } - - const adoClient = await this.getAzureDevOpsClient(organizationName, session); - - // Ditto for the projects. - const getProjects = async (): Promise[]> => { - const coreApi = await adoClient.getCoreApi(); - const projects = await coreApi.getProjects(); - return [ - ...projects - .filter(isValidProject) - .map(project => { return { label: project.name, data: project }; }), - { - // This is safe because ADO projects can't end with periods. - label: "Create new project...", - data: undefined, - } - ]; - }; - - const selectedProject = await showQuickPick( - constants.SelectProject, - getProjects(), - { placeHolder: Messages.selectProject }, - TelemetryKeys.ProjectListCount); - if (selectedProject === undefined) { - return undefined; - } - - const project = selectedProject.data; - if (project === undefined) { - // Special flag telling us to create a new project. - await vscode.env.openExternal(vscode.Uri.parse(`https://dev.azure.com/${organizationName}`)); - return undefined; - } - - return { - session, - adoClient, - organizationName, - project, - }; - } - } - - private async getAzureResourceDetails( - session: AzureSession, - kind: WebAppKind): Promise { - // show available subscriptions and get the chosen one - const subscriptionList = this.azureAccount.filters - .filter(filter => - // session is actually an AzureSessionInternal which makes a naive === check fail. - filter.session.environment === session.environment && - filter.session.tenantId === session.tenantId && - filter.session.userId === session.userId) - .map(subscriptionObject => { - return { - label: subscriptionObject.subscription.displayName ?? "Unknown subscription", - data: subscriptionObject, - description: subscriptionObject.subscription.subscriptionId ?? undefined - }; - }); - - const selectedSubscription = await showQuickPick( - constants.SelectSubscription, - subscriptionList, - { placeHolder: Messages.selectSubscription }); - if (selectedSubscription === undefined) { - return undefined; - } - - const { subscriptionId } = selectedSubscription.data.subscription; - if (subscriptionId === undefined) { - void vscode.window.showErrorMessage("Unable to get ID for subscription, please file a bug at https://github.com/microsoft/azure-pipelines-vscode/issues/new"); - return undefined; - } - - // show available resources and get the chosen one - const appServiceClient = new AppServiceClient(session.credentials2, subscriptionId); - - // TODO: Refactor kind so we don't need three kind.includes - - const sites = await appServiceClient.getAppServices(kind); - const items: QuickPickItemWithData[] = sites - .filter(isValidSite) - .map(site => { return { label: site.name, data: site }; }); - const appType = kind.includes("functionapp") ? "Function App" : "Web App"; - - items.push({ - // This is safe because apps can't have spaces in them. - label: `Create new ${appType.toLowerCase()}...`, - data: undefined, - }); - - const selectedResource = await showQuickPick( - kind.includes("functionapp") ? "selectFunctionApp" : "selectWebApp", - items, - { placeHolder: `Select ${appType}` }, - TelemetryKeys.WebAppListCount); - if (selectedResource === undefined) { - return undefined; - } - - const { data: site } = selectedResource; - if (site === undefined) { - // Special flag telling us to create a new app. - // URL format is documented at - // https://github.com/Azure/portaldocs/blob/main/portal-sdk/generated/portalfx-links.md#create-blades - const packageId = kind.includes("functionapp") ? "Microsoft.FunctionApp" : "Microsoft.WebSite"; - await vscode.env.openExternal(vscode.Uri.parse(`https://portal.azure.com/#create/${packageId}`)); - return undefined; - } - - return { - appServiceClient, - site, - subscriptionId, - }; - } - - private async createGitHubServiceConnection( - serviceConnectionHelper: ServiceConnectionHelper, - repoDetails: GitRepositoryDetails, - uniqueResourceNameSuffix: string, - ): Promise { - const token = await telemetryHelper.executeFunctionWithTimeTelemetry( - async () => showInputBox( - constants.GitHubPat, { - placeHolder: Messages.enterGitHubPat, - prompt: Messages.githubPatHelpMessage, - validateInput: input => input.length === 0 ? Messages.gitHubPatErrorMessage : null - } - ), TelemetryKeys.GitHubPatDuration - ); - - if (token === undefined) { - return undefined; - } - - return vscode.window.withProgress( - { - location: vscode.ProgressLocation.Notification, - title: Messages.creatingGitHubServiceConnection - }, - async () => { - const serviceConnectionName = `${repoDetails.repositoryName}-github-${uniqueResourceNameSuffix}`; - try { - return serviceConnectionHelper.createGitHubServiceConnection(serviceConnectionName, token); - } catch (error) { - telemetryHelper.logError(Layer, TracePoints.GitHubServiceConnectionError, error as Error); - throw error; - } - }); - } - - private async createAzureServiceConnection( - serviceConnectionHelper: ServiceConnectionHelper, - adoDetails: AzureDevOpsDetails, - azureSiteDetails: AzureSiteDetails, - uniqueResourceNameSuffix: string, - ): Promise { - // TODO: should SPN created be scoped to resource group of target azure resource. - return vscode.window.withProgress( - { - location: vscode.ProgressLocation.Notification, - title: utils.format(Messages.creatingAzureServiceConnection, azureSiteDetails.subscriptionId) - }, - async () => { - const scope = azureSiteDetails.site.id; - try { - const aadAppName = GraphHelper.generateAadApplicationName( - adoDetails.organizationName, - adoDetails.project.name); - const aadApp = await GraphHelper.createSpnAndAssignRole(adoDetails.session, aadAppName, scope); - const serviceConnectionName = `${azureSiteDetails.site.name}-${uniqueResourceNameSuffix}`; - return serviceConnectionHelper.createAzureServiceConnection( - serviceConnectionName, - adoDetails.session.tenantId, - azureSiteDetails.subscriptionId, - scope, - aadApp); - } - catch (error) { - telemetryHelper.logError(Layer, TracePoints.AzureServiceConnectionCreateFailure, error as Error); - throw error; - } - }); - } - - private async createPipelineFile( - template: PipelineTemplate, - branch: string, - azureSiteDetails: AzureSiteDetails | undefined, - azureServiceConnection: string | undefined, - ): Promise { - try { - const pipelineFileName = await getAvailableFileName("azure-pipelines.yml", this.workspaceUri); - const fileUri = Utils.joinPath(this.workspaceUri, pipelineFileName); - const content = await templateHelper.renderContent( - template.path, - branch, - azureSiteDetails?.site.name, - azureServiceConnection); - await vscode.workspace.fs.writeFile(fileUri, Buffer.from(content)); - await vscode.window.showTextDocument(fileUri); - return pipelineFileName; - } catch (error) { - telemetryHelper.logError(Layer, TracePoints.AddingContentToPipelineFileFailed, error as Error); - throw error; - } - } - - private async checkInPipelineFileToRepository( - pipelineFileName: string, - repoDetails: GitRepositoryDetails, - ): Promise { - try { - const commitOrDiscard = await vscode.window.showInformationMessage( - utils.format( - Messages.modifyAndCommitFile, - Messages.commitAndPush, - repoDetails.branch, - repoDetails.remoteName), - Messages.commitAndPush, - Messages.discardPipeline); - if (commitOrDiscard?.toLowerCase() === Messages.commitAndPush.toLowerCase()) { - return vscode.window.withProgress({ - location: vscode.ProgressLocation.Notification, - title: Messages.pushingPipelineFile - }, async () => { - try { - // TODO: Only commit the YAML file. Need to file a feature request on VS Code for this. - await this.repo.add([Utils.joinPath(this.workspaceUri, pipelineFileName).fsPath]); - await this.repo.commit(Messages.addYmlFile); - await this.repo.push(repoDetails.remoteName); - - const commit = this.repo.state.HEAD?.commit; - if (commit === undefined) { - void vscode.window.showErrorMessage("Unable to get commit after pushing pipeline, please file a bug at https://github.com/microsoft/azure-pipelines-vscode/issues/new"); - return undefined; - } - - return commit; - } catch (error) { - telemetryHelper.logError(Layer, TracePoints.CheckInPipelineFailure, error as Error); - void vscode.window.showErrorMessage( - utils.format(Messages.commitFailedErrorMessage, (error as Error).message)); - return undefined; - } - }); - } else { - telemetryHelper.setTelemetry(TelemetryKeys.PipelineDiscarded, 'true'); - return undefined; - } - } catch (error) { - telemetryHelper.logError(Layer, TracePoints.PipelineFileCheckInFailed, error as Error); - throw error; - } - } - - private async createAndRunPipeline( - repoDetails: GitRepositoryDetails, - adoDetails: AzureDevOpsDetails, - template: PipelineTemplate, - azureSiteDetails: AzureSiteDetails | undefined, - repositoryProperties: Record | undefined, - pipelineFileName: string, - commit: string, - ): Promise { - return vscode.window.withProgress({ - location: vscode.ProgressLocation.Notification, - title: Messages.configuringPipelineAndDeployment - }, async () => { - try { - const taskAgentApi = await adoDetails.adoClient.getTaskAgentApi(); - const queues = await taskAgentApi.getAgentQueuesByNames( - [constants.HostedVS2017QueueName], - adoDetails.project.name); - if (queues.length === 0) { - void vscode.window.showErrorMessage( - utils.format(Messages.noAgentQueueFound, constants.HostedVS2017QueueName)); - return undefined; - } - - const pipelineName = `${(azureSiteDetails?.site.name ?? template.label)}-${this.uniqueResourceNameSuffix}`; - const definitionPayload = AzureDevOpsHelper.getBuildDefinitionPayload( - pipelineName, - queues[0], - repoDetails, - adoDetails, - repositoryProperties, - pipelineFileName - ); - const buildApi = await adoDetails.adoClient.getBuildApi(); - const definition = await buildApi.createDefinition(definitionPayload, adoDetails.project.name); - const build = await buildApi.queueBuild({ - definition, - project: adoDetails.project, - sourceBranch: repoDetails.branch, - sourceVersion: commit - }, adoDetails.project.name); - - if (!isValidBuild(build)) { - return undefined; - } - - return build; - } - catch (error) { - telemetryHelper.logError(Layer, TracePoints.CreateAndQueuePipelineFailed, error as Error); - throw error; - } - }); - } - - private async updateScmType( - queuedPipeline: ValidatedBuild, - adoDetails: AzureDevOpsDetails, - azureSiteDetails: AzureSiteDetails, - ): Promise { - await vscode.window.withProgress({ - location: vscode.ProgressLocation.Notification, - title: Messages.runningPostDeploymentActions - }, async () => { - try { - // update SCM type - await azureSiteDetails.appServiceClient.updateScmType(azureSiteDetails.site); - - const buildDefinitionUrl = AzureDevOpsHelper.getOldFormatBuildDefinitionUrl( - adoDetails.organizationName, - adoDetails.project.id, - queuedPipeline.definition.id); - const buildUrl = AzureDevOpsHelper.getOldFormatBuildUrl( - adoDetails.organizationName, - adoDetails.project.id, - queuedPipeline.id); - - const locationsApi = await adoDetails.adoClient.getLocationsApi(); - const { instanceId } = await locationsApi.getConnectionData(); - if (instanceId === undefined) { - void vscode.window.showErrorMessage("Unable to determine the organization ID, please file a bug at https://github.com/microsoft/azure-pipelines-vscode/issues/new"); - return; - } - - // update metadata of app service to store information about the pipeline deploying to web app. - const metadata = await azureSiteDetails.appServiceClient.getAppServiceMetadata(azureSiteDetails.site); - metadata.properties = { - ...metadata.properties, - VSTSRM_ProjectId: adoDetails.project.id, - VSTSRM_AccountId: instanceId, - VSTSRM_BuildDefinitionId: queuedPipeline.definition.id.toString(), - VSTSRM_BuildDefinitionWebAccessUrl: buildDefinitionUrl, - VSTSRM_ConfiguredCDEndPoint: '', - VSTSRM_ReleaseDefinitionId: '', - }; - - await azureSiteDetails.appServiceClient.updateAppServiceMetadata(azureSiteDetails.site, metadata); - - // send a deployment log with information about the setup pipeline and links. - await azureSiteDetails.appServiceClient.publishDeploymentToAppService( - azureSiteDetails.site, - buildDefinitionUrl, - buildDefinitionUrl, - buildUrl); - } catch (error) { - telemetryHelper.logError(Layer, TracePoints.PostDeploymentActionFailed, error as Error); - throw error; - } - }); - } - - private async getAzureDevOpsClient(organization: string, session: AzureSession): Promise { - if (this.azureDevOpsClient) { - return this.azureDevOpsClient; - } - - const { accessToken } = await session.credentials2.getToken(); - const authHandler = getBearerHandler(accessToken); - this.azureDevOpsClient = new WebApi(`https://dev.azure.com/${organization}`, authHandler); - return this.azureDevOpsClient; - } -} - -function isValidProject(project: TeamProject): project is ValidatedProject { - if (project.name === undefined || project.id === undefined) { - void vscode.window.showErrorMessage("Unable to get name or ID for project, please file a bug at https://github.com/microsoft/azure-pipelines-vscode/issues/new"); - return false; - } - - return true; -} - -function isValidSite(resource: WebSiteManagementModels.Site): resource is ValidatedSite { - if (resource.name === undefined || resource.id === undefined) { - void vscode.window.showErrorMessage("Unable to get name or ID for resource, please file a bug at https://github.com/microsoft/azure-pipelines-vscode/issues/new"); - return false; - } - - return true; -} - -function isValidBuild(build: Build): build is ValidatedBuild { - if (build.definition === undefined || build.definition.id === undefined || build.id === undefined) { - void vscode.window.showErrorMessage("Unable to get definition or ID for build, please file a bug at https://github.com/microsoft/azure-pipelines-vscode/issues/new"); - return false; - } - - return true; -} diff --git a/src/configure/helper/commonHelper.ts b/src/configure/helper/commonHelper.ts deleted file mode 100644 index c350b5a8..00000000 --- a/src/configure/helper/commonHelper.ts +++ /dev/null @@ -1,67 +0,0 @@ -import * as vscode from 'vscode'; -import { URI } from 'vscode-uri'; -import * as util from 'util'; -import * as Messages from '../../messages'; -import * as logger from '../../logger'; - -export async function sleepForMilliSeconds(timeInMs: number): Promise { - return new Promise((resolve) => { - setTimeout(() => { - resolve(); - }, timeInMs); - }); -} - -export function generateRandomPassword(length: number = 20): string { - const characters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890!@#%^*()-+"; - const charTypeSize = [26, 26, 10, 10]; - const charTypeStartIndex = [0, 26, 52, 62]; - let password = ""; - for (let x = 0; x < length; x++) { - const i = Math.floor(Math.random() * charTypeSize[x % 4]); - password += characters.charAt(i + charTypeStartIndex[x % 4]); - } - return password; -} - -export async function executeFunctionWithRetry( - func: () => Promise, - retryCount: number = 20, - retryIntervalTimeInSec: number = 2, - errorMessage?: string): Promise { - let internalError = null; - for (; retryCount > 0; retryCount--) { - try { - return func(); - } catch (error) { - internalError = error; - logger.log(JSON.stringify(error)); - await sleepForMilliSeconds(retryIntervalTimeInSec * 1000); - } - } - - throw new Error(errorMessage ? - errorMessage.concat(util.format(Messages.retryFailedMessage, retryCount, JSON.stringify(internalError))) : - util.format(Messages.retryFailedMessage, retryCount, JSON.stringify(internalError))); -} - -export async function getAvailableFileName(fileName: string, repoPath: URI): Promise { - const files = (await vscode.workspace.fs.readDirectory(repoPath)).map(entries => entries[0]); - if (!files.includes(fileName)) { - return fileName; - } - - for (let i = 1; i < 100; i++) { - const incrementalFileName = getIncrementalFileName(fileName, i); - if (!files.includes(incrementalFileName)) { - return incrementalFileName; - } - } - - throw new Error(Messages.noAvailableFileNames); -} - -function getIncrementalFileName(fileName: string, count: number): string { - const periodIndex = fileName.indexOf('.'); - return fileName.substring(0, periodIndex).concat(` (${count})`, fileName.substring(periodIndex)); -} diff --git a/src/configure/helper/devOps/azureDevOpsHelper.ts b/src/configure/helper/devOps/azureDevOpsHelper.ts deleted file mode 100644 index 46e336b5..00000000 --- a/src/configure/helper/devOps/azureDevOpsHelper.ts +++ /dev/null @@ -1,140 +0,0 @@ -import { BuildDefinition, ContinuousIntegrationTrigger, DefinitionQuality, DefinitionTriggerType, DefinitionType, YamlProcess } from 'azure-devops-node-api/interfaces/BuildInterfaces'; -import { TaskAgentQueue } from 'azure-devops-node-api/interfaces/TaskAgentInterfaces'; - -import { RepositoryProvider, GitRepositoryDetails, AzureDevOpsDetails } from '../../model/models'; -import * as Messages from '../../../messages'; - -// https://dev.azure.com/ OR https://org@dev.azure.com/ -const AzureReposUrl = 'dev.azure.com/'; - -// git@ssh.dev.azure.com:v3/ -const SSHAzureReposUrl = 'ssh.dev.azure.com:v3/'; - -// https://org.visualstudio.com/ -const VSOUrl = '.visualstudio.com/'; - -// org@vs-ssh.visualstudio.com:v3/ -const SSHVsoReposUrl = 'vs-ssh.visualstudio.com:v3/'; - -export function isAzureReposUrl(remoteUrl: string): boolean { - return remoteUrl.includes(AzureReposUrl) || - remoteUrl.includes(VSOUrl) || - remoteUrl.includes(SSHAzureReposUrl) || - remoteUrl.includes(SSHVsoReposUrl); -} - -// TODO: Use ADO instead. -export function getFormattedRemoteUrl(remoteUrl: string): string { - // Convert SSH based url to https based url as pipeline service doesn't accept SSH based URL - if (remoteUrl.includes(SSHAzureReposUrl) || remoteUrl.includes(SSHVsoReposUrl)) { - const details = getRepositoryDetailsFromRemoteUrl(remoteUrl); - return `https://${details.organizationName}${VSOUrl}${details.projectName}/_git/${details.repositoryName}`; - } - - return remoteUrl; -} - -export function getRepositoryDetailsFromRemoteUrl(remoteUrl: string): { organizationName: string, projectName: string, repositoryName: string } { - if (remoteUrl.includes(AzureReposUrl)) { - const part = remoteUrl.substring(remoteUrl.indexOf(AzureReposUrl) + AzureReposUrl.length); - const parts = part.split('/'); - if (parts.length !== 4) { - throw new Error(Messages.failedToDetermineAzureRepoDetails); - } - - return { - organizationName: parts[0].trim(), - projectName: parts[1].trim(), - repositoryName: parts[3].trim() - }; - } else if (remoteUrl.includes(VSOUrl)) { - const part = remoteUrl.substring(remoteUrl.indexOf(VSOUrl) + VSOUrl.length); - const organizationName = remoteUrl.substring(remoteUrl.indexOf('https://') + 'https://'.length, remoteUrl.indexOf('.visualstudio.com')); - const parts = part.split('/'); - - if (parts.length === 4 && parts[0].toLowerCase() === 'defaultcollection') { - // Handle scenario where part is 'DefaultCollection//_git/' - parts.shift(); - } - - if (parts.length !== 3) { - throw new Error(Messages.failedToDetermineAzureRepoDetails); - } - - return { - organizationName: organizationName, - projectName: parts[0].trim(), - repositoryName: parts[2].trim() - }; - } else if (remoteUrl.includes(SSHAzureReposUrl) || remoteUrl.includes(SSHVsoReposUrl)) { - const urlFormat = remoteUrl.includes(SSHAzureReposUrl) ? SSHAzureReposUrl : SSHVsoReposUrl; - const part = remoteUrl.substring(remoteUrl.indexOf(urlFormat) + urlFormat.length); - const parts = part.split('/'); - if (parts.length !== 3) { - throw new Error(Messages.failedToDetermineAzureRepoDetails); - } - - return { - organizationName: parts[0].trim(), - projectName: parts[1].trim(), - repositoryName: parts[2].trim() - }; - } else { - throw new Error(Messages.notAzureRepoUrl); - } -} - -export function getBuildDefinitionPayload( - pipelineName: string, - queue: TaskAgentQueue, - repoDetails: GitRepositoryDetails, - adoDetails: AzureDevOpsDetails, - repositoryProperties: Record | undefined, - pipelineFileName: string, -): BuildDefinition { - return { - name: pipelineName, - type: DefinitionType.Build, - quality: DefinitionQuality.Definition, - path: "\\", //Folder path of build definition. Root folder in this case - project: adoDetails.project, - process: { - type: 2, - yamlFileName: pipelineFileName, - } as YamlProcess, - queue: { - id: queue.id, - }, - triggers: [ - { - triggerType: DefinitionTriggerType.ContinuousIntegration, // Continuous integration trigger type - settingsSourceType: 2, // Use trigger source as specified in YAML - batchChanges: false, - } as ContinuousIntegrationTrigger, - ], - repository: { - id: repoDetails.repositoryProvider === RepositoryProvider.Github - ? `${repoDetails.ownerName}/${repoDetails.repositoryName}` - : undefined, - name: repoDetails.repositoryProvider === RepositoryProvider.Github - ? `${repoDetails.ownerName}/${repoDetails.repositoryName}` - : repoDetails.repositoryName, - type: repoDetails.repositoryProvider, - defaultBranch: repoDetails.branch, - url: repoDetails.remoteUrl, - properties: repositoryProperties, - }, - properties: { - source: 'ms-azure-devops.azure-pipelines', - }, - }; -} - -// TODO: These should be able to be changed to use ADO instead. -export function getOldFormatBuildDefinitionUrl(accountName: string, projectName: string, buildDefinitionId: number) { - return `https://${accountName}.visualstudio.com/${projectName}/_build?definitionId=${buildDefinitionId}&_a=summary`; -} - -export function getOldFormatBuildUrl(accountName: string, projectName: string, buildId: number) { - return `https://${accountName}.visualstudio.com/${projectName}/_build/results?buildId=${buildId}&view=results`; -} diff --git a/src/configure/helper/devOps/serviceConnectionHelper.ts b/src/configure/helper/devOps/serviceConnectionHelper.ts deleted file mode 100644 index 244076b0..00000000 --- a/src/configure/helper/devOps/serviceConnectionHelper.ts +++ /dev/null @@ -1,58 +0,0 @@ -import * as azdev from 'azure-devops-node-api'; -import * as util from 'util'; - -import { sleepForMilliSeconds } from '../commonHelper'; -import { ServiceConnectionClient } from '../../clients/devOps/serviceConnectionClient'; -import { AadApplication } from '../../model/models'; -import * as Messages from '../../../messages'; - -export class ServiceConnectionHelper { - private serviceConnectionClient: ServiceConnectionClient; - - public constructor(connection: azdev.WebApi, project: string) { - this.serviceConnectionClient = new ServiceConnectionClient(connection, project); - } - - public async createGitHubServiceConnection(name: string, gitHubPat: string): Promise { - const connection = await this.serviceConnectionClient.createGitHubServiceConnection(name, gitHubPat); - const endpointId = connection.id; - await this.waitForEndpointToBeReady(endpointId); - const authorizationResponse = await this.serviceConnectionClient.authorizeEndpointForAllPipelines(endpointId); - if (!authorizationResponse.allPipelines.authorized) { - throw new Error(Messages.couldNotAuthorizeEndpoint); - } - - return endpointId; - } - - public async createAzureServiceConnection(name: string, tenantId: string, subscriptionId: string, scope: string, aadApp: AadApplication): Promise { - const connection = await this.serviceConnectionClient.createAzureServiceConnection(name, tenantId, subscriptionId, scope, aadApp); - const endpointId: string = connection.id; - await this.waitForEndpointToBeReady(endpointId); - const authorizationResponse = await this.serviceConnectionClient.authorizeEndpointForAllPipelines(endpointId); - if (!authorizationResponse.allPipelines.authorized) { - throw new Error(Messages.couldNotAuthorizeEndpoint); - } - - return endpointId; - } - - private async waitForEndpointToBeReady(endpointId: string): Promise { - for (let attempt = 0; attempt < 30; attempt++) { - const connection = await this.serviceConnectionClient.getEndpointStatus(endpointId); - - if (connection.isReady) { - return; - } - - const { operationStatus } = connection; - if (operationStatus.state.toLowerCase() === "failed") { - throw Error(util.format(Messages.unableToCreateServiceConnection, connection.type, operationStatus.state, operationStatus.statusMessage)); - } - - await sleepForMilliSeconds(2000); - } - - throw Error(util.format(Messages.timedOutCreatingServiceConnection)); - } -} diff --git a/src/configure/helper/gitHubHelper.ts b/src/configure/helper/gitHubHelper.ts deleted file mode 100644 index 9e99e0f5..00000000 --- a/src/configure/helper/gitHubHelper.ts +++ /dev/null @@ -1,33 +0,0 @@ -// Note that this is not intended to be be completely accurate. -// This is the canonical URL that GitHub provides when cloning, -// and the only one that we'll support to keep the code simple. -const GitHubUrl = 'https://github.com/'; -const SSHGitHubUrl = 'git@github.com:'; - -export function isGitHubUrl(remoteUrl: string): boolean { - return remoteUrl.startsWith(GitHubUrl) || remoteUrl.startsWith(SSHGitHubUrl); -} - -export function getRepositoryDetailsFromRemoteUrl(remoteUrl: string): { ownerName: string, repositoryName: string } { - // https://github.com/microsoft/azure-pipelines-vscode.git - // => ['https:', '', 'github.com', 'microsoft', 'azure-pipelines-vscode.git'] - // => { ownerName: 'microsoft', repositoryName: 'azure-pipelines-vscode'} - // =============================================== - // git@github.com:microsoft/azure-pipelines-vscode - // => microsoft/zure-pipelines-vscode - // => ['microsoft', 'azure-pipelines-vscode'] - // => { ownerName: 'microsoft', repositoryName: 'azure-pipelines-vscode'} - const parts = remoteUrl.replace(SSHGitHubUrl, '').split('/'); - return { - ownerName: parts[parts.length - 2], - repositoryName: parts[parts.length - 1].replace(/\.git$/, '') - }; -} - -export function getFormattedRemoteUrl(remoteUrl: string): string { - if (remoteUrl.startsWith(SSHGitHubUrl)) { - return `https://github.com/${remoteUrl.substring(SSHGitHubUrl.length)}`; - } - - return remoteUrl; -} diff --git a/src/configure/helper/graphHelper.ts b/src/configure/helper/graphHelper.ts deleted file mode 100644 index 79bb07d8..00000000 --- a/src/configure/helper/graphHelper.ts +++ /dev/null @@ -1,182 +0,0 @@ -import { v4 as uuid } from 'uuid'; -import { AadApplication } from '../model/models'; -import { generateRandomPassword, executeFunctionWithRetry } from './commonHelper'; -import * as Messages from '../../messages'; -import { RestClient } from '../clients/restClient'; -import { TokenCredentials } from '@azure/ms-rest-js'; -import { TokenCredentialsBase } from '@azure/ms-rest-nodeauth'; -import * as util from 'util'; -import { AzureSession } from '../../typings/azure-account.api'; - -// TODO: Replace this class with @microsoft/microsoft-graph-client and @azure/arm-authorization -// client.api("/applications").post() -// client.api("/servicePrincipals").post() -// new AuthorizationManagementClient().roleAssignments.create() -// Disable ESLint rules because there won't be any investment into this file; see above. -/* eslint-disable */ -export class GraphHelper { - - private static contributorRoleId = "b24988ac-6180-42a0-ab88-20f7382dd24c"; - private static retryTimeIntervalInSec = 2; - private static retryCount = 20; - - public static async createSpnAndAssignRole(session: AzureSession, aadAppName: string, scope: string): Promise { - const accessToken = await this.getGraphToken(session); - const tokenCredentials = new TokenCredentials(accessToken); - const graphClient = new RestClient(tokenCredentials); - const tenantId = session.tenantId; - let aadApp: AadApplication; - - return this.createAadApp(graphClient, aadAppName, tenantId) - .then((aadApplication) => { - aadApp = aadApplication; - return this.createSpn(graphClient, aadApp.appId, tenantId); - }) - .then((spn) => { - aadApp.objectId = spn.objectId; - return this.createRoleAssignment(session.credentials2, scope, aadApp.objectId); - }) - .then(() => { - return aadApp; - }) - .catch((error) => { - let errorMessage = error && error.message; - if (!errorMessage && error["odata.error"]) { - errorMessage = error["odata.error"]["message"]; - if (typeof errorMessage === "object") { - errorMessage = errorMessage.value; - } - } - throw new Error(errorMessage); - }); - } - - public static generateAadApplicationName(accountName: string, projectName: string): string { - let spnLengthAllowed = 92; - const guid = uuid(); - projectName = projectName.replace(/[^a-zA-Z0-9_-]/g, ""); - accountName = accountName.replace(/[^a-zA-Z0-9_-]/g, ""); - const spnName = accountName + "-" + projectName + "-" + guid; - if (spnName.length <= spnLengthAllowed) { - return spnName; - } - - // 2 is subtracted for delimiter '-' - spnLengthAllowed = spnLengthAllowed - guid.length - 2; - if (accountName.length > spnLengthAllowed / 2 && projectName.length > spnLengthAllowed / 2) { - accountName = accountName.substr(0, spnLengthAllowed / 2); - projectName = projectName.substr(0, spnLengthAllowed - accountName.length); - } - else if (accountName.length > spnLengthAllowed / 2 && accountName.length + projectName.length > spnLengthAllowed) { - accountName = accountName.substr(0, spnLengthAllowed - projectName.length); - } - else if (projectName.length > spnLengthAllowed / 2 && accountName.length + projectName.length > spnLengthAllowed) { - projectName = projectName.substr(0, spnLengthAllowed - accountName.length); - } - - return accountName + "-" + projectName + "-" + guid; - } - - private static async getGraphToken(session: AzureSession): Promise { - const { activeDirectoryGraphResourceId } = session.environment; - if (activeDirectoryGraphResourceId === undefined) { - throw new Error(util.format(Messages.acquireAccessTokenFailed, "Active Directory Graph resource ID is undefined.")); - } - - return new Promise((resolve, reject) => { - const credentials = session.credentials2; - credentials.authContext.acquireToken(activeDirectoryGraphResourceId, session.userId, credentials.clientId, function (err, tokenResponse) { - if (err) { - reject(new Error(util.format(Messages.acquireAccessTokenFailed, err.message))); - } else if (tokenResponse.error) { - reject(new Error(util.format(Messages.acquireAccessTokenFailed, tokenResponse.error))); - } else { - // This little casting workaround here allows us to not have to import adal-node - // just for the typings. Really it's on adal-node for making the type - // TokenResponse | ErrorResponse, even though TokenResponse has the same - // error properties as ErrorResponse. - resolve((tokenResponse as any).accessToken); - } - }); - }); - } - - private static async createAadApp(graphClient: RestClient, name: string, tenantId: string): Promise { - const secret = generateRandomPassword(20); - const startDate = new Date(Date.now()); - - return graphClient.sendRequest({ - url: `https://graph.windows.net/${tenantId}/applications`, - queryParameters: { - "api-version": "1.6" - }, - method: "POST", - body: { - "availableToOtherTenants": false, - "displayName": name, - "homepage": "https://" + name, - "passwordCredentials": [ - { - "startDate": startDate, - "endDate": new Date(startDate.getFullYear() + 1, startDate.getMonth()), - "value": secret - } - ] - } - }) - .then((data) => { - return { - appId: data.appId, - secret: secret - }; - }); - } - - private static async createSpn(graphClient: RestClient, appId: string, tenantId: string): Promise { - const createSpnPromise = () => { - return graphClient.sendRequest({ - url: `https://graph.windows.net/${tenantId}/servicePrincipals`, - queryParameters: { - "api-version": "1.6" - }, - method: "POST", - body: { - "appId": appId, - "accountEnabled": "true" - } - }); - }; - - return executeFunctionWithRetry( - createSpnPromise, - GraphHelper.retryCount, - GraphHelper.retryTimeIntervalInSec, - Messages.azureServicePrincipalFailedMessage); - } - - private static async createRoleAssignment(credentials: TokenCredentialsBase, scope: string, objectId: string): Promise { - const restClient = new RestClient(credentials); - const createRoleAssignmentPromise = () => { - return restClient.sendRequest({ - url: `https://management.azure.com/${scope}/providers/Microsoft.Authorization/roleAssignments/${uuid()}`, - queryParameters: { - "api-version": "2021-04-01-preview" // So we have access to the "principalType" property - }, - method: "PUT", - body: { - "properties": { - "roleDefinitionId": `${scope}/providers/Microsoft.Authorization/roleDefinitions/${this.contributorRoleId}`, - "principalId": objectId, - "principalType": "ServicePrincipal", // Makes the assignment work for newly-created service principals - } - } - }); - }; - - return executeFunctionWithRetry( - createRoleAssignmentPromise, - GraphHelper.retryCount, - GraphHelper.retryTimeIntervalInSec, - Messages.roleAssignmentFailedMessage); - } -} diff --git a/src/configure/helper/templateHelper.ts b/src/configure/helper/templateHelper.ts deleted file mode 100644 index 0eb39011..00000000 --- a/src/configure/helper/templateHelper.ts +++ /dev/null @@ -1,214 +0,0 @@ -import { PipelineTemplate, TargetResourceType, WebAppKind } from '../model/models'; -import * as fs from 'fs/promises'; -import Mustache from 'mustache'; -import * as path from 'path'; -import * as vscode from 'vscode'; -import { URI } from 'vscode-uri'; - -export async function analyzeRepoAndListAppropriatePipeline(repoUri: URI): Promise { - // TO-DO: To populate the possible templates on the basis of azure target resource. - let templateList = simpleWebAppTemplates; - const analysisResult = await analyzeRepo(repoUri); - - if (analysisResult.isNodeApplication) { - // add all node application templates - templateList = nodeTemplates.concat(templateList); - } - - if (analysisResult.isPythonApplication) { - templateList = pythonTemplates.concat(templateList); - } - - if (analysisResult.isFunctionApplication) { - templateList = functionTemplates.concat(templateList); - } - - if (analysisResult.isDotnetApplication) { - templateList = dotnetTemplates.concat(templateList); - } - - // add all possible templates as we could not detect the appropriate onesı - return templateList; -} - -export async function renderContent(templateFilePath: string, branch: string, resource: string | undefined, azureServiceConnection: string | undefined): Promise { - const data = await fs.readFile(templateFilePath, { encoding: "utf8" }); - return Mustache.render(data, { - branch, - resource, - azureServiceConnection, - }); -} - -async function analyzeRepo(repoUri: URI): Promise<{ isNodeApplication: boolean, isFunctionApplication: boolean, isPythonApplication: boolean, isDotnetApplication: boolean }> { - let contents: [string, vscode.FileType][]; - try { - contents = await vscode.workspace.fs.readDirectory(repoUri); - } catch { - return { - isNodeApplication: true, - isFunctionApplication: true, - isPythonApplication: true, - isDotnetApplication: true, - }; - } - - const files = contents.filter(file => file[1] !== vscode.FileType.Directory).map(file => file[0]); - - return { - isNodeApplication: isNodeRepo(files), - isFunctionApplication: isFunctionApp(files), - isPythonApplication: isPythonRepo(files), - isDotnetApplication: isDotnetApplication(files), - // isContainerApplication: isDockerRepo(files) - }; - -} - -function isNodeRepo(files: string[]): boolean { - const nodeFilesRegex = /\.ts$|\.js$|package\.json$|node_modules/; - return files.some((file) => nodeFilesRegex.test(file.toLowerCase())); -} - -function isFunctionApp(files: string[]): boolean { - return files.some((file) => file.toLowerCase().endsWith("host.json")); -} - -function isPythonRepo(files: string[]): boolean { - return files.some((file) => path.extname(file).toLowerCase() === '.py'); -} - -function isDotnetApplication(files: string[]): boolean { - return files.some((file) => ['.sln', '.csproj', '.fsproj'].includes(path.extname(file).toLowerCase())); -} - -const nodeTemplates: Array = [ - { - label: 'Node.js with npm to Windows Web App', - path: path.join(__dirname, 'configure/templates/nodejsWindowsWebApp.yml'), - language: 'node', - target: { - type: TargetResourceType.WebApp, - kind: WebAppKind.WindowsApp, - }, - }, - { - label: 'Node.js with Angular to Windows Web App', - path: path.join(__dirname, 'configure/templates/nodejsWindowsWebAppAngular.yml'), - language: 'node', - target: { - type: TargetResourceType.WebApp, - kind: WebAppKind.WindowsApp, - }, - }, - { - label: 'Node.js with Gulp to Windows Web App', - path: path.join(__dirname, 'configure/templates/nodejsWindowsWebAppGulp.yml'), - language: 'node', - target: { - type: TargetResourceType.WebApp, - kind: WebAppKind.WindowsApp, - }, - }, - { - label: 'Node.js with Grunt to Windows Web App', - path: path.join(__dirname, 'configure/templates/nodejsWindowsWebAppGrunt.yml'), - language: 'node', - target: { - type: TargetResourceType.WebApp, - kind: WebAppKind.WindowsApp, - }, - }, - { - label: 'Node.js with Webpack to Windows Web App', - path: path.join(__dirname, 'configure/templates/nodejsWindowsWebAppWebpack.yml'), - language: 'node', - target: { - type: TargetResourceType.WebApp, - kind: WebAppKind.WindowsApp, - }, - } -]; - -const pythonTemplates: Array = [ - { - label: 'Python to Linux Web App on Azure', - path: path.join(__dirname, 'configure/templates/pythonLinuxWebApp.yml'), - language: 'python', - target: { - type: TargetResourceType.WebApp, - kind: WebAppKind.LinuxApp, - }, - }, - { - label: 'Build and Test Python Django App', - path: path.join(__dirname, 'configure/templates/pythonDjango.yml'), - language: 'python', - target: { - type: TargetResourceType.None, - }, - } -]; - -const dotnetTemplates: Array = [ - { - label: '.NET Web App to Windows on Azure', - path: path.join(__dirname, 'configure/templates/dotnetWindowsWebApp.yml'), - language: 'dotnet', - target: { - type: TargetResourceType.WebApp, - kind: WebAppKind.WindowsApp, - }, - }, - { - label: '.NET Web App to Linux on Azure', - path: path.join(__dirname, 'configure/templates/dotnetLinuxWebApp.yml'), - language: 'dotnet', - target: { - type: TargetResourceType.WebApp, - kind: WebAppKind.LinuxApp, - }, - } -] - -const simpleWebAppTemplates: Array = [ - { - label: 'Simple application to Windows Web App', - path: path.join(__dirname, 'configure/templates/simpleWebApp.yml'), - language: 'none', - target: { - type: TargetResourceType.WebApp, - kind: WebAppKind.WindowsApp, - }, - } -]; - -const functionTemplates: Array = [ - { - label: 'Python Function App to Linux Azure Function', - path: path.join(__dirname, 'configure/templates/pythonLinuxFunctionApp.yml'), - language: 'python', - target: { - type: TargetResourceType.WebApp, - kind: WebAppKind.FunctionAppLinux, - }, - }, - { - label: 'Node.js Function App to Linux Azure Function', - path: path.join(__dirname, 'configure/templates/nodejsLinuxFunctionApp.yml'), - language: 'node', - target: { - type: TargetResourceType.WebApp, - kind: WebAppKind.FunctionAppLinux, - }, - }, - { - label: '.NET Function App to Windows Azure Function', - path: path.join(__dirname, 'configure/templates/dotnetWindowsFunctionApp.yml'), - language: 'dotnet', - target: { - type: TargetResourceType.WebApp, - kind: WebAppKind.FunctionApp, - }, - }, -] diff --git a/src/configure/helper/userCancelledError.ts b/src/configure/helper/userCancelledError.ts deleted file mode 100644 index f1c69715..00000000 --- a/src/configure/helper/userCancelledError.ts +++ /dev/null @@ -1,8 +0,0 @@ -// https://github.com/microsoft/vscode-azuretools/blob/5999c2ad4423e86f22d2c648027242d8816a50e4/ui/src/errors.ts -// minus localization - -export class UserCancelledError extends Error { - constructor() { - super('Operation cancelled.'); - } -} diff --git a/src/configure/model/models.ts b/src/configure/model/models.ts deleted file mode 100644 index 7e92a816..00000000 --- a/src/configure/model/models.ts +++ /dev/null @@ -1,124 +0,0 @@ -import { QuickPickItem } from 'vscode'; -import { TeamProject } from 'azure-devops-node-api/interfaces/CoreInterfaces'; -import { WebApi } from 'azure-devops-node-api'; -import { AppServiceClient } from '../clients/azure/appServiceClient'; -import { Build, BuildDefinition } from 'azure-devops-node-api/interfaces/BuildInterfaces'; -import { WebSiteManagementModels } from '@azure/arm-appservice'; -import { AzureSession } from '../../typings/azure-account.api'; - -export interface Organization { - accountId: string; - accountName: string; - accountUri: string; - properties: Record; -} - -/** - * Identical to @see {TeamProject} except with name & id verified. - */ -export interface ValidatedProject extends TeamProject { - name: string; - id: string; -} - -/** - * Identical to @see {WebSiteManagementModels.Site} except with name, id, & resourceGroup verified. - */ -export interface ValidatedSite extends WebSiteManagementModels.Site { - name: string; - id: string; - resourceGroup: string; -} - -/** - * Identical to @see {Build} except with definition & id verified. - */ -export interface ValidatedBuild extends Build { - definition: Required; - id: number; -} - -export type OrganizationAvailability = { - isAvailable: true; - name: string; - unavailabilityReason: null; -} | { - isAvailable: false; - name: string; - unavailabilityReason: string; -}; - -export interface AzureSiteDetails { - appServiceClient: AppServiceClient; - subscriptionId: string; - site: ValidatedSite; -} - -export type GitRepositoryDetails = { - repositoryName: string; - remoteName: string; - remoteUrl: string; - branch: string; -} & ({ - repositoryProvider: RepositoryProvider.AzureRepos; - organizationName: string; - projectName: string; -} | { - repositoryProvider: RepositoryProvider.Github; - ownerName: string; -}); - -export interface AzureDevOpsDetails { - session: AzureSession; - adoClient: WebApi; - organizationName: string; - project: ValidatedProject; -} - -export interface PipelineTemplate { - path: string; - label: string; - language: string; - target: TargetResource; -} - -export enum SourceOptions { - CurrentWorkspace = 'Current workspace', - BrowseLocalMachine = 'Browse local machine', - GithubRepository = 'Github repository' -} - -export enum RepositoryProvider { - Github = 'github', - AzureRepos = 'tfsgit' -} - -export type TargetResource = { - type: TargetResourceType.None; -} | { - type: TargetResourceType.WebApp; - kind: WebAppKind; -}; - -export enum TargetResourceType { - None = 'none', - WebApp = 'Microsoft.Web/sites' -} - -export enum WebAppKind { - WindowsApp = 'app', - FunctionApp = 'functionapp', - FunctionAppLinux = 'functionapp,linux', - LinuxApp = 'app,linux', - LinuxContainerApp = 'app,linux,container' -} - -export interface QuickPickItemWithData extends QuickPickItem { - data: T; -} - -export interface AadApplication { - appId: string; - secret: string; - objectId: string; -} diff --git a/src/configure/resources/constants.ts b/src/configure/resources/constants.ts deleted file mode 100644 index 4856cb65..00000000 --- a/src/configure/resources/constants.ts +++ /dev/null @@ -1,7 +0,0 @@ -export const HostedVS2017QueueName: string = "Hosted VS2017"; -export const SelectProject = 'selectProject'; -export const SelectPipelineTemplate = 'selectPipelineTemplate'; -export const SelectSubscription = 'selectSubscription'; -export const GitHubPat = 'gitHubPat'; -export const SelectFromMultipleWorkSpace = 'selectFromMultipleWorkSpace'; -export const SelectRemoteForRepo = 'selectRemoteForRepo'; diff --git a/src/configure/resources/tracePoints.ts b/src/configure/resources/tracePoints.ts deleted file mode 100644 index 177e7d1b..00000000 --- a/src/configure/resources/tracePoints.ts +++ /dev/null @@ -1,8 +0,0 @@ -// Failure trace points -export const AddingContentToPipelineFileFailed = 'AddingContentToPipelineFileFailed'; -export const AzureServiceConnectionCreateFailure = 'AzureServiceConnectionCreateFailure'; -export const CheckInPipelineFailure = 'checkInPipelineFailure'; -export const CreateAndQueuePipelineFailed = 'createAndBuildPipelineFailed'; -export const GitHubServiceConnectionError = 'gitHubServiceConnectionError'; -export const PipelineFileCheckInFailed = 'PipelineFileCheckInFailed'; -export const PostDeploymentActionFailed = 'PostDeploymentActionFailed'; diff --git a/src/configure/templates/dotnetLinuxWebApp.yml b/src/configure/templates/dotnetLinuxWebApp.yml deleted file mode 100644 index 6bb64f9b..00000000 --- a/src/configure/templates/dotnetLinuxWebApp.yml +++ /dev/null @@ -1,95 +0,0 @@ -# .NET Web App to Linux on Azure -# Build a .NET Web App and deploy it to Azure as a Linux Web App. -# Add steps that analyze code, save build artifacts, deploy, and more: -# https://docs.microsoft.com/en-us/azure/devops/pipelines/languages/dotnet-core - -trigger: -- {{{ branch }}} - -variables: - # Azure Resource Manager connection created during pipeline creation - azureSubscription: '{{{ azureServiceConnection }}}' - - # Web App name - webAppName: '{{{ resource }}}' - - # Agent VM image name - vmImageName: 'ubuntu-latest' - - # Build Configuration - buildConfiguration: 'Release' - - # Build Projects - buildProjects: "**/*.csproj" - - # Test Projects - testProjects: "**/*[Tt]est*/*.csproj" - -stages: -- stage: Build - displayName: Build stage - - jobs: - - job: Build - displayName: Build - pool: - vmImage: $(vmImageName) - - steps: - - task: DotNetCoreCLI@2 - displayName: Restore - inputs: - command: 'restore' - publishWebProjects: true - projects: $(buildProjects) - - - task: DotNetCoreCLI@2 - displayName: Build - inputs: - command: 'build' - projects: $(buildProjects) - arguments: --configuration $(buildConfiguration) - - - task: DotNetCoreCLI@2 - displayName: Test - inputs: - command: 'test' - projects: $(testProjects) - publishWebProjects: true - arguments: --configuration $(buildConfiguration) - - - task: DotNetCoreCLI@2 - displayName: Publish - inputs: - command: 'publish' - publishWebProjects: true - arguments: --configuration $(buildConfiguration) --output $(Build.ArtifactStagingDirectory) - zipAfterPublish: true - - - publish: $(Build.ArtifactStagingDirectory) - artifact: drop - -- stage: Deploy - displayName: Deploy stage - dependsOn: Build - condition: succeeded() - - jobs: - - deployment: Deploy - displayName: Deploy - environment: $(webAppName) - pool: - vmImage: $(vmImageName) - strategy: - runOnce: - deploy: - steps: - - task: AzureRMWebAppDeployment@4 - displayName: "Deploy Azure Web App" - inputs: - ConnectionType: "AzureRM" - ConnectedServiceName: $(azureSubscription) - WebAppName: $(webAppName) - WebAppKind: webAppLinux - Package: $(Pipeline.Workspace)/**/*.zip - DeploymentType: "webDeploy" diff --git a/src/configure/templates/dotnetWindowsFunctionApp.yml b/src/configure/templates/dotnetWindowsFunctionApp.yml deleted file mode 100644 index 03ae9dd0..00000000 --- a/src/configure/templates/dotnetWindowsFunctionApp.yml +++ /dev/null @@ -1,95 +0,0 @@ -# .NET Function App to Windows on Azure -# Build a .NET function app and deploy it to Azure as a Windows function App. -# Add steps that analyze code, save build artifacts, deploy, and more: -# https://docs.microsoft.com/en-us/azure/devops/pipelines/languages/dotnet-core - -trigger: -- {{{ branch }}} - -variables: - # Azure Resource Manager connection created during pipeline creation - azureSubscription: '{{{ azureServiceConnection }}}' - - # Function app name - functionAppName: '{{{ resource }}}' - - # Agent VM image name - vmImageName: 'windows-latest' - - # Build Configuration - buildConfiguration: 'Release' - - # Build Projects - buildProjects: "**/*.csproj" - - # Test Projects - testProjects: "**/*[Tt]est*/*.csproj" - -stages: -- stage: Build - displayName: Build stage - - jobs: - - job: Build - displayName: Build - pool: - vmImage: $(vmImageName) - - steps: - - task: DotNetCoreCLI@2 - displayName: Restore - inputs: - command: 'restore' - publishWebProjects: true - projects: $(buildProjects) - - - task: DotNetCoreCLI@2 - displayName: Build - inputs: - command: 'build' - projects: $(buildProjects) - arguments: --configuration $(buildConfiguration) - - - task: DotNetCoreCLI@2 - displayName: Test - inputs: - command: 'test' - projects: $(testProjects) - publishWebProjects: true - arguments: --configuration $(buildConfiguration) - - - task: DotNetCoreCLI@2 - displayName: Publish - inputs: - command: 'publish' - publishWebProjects: true - arguments: --configuration $(buildConfiguration) --output $(Build.ArtifactStagingDirectory) - zipAfterPublish: true - - - publish: $(Build.ArtifactStagingDirectory) - artifact: drop - -- stage: Deploy - displayName: Deploy stage - dependsOn: Build - condition: succeeded() - - jobs: - - deployment: Deploy - displayName: Deploy - environment: $(functionAppName) - pool: - vmImage: $(vmImageName) - - strategy: - runOnce: - deploy: - - steps: - - task: AzureFunctionApp@1 - displayName: 'Azure functions app deploy' - inputs: - azureSubscription: '$(azureSubscription)' - appType: functionApp - appName: $(functionAppName) - package: '$(Pipeline.Workspace)/**/*.zip' diff --git a/src/configure/templates/dotnetWindowsWebApp.yml b/src/configure/templates/dotnetWindowsWebApp.yml deleted file mode 100644 index ae237f96..00000000 --- a/src/configure/templates/dotnetWindowsWebApp.yml +++ /dev/null @@ -1,95 +0,0 @@ -# .NET Web App to Windows on Azure -# Build a .NET Web App and deploy it to Azure as a Windows Web App. -# Add steps that analyze code, save build artifacts, deploy, and more: -# https://docs.microsoft.com/en-us/azure/devops/pipelines/languages/dotnet-core - -trigger: -- {{{ branch }}} - -variables: - # Azure Resource Manager connection created during pipeline creation - azureSubscription: '{{{ azureServiceConnection }}}' - - # Web App name - webAppName: '{{{ resource }}}' - - # Agent VM image name - vmImageName: 'windows-latest' - - # Build Configuration - buildConfiguration: 'Release' - - # Build Projects - buildProjects: "**/*.csproj" - - # Test Projects - testProjects: "**/*[Tt]est*/*.csproj" - -stages: -- stage: Build - displayName: Build stage - - jobs: - - job: Build - displayName: Build - pool: - vmImage: $(vmImageName) - - steps: - - task: DotNetCoreCLI@2 - displayName: Restore - inputs: - command: 'restore' - publishWebProjects: true - projects: $(buildProjects) - - - task: DotNetCoreCLI@2 - displayName: Build - inputs: - command: 'build' - projects: $(buildProjects) - arguments: --configuration $(buildConfiguration) - - - task: DotNetCoreCLI@2 - displayName: Test - inputs: - command: 'test' - projects: $(testProjects) - publishWebProjects: true - arguments: --configuration $(buildConfiguration) - - - task: DotNetCoreCLI@2 - displayName: Publish - inputs: - command: 'publish' - publishWebProjects: true - arguments: --configuration $(buildConfiguration) --output $(Build.ArtifactStagingDirectory) - zipAfterPublish: true - - - publish: $(Build.ArtifactStagingDirectory) - artifact: drop - -- stage: Deploy - displayName: Deploy stage - dependsOn: Build - condition: succeeded() - - jobs: - - deployment: Deploy - displayName: Deploy - environment: $(webAppName) - pool: - vmImage: $(vmImageName) - strategy: - runOnce: - deploy: - steps: - - task: AzureRMWebAppDeployment@4 - displayName: "Deploy Azure Web App" - inputs: - ConnectionType: "AzureRM" - ConnectedServiceName: $(azureSubscription) - WebAppName: $(webAppName) - WebAppKind: webApp - Package: $(Pipeline.Workspace)/**/*.zip - DeploymentType: "webDeploy" diff --git a/src/configure/templates/nodejsLinuxFunctionApp.yml b/src/configure/templates/nodejsLinuxFunctionApp.yml deleted file mode 100644 index c6e09f80..00000000 --- a/src/configure/templates/nodejsLinuxFunctionApp.yml +++ /dev/null @@ -1,78 +0,0 @@ -# Node.js Function App to Linux on Azure -# Build a Node.js function app and deploy it to Azure as a Windows function app. -# Add steps that analyze code, save build artifacts, deploy, and more: -# https://docs.microsoft.com/azure/devops/pipelines/languages/javascript - -trigger: -- {{{ branch }}} - -variables: - # Azure Resource Manager connection - azureSubscription: '{{{ azureServiceConnection }}}' - - # Web app name - functionAppName: '{{{ resource }}}' - - # Agent VM image name - vmImageName: 'ubuntu-latest' - -stages: -- stage: Build - displayName: Build stage - jobs: - - job: Build - displayName: Build - pool: - vmImage: $(vmImageName) - - steps: - - task: NodeTool@0 - inputs: - versionSpec: '10.x' - displayName: 'Install Node.js' - - - script: | - if [ -f extensions.csproj ] - then - dotnet build extensions.csproj --runtime ubuntu.16.04-x64 --output ./bin - fi - displayName: 'Build extensions' - - script: | - npm install - npm run build --if-present - npm run test --if-present - displayName: 'Prepare binaries' - - - task: ArchiveFiles@2 - displayName: 'Archive files' - inputs: - rootFolderOrFile: '.' - includeRootFolder: false - archiveType: zip - archiveFile: $(Build.ArtifactStagingDirectory)/$(Build.BuildId).zip - replaceExistingArchive: true - - - upload: $(Build.ArtifactStagingDirectory)/$(Build.BuildId).zip - artifact: drop - -- stage: Deploy - displayName: Deploy stage - dependsOn: Build - condition: succeeded() - jobs: - - deployment: Deploy - displayName: Deploy - environment: $(functionAppName) - pool: - vmImage: $(vmImageName) - strategy: - runOnce: - deploy: - steps: - - task: AzureFunctionApp@1 - displayName: 'Azure Functions App Deploy: {{ functionAppName }}' - inputs: - azureSubscription: '$(azureSubscription)' - appType: functionAppLinux - appName: $(functionAppName) - package: '$(Pipeline.Workspace)/drop/$(Build.BuildId).zip' diff --git a/src/configure/templates/nodejsWindowsWebApp.yml b/src/configure/templates/nodejsWindowsWebApp.yml deleted file mode 100644 index b85247b7..00000000 --- a/src/configure/templates/nodejsWindowsWebApp.yml +++ /dev/null @@ -1,66 +0,0 @@ -# Node.js App on Windows Web App -# Build a Node.js app and deploy it to Azure as a Windows web app. -# Add steps that analyze code, save build artifacts, deploy, and more: -# https://docs.microsoft.com/azure/devops/pipelines/languages/javascript - -trigger: -- {{{ branch }}} - -variables: - # Azure Resource Manager connection - azureSubscription: '{{{ azureServiceConnection }}}' - - # Web app name - webAppName: '{{{ resource }}}' - - # Agent VM image name - vmImageName: 'windows-latest' - -stages: -- stage: Build - displayName: Build stage - jobs: - - job: Build - displayName: Build - pool: - vmImage: $(vmImageName) - - steps: - - script: | - npm install - npm build - displayName: 'npm install and build' - - - task: ArchiveFiles@2 - displayName: 'Archive files' - inputs: - rootFolderOrFile: '.' - includeRootFolder: false - archiveType: zip - archiveFile: $(Build.ArtifactStagingDirectory)/$(Build.BuildId).zip - replaceExistingArchive: true - - - upload: $(Build.ArtifactStagingDirectory)/$(Build.BuildId).zip - artifact: drop - -- stage: Deploy - displayName: Deploy stage - dependsOn: Build - condition: succeeded() - jobs: - - deployment: Deploy - environment: 'development' - pool: - vmImage: $(vmImageName) - - strategy: - runOnce: - deploy: - steps: - - task: AzureWebApp@1 - displayName: 'Azure Web App Deploy' - inputs: - azureSubscription: $(azureSubscription) - appType: webApp - appName: $(webAppName) - package: $(Pipeline.Workspace)/drop/$(Build.BuildId).zip diff --git a/src/configure/templates/nodejsWindowsWebAppAngular.yml b/src/configure/templates/nodejsWindowsWebAppAngular.yml deleted file mode 100644 index 4cabaec5..00000000 --- a/src/configure/templates/nodejsWindowsWebAppAngular.yml +++ /dev/null @@ -1,68 +0,0 @@ -# Node.js with Angular on Windows Web App -# Build a Node.js project that uses Angular and deploy it to Azure as a Windows web app. -# Add steps that analyze code, save build artifacts, deploy, and more: -# https://docs.microsoft.com/azure/devops/pipelines/languages/javascript - -trigger: -- {{{ branch }}} - -variables: - # Azure Resource Manager connection - azureSubscription: '{{{ azureServiceConnection }}}' - - # Web app name - webAppName: '{{{ resource }}}' - - # Agent VM image name - vmImageName: 'windows-latest' - -stages: -- stage: Build - displayName: Build stage - jobs: - - job: Build - displayName: Build - pool: - vmImage: $(vmImageName) - - steps: - - script: | - npm install -g @angular/cli - npm install - ng build --prod - displayName: 'npm install and build' - workingDirectory: $(workingDirectory) - - - task: ArchiveFiles@2 - displayName: 'Archive files' - inputs: - rootFolderOrFile: $(workingDirectory) - includeRootFolder: false - archiveType: zip - archiveFile: $(Build.ArtifactStagingDirectory)/$(Build.BuildId).zip - replaceExistingArchive: true - - - upload: $(Build.ArtifactStagingDirectory)/$(Build.BuildId).zip - artifact: drop - -- stage: Deploy - displayName: Deploy stage - dependsOn: Build - condition: succeeded() - jobs: - - deployment: Deploy - environment: 'development' - pool: - vmImage: $(vmImageName) - - strategy: - runOnce: - deploy: - steps: - - task: AzureWebApp@1 - displayName: 'Azure Web App Deploy' - inputs: - azureSubscription: $(azureSubscription) - appType: webApp - appName: $(webAppName) - package: $(Pipeline.Workspace)/drop/$(Build.BuildId).zip diff --git a/src/configure/templates/nodejsWindowsWebAppGrunt.yml b/src/configure/templates/nodejsWindowsWebAppGrunt.yml deleted file mode 100644 index 171e5fd1..00000000 --- a/src/configure/templates/nodejsWindowsWebAppGrunt.yml +++ /dev/null @@ -1,66 +0,0 @@ -# Node.js with Grunt on Windows Web App -# Build a Node.js project using the Grunt task runner and deploy it to Azure as a Windows web app. -# Add steps that analyze code, save build artifacts, deploy, and more: -# https://docs.microsoft.com/azure/devops/pipelines/languages/javascript - -trigger: -- {{{ branch }}} - -variables: - # Azure Resource Manager connection - azureSubscription: '{{{ azureServiceConnection }}}' - - # Web app name - webAppName: '{{{ resource }}}' - - # Agent VM image name - vmImageName: 'windows-latest' - -stages: -- stage: Build - displayName: Build stage - jobs: - - job: Build - displayName: Build - pool: - vmImage: $(vmImageName) - - steps: - - script: | - npm install - grunt --gruntfile Gruntfile.js - displayName: 'npm install and run grunt' - - - task: ArchiveFiles@2 - displayName: 'Archive files' - inputs: - rootFolderOrFile: '.' - includeRootFolder: false - archiveType: zip - archiveFile: $(Build.ArtifactStagingDirectory)/$(Build.BuildId).zip - replaceExistingArchive: true - - - upload: $(Build.ArtifactStagingDirectory)/$(Build.BuildId).zip - artifact: drop - -- stage: Deploy - displayName: Deploy stage - dependsOn: Build - condition: succeeded() - jobs: - - deployment: Deploy - environment: 'development' - pool: - vmImage: $(vmImageName) - - strategy: - runOnce: - deploy: - steps: - - task: AzureWebApp@1 - displayName: 'Azure Web App Deploy' - inputs: - azureSubscription: $(azureSubscription) - appType: webApp - appName: $(webAppName) - package: $(Pipeline.Workspace)/drop/$(Build.BuildId).zip diff --git a/src/configure/templates/nodejsWindowsWebAppGulp.yml b/src/configure/templates/nodejsWindowsWebAppGulp.yml deleted file mode 100644 index 43d21ab9..00000000 --- a/src/configure/templates/nodejsWindowsWebAppGulp.yml +++ /dev/null @@ -1,66 +0,0 @@ -# Node.js with gulp on Windows Web App -# Build a Node.js project using the gulp task runner and deploy it to Azure as a Windows web app. -# Add steps that analyze code, save build artifacts, deploy, and more: -# https://docs.microsoft.com/azure/devops/pipelines/languages/javascript - -trigger: -- {{{ branch }}} - -variables: - # Azure Resource Manager connection - azureSubscription: '{{{ azureServiceConnection }}}' - - # Web app name - webAppName: '{{{ resource }}}' - - # Agent VM image name - vmImageName: 'windows-latest' - -stages: -- stage: Build - displayName: Build stage - jobs: - - job: Build - displayName: Build - pool: - vmImage: $(vmImageName) - - steps: - - script: | - npm install - gulp default --gulpfile gulpfile.js - displayName: 'npm install and run gulp' - - - task: ArchiveFiles@2 - displayName: 'Archive files' - inputs: - rootFolderOrFile: '.' - includeRootFolder: false - archiveType: zip - archiveFile: $(Build.ArtifactStagingDirectory)/$(Build.BuildId).zip - replaceExistingArchive: true - - - upload: $(Build.ArtifactStagingDirectory)/$(Build.BuildId).zip - artifact: drop - -- stage: Deploy - displayName: Deploy stage - dependsOn: Build - condition: succeeded() - jobs: - - deployment: Deploy - environment: 'development' - pool: - vmImage: $(vmImageName) - - strategy: - runOnce: - deploy: - steps: - - task: AzureWebApp@1 - displayName: 'Azure Web App Deploy' - inputs: - azureSubscription: $(azureSubscription) - appType: webApp - appName: $(webAppName) - package: $(Pipeline.Workspace)/drop/$(Build.BuildId).zip diff --git a/src/configure/templates/nodejsWindowsWebAppWebpack.yml b/src/configure/templates/nodejsWindowsWebAppWebpack.yml deleted file mode 100644 index 22c09148..00000000 --- a/src/configure/templates/nodejsWindowsWebAppWebpack.yml +++ /dev/null @@ -1,67 +0,0 @@ -# Node.js with webpack on Windows Web App -# Build a Node.js project using the webpack CLI and deploy it to Azure as a Windows web app. -# Add steps that analyze code, save build artifacts, deploy, and more: -# https://docs.microsoft.com/azure/devops/pipelines/languages/javascript - -trigger: -- {{{ branch }}} - -variables: - # Azure Resource Manager connection - azureSubscription: '{{{ azureServiceConnection }}}' - - # Web app name - webAppName: '{{{ resource }}}' - - # Agent VM image name - vmImageName: 'windows-latest' - -stages: -- stage: Build - displayName: Build stage - jobs: - - job: Build - displayName: Build - pool: - vmImage: $(vmImageName) - - steps: - - script: | - npm install -g webpack webpack-cli --save-dev - npm install - npx webpack --config webpack.config.js - displayName: 'npm install, run webpack' - - - task: ArchiveFiles@2 - displayName: 'Archive files' - inputs: - rootFolderOrFile: '.' - includeRootFolder: false - archiveType: zip - archiveFile: $(Build.ArtifactStagingDirectory)/$(Build.BuildId).zip - replaceExistingArchive: true - - - upload: $(Build.ArtifactStagingDirectory)/$(Build.BuildId).zip - artifact: drop - -- stage: Deploy - displayName: Deploy stage - dependsOn: Build - condition: succeeded() - jobs: - - deployment: Deploy - environment: 'development' - pool: - vmImage: $(vmImageName) - - strategy: - runOnce: - deploy: - steps: - - task: AzureWebApp@1 - displayName: 'Azure Web App Deploy' - inputs: - azureSubscription: $(azureSubscription) - appType: webApp - appName: $(webAppName) - package: $(Pipeline.Workspace)/drop/$(Build.BuildId).zip diff --git a/src/configure/templates/pythonDjango.yml b/src/configure/templates/pythonDjango.yml deleted file mode 100644 index 9a533ed9..00000000 --- a/src/configure/templates/pythonDjango.yml +++ /dev/null @@ -1,43 +0,0 @@ -# Python Django -# Test a Django project on multiple versions of Python. -# Add steps that analyze code, save build artifacts, deploy, and more: -# https://docs.microsoft.com/azure/devops/pipelines/languages/python - -trigger: -- {{{ branch }}} - -pool: - vmImage: 'ubuntu-latest' - -steps: -- task: PythonScript@0 - displayName: 'Export project path' - inputs: - scriptSource: 'inline' - script: | - """Search all subdirectories for `manage.py`.""" - from glob import iglob - from os import path - manage_py = next(iglob(path.join('**', 'manage.py'), recursive=True), None) - if not manage_py: - raise SystemExit('Could not find a Django project') - project_location = path.dirname(path.abspath(manage_py)) - print('Found Django project in', project_location) - print('##vso[task.setvariable variable=projectRoot]{}'.format(project_location)) - -- script: | - python -m pip install --upgrade pip setuptools wheel - pip install -r requirements.txt - pip install unittest-xml-reporting - displayName: 'Install prerequisites' - -- script: | - pushd '$(projectRoot)' - python manage.py test --testrunner xmlrunner.extra.djangotestrunner.XMLTestRunner --no-input - displayName: 'Run tests' - -- task: PublishTestResults@2 - inputs: - testResultsFiles: "**/TEST-*.xml" - testRunTitle: 'Python $(PYTHON_VERSION)' - condition: succeededOrFailed() diff --git a/src/configure/templates/pythonLinuxFunctionApp.yml b/src/configure/templates/pythonLinuxFunctionApp.yml deleted file mode 100644 index fc4b73e1..00000000 --- a/src/configure/templates/pythonLinuxFunctionApp.yml +++ /dev/null @@ -1,76 +0,0 @@ -# Python Function App to Linux on Azure -# Build a Python function app and deploy it to Azure as a Linux function app. -# Add steps that analyze code, save build artifacts, deploy, and more: -# https://docs.microsoft.com/azure/devops/pipelines/languages/python - -trigger: -- {{{ branch }}} - -variables: - # Azure Resource Manager connection - azureSubscription: '{{{ azureServiceConnection }}}' - - # Web app name - functionAppName: '{{{ resource }}}' - - # Agent VM image name - vmImageName: 'ubuntu-latest' - -stages: -- stage: Build - displayName: Build stage - jobs: - - job: Build - displayName: Build - pool: - vmImage: $(vmImageName) - - steps: - - bash: | - if [ -f extensions.csproj ] - then - dotnet build extensions.csproj --output ./bin - fi - displayName: 'Build extensions' - - - bash: | - python -m venv worker_venv - source worker_venv/bin/activate - pip install -r requirements.txt - displayName: 'Install application dependencies' - - - task: ArchiveFiles@2 - displayName: 'Archive files' - inputs: - rootFolderOrFile: '.' - includeRootFolder: false - archiveType: zip - archiveFile: $(Build.ArtifactStagingDirectory)/$(Build.BuildId).zip - replaceExistingArchive: true - - - publish: $(Build.ArtifactStagingDirectory)/$(Build.BuildId).zip - artifact: drop - -- stage: Deploy - displayName: Deploy stage - dependsOn: Build - condition: succeeded() - - jobs: - - deployment: Deploy - displayName: Deploy - environment: $(functionAppName) - pool: - vmImage: $(vmImageName) - - strategy: - runOnce: - deploy: - steps: - - task: AzureFunctionApp@1 - displayName: 'Azure functions app deploy' - inputs: - azureSubscription: '$(azureSubscription)' - appType: functionAppLinux - appName: $(functionAppName) - package: '$(Pipeline.Workspace)/drop/$(Build.BuildId).zip' diff --git a/src/configure/templates/pythonLinuxWebApp.yml b/src/configure/templates/pythonLinuxWebApp.yml deleted file mode 100644 index 2267bf81..00000000 --- a/src/configure/templates/pythonLinuxWebApp.yml +++ /dev/null @@ -1,70 +0,0 @@ -# Python to Linux Web App on Azure -# Build a Python project and deploy it to Azure as a Linux Web App. -# Add steps that analyze code, save build artifacts, deploy, and more: -# https://docs.microsoft.com/azure/devops/pipelines/languages/python - -trigger: -- {{{ branch }}} - -variables: - # Azure Resource Manager connection created during pipeline creation - azureServiceConnectionId: '{{{ azureServiceConnection }}}' - - # Web app name - webAppName: '{{{ resource }}}' - - # Agent VM image name - vmImageName: 'ubuntu-latest' - - # Environment name - environmentName: '{{{ resource }}}' - -stages: -- stage: Build - displayName: Build stage - jobs: - - job: BuildJob - pool: - vmImage: $(vmImageName) - - steps: - - script: | - python -m venv antenv - source antenv/bin/activate - python -m pip install --upgrade pip - pip install setup - pip install -r requirements.txt - displayName: "Install requirements" - - - task: ArchiveFiles@2 - displayName: 'Archive files' - inputs: - rootFolderOrFile: '.' - includeRootFolder: false - archiveType: zip - archiveFile: $(Build.ArtifactStagingDirectory)/$(Build.BuildId).zip - replaceExistingArchive: true - - - upload: $(Build.ArtifactStagingDirectory)/$(Build.BuildId).zip - displayName: 'Upload package' - artifact: drop - -- stage: Deploy - displayName: 'Deploy Web App' - dependsOn: Build - condition: succeeded() - jobs: - - deployment: DeploymentJob - pool: - vmImage: $(vmImageName) - environment: $(environmentName) - strategy: - runOnce: - deploy: - steps: - - task: AzureWebApp@1 - displayName: 'Deploy Azure Web App : {{ webAppName }}' - inputs: - azureSubscription: $(azureServiceConnectionId) - appName: $(webAppName) - package: $(Pipeline.Workspace)/drop/$(Build.BuildId).zip diff --git a/src/configure/templates/simpleWebApp.yml b/src/configure/templates/simpleWebApp.yml deleted file mode 100644 index 940a3794..00000000 --- a/src/configure/templates/simpleWebApp.yml +++ /dev/null @@ -1,60 +0,0 @@ -# Simple App on Windows Web App -# Package and deploy a simple web application and deploy it to Azure as Windows web app. - -trigger: -- {{{ branch }}} - -variables: - # Azure Resource Manager connection - azureSubscription: '{{{ azureServiceConnection }}}' - - # Web app name - webAppName: '{{{ resource }}}' - - # Agent VM image name - vmImageName: 'windows-latest' - -stages: -- stage: Build - displayName: Build stage - jobs: - - job: BuildJob - displayName: Build - pool: - vmImage: $(vmImageName) - - steps: - - - task: ArchiveFiles@2 - displayName: 'Archive files' - inputs: - rootFolderOrFile: '.' - includeRootFolder: false - archiveType: zip - archiveFile: $(Build.ArtifactStagingDirectory)/$(Build.BuildId).zip - replaceExistingArchive: true - - - upload: $(Build.ArtifactStagingDirectory)/$(Build.BuildId).zip - artifact: drop - -- stage: Deploy - displayName: Deploy stage - dependsOn: Build - condition: succeeded() - jobs: - - deployment: Deploy - environment: 'development' - pool: - vmImage: $(vmImageName) - - strategy: - runOnce: - deploy: - steps: - - task: AzureWebApp@1 - displayName: 'Azure Web App Deploy' - inputs: - azureSubscription: $(azureSubscription) - appType: webApp - appName: $(webAppName) - package: $(Pipeline.Workspace)/drop/$(Build.BuildId).zip diff --git a/src/extension.ts b/src/extension.ts index 687473c9..dbf663ef 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -11,7 +11,6 @@ import * as logger from './logger'; import { getSchemaAssociation, locateSchemaFile, onDidSelectOrganization, resetDoNotAskState, SchemaAssociationNotification } from './schema-association-service'; import { schemaContributor, CUSTOM_SCHEMA_REQUEST, CUSTOM_CONTENT_REQUEST } from './schema-contributor'; import { telemetryHelper } from './helpers/telemetryHelper'; -import { getAzureAccountExtensionApi } from './extensionApis'; /** * The unique string that identifies the Azure Pipelines languge. @@ -27,15 +26,9 @@ const DOCUMENT_SELECTOR = [ ] export async function activate(context: vscode.ExtensionContext) { - const configurePipelineEnabled = vscode.workspace.getConfiguration(LANGUAGE_IDENTIFIER).get('configure', true); telemetryHelper.setTelemetry('isActivationEvent', 'true'); - telemetryHelper.setTelemetry('configurePipelineEnabled', `${configurePipelineEnabled}`); await telemetryHelper.callWithTelemetryAndErrorHandling('azurePipelines.activate', async () => { await activateYmlContributor(context); - if (configurePipelineEnabled) { - const { activateConfigurePipeline } = await import('./configure/activate'); - activateConfigurePipeline(); - } }); context.subscriptions.push(telemetryHelper); @@ -103,9 +96,8 @@ async function activateYmlContributor(context: vscode.ExtensionContext) { // Re-request the schema when sessions change since auto-detection is dependent on // being able to query ADO organizations, check if 1ESPT schema can be used using session credentials. - const azureAccountApi = await getAzureAccountExtensionApi(); - context.subscriptions.push(azureAccountApi.onSessionsChanged(async () => { - if (azureAccountApi.status === 'LoggedIn' || azureAccountApi.status === 'LoggedOut') { + context.subscriptions.push(vscode.authentication.onDidChangeSessions(async session => { + if (session.provider.id === 'microsoft') { await loadSchema(context, client); } })); diff --git a/src/extensionApis.ts b/src/extensionApis.ts index c4787f12..938379f3 100644 --- a/src/extensionApis.ts +++ b/src/extensionApis.ts @@ -1,26 +1,7 @@ import * as vscode from 'vscode'; import * as Messages from './messages'; -import { AzureAccount } from './typings/azure-account.api'; import { API, GitExtension } from './typings/git'; -let azureAccountExtensionApi: AzureAccount | undefined; -export async function getAzureAccountExtensionApi(): Promise { - if (azureAccountExtensionApi === undefined) { - const azureAccountExtension = vscode.extensions.getExtension("ms-vscode.azure-account"); - if (!azureAccountExtension) { - throw new Error(Messages.azureAccountExtensionUnavailable); - } - - if (!azureAccountExtension.isActive) { - await azureAccountExtension.activate(); - } - - azureAccountExtensionApi = azureAccountExtension.exports; - } - - return azureAccountExtensionApi; -} - let gitExtensionApi: API | undefined; export async function getGitExtensionApi(): Promise { if (gitExtensionApi === undefined) { diff --git a/src/helpers/azureDevOpsHelper.ts b/src/helpers/azureDevOpsHelper.ts new file mode 100644 index 00000000..72400e68 --- /dev/null +++ b/src/helpers/azureDevOpsHelper.ts @@ -0,0 +1,70 @@ +import * as Messages from '../messages'; + +// https://dev.azure.com/ OR https://org@dev.azure.com/ +const AzureReposUrl = 'dev.azure.com/'; + +// git@ssh.dev.azure.com:v3/ +const SSHAzureReposUrl = 'ssh.dev.azure.com:v3/'; + +// https://org.visualstudio.com/ +const VSOUrl = '.visualstudio.com/'; + +// org@vs-ssh.visualstudio.com:v3/ +const SSHVsoReposUrl = 'vs-ssh.visualstudio.com:v3/'; + +export function isAzureReposUrl(remoteUrl: string): boolean { + return remoteUrl.includes(AzureReposUrl) || + remoteUrl.includes(VSOUrl) || + remoteUrl.includes(SSHAzureReposUrl) || + remoteUrl.includes(SSHVsoReposUrl); +} + +export function getRepositoryDetailsFromRemoteUrl(remoteUrl: string): { organizationName: string, projectName: string, repositoryName: string } { + if (remoteUrl.includes(AzureReposUrl)) { + const part = remoteUrl.substring(remoteUrl.indexOf(AzureReposUrl) + AzureReposUrl.length); + const parts = part.split('/'); + if (parts.length !== 4) { + throw new Error(Messages.failedToDetermineAzureRepoDetails); + } + + return { + organizationName: parts[0].trim(), + projectName: parts[1].trim(), + repositoryName: parts[3].trim() + }; + } else if (remoteUrl.includes(VSOUrl)) { + const part = remoteUrl.substring(remoteUrl.indexOf(VSOUrl) + VSOUrl.length); + const organizationName = remoteUrl.substring(remoteUrl.indexOf('https://') + 'https://'.length, remoteUrl.indexOf('.visualstudio.com')); + const parts = part.split('/'); + + if (parts.length === 4 && parts[0].toLowerCase() === 'defaultcollection') { + // Handle scenario where part is 'DefaultCollection//_git/' + parts.shift(); + } + + if (parts.length !== 3) { + throw new Error(Messages.failedToDetermineAzureRepoDetails); + } + + return { + organizationName: organizationName, + projectName: parts[0].trim(), + repositoryName: parts[2].trim() + }; + } else if (remoteUrl.includes(SSHAzureReposUrl) || remoteUrl.includes(SSHVsoReposUrl)) { + const urlFormat = remoteUrl.includes(SSHAzureReposUrl) ? SSHAzureReposUrl : SSHVsoReposUrl; + const part = remoteUrl.substring(remoteUrl.indexOf(urlFormat) + urlFormat.length); + const parts = part.split('/'); + if (parts.length !== 3) { + throw new Error(Messages.failedToDetermineAzureRepoDetails); + } + + return { + organizationName: parts[0].trim(), + projectName: parts[1].trim(), + repositoryName: parts[2].trim() + }; + } else { + throw new Error(Messages.notAzureRepoUrl); + } +} diff --git a/src/configure/helper/controlProvider.ts b/src/helpers/controlProvider.ts similarity index 88% rename from src/configure/helper/controlProvider.ts rename to src/helpers/controlProvider.ts index 9b13eb7f..fa78bd76 100644 --- a/src/configure/helper/controlProvider.ts +++ b/src/helpers/controlProvider.ts @@ -1,6 +1,6 @@ import { InputBoxOptions, QuickPickItem, QuickPickOptions, window } from 'vscode'; -import { telemetryHelper } from '../../helpers/telemetryHelper'; -import * as TelemetryKeys from '../../helpers/telemetryKeys'; +import { telemetryHelper } from './telemetryHelper'; +import * as TelemetryKeys from './telemetryKeys'; export async function showQuickPick(listName: string, listItems: T[] | Thenable, options: QuickPickOptions, itemCountTelemetryKey?: string): Promise { try { diff --git a/src/helpers/parseError.ts b/src/helpers/parseError.ts deleted file mode 100644 index 4151715a..00000000 --- a/src/helpers/parseError.ts +++ /dev/null @@ -1,247 +0,0 @@ -// Copied from https://github.com/microsoft/vscode-azuretools/blob/5999c2ad4423e86f22d2c648027242d8816a50e4/ui/src/parseError.ts -// with inline IParsedError interface and no localization - -// Disable linting precisely because this file is copied. -/* eslint-disable */ - -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -import * as htmlToText from 'html-to-text'; - -export interface IParsedError { - errorType: string; - message: string; - stack?: string; - isUserCancelledError: boolean; -} - -// tslint:disable:no-unsafe-any -// tslint:disable:no-any -export function parseError(error: any): IParsedError { - let errorType: string = ''; - let message: string = ''; - let stack: string | undefined; - - if (typeof (error) === 'object' && error !== null) { - if (error.constructor !== Object) { - errorType = error.constructor.name; - } - - stack = getCallstack(error); - errorType = getCode(error, errorType); - - // See https://github.com/Microsoft/vscode-azureappservice/issues/419 for an example error that requires these 'unpack's - error = unpackErrorFromField(error, 'value'); - error = unpackErrorFromField(error, '_value'); - error = unpackErrorFromField(error, 'error'); - error = unpackErrorFromField(error, 'error'); - if (Array.isArray(error.errors) && error.errors.length) { - error = error.errors[0]; - } - - errorType = getCode(error, errorType); - message = getMessage(error, message); - - if (!errorType || !message || /error.*deserializing.*response.*body/i.test(message)) { - error = unpackErrorFromField(error, 'response'); - error = unpackErrorFromField(error, 'body'); - - errorType = getCode(error, errorType); - message = getMessage(error, message); - } - - // Azure errors have a JSON object in the message - let parsedMessage: any = parseIfJson(error.message); - // For some reason, the message is sometimes serialized twice and we need to parse it again - parsedMessage = parseIfJson(parsedMessage); - // Extract out the "internal" error if it exists - if (parsedMessage && parsedMessage.error) { - parsedMessage = parsedMessage.error; - } - - errorType = getCode(parsedMessage, errorType); - message = getMessage(parsedMessage, message); - - message = message || convertCodeToError(errorType) || JSON.stringify(error); - } else if (error !== undefined && error !== null && error.toString && error.toString().trim() !== '') { - errorType = typeof (error); - message = error.toString(); - } - - message = unpackErrorsInMessage(message); - - [message, errorType] = parseIfFileSystemError(message, errorType); - - // tslint:disable-next-line:strict-boolean-expressions - errorType = errorType || typeof (error); - message = message || 'Unknown Error'; - - message = parseIfHtml(message); - - // Azure storage SDK errors are presented in XML - // https://github.com/Azure/azure-sdk-for-js/issues/6927 - message = parseIfXml(message); - - return { - errorType: errorType, - message: message, - stack: stack, - // NOTE: Intentionally not using 'error instanceof UserCancelledError' because that doesn't work if multiple versions of the UI package are used in one extension - // See https://github.com/Microsoft/vscode-azuretools/issues/51 for more info - isUserCancelledError: errorType === 'UserCancelledError' - }; -} - -function convertCodeToError(errorType: string | undefined): string | undefined { - if (errorType) { - const code: number = parseInt(errorType, 10); - if (!isNaN(code)) { - return `Failed with code "${code}".`; - } - } - - return undefined; -} - -function parseIfJson(o: any): any { - if (typeof o === 'string' && o.indexOf('{') >= 0) { - try { - return JSON.parse(o); - } catch (err) { - // ignore - } - } - - return o; -} - -function parseIfHtml(message: string): string { - if (/(.*)<\/Message>/si); - if (matches) { - return matches[1]; - } - - return message; -} - -function getMessage(o: any, defaultMessage: string): string { - return (o && (o.message || o.Message || o.detail || (typeof parseIfJson(o.body) === 'string' && o.body))) || defaultMessage; -} - -function getCode(o: any, defaultCode: string): string { - const code: any = o && (o.code || o.Code || o.errorCode || o.statusCode); - return code ? String(code) : defaultCode; -} - -function unpackErrorsInMessage(message: string): string { - // Handle messages like this from Azure (just handle first error for now) - // ["Errors":["The offer should have valid throughput]]", - if (message) { - const errorsInMessage: RegExpMatchArray | null = message.match(/"Errors":\[\s*"([^"]+)"/); - if (errorsInMessage !== null) { - const [, firstError] = errorsInMessage; - return firstError; - } - } - - return message; -} - -function unpackErrorFromField(error: any, prop: string): any { - // Handle objects from Azure SDK that contain the error information in a "body" field (serialized or not) - let field: any = error && error[prop]; - if (field) { - if (typeof field === 'string' && field.indexOf('{') >= 0) { - try { - field = JSON.parse(field); - } catch (err) { - // Ignore - } - } - - if (typeof field === 'object') { - return field; - } - } - - return error; -} - -/** - * Example line in the stack: - * at FileService.StorageServiceClient._processResponse (/path/ms-azuretools.vscode-azurestorage-0.6.0/node_modules/azure-storage/lib/common/services/storageserviceclient.js:751:50) - * - * Final minified line: - * FileService.StorageServiceClient._processResponse azure-storage/storageserviceclient.js:751:50 - */ -function getCallstack(error: { stack?: string }): string | undefined { - // tslint:disable-next-line: strict-boolean-expressions - const stack: string = error.stack || ''; - - const minifiedLines: (string | undefined)[] = stack - .split(/(\r\n|\n)/g) // split by line ending - .map(l => { - let result: string = ''; - // Get just the file name, line number and column number - // From above example: storageserviceclient.js:751:50 - const fileMatch: RegExpMatchArray | null = l.match(/[^\/\\\(\s]+\.(t|j)s:[0-9]+:[0-9]+/i); - - // Ignore any lines without a file match (e.g. "at Generator.next ()") - if (fileMatch) { - // Get the function name - // From above example: FileService.StorageServiceClient._processResponse - const functionMatch: RegExpMatchArray | null = l.match(/^[\s]*at ([^\(\\\/]+(?:\\|\/)?)+/i); - if (functionMatch) { - result += functionMatch[1]; - } - - const parts: string[] = []; - - // Get the name of the node module (and any sub modules) containing the file - // From above example: azure-storage - const moduleRegExp: RegExp = /node_modules(?:\\|\/)([^\\\/]+)/ig; - let moduleMatch: RegExpExecArray | null; - do { - moduleMatch = moduleRegExp.exec(l); - if (moduleMatch) { - parts.push(moduleMatch[1]); - } - } while (moduleMatch); - - parts.push(fileMatch[0]); - result += parts.join('/'); - } - - return result; - }) - .filter(l => !!l); - - return minifiedLines.length > 0 ? minifiedLines.join('\n') : undefined; -} - -/** - * See https://github.com/microsoft/vscode-cosmosdb/issues/1580 for an example error - */ -function parseIfFileSystemError(message: string, errorType: string): [string, string] { - const match: RegExpMatchArray | null = message.match(/\((([a-z]*) \(FileSystemError\).*)\)$/i); - if (match) { - message = match[1]; - errorType = match[2]; - } - return [message, errorType]; -} diff --git a/src/helpers/telemetryHelper.ts b/src/helpers/telemetryHelper.ts index ad29e417..86edf0fe 100644 --- a/src/helpers/telemetryHelper.ts +++ b/src/helpers/telemetryHelper.ts @@ -1,16 +1,16 @@ import * as vscode from 'vscode'; +import * as crypto from 'crypto'; + import TelemetryReporter from '@vscode/extension-telemetry'; import * as TelemetryKeys from './telemetryKeys'; import * as logger from '../logger'; -import { parseError } from './parseError'; -import { v4 as uuid } from 'uuid'; const extensionName = 'ms-azure-devops.azure-pipelines'; /* eslint-disable @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access */ const packageJSON = vscode.extensions.getExtension(extensionName)?.packageJSON; // Guaranteed to exist -const extensionVersion: string = packageJSON.version; +export const extensionVersion: string = packageJSON.version; const aiKey: string = packageJSON.aiKey; /* eslint-enable @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access */ @@ -18,19 +18,11 @@ interface TelemetryProperties { [key: string]: string; } -enum Result { - Succeeded = 'Succeeded', - Failed = 'Failed', - Canceled = 'Canceled' -} - - class TelemetryHelper { - private journeyId: string = uuid(); + private journeyId: string = crypto.randomUUID(); private properties: TelemetryProperties = { [TelemetryKeys.JourneyId]: this.journeyId, - [TelemetryKeys.Result]: Result.Succeeded, }; private static reporter = new TelemetryReporter(extensionName, extensionVersion, aiKey); @@ -47,10 +39,6 @@ class TelemetryHelper { this.properties[key] = value; } - public setCurrentStep(stepName: string): void { - this.properties.cancelStep = stepName; - } - // Log an error. // No custom properties are logged alongside the error. // FIXME: This should really be sendTelemetryException but I'm maintaining @@ -74,7 +62,7 @@ class TelemetryHelper { public async executeFunctionWithTimeTelemetry(callback: () => Promise, telemetryKey: string): Promise { const startTime = Date.now(); try { - return await callback(); + return callback(); } finally { this.setTelemetry(telemetryKey, ((Date.now() - startTime) / 1000).toString()); @@ -84,41 +72,24 @@ class TelemetryHelper { // Wraps the given function in a telemetry event. // The telemetry event sent ater function execution will contain how long the function took as well as any custom properties // supplied through initialize() or setTelemetry(). - // If the function errors, the telemetry event will additionally contain metadata about the error that occurred. - // https://github.com/microsoft/vscode-azuretools/blob/5999c2ad4423e86f22d2c648027242d8816a50e4/ui/src/callWithTelemetryAndErrorHandling.ts public async callWithTelemetryAndErrorHandling(command: string, callback: () => Promise): Promise { try { - return await this.executeFunctionWithTimeTelemetry(callback, 'duration'); + return this.executeFunctionWithTimeTelemetry(callback, 'duration'); } catch (error) { - const parsedError = parseError(error); - if (parsedError.isUserCancelledError) { - this.setTelemetry(TelemetryKeys.Result, Result.Canceled); - } else { - this.setTelemetry(TelemetryKeys.Result, Result.Failed); - this.setTelemetry('error', parsedError.errorType); - this.setTelemetry('errorMessage', parsedError.message); - this.setTelemetry('stack', parsedError.stack ?? ''); - - logger.log(parsedError.message); - if (parsedError.message.includes('\n')) { - void vscode.window.showErrorMessage('An error has occurred. Check the output window for more details.'); - } else { - void vscode.window.showErrorMessage(parsedError.message); - } - } - } finally { - if (this.properties.result === Result.Failed.toString()) { - TelemetryHelper.reporter.sendTelemetryErrorEvent( - command, { - ...this.properties, - [TelemetryKeys.JourneyId]: this.journeyId, - }, undefined, ['error', 'errorMesage', 'stack']); + TelemetryHelper.reporter.sendTelemetryErrorEvent( + command, { + ...this.properties, + [TelemetryKeys.JourneyId]: this.journeyId, + }); + + const message = error instanceof Error ? error.message : String(error); + + logger.log(message, command); + + if (message.includes('\n')) { + void vscode.window.showErrorMessage('An error has occurred. Check the output window for more details.'); } else { - TelemetryHelper.reporter.sendTelemetryEvent( - command, { - ...this.properties, - [TelemetryKeys.JourneyId]: this.journeyId, - }); + void vscode.window.showErrorMessage(message); } } diff --git a/src/helpers/telemetryKeys.ts b/src/helpers/telemetryKeys.ts index b59ecfe2..9349a61a 100644 --- a/src/helpers/telemetryKeys.ts +++ b/src/helpers/telemetryKeys.ts @@ -1,17 +1,2 @@ export const CurrentUserInput = 'currentUserInput'; -export const RepoProvider = 'repoProvider'; -export const AzureLoginRequired = 'azureLoginRequired'; export const JourneyId = 'journeyId'; -export const Result = 'result'; -export const SourceRepoLocation = 'sourceRepoLocation'; -export const ChosenTemplate = 'chosenTemplate'; -export const PipelineDiscarded = 'pipelineDiscarded'; -export const BrowsePipelineClicked = 'browsePipelineClicked'; -export const MultipleWorkspaceFolders = 'multipleWorkspaceFolders'; -export const GitHubPatDuration = 'gitHubPatDuration'; - -// Count of drop down items -export const OrganizationListCount = 'OrganizationListCount'; -export const ProjectListCount = 'ProjectListCount'; -export const WebAppListCount = 'WebAppListCount'; -export const PipelineTempateListCount = 'pipelineTempateListCount'; diff --git a/src/messages.ts b/src/messages.ts index f0cfefd0..6fbdb88a 100644 --- a/src/messages.ts +++ b/src/messages.ts @@ -1,53 +1,14 @@ -export const acquireAccessTokenFailed: string = 'Acquiring access token failed. Error: %s.'; -export const addYmlFile: string = 'Add Azure Pipelines YAML definition.'; -export const analyzingRepo: string = 'Analyzing your repo'; -export const azureAccountExtensionUnavailable: string = 'Azure Account extension could not be fetched. Please ensure it\'s installed and activated.'; export const gitExtensionUnavailable: string = 'Git extension could not be fetched. Please ensure it\'s installed and activated.'; export const gitExtensionNotEnabled: string = 'Git extension is not enabled. Please change the `git.enabled` setting to true.'; -export const azureLoginRequired: string = 'Please sign in to your Azure account first.'; -export const branchHeadMissing: string = `The current repository doesn't have any commits. Please [create a commit](https://git-scm.com/docs/git-commit) first, and then try this again.`; -export const branchNameMissing: string = `The current repository isn't on a branch. Please [checkout a branch](https://git-scm.com/docs/git-checkout) first, and then try this again.`; -export const branchRemoteMissing: string = `The current branch doesn't have a tracking branch, and the selected repository has no remotes. We're unable to create a remote tracking branch. Please [set a remote tracking branch](https://git-scm.com/docs/git-branch#Documentation/git-branch.txt---track) first, and then try this again.`; -export const browsePipeline: string = 'Browse Pipeline'; -export const cannotIdentifyRepositoryDetails: string = 'Couldn\'t get repository details. Ensure your repo is hosted on [Azure Repos](https://docs.microsoft.com/azure/devops/repos/get-started) or [GitHub](https://guides.github.com/activities/hello-world/).'; -export const commitAndPush: string = 'Commit & push'; -export const commitFailedErrorMessage: string =`Commit failed due to error: %s`; -export const pushingPipelineFile: string = 'Pushing pipeline file...'; -export const configuringPipelineAndDeployment: string = 'Configuring pipeline and proceeding to deployment...'; -export const runningPostDeploymentActions: string = 'Running post-deployment actions...'; -export const couldNotAuthorizeEndpoint: string = 'Couldn\'t authorize endpoint for use in Azure Pipelines.'; -export const creatingAzureServiceConnection: string = 'Connecting Azure Pipelines with your subscription: %s'; -export const creatingGitHubServiceConnection: string = 'Creating GitHub service connection'; -export const discardPipeline: string = 'Discard pipeline'; -export const enterGitHubPat: string = 'Enter GitHub personal access token (PAT)'; export const failedToDetermineAzureRepoDetails: string = 'Failed to determine Azure Repo details from remote url. Please ensure that the remote points to a valid Azure Repos url.'; -export const gitHubPatErrorMessage: string = 'GitHub PAT cannot be empty.'; -export const githubPatHelpMessage: string = 'GitHub personal access token (PAT) with following permissions: full access to repository webhooks and services, read and write access to all repository data.'; -export const modifyAndCommitFile: string = 'Modify and save your YAML file. %s will commit this file, push the branch \'%s\' to remote \'%s\' and proceed with deployment.'; -export const noAgentQueueFound: string = 'No agent pool found named "%s".'; -export const noAvailableFileNames: string = 'No available filenames found.'; -export const notAGitRepository: string = 'Selected workspace is not a [Git](https://git-scm.com/docs/git) repository. Please select a Git repository.'; export const notAzureRepoUrl: string = 'The repo isn\'t hosted with Azure Repos.'; -export const pipelineSetupSuccessfully: string = 'Pipeline set up successfully!'; -export const remoteRepositoryNotConfigured: string = 'Remote repository is not configured. This extension is compatible with [Azure Repos](https://docs.microsoft.com/en-us/azure/devops/repos/get-started) or [GitHub](https://guides.github.com/activities/hello-world/).'; -export const selectFolderLabel: string = 'Select source folder for configuring pipeline'; export const selectOrganizationForEnhancedIntelliSense: string = 'Select Azure DevOps organization associated with the %s repository for enhanced Azure Pipelines IntelliSense.'; export const selectOrganizationLabel: string = 'Select organization'; export const selectOrganizationPlaceholder: string = 'Select Azure DevOps organization associated with the %s repository'; -export const selectPipelineTemplate: string = 'Select an Azure Pipelines template...'; -export const selectProject: string = 'Select an Azure DevOps project'; -export const selectRemoteForBranch: string = 'Select the remote repository where you want to track your current branch'; -export const selectSubscription: string = 'Select an Azure subscription'; -export const selectWorkspaceFolder: string = 'Select a folder from your workspace to deploy'; export const signInLabel: string = 'Sign In'; -export const unableToAccessOrganization: string = 'Unable to access the "%s" organization. Make sure you\'re signed into the right Azure account.'; -export const unableToCreateServiceConnection: string = `Unable to create %s service connection.\nOperation Status: %s\nMessage: %s\nService connection is not in ready state.`; -export const timedOutCreatingServiceConnection: string =`Timed out creating %s service connection.\nService connection is not in ready state.`; -export const retryFailedMessage: string =`Failed after retrying: %s times. Internal Error: %s`; -export const azureServicePrincipalFailedMessage: string =`Failed while creating Azure service principal.`; -export const roleAssignmentFailedMessage: string =`Failed while role assignement.`; -export const waitForAzureSignIn: string = `Waiting for Azure sign-in...`; -export const signInForEnhancedIntelliSense = 'Sign in to Azure for enhanced Azure Pipelines IntelliSense'; +export const signInWithADifferentAccountLabel: string = 'Sign in with a different account'; +export const unableToAccessOrganization: string = 'Unable to access the "%s" organization. Make sure you\'re signed into the right Microsoft account.'; +export const signInForEnhancedIntelliSense = 'Sign in to Microsoft for enhanced Azure Pipelines IntelliSense'; export const userEligibleForEnahanced1ESPTIntellisense = 'Enable 1ESPT Schema in Azure Pipelines Extension settings for enhanced Intellisense'; export const notUsing1ESPTSchemaAsUserNotSignedInMessage = '1ESPT Schema is not used for Intellisense as you are not signed in with a `@microsoft.com` account'; export const enable1ESPTSchema = 'Enable'; diff --git a/src/schema-association-service-1espt.ts b/src/schema-association-service-1espt.ts index 3e2ece09..c0a8028b 100644 --- a/src/schema-association-service-1espt.ts +++ b/src/schema-association-service-1espt.ts @@ -7,14 +7,14 @@ import * as vscode from 'vscode'; import { URI, Utils } from 'vscode-uri'; import * as azdev from 'azure-devops-node-api'; import * as logger from './logger'; -import { AzureSession } from './typings/azure-account.api'; import * as Messages from './messages'; +import { getAzureDevOpsSessions } from './schema-association-service'; const milliseconds24hours = 86400000; -export async function get1ESPTSchemaUri(azureDevOpsClient: azdev.WebApi, organizationName: string, session: AzureSession, context: vscode.ExtensionContext, repoId1espt: string): Promise { +export async function get1ESPTSchemaUri(azureDevOpsClient: azdev.WebApi, organizationName: string, session: vscode.AuthenticationSession, context: vscode.ExtensionContext, repoId1espt: string): Promise { try { - if (session.userId.endsWith("@microsoft.com")) { + if (session.account.label.endsWith("@microsoft.com")) { const gitApi = await azureDevOpsClient.getGitApi(); // Using getItem from GitApi: getItem(repositoryId: string, path: string, project?: string, scopePath?: string, recursionLevel?: GitInterfaces.VersionControlRecursionType, includeContentMetadata?: boolean, latestProcessedChange?: boolean, download?: boolean, versionDescriptor?: GitInterfaces.GitVersionDescriptor, includeContent?: boolean, resolveLfs?: boolean, sanitize?: boolean): Promise; const schemaFile = await gitApi.getItem(repoId1espt, "schema/1espt-base-schema.json", "1ESPipelineTemplates", undefined, undefined, true, true, true, undefined, true, true); @@ -35,7 +35,7 @@ export async function get1ESPTSchemaUri(azureDevOpsClient: azdev.WebApi, organiz } } catch (error) { - logger.log(`Error : ${String(error)} while fetching 1ESPT schema for org: ${organizationName} : `, 'SchemaDetection'); + logger.log(`Error: ${error instanceof Error ? error.message : String(error)} while fetching 1ESPT schema for org: ${organizationName} : `, 'SchemaDetection'); } return undefined; } @@ -52,7 +52,7 @@ export async function get1ESPTSchemaUri(azureDevOpsClient: azdev.WebApi, organiz * @param lastUpdated1ESPTSchema * @returns */ -export async function getCached1ESPTSchema(context: vscode.ExtensionContext, organizationName: string, session: AzureSession, lastUpdated1ESPTSchema: Map): Promise { +export async function getCached1ESPTSchema(context: vscode.ExtensionContext, organizationName: string, session: vscode.AuthenticationSession, lastUpdated1ESPTSchema: Map): Promise { const lastUpdatedDate = lastUpdated1ESPTSchema.get(organizationName); if (!lastUpdatedDate) { return undefined; @@ -61,7 +61,7 @@ export async function getCached1ESPTSchema(context: vscode.ExtensionContext, org const schemaUri1ESPT = Utils.joinPath(context.globalStorageUri, '1ESPTSchema', `${organizationName}-1espt-schema.json`); try { - if (session.userId.endsWith("@microsoft.com")) { + if (session.account.label.endsWith("@microsoft.com")) { if ((new Date().getTime() - lastUpdatedDate.getTime()) < milliseconds24hours) { try { await vscode.workspace.fs.stat(schemaUri1ESPT); @@ -77,20 +77,20 @@ export async function getCached1ESPTSchema(context: vscode.ExtensionContext, org } } else { - const signInAction = await vscode.window.showInformationMessage(Messages.notUsing1ESPTSchemaAsUserNotSignedInMessage, Messages.signInLabel); - if (signInAction == Messages.signInLabel) { - await vscode.window.withProgress({ - location: vscode.ProgressLocation.Notification, - title: Messages.waitForAzureSignIn, - }, async () => { - await vscode.commands.executeCommand("azure-account.login"); + void vscode.window.showInformationMessage(Messages.notUsing1ESPTSchemaAsUserNotSignedInMessage, Messages.signInWithADifferentAccountLabel) + .then(async action => { + if (action === Messages.signInWithADifferentAccountLabel) { + await getAzureDevOpsSessions(context, { + clearSessionPreference: true, + createIfNone: true, + }); + } }); - } logger.log(`Skipping cached 1ESPT schema for ${organizationName} as user is not signed in with Microsoft account`, `SchemaDetection`); } } catch (error) { - logger.log(`Error : ${String(error)} while fetching cached 1ESPT schema for org: ${organizationName}. It's possible that the schema does not exist.`, 'SchemaDetection'); + logger.log(`Error: ${error instanceof Error ? error.message : String(error)} while fetching cached 1ESPT schema for org: ${organizationName}. It's possible that the schema does not exist.`, 'SchemaDetection'); } return undefined; @@ -105,13 +105,9 @@ export async function getCached1ESPTSchema(context: vscode.ExtensionContext, org export async function get1ESPTRepoIdIfAvailable(azureDevOpsClient: azdev.WebApi, organizationName: string): Promise { try { const gitApi = await azureDevOpsClient.getGitApi(); - const repositories = await gitApi.getRepositories('1ESPipelineTemplates'); - if (repositories.length === 0) { - logger.log(`1ESPipelineTemplates ADO project not found for org ${organizationName}`, `SchemaDetection`); - return ""; // 1ESPT ADO project not found - } - - const repository = repositories.find(repo => repo.name === "1ESPipelineTemplates"); + const repository = await gitApi.getRepository('1ESPipelineTemplates', '1ESPipelineTemplates'); + // Types are wrong and getRepository cah return null. + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition if (repository?.id === undefined) { logger.log(`1ESPipelineTemplates repo not found for org ${organizationName}`, `SchemaDetection`); return ""; // 1ESPT repo not found @@ -120,7 +116,7 @@ export async function get1ESPTRepoIdIfAvailable(azureDevOpsClient: azdev.WebApi, return repository.id; } catch (error) { - logger.log(`Error : ${String(error)} while checking eligibility for enhanced Intellisense for 1ESPT schema for org: ${organizationName}.`, 'SchemaDetection'); + logger.log(`Error: ${error instanceof Error ? error.message : String(error)} while checking eligibility for enhanced Intellisense for 1ESPT schema for org: ${organizationName}.`, 'SchemaDetection'); return ""; } } @@ -130,6 +126,6 @@ export async function delete1ESPTSchemaFileIfPresent(context: vscode.ExtensionCo await vscode.workspace.fs.delete(Utils.joinPath(context.globalStorageUri, '1ESPTSchema'), { recursive: true }); } catch (error) { - logger.log(`Error: ${String(error)} while deleting 1ESPT schema. It's possible that the schema file does not exist`, 'SchemaDetection'); + logger.log(`Error: ${error instanceof Error ? error.message : String(error)} while deleting 1ESPT schema. It's possible that the schema file does not exist`, 'SchemaDetection'); } } diff --git a/src/schema-association-service.ts b/src/schema-association-service.ts index 67c5c569..ee1015f6 100644 --- a/src/schema-association-service.ts +++ b/src/schema-association-service.ts @@ -9,14 +9,13 @@ import { Utils } from 'vscode-uri'; import * as languageclient from 'vscode-languageclient/node'; import * as azdev from 'azure-devops-node-api'; import { format } from 'util'; -import { getAzureAccountExtensionApi, getGitExtensionApi } from './extensionApis'; -import { OrganizationsClient } from './configure/clients/devOps/organizationsClient'; -import { getRepositoryDetailsFromRemoteUrl, isAzureReposUrl } from './configure/helper/devOps/azureDevOpsHelper'; -import { showQuickPick } from './configure/helper/controlProvider'; -import { QuickPickItemWithData } from './configure/model/models'; +import { getGitExtensionApi } from './extensionApis'; +import { OrganizationsClient } from './clients/devOps/organizationsClient'; +import { getRepositoryDetailsFromRemoteUrl, isAzureReposUrl } from './helpers/azureDevOpsHelper'; +import { showQuickPick } from './helpers/controlProvider'; +import { extensionVersion } from './helpers/telemetryHelper'; import * as logger from './logger'; import * as Messages from './messages'; -import { AzureSession } from './typings/azure-account.api'; import { get1ESPTSchemaUri, getCached1ESPTSchema, get1ESPTRepoIdIfAvailable, delete1ESPTSchemaFileIfPresent } from './schema-association-service-1espt'; const selectOrganizationEvent = new vscode.EventEmitter(); @@ -28,8 +27,24 @@ export const onDidSelectOrganization = selectOrganizationEvent.event; const seenOrganizations = new Set(); const lastUpdated1ESPTSchema = new Map(); -export const DO_NOT_ASK_SIGN_IN_KEY = "DO_NOT_ASK_SIGN_IN_KEY"; -export const DO_NOT_ASK_SELECT_ORG_KEY = "DO_NOT_ASK_SELECT_ORG_KEY"; +const DO_NOT_ASK_SIGN_IN_KEY = "DO_NOT_ASK_SIGN_IN_KEY"; +const DO_NOT_ASK_SELECT_ORG_KEY = "DO_NOT_ASK_SELECT_ORG_KEY"; + +const AZURE_MANAGEMENT_SCOPES = [ + // Get tenants + 'https://management.core.windows.net/.default', +]; + +const AZURE_DEVOPS_SCOPES = [ + // It would be better to use the fine-grained scopes, + // but we need to wait for VS Code to support them. + // https://github.com/microsoft/vscode/issues/201679 + '499b84ac-1321-427f-aa17-267ca6975798/.default', + // // Get YAML schema + // '499b84ac-1321-427f-aa17-267ca6975798/vso.agentpools', + // // Get ADO orgs + // '499b84ac-1321-427f-aa17-267ca6975798/vso.profile', +]; let repoId1espt: string | undefined = undefined; @@ -105,47 +120,9 @@ export function getSchemaAssociation(schemaFilePath: string): ISchemaAssociation async function autoDetectSchema( context: vscode.ExtensionContext, workspaceFolder: vscode.WorkspaceFolder): Promise { - const azureAccountApi = await getAzureAccountExtensionApi(); - - // We could care less about the subscriptions; all we need are the sessions. - // However, there's no waitForSessions API, and waitForLogin returns before - // the underlying account information is guaranteed to finish loading. - // The next-best option is then waitForSubscriptions which, by definition, - // can't return until the sessions are also available. - // This only returns false if there is no login. - if (!(await azureAccountApi.waitForSubscriptions())) { - const doNotAskAgainSignIn = context.globalState.get(DO_NOT_ASK_SIGN_IN_KEY); - if (doNotAskAgainSignIn) { - logger.log(`Not prompting for login - do not ask again was set`, 'SchemaDetection'); - return undefined; - } - - logger.log(`Waiting for login`, 'SchemaDetection'); - - try { - await delete1ESPTSchemaFileIfPresent(context); - logger.log("1ESPTSchema folder deleted as user is not signed in", 'SchemaDetection') - } - catch (error) { - logger.log(`Error ${String(error)} while trying to delete 1ESPTSchema folder. Either the folder does not exist or there is an actual error.`, 'SchemaDetection') - } - - // Don't await this message so that we can return the fallback schema instead of blocking. - // We'll detect the login in extension.ts and then re-request the schema. - void vscode.window.showInformationMessage(Messages.signInForEnhancedIntelliSense, Messages.signInLabel, Messages.doNotAskAgain) - .then(async action => { - if (action === Messages.signInLabel) { - await vscode.window.withProgress({ - location: vscode.ProgressLocation.Notification, - title: Messages.waitForAzureSignIn, - }, async () => { - await vscode.commands.executeCommand("azure-account.login"); - }); - } else if (action === Messages.doNotAskAgain) { - await context.globalState.update(DO_NOT_ASK_SIGN_IN_KEY, true); - } - }); - + const azureDevOpsSessions = await getAzureDevOpsSessions(context); + if (azureDevOpsSessions === undefined) { + logger.log(`Not logged in`, 'SchemaDetection'); return undefined; } @@ -177,20 +154,11 @@ async function autoDetectSchema( } let organizationName: string; - let session: AzureSession | undefined; if (remoteUrl !== undefined && isAzureReposUrl(remoteUrl)) { logger.log(`${workspaceFolder.name} is an Azure repo`, 'SchemaDetection'); - // If we're in an Azure repo, we can silently determine the organization name and session. + // If we're in an Azure repo, we can silently determine the organization name. organizationName = getRepositoryDetailsFromRemoteUrl(remoteUrl).organizationName; - for (const azureSession of azureAccountApi.sessions) { - const organizationsClient = new OrganizationsClient(azureSession.credentials2); - const organizations = await organizationsClient.listOrganizations(); - if (organizations.find(org => org.accountName.toLowerCase() === organizationName.toLowerCase())) { - session = azureSession; - break; - } - } } else { logger.log(`${workspaceFolder.name} has no remote URL or is not an Azure repo`, 'SchemaDetection'); @@ -201,77 +169,94 @@ async function autoDetectSchema( // If we already have cached information for this workspace folder, use it. const details = azurePipelinesDetails[workspaceFolder.name]; organizationName = details.organization; - session = azureAccountApi.sessions.find(session => session.tenantId === details.tenant); logger.log( - `Using cached information for ${workspaceFolder.name}: ${organizationName}, ${session?.tenantId}`, + `Using cached organization for ${workspaceFolder.name}: ${organizationName}`, 'SchemaDetection'); } else { - const doNotAskAgainSelectOrg = context.globalState.get(DO_NOT_ASK_SELECT_ORG_KEY); - if (doNotAskAgainSelectOrg) { - logger.log(`Not prompting for organization - do not ask again was set`, 'SchemaDetection'); - return; - } + logger.log(`Retrieving organizations for ${workspaceFolder.name}`, 'SchemaDetection'); + + const organizations = (await Promise.all(azureDevOpsSessions.map(async session => { + const organizationsClient = new OrganizationsClient(session.accessToken); + const organizations = await organizationsClient.listOrganizations(); + return organizations.map(({ accountName }) => accountName); + }))).flat(); + + // If there's only one organization, we can just use that. + if (organizations.length === 1) { + organizationName = organizations[0]; + logger.log(`Using only available organization ${organizationName} for ${workspaceFolder.name}`, 'SchemaDetection'); + } else { + const doNotAskAgainSelectOrg = context.globalState.get(DO_NOT_ASK_SELECT_ORG_KEY); + if (doNotAskAgainSelectOrg) { + logger.log(`Not prompting for organization - do not ask again was set`, 'SchemaDetection'); + return undefined; + } - logger.log(`Prompting for organization for ${workspaceFolder.name}`, 'SchemaDetection'); - - // Otherwise, we need to manually prompt. - // We do this by asking them to select an organization via an information message, - // then displaying the quick pick of all the organizations they have access to. - // We *do not* await this message so that we can use the fallback schema while waiting. - // We'll detect when they choose the organization in extension.ts and then re-request the schema. - void vscode.window.showInformationMessage( - format(Messages.selectOrganizationForEnhancedIntelliSense, workspaceFolder.name), - Messages.selectOrganizationLabel, Messages.doNotAskAgain) - .then(async action => { - if (action === Messages.selectOrganizationLabel) { - // Lazily construct list of organizations so that we can immediately show the quick pick, - // then fill in the choices as they come in. - const getOrganizationsAndSessions = async (): Promise[]> => { - return (await Promise.all(azureAccountApi.sessions.map(async session => { - const organizationsClient = new OrganizationsClient(session.credentials2); - const organizations = await organizationsClient.listOrganizations(); - return organizations.map(organization => ({ - label: organization.accountName, - data: session, - })); - }))).flat(); - }; - - const selectedOrganizationAndSession = await showQuickPick( - 'organization', - getOrganizationsAndSessions(), { - placeHolder: format(Messages.selectOrganizationPlaceholder, workspaceFolder.name), - }); - - if (selectedOrganizationAndSession === undefined) { - return; - } + logger.log(`${organizations.length} organizations found - prompting for ${workspaceFolder.name}`, 'SchemaDetection'); + + // Otherwise, we need to manually prompt. + // We do this by asking them to select an organization via an information message, + // then displaying the quick pick of all the organizations they have access to. + // We *do not* await this message so that we can use the fallback schema while waiting. + // We'll detect when they choose the organization in extension.ts and then re-request the schema. + void vscode.window.showInformationMessage( + format(Messages.selectOrganizationForEnhancedIntelliSense, workspaceFolder.name), + Messages.selectOrganizationLabel, Messages.doNotAskAgain) + .then(async action => { + if (action === Messages.selectOrganizationLabel) { + const selectedOrganization = await showQuickPick( + 'organization', + organizations.map(organization => ({ label: organization })), { + placeHolder: format(Messages.selectOrganizationPlaceholder, workspaceFolder.name), + }); + + if (selectedOrganization === undefined) { + logger.log(`No organization picked for ${workspaceFolder.name}`, 'SchemaDetection'); + return; + } - organizationName = selectedOrganizationAndSession.label; - session = selectedOrganizationAndSession.data; + organizationName = selectedOrganization.label; - await context.workspaceState.update('azurePipelinesDetails', { - ...azurePipelinesDetails, - [workspaceFolder.name]: { - organization: organizationName, - tenant: session.tenantId, - } - }); + await context.workspaceState.update('azurePipelinesDetails', { + ...azurePipelinesDetails, + [workspaceFolder.name]: { + organization: organizationName, + } + }); - selectOrganizationEvent.fire(workspaceFolder); - } else if (action === Messages.doNotAskAgain) { - await context.globalState.update(DO_NOT_ASK_SELECT_ORG_KEY, true); - } - }); - return undefined; + selectOrganizationEvent.fire(workspaceFolder); + } else if (action === Messages.doNotAskAgain) { + await context.globalState.update(DO_NOT_ASK_SELECT_ORG_KEY, true); + } + }); + return undefined; + } + } + } + + let azureDevOpsSession: vscode.AuthenticationSession | undefined; + for (const session of azureDevOpsSessions) { + const organizationsClient = new OrganizationsClient(session.accessToken); + const organizations = await organizationsClient.listOrganizations(); + if (organizations.map(({ accountName }) => accountName).includes(organizationName)) { + azureDevOpsSession = session; + break; } } // Not logged into an account that has access. - if (session === undefined) { - logger.log(`No organization found for ${workspaceFolder.name}`, 'SchemaDetection'); - void vscode.window.showErrorMessage(format(Messages.unableToAccessOrganization, organizationName)); + if (azureDevOpsSession === undefined) { + logger.log(`No account found for ${organizationName}`, 'SchemaDetection'); + void vscode.window.showErrorMessage(format(Messages.unableToAccessOrganization, organizationName), Messages.signInWithADifferentAccountLabel) + .then(async action => { + if (action === Messages.signInWithADifferentAccountLabel) { + await getAzureDevOpsSessions(context, { + clearSessionPreference: true, + createIfNone: true, + }); + } + }); await delete1ESPTSchemaFileIfPresent(context); return undefined; } @@ -279,15 +264,14 @@ async function autoDetectSchema( // Create the global storage folder to guarantee that it exists. await vscode.workspace.fs.createDirectory(context.globalStorageUri); - logger.log(`Retrieving schema for ${workspaceFolder.name}`, 'SchemaDetection'); + logger.log(`Retrieving ${organizationName} schema for ${workspaceFolder.name}`, 'SchemaDetection'); // Try to fetch schema in the following order: // 1. Cached 1ESPT schema // 2. 1ESPT schema if user is signed in with microsoft account and has enabled 1ESPT schema // 3. Cached Organization specific schema // 4. Organization specific schema - const token = await session.credentials2.getToken(); - const authHandler = azdev.getBearerHandler(token.accessToken); + const authHandler = azdev.getBearerHandler(azureDevOpsSession.accessToken); const azureDevOpsClient = new azdev.WebApi(`https://dev.azure.com/${organizationName}`, authHandler); // Cache the response - this is why this method returns empty strings instead of undefined. @@ -298,13 +282,13 @@ async function autoDetectSchema( if (repoId1espt.length > 0) { // user has enabled 1ESPT schema if (vscode.workspace.getConfiguration('azure-pipelines', workspaceFolder).get('1ESPipelineTemplatesSchemaFile', false)) { - const cachedSchemaUri1ESPT = await getCached1ESPTSchema(context, organizationName, session, lastUpdated1ESPTSchema); + const cachedSchemaUri1ESPT = await getCached1ESPTSchema(context, organizationName, azureDevOpsSession, lastUpdated1ESPTSchema); if (cachedSchemaUri1ESPT) { return cachedSchemaUri1ESPT; } else { // if user is signed in with microsoft account and has enabled 1ESPipeline Template Schema, then give preference to 1ESPT schema - const schemaUri1ESPT = await get1ESPTSchemaUri(azureDevOpsClient, organizationName, session, context, repoId1espt); + const schemaUri1ESPT = await get1ESPTSchemaUri(azureDevOpsClient, organizationName, azureDevOpsSession, context, repoId1espt); if (schemaUri1ESPT) { lastUpdated1ESPTSchema.set(organizationName, new Date()); return schemaUri1ESPT; @@ -337,7 +321,7 @@ async function autoDetectSchema( // hit the network to request an updated schema for an organization once per session. const schemaUri = Utils.joinPath(context.globalStorageUri, `${organizationName}-schema.json`); if (seenOrganizations.has(organizationName)) { - logger.log(`Returning cached schema for ${workspaceFolder.name}`, 'SchemaDetection'); + logger.log(`Returning cached ${organizationName} schema for ${workspaceFolder.name}`, 'SchemaDetection'); return schemaUri; } @@ -350,6 +334,81 @@ async function autoDetectSchema( return schemaUri; } +export async function getAzureDevOpsSessions(context: vscode.ExtensionContext, options?: vscode.AuthenticationGetSessionOptions): Promise { + // First, request an ARM token. + const managementSession = await vscode.authentication.getSession('microsoft', AZURE_MANAGEMENT_SCOPES, options); + if (managementSession === undefined) { + const doNotAskAgainSignIn = context.globalState.get(DO_NOT_ASK_SIGN_IN_KEY); + if (doNotAskAgainSignIn) { + logger.log(`Not prompting for login - do not ask again was set`, 'SchemaDetection'); + return undefined; + } + + logger.log(`Waiting for login`, 'SchemaDetection'); + + try { + await delete1ESPTSchemaFileIfPresent(context); + logger.log("1ESPTSchema folder deleted as user is not signed in", 'SchemaDetection') + } + catch (error) { + logger.log(`Error ${String(error)} while trying to delete 1ESPTSchema folder. Either the folder does not exist or there is an actual error.`, 'SchemaDetection') + } + + // Don't await this message so that we can return the fallback schema instead of blocking. + // We'll detect the login in extension.ts and then re-request the schema. + void vscode.window.showInformationMessage(Messages.signInForEnhancedIntelliSense, Messages.signInLabel, Messages.doNotAskAgain) + .then(async action => { + if (action === Messages.signInLabel) { + await vscode.authentication.getSession('microsoft', AZURE_MANAGEMENT_SCOPES, { createIfNone: true }); + } else if (action === Messages.doNotAskAgain) { + await context.globalState.update(DO_NOT_ASK_SIGN_IN_KEY, true); + } + }); + + return undefined; + } + + const azureDevOpsSessions: vscode.AuthenticationSession[] = []; + + // The ARM token allows us to get a list of tenants, which we then request ADO tokens for. + let nextLink: string | undefined = 'https://management.azure.com/tenants?api-version=2022-01-01'; + while (nextLink !== undefined) { + const response = await fetch(nextLink, { + headers: { + Authorization: `Bearer ${managementSession.accessToken}`, + 'User-Agent': `azure-pipelines-vscode ${extensionVersion}`, + }, + }); + const data = await response.json() as { value: { tenantId: string }[], nextLink?: string }; + nextLink = data.nextLink; + + for (const tenant of data.value) { + const session = await vscode.authentication.getSession('microsoft', [...AZURE_DEVOPS_SCOPES, `VSCODE_TENANT:${tenant.tenantId}`], { silent: true }); + if (session !== undefined) { + azureDevOpsSessions.push(session); + } + } + } + + // Implementation detail (yuck): The microsoft provider sets this to MSAL's homeAccountId, + // which is further defined as .. + // Also included is a live.com check for the non-MSAL case, which can be removed once MSAL is the only option. + // We can use this to determine if the session is for an MSA or not. + if (managementSession.account.id.includes('live.com') || + (managementSession.account.id.includes('.') + // MSA tenant & first-party tenant which MSAs can request tokens for. + && ['9188040d-6c67-4c5b-b112-36a304b66dad', 'f8cdef31-a31e-4b4a-93e4-5f571e91255a'] + .includes(managementSession.account.id.split('.')[1]))) { + // MSAs have their own organizations that aren't associated with a tenant. + const msaSession = await vscode.authentication.getSession('microsoft', AZURE_DEVOPS_SCOPES, { silent: true }); + if (msaSession !== undefined) { + azureDevOpsSessions.push(msaSession); + } + } + + return azureDevOpsSessions; +} + // Mapping of glob pattern -> schemas interface ISchemaAssociations { [pattern: string]: string[]; diff --git a/src/test/index.ts b/src/test/index.ts deleted file mode 100644 index 4196d3bd..00000000 --- a/src/test/index.ts +++ /dev/null @@ -1,40 +0,0 @@ -import * as path from 'path'; -import Mocha from 'mocha'; -import glob from 'glob'; - -export function run(): Promise { - // Create the mocha test - const mocha = new Mocha({ - ui: 'tdd', - color: true, - }); - mocha.timeout(100000); - - const testsRoot = __dirname; - - return new Promise((c, e) => { - glob('**/**.test.js', { cwd: testsRoot }, (err, files) => { - if (err) { - e(err); - return; - } - - // Add files to the test suite - files.forEach(f => mocha.addFile(path.resolve(testsRoot, f))); - - try { - // Run the mocha test - mocha.run(failures => { - if (failures > 0) { - e(new Error(`${failures} tests failed.`)); - } else { - c(); - } - }); - } catch (err) { - console.error(err); - e(err as Error); - } - }); - }); -} diff --git a/src/test/runTest.ts b/src/test/runTest.ts deleted file mode 100644 index e57eb508..00000000 --- a/src/test/runTest.ts +++ /dev/null @@ -1,51 +0,0 @@ -import * as cp from 'child_process'; -import * as path from 'path'; - -import { - downloadAndUnzipVSCode, - resolveCliPathFromVSCodeExecutablePath, - runTests -} from '@vscode/test-electron'; - -async function main() { - try { - // The folder containing the Extension Manifest package.json - // Passed to `--extensionDevelopmentPath` - const extensionDevelopmentPath = path.resolve(__dirname, '../../'); - - // The path to the extension test runner script - // Passed to --extensionTestsPath - const extensionTestsPath = path.resolve(__dirname, './index'); - - // If the first argument is a path to a file/folder/workspace, - // the launched VS Code instance will open it. - // workspace isn't copied to out because it's all YAML files. - const launchArgs = [path.resolve(__dirname, '../../src/test/workspace')]; - - const vscodeExecutablePath = await downloadAndUnzipVSCode(); - const cliPath = resolveCliPathFromVSCodeExecutablePath(vscodeExecutablePath); - - // 0.11.0 has a bug where it blocks extension loading on first launch: - // https://github.com/microsoft/vscode-azure-account/pull/603. - // Since we always launch for the first time in CI, that turns out - // to be problematic. - cp.spawnSync(cliPath, ['--install-extension', 'ms-vscode.azure-account@0.10.1'], { - encoding: 'utf-8', - stdio: 'inherit' - }); - - // Download VS Code, unzip it and run the integration test - await runTests({ - vscodeExecutablePath, - extensionDevelopmentPath, - extensionTestsPath, - launchArgs - }); - } catch (err) { - console.error(err); - console.error('Failed to run tests'); - process.exit(1); - } -} - -void main(); diff --git a/src/test/suite/configure/azureDevOpsHelper.test.ts b/src/test/suite/configure/azureDevOpsHelper.test.ts deleted file mode 100644 index 5c71d54b..00000000 --- a/src/test/suite/configure/azureDevOpsHelper.test.ts +++ /dev/null @@ -1,158 +0,0 @@ -import * as assert from 'assert'; -import { isAzureReposUrl, getFormattedRemoteUrl, getRepositoryDetailsFromRemoteUrl, getOldFormatBuildDefinitionUrl, getOldFormatBuildUrl } from '../../../configure/helper/devOps/azureDevOpsHelper'; - -suite('Azure DevOps Helper', () => { - suite('isAzureReposUrl', () => { - test('Returns true for HTTPS ADO URLs', () => { - assert.ok(isAzureReposUrl('https://dev.azure.com/ms/example/_git/repo')); - }); - - test('Returns true for HTTPS ADO URLs with leading organization', () => { - assert.ok(isAzureReposUrl('https://ms@dev.azure.com/ms/example/_git/repo')); - }); - - test('Returns true for SSH ADO URLs', () => { - assert.ok(isAzureReposUrl('git@ssh.dev.azure.com:v3/ms/example/repo')); - }); - - test('Returns true for legacy HTTPS VSTS URLs', () => { - assert.ok(isAzureReposUrl('https://ms.visualstudio.com/example/_git/repo')); - }); - - test('Returns true for legacy HTTPS VSTS URLs with DefaultCollection', () => { - assert.ok(isAzureReposUrl('https://ms.visualstudio.com/DefaultCollection/example/_git/repo')); - }); - - test('Returns true for legacy SSH VSTS URLs', () => { - assert.ok(isAzureReposUrl('ms@vs-ssh.visualstudio.com:v3/ms/example/repo')); - }); - - test('Returns false for non-ADO HTTPS URLs', () => { - assert.strictEqual( - isAzureReposUrl('https://dev.azure.coms/ms/example/_git/repo'), - false); - }); - - test('Returns false for non-ADO SSH URLs', () => { - assert.strictEqual( - isAzureReposUrl('git@dev.azure.com:v3/ms/example/repo'), - false); - }); - - test('Returns false for non-VSTS HTTPS URLs', () => { - assert.strictEqual( - isAzureReposUrl('https://ms.visualstudio.coms/example/_git/repo'), - false); - }); - - test('Returns false for non-VSTS SSH URLs', () => { - assert.strictEqual( - isAzureReposUrl('ms@ssh.visualstudio.com:v3/ms/example/repo'), - false); - }); - }); - - suite('getRepositoryIdFromUrl', () => { - test('Returns details from an HTTPS ADO URL', () => { - assert.deepStrictEqual( - getRepositoryDetailsFromRemoteUrl('https://dev.azure.com/ms/example/_git/repo'), - { - organizationName: 'ms', - projectName: 'example', - repositoryName: 'repo', - }); - }); - - test('Returns details from an HTTPS ADO URL with leading organization', () => { - assert.deepStrictEqual( - getRepositoryDetailsFromRemoteUrl('https://ms@dev.azure.com/ms/example/_git/repo'), - { - organizationName: 'ms', - projectName: 'example', - repositoryName: 'repo', - }); - }); - - test('Returns details from a SSH ADO URL', () => { - assert.deepStrictEqual( - getRepositoryDetailsFromRemoteUrl('git@ssh.dev.azure.com:v3/ms/example/repo'), - { - organizationName: 'ms', - projectName: 'example', - repositoryName: 'repo', - }); - }); - - test('Returns details from a legacy HTTPS VSTS URL', () => { - assert.deepStrictEqual( - getRepositoryDetailsFromRemoteUrl('https://ms.visualstudio.com/example/_git/repo'), - { - organizationName: 'ms', - projectName: 'example', - repositoryName: 'repo', - }); - }); - - test('Returns details from a legacy HTTPS VSTS URL with DefaultCollection', () => { - assert.deepStrictEqual( - getRepositoryDetailsFromRemoteUrl('https://ms.visualstudio.com/DefaultCollection/example/_git/repo'), - { - organizationName: 'ms', - projectName: 'example', - repositoryName: 'repo', - }); - }); - - test('Returns details from a legacy SSH VSTS URL', () => { - assert.deepStrictEqual( - getRepositoryDetailsFromRemoteUrl('ms@vs-ssh.visualstudio.com:v3/ms/example/repo'), - { - organizationName: 'ms', - projectName: 'example', - repositoryName: 'repo', - }); - }); - }); - - suite('getFormattedRemoteUrl', () => { - test('Returns HTTPS ADO URLs as-is', () => { - assert.strictEqual( - getFormattedRemoteUrl('https://dev.azure.com/ms/example/_git/repo'), - 'https://dev.azure.com/ms/example/_git/repo'); - }); - - test('Returns HTTPS ADO URLs with leading organization as-is', () => { - assert.strictEqual( - getFormattedRemoteUrl('https://ms@dev.azure.com/ms/example/_git/repo'), - 'https://ms@dev.azure.com/ms/example/_git/repo'); - }); - - test('Returns an HTTPS VSTS URL from a SSH ADO URL', () => { - assert.strictEqual( - getFormattedRemoteUrl('git@ssh.dev.azure.com:v3/ms/example/repo'), - 'https://ms.visualstudio.com/example/_git/repo'); - }); - - test('Returns an HTTPS VSTS URL from a SSH VSTS URL', () => { - assert.strictEqual( - getFormattedRemoteUrl('ms@vs-ssh.visualstudio.com:v3/ms/example/repo'), - 'https://ms.visualstudio.com/example/_git/repo'); - }); - }); - - suite('getOldFormatBuildDefinitionUrl', () => { - test('Returns a legacy HTTPS VSTS build definition URL', () => { - assert.strictEqual( - getOldFormatBuildDefinitionUrl('ms', 'example', 42), - 'https://ms.visualstudio.com/example/_build?definitionId=42&_a=summary'); - }); - }); - - suite('getOldFormatBuildUrl', () => { - test('Returns a legacy HTTPS VSTS build URL', () => { - assert.strictEqual( - getOldFormatBuildUrl('ms', 'example', 42), - 'https://ms.visualstudio.com/example/_build/results?buildId=42&view=results'); - }); - }); -}); diff --git a/src/test/suite/configure/gitHubHelper.test.ts b/src/test/suite/configure/gitHubHelper.test.ts deleted file mode 100644 index fe6bf162..00000000 --- a/src/test/suite/configure/gitHubHelper.test.ts +++ /dev/null @@ -1,64 +0,0 @@ -import * as assert from 'assert'; -import { isGitHubUrl, getFormattedRemoteUrl, getRepositoryDetailsFromRemoteUrl } from '../../../configure/helper/gitHubHelper'; - -suite('GitHub Helper', () => { - suite('isGitHubUrl', () => { - test('Returns true for HTTPS GitHub URLs', () => { - assert.ok(isGitHubUrl('https://github.com/microsoft/azure-pipelines-vscode')); - }); - - test('Returns true for HTTPS GitHub URLs with trailing .git', () => { - assert.ok(isGitHubUrl('https://github.com/microsoft/azure-pipelines-vscode.git')); - }); - - test('Returns true for SSH GitHub URLs', () => { - assert.ok(isGitHubUrl('git@github.com:microsoft/azure-pipelines-vscode.git')); - }); - - test('Returns false for non-GitHub HTTPS URLs', () => { - assert.strictEqual( - isGitHubUrl('https://github.coms/microsoft/azure-pipelines-vscode'), - false); - }); - - test('Returns false for non-GitHub SSH URLs', () => { - assert.strictEqual( - isGitHubUrl('sgit@github.com:microsoft/azure-pipelines-vscode.git'), - false); - }); - }); - - suite('getRepositoryDetailsFromRemoteUrl', () => { - test('Returns owner and repo from an HTTPS URL', () => { - assert.deepStrictEqual( - getRepositoryDetailsFromRemoteUrl('https://github.com/microsoft/azure-pipelines-vscode'), - { ownerName: 'microsoft', repositoryName: 'azure-pipelines-vscode' }); - }); - - test('Returns owner from an HTTPS URL with trailing .git', () => { - assert.deepStrictEqual( - getRepositoryDetailsFromRemoteUrl('https://github.com/microsoft/azure-pipelines-vscode.git'), - { ownerName: 'microsoft', repositoryName: 'azure-pipelines-vscode' }); - }); - - test('Returns owner from a SSH URL', () => { - assert.deepStrictEqual( - getRepositoryDetailsFromRemoteUrl('git@github.com:microsoft/azure-pipelines-vscode.git'), - { ownerName: 'microsoft', repositoryName: 'azure-pipelines-vscode' }); - }); - }); - - suite('getFormattedRemoteUrl', () => { - test('Returns HTTPS URLs as-is', () => { - assert.strictEqual( - getFormattedRemoteUrl('https://github.com/microsoft/azure-pipelines-vscode.git'), - 'https://github.com/microsoft/azure-pipelines-vscode.git'); - }); - - test('Returns an HTTPS URL from a SSH URL', () => { - assert.strictEqual( - getFormattedRemoteUrl('git@github.com:microsoft/azure-pipelines-vscode.git'), - 'https://github.com/microsoft/azure-pipelines-vscode.git'); - }); - }); -}); diff --git a/src/typings/azure-account.api.d.ts b/src/typings/azure-account.api.d.ts deleted file mode 100644 index 7c5eaddb..00000000 --- a/src/typings/azure-account.api.d.ts +++ /dev/null @@ -1,71 +0,0 @@ -// https://github.com/microsoft/vscode-azure-account/blob/v0.9.11/src/azure-account.api.d.ts -// This is the version right before they started versioning their API. - -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -import { Event, Terminal, Progress, CancellationToken } from 'vscode'; -import { ServiceClientCredentials } from 'ms-rest'; -import { ReadStream } from 'fs'; -import { TokenCredentialsBase } from '@azure/ms-rest-nodeauth'; -import { Environment } from '@azure/ms-rest-azure-env'; -import { SubscriptionModels } from '@azure/arm-subscriptions'; - -export type AzureLoginStatus = 'Initializing' | 'LoggingIn' | 'LoggedIn' | 'LoggedOut'; - -export interface AzureAccount { - readonly status: AzureLoginStatus; - readonly onStatusChanged: Event; - readonly waitForLogin: () => Promise; - readonly sessions: AzureSession[]; - readonly onSessionsChanged: Event; - readonly subscriptions: AzureSubscription[]; - readonly onSubscriptionsChanged: Event; - readonly waitForSubscriptions: () => Promise; - readonly filters: AzureResourceFilter[]; - readonly onFiltersChanged: Event; - readonly waitForFilters: () => Promise; - createCloudShell(os: 'Linux' | 'Windows'): CloudShell; -} - -export interface AzureSession { - readonly environment: Environment; - readonly userId: string; - readonly tenantId: string; - - /** - * The credentials object for azure-sdk-for-node modules https://github.com/azure/azure-sdk-for-node - */ - readonly credentials: ServiceClientCredentials; - - /** - * The credentials object for azure-sdk-for-js modules https://github.com/azure/azure-sdk-for-js - */ - readonly credentials2: TokenCredentialsBase; -} - -export interface AzureSubscription { - readonly session: AzureSession; - readonly subscription: SubscriptionModels.Subscription; -} - -export type AzureResourceFilter = AzureSubscription; - -export type CloudShellStatus = 'Connecting' | 'Connected' | 'Disconnected'; - -export interface UploadOptions { - contentLength?: number; - progress?: Progress<{ message?: string; increment?: number }>; - token?: CancellationToken; -} - -export interface CloudShell { - readonly status: CloudShellStatus; - readonly onStatusChanged: Event; - readonly waitForConnection: () => Promise; - readonly terminal: Promise; - readonly session: Promise; - readonly uploadFile: (filename: string, stream: ReadStream, options?: UploadOptions) => Promise; -} diff --git a/tsconfig.json b/tsconfig.json index 24bf8227..d4ecd6dd 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,8 +1,5 @@ { "compilerOptions": { - /* List of library files to be included in the compilation. */ - "lib": [ "es2019" ], - /* Specify module code generation. */ "module": "ES2022", @@ -42,9 +39,7 @@ "strict": true, /* Specify ECMAScript target version. */ - "target": "es2019", - - "skipLibCheck": true // https://github.com/Azure/ms-rest-js/issues/367 + "target": "ES2022", }, "include": [ "src" diff --git a/webpack.config.js b/webpack.config.js index b09d256c..5f4ab254 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -3,7 +3,6 @@ 'use strict'; const path = require('path'); -const CopyPlugin = require('copy-webpack-plugin'); /** @type {import('webpack').Configuration} */ const config = { @@ -40,18 +39,5 @@ const config = { } ] }, - plugins: [ - new CopyPlugin({ - patterns: [ - { from: 'src/configure/templates', to: 'configure/templates' }, - ], - }), - ], - // Disable optimization until vscode-azure-account supports @azure/core-auth - // and we move off of @azure/ms-rest-nodeauth. - // https://github.com/Azure/ms-rest-nodeauth/issues/83 - optimization: { - minimize: false, - }, }; module.exports = config;