diff --git a/.vscode/launch.json b/.vscode/launch.json index 375f156e8c..641dc386a3 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -265,6 +265,38 @@ "program": "${workspaceFolder}/node_modules/gulp/bin/gulp.js", "args": ["test:integration:razor:cohost"], "cwd": "${workspaceFolder}" + }, + { + "type": "node", + "request": "launch", + "name": "Debug Gulp Task", + "program": "${workspaceFolder}/node_modules/gulp/bin/gulp.js", + "args": ["${input:gulpTask}"], + "cwd": "${workspaceFolder}", + "sourceMaps": true, + "skipFiles": ["/**"] + }, + { + "type": "node", + "request": "launch", + "name": "Debug gulp insertion:roslyn", + "preLaunchTask": "build", + "program": "${workspaceFolder}/node_modules/gulp/bin/gulp.js", + "args": [ + "insertion:roslyn", + "--assetManifestPath=./test-manifests", + "--roslynRepoPath=../roslyn", + "--roslynEndSHA=2eaa09890be9bdc5ea662d54129991355e5c60bb", + "--roslynBuildNumber=5.0.0-2.25430.3", + "--roslynBuildId=2783326", + "--targetBranch=main", + "--githubPAT=${input:githubPAT}", + "--dryRun=false" + ], + "cwd": "${workspaceFolder}", + "console": "externalTerminal", + "sourceMaps": true, + "skipFiles": ["/**"] } ], "inputs": [ @@ -275,9 +307,15 @@ "options": ["singleCsproj", "RazorApp", "slnWithCsproj", "slnFilterWithCsproj", "slnWithGenerator"] }, { - "id": "gulpTaskName", - "description": "The name of the gulp task to debug", - "type": "promptString" + "id": "gulpTask", + "type": "promptString", + "description": "Enter the gulp task name to debug" + }, + { + "id": "githubPAT", + "type": "promptString", + "description": "Enter your GitHub Personal Access Token", + "password": true } ] } diff --git a/azure-pipelines/dotnet-vscode-csharp-insertion.yml b/azure-pipelines/dotnet-vscode-csharp-insertion.yml new file mode 100644 index 0000000000..357a3c3646 --- /dev/null +++ b/azure-pipelines/dotnet-vscode-csharp-insertion.yml @@ -0,0 +1,102 @@ +trigger: none +pr: none + +parameters: + - name: targetBranch + displayName: Target Branch for PR + type: string + default: main + +resources: + repositories: + - repository: 1ESPipelineTemplates + type: git + name: 1ESPipelineTemplates/1ESPipelineTemplates + ref: refs/tags/release + - repository: RoslynMirror + type: git + name: internal/dotnet-roslyn + pipelines: + - pipeline: officialBuildCI + source: dotnet-roslyn-official + project: internal + branch: main + trigger: none + +variables: + - name: RoslynEndSHA + value: $(resources.pipeline.officialBuildCI.sourceCommit) + - name: RoslynBuildNumber + value: $(resources.pipeline.officialBuildCI.runName) + - name: RoslynBuildId + value: $(resources.pipeline.officialBuildCI.runID) + - template: dotnet-variables.yml + +extends: + template: v1/1ES.Unofficial.PipelineTemplate.yml@1ESPipelineTemplates + parameters: + pool: + name: netcore1espool-internal + image: 1es-ubuntu-2204 + os: linux + stages: + - stage: BumpRoslyn + displayName: Bump Roslyn Version + jobs: + - job: ProcessBump + displayName: Process Roslyn Bump + pool: + name: netcore1espool-internal + image: 1es-ubuntu-2204 + os: linux + steps: + - checkout: self + persistCredentials: true + + - task: UseDotNet@2 + displayName: Install .NET SDK + inputs: + version: $(defaultDotnetVersion) + + - template: install-node.yml + + - task: DownloadPipelineArtifact@2 + displayName: Download Asset Manifests + inputs: + source: specific + project: internal + pipeline: dotnet-roslyn-official + runVersion: specific + runId: $(RoslynBuildId) + artifact: AssetManifests + path: $(Pipeline.Workspace)/AssetManifests + + - pwsh: | + npm ci + npm install + npm install -g gulp + gulp installDependencies + displayName: 'Install npm dependencies and gulp' + + - checkout: RoslynMirror + displayName: 'Checkout Roslyn repository' + path: roslyn + + - script: | + echo "Installing roslyn-tools..." + dotnet tool install -g Microsoft.RoslynTools --prerelease --add-source https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-eng/nuget/v3/index.json + echo "Verifying roslyn-tools installation..." + dotnet tool list -g + roslyn-tools --help + displayName: 'Install roslyn-tools CLI' + + - task: Npm@1 + displayName: Run Roslyn insertion + env: + GITHUB_TOKEN: $(System.AccessToken) + GitHubPAT: $(System.AccessToken) + inputs: + command: custom + customCommand: 'run gulp -- insertion:roslyn --assetManifestPath=$(Pipeline.Workspace)/AssetManifests --roslynRepoPath=$(Pipeline.Workspace)/roslyn --roslynEndSHA=$(RoslynEndSHA) --roslynBuildNumber=$(RoslynBuildNumber) --roslynBuildId=$(RoslynBuildId) --targetBranch=${{ parameters.targetBranch }} --githubPAT=$(System.AccessToken) --dryRun=false' + + diff --git a/gulpfile.ts b/gulpfile.ts index ef52553ced..e4f8732493 100644 --- a/gulpfile.ts +++ b/gulpfile.ts @@ -12,3 +12,4 @@ require('./tasks/debuggerTasks'); require('./tasks/snapTasks'); require('./tasks/signingTasks'); require('./tasks/profilingTasks'); +require('./tasks/insertionTasks'); diff --git a/package-lock.json b/package-lock.json index 540426363f..b21680515b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -33,6 +33,7 @@ "vscode-languageserver-textdocument": "1.0.12", "vscode-languageserver-types": "3.17.6-next.6", "vscode-nls": "5.0.1", + "xml2js": "^0.6.2", "yauzl": "2.10.0" }, "devDependencies": { @@ -46,6 +47,7 @@ "@types/tmp": "0.0.33", "@types/uuid": "^9.0.1", "@types/vscode": "1.93.0", + "@types/xml2js": "^0.4.14", "@types/yauzl": "2.10.0", "@typescript-eslint/eslint-plugin": "^8.19.0", "@typescript-eslint/parser": "^8.19.0", @@ -63,7 +65,7 @@ "eslint-plugin-promise": "^6.1.1", "eslint-plugin-unicorn": "^47.0.0", "get-port": "5.1.1", - "gulp": "5.0.0", + "gulp": "^5.0.1", "jest": "^29.6.2", "jest-junit": "^16.0.0", "mock-http-server": "1.4.2", @@ -3672,6 +3674,16 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/xml2js": { + "version": "0.4.14", + "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@types/xml2js/-/xml2js-0.4.14.tgz", + "integrity": "sha1-XUYqKnMwNF4jCca1SaGDo3bej5o=", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/yargs": { "version": "17.0.24", "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@types/yargs/-/yargs-17.0.24.tgz", @@ -4197,6 +4209,20 @@ "dev": true, "license": "MIT" }, + "node_modules/@vscode/l10n-dev/node_modules/xml2js": { + "version": "0.5.0", + "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/xml2js/-/xml2js-0.5.0.tgz", + "integrity": "sha1-2UQGMfuy7YACA/rRBvJyT2LEk7c=", + "dev": true, + "license": "MIT", + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, "node_modules/@vscode/l10n-dev/node_modules/yargs": { "version": "17.7.2", "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/yargs/-/yargs-17.7.2.tgz", @@ -4588,6 +4614,20 @@ "node": "20 || >=22" } }, + "node_modules/@vscode/vsce/node_modules/xml2js": { + "version": "0.5.0", + "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/xml2js/-/xml2js-0.5.0.tgz", + "integrity": "sha1-2UQGMfuy7YACA/rRBvJyT2LEk7c=", + "dev": true, + "license": "MIT", + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, "node_modules/acorn": { "version": "8.12.1", "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/acorn/-/acorn-8.12.1.tgz", @@ -4940,9 +4980,9 @@ } }, "node_modules/b4a": { - "version": "1.6.6", - "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/b4a/-/b4a-1.6.6.tgz", - "integrity": "sha1-pMw0mjhRmHw8SsLXeFwYdE9tqbo=", + "version": "1.6.7", + "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/b4a/-/b4a-1.6.7.tgz", + "integrity": "sha1-qZWH1Ou/vVpuOyG9tdX6OFdnq+Q=", "dev": true, "license": "Apache-2.0" }, @@ -5128,9 +5168,9 @@ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, "node_modules/bare-events": { - "version": "2.3.1", - "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/bare-events/-/bare-events-2.3.1.tgz", - "integrity": "sha1-WvLuC+lXj4Hjwaqbw6aivPIjB84=", + "version": "2.6.1", + "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/bare-events/-/bare-events-2.6.1.tgz", + "integrity": "sha1-95Oyi9w9zxR9fPAfiCpvCxLMxKI=", "dev": true, "license": "Apache-2.0", "optional": true @@ -5146,15 +5186,6 @@ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/before-after-hook/-/before-after-hook-2.2.3.tgz", "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==" }, - "node_modules/big.js": { - "version": "5.2.2", - "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "dev": true, - "engines": { - "node": "*" - } - }, "node_modules/binary-extensions": { "version": "2.2.0", "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -5705,13 +5736,6 @@ "node": ">=0.8" } }, - "node_modules/clone-stats": { - "version": "1.0.0", - "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/clone-stats/-/clone-stats-1.0.0.tgz", - "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", - "dev": true, - "license": "MIT" - }, "node_modules/co": { "version": "4.6.0", "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/co/-/co-4.6.0.tgz", @@ -5856,16 +5880,6 @@ "node": ">= 10.13.0" } }, - "node_modules/copy-props/node_modules/is-plain-object": { - "version": "5.0.0", - "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha1-RCf1CrNCnpAl6n1S6QQ6nvQVk0Q=", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/core-util-is": { "version": "1.0.2", "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/core-util-is/-/core-util-is-1.0.2.tgz", @@ -6250,16 +6264,6 @@ "node": ">= 10.13.0" } }, - "node_modules/each-props/node_modules/is-plain-object": { - "version": "5.0.0", - "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha1-RCf1CrNCnpAl6n1S6QQ6nvQVk0Q=", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/eastasianwidth": { "version": "0.2.0", "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/eastasianwidth/-/eastasianwidth-0.2.0.tgz", @@ -6305,15 +6309,6 @@ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, - "node_modules/emojis-list": { - "version": "3.0.0", - "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, "node_modules/encodeurl": { "version": "1.0.2", "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/encodeurl/-/encodeurl-1.0.2.tgz", @@ -7693,16 +7688,6 @@ "node": ">= 10.13.0" } }, - "node_modules/fined/node_modules/is-plain-object": { - "version": "5.0.0", - "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha1-RCf1CrNCnpAl6n1S6QQ6nvQVk0Q=", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/flagged-respawn": { "version": "2.0.0", "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/flagged-respawn/-/flagged-respawn-2.0.0.tgz", @@ -8142,9 +8127,9 @@ } }, "node_modules/glob-stream": { - "version": "8.0.2", - "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/glob-stream/-/glob-stream-8.0.2.tgz", - "integrity": "sha1-CeWBjkHBbdhSdNcsenFY0wdCYxM=", + "version": "8.0.3", + "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/glob-stream/-/glob-stream-8.0.3.tgz", + "integrity": "sha1-h+YxU6rfBb0CB83holPuOdkUWLk=", "dev": true, "license": "MIT", "dependencies": { @@ -8290,16 +8275,16 @@ "dev": true }, "node_modules/gulp": { - "version": "5.0.0", - "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/gulp/-/gulp-5.0.0.tgz", - "integrity": "sha1-ePS4rEigv2GzVNOeW+hE3ixcw/M=", + "version": "5.0.1", + "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/gulp/-/gulp-5.0.1.tgz", + "integrity": "sha1-xD83qjRWnhAfttpOC0ZGdzBazTY=", "dev": true, "license": "MIT", "dependencies": { "glob-watcher": "^6.0.0", - "gulp-cli": "^3.0.0", + "gulp-cli": "^3.1.0", "undertaker": "^2.0.0", - "vinyl-fs": "^4.0.0" + "vinyl-fs": "^4.0.2" }, "bin": { "gulp": "bin/gulp.js" @@ -8309,9 +8294,9 @@ } }, "node_modules/gulp-cli": { - "version": "3.0.0", - "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/gulp-cli/-/gulp-cli-3.0.0.tgz", - "integrity": "sha1-V3AI9TI/rWEGtE2ySAPCfDpkmEE=", + "version": "3.1.0", + "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/gulp-cli/-/gulp-cli-3.1.0.tgz", + "integrity": "sha1-klkOmyCRQrF2yVrVxwZtJZIBcmg=", "dev": true, "license": "MIT", "dependencies": { @@ -8320,7 +8305,7 @@ "copy-props": "^4.0.0", "gulplog": "^2.2.0", "interpret": "^3.1.1", - "liftoff": "^5.0.0", + "liftoff": "^5.0.1", "mute-stdout": "^2.0.0", "replace-homedir": "^2.0.0", "semver-greatest-satisfied-range": "^2.0.0", @@ -9030,6 +9015,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha1-RCf1CrNCnpAl6n1S6QQ6nvQVk0Q=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-regex": { "version": "1.1.4", "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/is-regex/-/is-regex-1.1.4.tgz", @@ -9204,6 +9199,7 @@ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/isobject/-/isobject-3.0.1.tgz", "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -11341,9 +11337,9 @@ } }, "node_modules/liftoff": { - "version": "5.0.0", - "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/liftoff/-/liftoff-5.0.0.tgz", - "integrity": "sha1-Dl7SdbwzTK7A5VHs8IuyK+WD4jY=", + "version": "5.0.1", + "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/liftoff/-/liftoff-5.0.1.tgz", + "integrity": "sha1-4jKefx4Z6YyNunEYXyB45tu8XB8=", "dev": true, "license": "MIT", "dependencies": { @@ -11359,16 +11355,6 @@ "node": ">=10.13.0" } }, - "node_modules/liftoff/node_modules/is-plain-object": { - "version": "5.0.0", - "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha1-RCf1CrNCnpAl6n1S6QQ6nvQVk0Q=", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/lines-and-columns/-/lines-and-columns-1.2.4.tgz", @@ -12925,13 +12911,6 @@ } ] }, - "node_modules/queue-tick": { - "version": "1.0.1", - "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/queue-tick/-/queue-tick-1.0.1.tgz", - "integrity": "sha1-9vB6yCwf1g+C4Ji0F6gOUvH0wUI=", - "dev": true, - "license": "MIT" - }, "node_modules/random-bytes": { "version": "1.0.0", "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/random-bytes/-/random-bytes-1.0.0.tgz", @@ -13346,8 +13325,7 @@ "node_modules/sax": { "version": "1.2.4", "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" }, "node_modules/semver": { "version": "7.5.4", @@ -13618,14 +13596,13 @@ "license": "MIT" }, "node_modules/streamx": { - "version": "2.18.0", - "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/streamx/-/streamx-2.18.0.tgz", - "integrity": "sha1-W8GlHrQSpmfr/c1ObPam/GVyGsc=", + "version": "2.22.1", + "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/streamx/-/streamx-2.22.1.tgz", + "integrity": "sha1-yXy7DOGNpPTbWpcdyato/13H9aU=", "dev": true, "license": "MIT", "dependencies": { "fast-fifo": "^1.3.2", - "queue-tick": "^1.0.1", "text-decoder": "^1.1.0" }, "optionalDependencies": { @@ -13909,9 +13886,9 @@ } }, "node_modules/text-decoder": { - "version": "1.1.0", - "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/text-decoder/-/text-decoder-1.1.0.tgz", - "integrity": "sha1-M3nnKPz004k+wa6jXowsrCFe8ZA=", + "version": "1.2.3", + "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/text-decoder/-/text-decoder-1.2.3.tgz", + "integrity": "sha1-sZ2jZNmBsjJtX0MJnDEMyA13DGU=", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -14453,14 +14430,13 @@ } }, "node_modules/vinyl": { - "version": "3.0.0", - "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/vinyl/-/vinyl-3.0.0.tgz", - "integrity": "sha1-EeFHMr9W4vqpj/3lFX/mwTJZ/zA=", + "version": "3.0.1", + "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/vinyl/-/vinyl-3.0.1.tgz", + "integrity": "sha1-X1/4UlW9orXaJeSzvYCz/Ad/tak=", "dev": true, "license": "MIT", "dependencies": { "clone": "^2.1.2", - "clone-stats": "^1.0.0", "remove-trailing-separator": "^1.1.0", "replace-ext": "^2.0.0", "teex": "^1.0.1" @@ -14543,14 +14519,14 @@ } }, "node_modules/vinyl-fs": { - "version": "4.0.0", - "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/vinyl-fs/-/vinyl-fs-4.0.0.tgz", - "integrity": "sha1-Bss278kRxuEoRS8jC5ZYSpEzw6E=", + "version": "4.0.2", + "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/vinyl-fs/-/vinyl-fs-4.0.2.tgz", + "integrity": "sha1-1GVXZT5KcQnynWJqnPR4aAx/jHA=", "dev": true, "license": "MIT", "dependencies": { "fs-mkdirp-stream": "^2.0.1", - "glob-stream": "^8.0.0", + "glob-stream": "^8.0.3", "graceful-fs": "^4.2.11", "iconv-lite": "^0.6.3", "is-valid-glob": "^1.0.0", @@ -14561,7 +14537,7 @@ "streamx": "^2.14.0", "to-through": "^3.0.0", "value-or-function": "^4.0.0", - "vinyl": "^3.0.0", + "vinyl": "^3.0.1", "vinyl-sourcemap": "^2.0.0" }, "engines": { @@ -14746,8 +14722,9 @@ "node_modules/which": { "version": "1.3.1", "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "integrity": "sha1-pFBD1U9YBTFtqNYvn1CRjT2nCwo=", "dev": true, + "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -14931,10 +14908,10 @@ "dev": true }, "node_modules/xml2js": { - "version": "0.5.0", - "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/xml2js/-/xml2js-0.5.0.tgz", - "integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==", - "dev": true, + "version": "0.6.2", + "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/xml2js/-/xml2js-0.6.2.tgz", + "integrity": "sha1-3QtjAIOqCcFh4lpNCQHisqkptJk=", + "license": "MIT", "dependencies": { "sax": ">=0.6.0", "xmlbuilder": "~11.0.0" @@ -14947,7 +14924,6 @@ "version": "11.0.1", "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/xmlbuilder/-/xmlbuilder-11.0.1.tgz", "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", - "dev": true, "engines": { "node": ">=4.0" } @@ -17776,6 +17752,15 @@ "integrity": "sha1-HNdXPgJyrvnDV7r8Y1thd8FUAT4=", "dev": true }, + "@types/xml2js": { + "version": "0.4.14", + "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@types/xml2js/-/xml2js-0.4.14.tgz", + "integrity": "sha1-XUYqKnMwNF4jCca1SaGDo3bej5o=", + "dev": true, + "requires": { + "@types/node": "*" + } + }, "@types/yargs": { "version": "17.0.24", "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@types/yargs/-/yargs-17.0.24.tgz", @@ -18130,6 +18115,16 @@ "integrity": "sha1-+NP30OxMPeo1p+PI76TLi0XJ5+4=", "dev": true }, + "xml2js": { + "version": "0.5.0", + "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/xml2js/-/xml2js-0.5.0.tgz", + "integrity": "sha1-2UQGMfuy7YACA/rRBvJyT2LEk7c=", + "dev": true, + "requires": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + } + }, "yargs": { "version": "17.7.2", "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/yargs/-/yargs-17.7.2.tgz", @@ -18312,6 +18307,16 @@ "dev": true } } + }, + "xml2js": { + "version": "0.5.0", + "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/xml2js/-/xml2js-0.5.0.tgz", + "integrity": "sha1-2UQGMfuy7YACA/rRBvJyT2LEk7c=", + "dev": true, + "requires": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + } } } }, @@ -18654,9 +18659,9 @@ } }, "b4a": { - "version": "1.6.6", - "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/b4a/-/b4a-1.6.6.tgz", - "integrity": "sha1-pMw0mjhRmHw8SsLXeFwYdE9tqbo=", + "version": "1.6.7", + "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/b4a/-/b4a-1.6.7.tgz", + "integrity": "sha1-qZWH1Ou/vVpuOyG9tdX6OFdnq+Q=", "dev": true }, "babel-jest": { @@ -18797,9 +18802,9 @@ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, "bare-events": { - "version": "2.3.1", - "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/bare-events/-/bare-events-2.3.1.tgz", - "integrity": "sha1-WvLuC+lXj4Hjwaqbw6aivPIjB84=", + "version": "2.6.1", + "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/bare-events/-/bare-events-2.6.1.tgz", + "integrity": "sha1-95Oyi9w9zxR9fPAfiCpvCxLMxKI=", "dev": true, "optional": true }, @@ -18814,12 +18819,6 @@ "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/before-after-hook/-/before-after-hook-2.2.3.tgz", "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==" }, - "big.js": { - "version": "5.2.2", - "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "dev": true - }, "binary-extensions": { "version": "2.2.0", "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -19228,12 +19227,6 @@ "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", "dev": true }, - "clone-stats": { - "version": "1.0.0", - "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/clone-stats/-/clone-stats-1.0.0.tgz", - "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", - "dev": true - }, "co": { "version": "4.6.0", "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/co/-/co-4.6.0.tgz", @@ -19352,14 +19345,6 @@ "requires": { "each-props": "^3.0.0", "is-plain-object": "^5.0.0" - }, - "dependencies": { - "is-plain-object": { - "version": "5.0.0", - "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha1-RCf1CrNCnpAl6n1S6QQ6nvQVk0Q=", - "dev": true - } } }, "core-util-is": { @@ -19623,14 +19608,6 @@ "requires": { "is-plain-object": "^5.0.0", "object.defaults": "^1.1.0" - }, - "dependencies": { - "is-plain-object": { - "version": "5.0.0", - "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha1-RCf1CrNCnpAl6n1S6QQ6nvQVk0Q=", - "dev": true - } } }, "eastasianwidth": { @@ -19672,12 +19649,6 @@ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, - "emojis-list": { - "version": "3.0.0", - "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "dev": true - }, "encodeurl": { "version": "1.0.2", "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/encodeurl/-/encodeurl-1.0.2.tgz", @@ -20708,14 +20679,6 @@ "object.defaults": "^1.1.0", "object.pick": "^1.3.0", "parse-filepath": "^1.0.2" - }, - "dependencies": { - "is-plain-object": { - "version": "5.0.0", - "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha1-RCf1CrNCnpAl6n1S6QQ6nvQVk0Q=", - "dev": true - } } }, "flagged-respawn": { @@ -21023,9 +20986,9 @@ } }, "glob-stream": { - "version": "8.0.2", - "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/glob-stream/-/glob-stream-8.0.2.tgz", - "integrity": "sha1-CeWBjkHBbdhSdNcsenFY0wdCYxM=", + "version": "8.0.3", + "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/glob-stream/-/glob-stream-8.0.3.tgz", + "integrity": "sha1-h+YxU6rfBb0CB83holPuOdkUWLk=", "dev": true, "requires": { "@gulpjs/to-absolute-glob": "^4.0.0", @@ -21128,21 +21091,21 @@ "dev": true }, "gulp": { - "version": "5.0.0", - "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/gulp/-/gulp-5.0.0.tgz", - "integrity": "sha1-ePS4rEigv2GzVNOeW+hE3ixcw/M=", + "version": "5.0.1", + "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/gulp/-/gulp-5.0.1.tgz", + "integrity": "sha1-xD83qjRWnhAfttpOC0ZGdzBazTY=", "dev": true, "requires": { "glob-watcher": "^6.0.0", - "gulp-cli": "^3.0.0", + "gulp-cli": "^3.1.0", "undertaker": "^2.0.0", - "vinyl-fs": "^4.0.0" + "vinyl-fs": "^4.0.2" } }, "gulp-cli": { - "version": "3.0.0", - "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/gulp-cli/-/gulp-cli-3.0.0.tgz", - "integrity": "sha1-V3AI9TI/rWEGtE2ySAPCfDpkmEE=", + "version": "3.1.0", + "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/gulp-cli/-/gulp-cli-3.1.0.tgz", + "integrity": "sha1-klkOmyCRQrF2yVrVxwZtJZIBcmg=", "dev": true, "requires": { "@gulpjs/messages": "^1.1.0", @@ -21150,7 +21113,7 @@ "copy-props": "^4.0.0", "gulplog": "^2.2.0", "interpret": "^3.1.1", - "liftoff": "^5.0.0", + "liftoff": "^5.0.1", "mute-stdout": "^2.0.0", "replace-homedir": "^2.0.0", "semver-greatest-satisfied-range": "^2.0.0", @@ -21626,6 +21589,12 @@ "has-tostringtag": "^1.0.0" } }, + "is-plain-object": { + "version": "5.0.0", + "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha1-RCf1CrNCnpAl6n1S6QQ6nvQVk0Q=", + "dev": true + }, "is-regex": { "version": "1.1.4", "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/is-regex/-/is-regex-1.1.4.tgz", @@ -23342,9 +23311,9 @@ } }, "liftoff": { - "version": "5.0.0", - "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/liftoff/-/liftoff-5.0.0.tgz", - "integrity": "sha1-Dl7SdbwzTK7A5VHs8IuyK+WD4jY=", + "version": "5.0.1", + "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/liftoff/-/liftoff-5.0.1.tgz", + "integrity": "sha1-4jKefx4Z6YyNunEYXyB45tu8XB8=", "dev": true, "requires": { "extend": "^3.0.2", @@ -23354,14 +23323,6 @@ "is-plain-object": "^5.0.0", "rechoir": "^0.8.0", "resolve": "^1.20.0" - }, - "dependencies": { - "is-plain-object": { - "version": "5.0.0", - "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha1-RCf1CrNCnpAl6n1S6QQ6nvQVk0Q=", - "dev": true - } } }, "lines-and-columns": { @@ -24540,12 +24501,6 @@ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "dev": true }, - "queue-tick": { - "version": "1.0.1", - "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/queue-tick/-/queue-tick-1.0.1.tgz", - "integrity": "sha1-9vB6yCwf1g+C4Ji0F6gOUvH0wUI=", - "dev": true - }, "random-bytes": { "version": "1.0.0", "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/random-bytes/-/random-bytes-1.0.0.tgz", @@ -24852,8 +24807,7 @@ "sax": { "version": "1.2.4", "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" }, "semver": { "version": "7.5.4", @@ -25053,14 +25007,13 @@ "dev": true }, "streamx": { - "version": "2.18.0", - "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/streamx/-/streamx-2.18.0.tgz", - "integrity": "sha1-W8GlHrQSpmfr/c1ObPam/GVyGsc=", + "version": "2.22.1", + "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/streamx/-/streamx-2.22.1.tgz", + "integrity": "sha1-yXy7DOGNpPTbWpcdyato/13H9aU=", "dev": true, "requires": { "bare-events": "^2.2.0", "fast-fifo": "^1.3.2", - "queue-tick": "^1.0.1", "text-decoder": "^1.1.0" } }, @@ -25279,9 +25232,9 @@ } }, "text-decoder": { - "version": "1.1.0", - "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/text-decoder/-/text-decoder-1.1.0.tgz", - "integrity": "sha1-M3nnKPz004k+wa6jXowsrCFe8ZA=", + "version": "1.2.3", + "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/text-decoder/-/text-decoder-1.2.3.tgz", + "integrity": "sha1-sZ2jZNmBsjJtX0MJnDEMyA13DGU=", "dev": true, "requires": { "b4a": "^1.6.4" @@ -25659,13 +25612,12 @@ "dev": true }, "vinyl": { - "version": "3.0.0", - "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/vinyl/-/vinyl-3.0.0.tgz", - "integrity": "sha1-EeFHMr9W4vqpj/3lFX/mwTJZ/zA=", + "version": "3.0.1", + "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/vinyl/-/vinyl-3.0.1.tgz", + "integrity": "sha1-X1/4UlW9orXaJeSzvYCz/Ad/tak=", "dev": true, "requires": { "clone": "^2.1.2", - "clone-stats": "^1.0.0", "remove-trailing-separator": "^1.1.0", "replace-ext": "^2.0.0", "teex": "^1.0.1" @@ -25722,13 +25674,13 @@ } }, "vinyl-fs": { - "version": "4.0.0", - "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/vinyl-fs/-/vinyl-fs-4.0.0.tgz", - "integrity": "sha1-Bss278kRxuEoRS8jC5ZYSpEzw6E=", + "version": "4.0.2", + "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/vinyl-fs/-/vinyl-fs-4.0.2.tgz", + "integrity": "sha1-1GVXZT5KcQnynWJqnPR4aAx/jHA=", "dev": true, "requires": { "fs-mkdirp-stream": "^2.0.1", - "glob-stream": "^8.0.0", + "glob-stream": "^8.0.3", "graceful-fs": "^4.2.11", "iconv-lite": "^0.6.3", "is-valid-glob": "^1.0.0", @@ -25739,7 +25691,7 @@ "streamx": "^2.14.0", "to-through": "^3.0.0", "value-or-function": "^4.0.0", - "vinyl": "^3.0.0", + "vinyl": "^3.0.1", "vinyl-sourcemap": "^2.0.0" }, "dependencies": { @@ -25891,7 +25843,7 @@ "which": { "version": "1.3.1", "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "integrity": "sha1-pFBD1U9YBTFtqNYvn1CRjT2nCwo=", "dev": true, "requires": { "isexe": "^2.0.0" @@ -26026,10 +25978,9 @@ "dev": true }, "xml2js": { - "version": "0.5.0", - "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/xml2js/-/xml2js-0.5.0.tgz", - "integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==", - "dev": true, + "version": "0.6.2", + "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/xml2js/-/xml2js-0.6.2.tgz", + "integrity": "sha1-3QtjAIOqCcFh4lpNCQHisqkptJk=", "requires": { "sax": ">=0.6.0", "xmlbuilder": "~11.0.0" @@ -26038,8 +25989,7 @@ "xmlbuilder": { "version": "11.0.1", "resolved": "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", - "dev": true + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==" }, "y18n": { "version": "5.0.8", diff --git a/package.json b/package.json index 7ef1eab978..c0ab9688fc 100644 --- a/package.json +++ b/package.json @@ -40,8 +40,8 @@ "workspace" ], "defaults": { - "roslyn": "5.0.0-2.25412.5", - "omniSharp": "1.39.14", + "roslyn": "5.0.0-2.25430.3", + "omniSharp": "1.39.14", "razor": "10.0.0-preview.25419.3", "razorOmnisharp": "7.0.0-preview.23363.1", "xamlTools": "17.14.36106.43" diff --git a/tasks/createTagsTasks.ts b/tasks/createTagsTasks.ts index a5589e9d74..e92bde07d4 100644 --- a/tasks/createTagsTasks.ts +++ b/tasks/createTagsTasks.ts @@ -4,12 +4,10 @@ *--------------------------------------------------------------------------------------------*/ import * as gulp from 'gulp'; -import * as fs from 'fs'; import minimist from 'minimist'; import { Octokit } from '@octokit/rest'; -import { allNugetPackages, NugetPackageInfo, platformSpecificPackages } from './offlinePackagingTasks'; -import { PlatformInformation } from '../src/shared/platform'; -import path from 'path'; +import { allNugetPackages } from './offlinePackagingTasks'; +import { getCommitFromNugetAsync } from './gitHelpers'; interface CreateTagsOptions { releaseVersion: string; @@ -194,53 +192,3 @@ function logWarning(message: string): void { function logError(message: string): void { console.log(`##vso[task.logissue type=error]${message}`); } - -async function getCommitFromNugetAsync(packageInfo: NugetPackageInfo): Promise { - const packageJsonString = fs.readFileSync('./package.json').toString(); - const packageJson = JSON.parse(packageJsonString); - const packageVersion = packageJson['defaults'][packageInfo.packageJsonName]; - if (!packageVersion) { - logError(`Can't find ${packageInfo.packageJsonName} version in package.json`); - return null; - } - - const platform = await PlatformInformation.GetCurrent(); - const vsixPlatformInfo = platformSpecificPackages.find( - (p) => p.platformInfo.platform === platform.platform && p.platformInfo.architecture === platform.architecture - )!; - - const packageName = packageInfo.getPackageName(vsixPlatformInfo); - console.log(`${packageName} version is ${packageVersion}`); - - // Nuget package should exist under out/.nuget/ since we have run the install dependencies task. - // Package names are always lower case in the .nuget folder. - const packageDir = path.join('out', '.nuget', packageName.toLowerCase(), packageVersion); - const nuspecFiles = fs.readdirSync(packageDir).filter((file) => file.endsWith('.nuspec')); - - if (nuspecFiles.length === 0) { - logError(`No .nuspec file found in ${packageDir}`); - return null; - } - - if (nuspecFiles.length > 1) { - logError(`Multiple .nuspec files found in ${packageDir}`); - return null; - } - - const nuspecFilePath = path.join(packageDir, nuspecFiles[0]); - const nuspecFile = fs.readFileSync(nuspecFilePath).toString(); - const results = /commit="(.*)"/.exec(nuspecFile); - if (results == null || results.length == 0) { - logError('Failed to find commit number from nuspec file'); - return null; - } - - if (results.length != 2) { - logError('Unexpected regex match result from nuspec file.'); - return null; - } - - const commitNumber = results[1]; - console.log(`commitNumber is ${commitNumber}`); - return commitNumber; -} diff --git a/tasks/gitHelpers.ts b/tasks/gitHelpers.ts new file mode 100644 index 0000000000..f5e7282b7c --- /dev/null +++ b/tasks/gitHelpers.ts @@ -0,0 +1,198 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { spawnSync } from 'child_process'; +import * as fs from 'fs'; +import * as path from 'path'; +import { Octokit } from '@octokit/rest'; +import { NugetPackageInfo, platformSpecificPackages } from './offlinePackagingTasks'; +import { PlatformInformation } from '../src/shared/platform'; + +export interface GitOptions { + commitSha: string; + targetRemoteRepo: string; + baseBranch: string; +} + +export interface BranchAndPROptions extends GitOptions { + githubPAT: string; + dryRun: boolean; + newBranchName: string; + userName?: string; + email?: string; +} + +// Logging utilities +export function logWarning(message: string): void { + console.log(`##vso[task.logissue type=warning]${message}`); +} + +export function logError(message: string): void { + console.log(`##vso[task.logissue type=error]${message}`); +} + +export async function git(args: string[], printCommand = true): Promise { + if (printCommand) { + console.log(`git ${args.join(' ')}`); + } + + const git = spawnSync('git', args); + if (git.status !== 0) { + const err = git.stderr.toString(); + if (printCommand) { + console.log(`Failed to execute git ${args.join(' ')}.`); + } + throw err; + } + + const stdout = git.stdout.toString(); + if (printCommand) { + console.log(stdout); + } + return stdout; +} + +export async function getCommitFromNugetAsync(packageInfo: NugetPackageInfo): Promise { + try { + const packageJsonString = fs.readFileSync('./package.json').toString(); + const packageJson = JSON.parse(packageJsonString); + const packageVersion = packageJson['defaults'][packageInfo.packageJsonName]; + if (!packageVersion) { + logError(`Can't find ${packageInfo.packageJsonName} version in package.json`); + return null; + } + + const platform = await PlatformInformation.GetCurrent(); + const vsixPlatformInfo = platformSpecificPackages.find( + (p) => p.platformInfo.platform === platform.platform && p.platformInfo.architecture === platform.architecture + )!; + + const packageName = packageInfo.getPackageName(vsixPlatformInfo); + console.log(`${packageName} version is ${packageVersion}`); + + // Nuget package should exist under out/.nuget/ since we have run the install dependencies task. + // Package names are always lower case in the .nuget folder. + const packageDir = path.join('out', '.nuget', packageName.toLowerCase(), packageVersion); + const nuspecFiles = fs.readdirSync(packageDir).filter((file) => file.endsWith('.nuspec')); + + if (nuspecFiles.length === 0) { + logError(`No .nuspec file found in ${packageDir}`); + return null; + } + + if (nuspecFiles.length > 1) { + logError(`Multiple .nuspec files found in ${packageDir}`); + return null; + } + + const nuspecFilePath = path.join(packageDir, nuspecFiles[0]); + const nuspecFile = fs.readFileSync(nuspecFilePath).toString(); + const results = /commit="(.*?)"/.exec(nuspecFile); + if (results == null || results.length === 0) { + logError('Failed to find commit number from nuspec file'); + return null; + } + + if (results.length !== 2) { + logError('Unexpected regex match result from nuspec file.'); + return null; + } + + const commitNumber = results[1]; + console.log(`commitNumber is ${commitNumber}`); + return commitNumber; + } catch (error) { + logError(`Error getting commit from NuGet package: ${error}`); + if (error instanceof Error && error.stack) { + console.log(`##[debug]${error.stack}`); + } + throw error; + } +} + +export async function createBranchAndPR( + options: BranchAndPROptions, + title: string, + commitMessage: string, + body?: string +): Promise { + const { githubPAT, targetRemoteRepo, baseBranch, dryRun, userName, email, newBranchName } = options; + const remoteRepoAlias = 'target'; + + // Set git user configuration if provided in options + if (userName) { + await git(['config', '--local', 'user.name', userName]); + } + if (email) { + await git(['config', '--local', 'user.email', email]); + } + + // Create and checkout new branch + await git(['checkout', '-b', newBranchName]); + + // Add and commit changes + await git(['add', '.']); + await git(['commit', '-m', commitMessage]); + + // Add remote and push + await git( + [ + 'remote', + 'add', + remoteRepoAlias, + `https://github.com/deepakrathore33/vscode-csharp.git`, + ], + false // Don't print command with PAT + ); + + await git(['fetch', remoteRepoAlias]); + + // Check if branch already exists on remote (refs/heads/) + const lsRemote = await git(['ls-remote', remoteRepoAlias, 'refs/heads/' + newBranchName]); + if (lsRemote.trim() !== '') { + console.log(`##vso[task.logissue type=error]${newBranchName} already exists in ${targetRemoteRepo}. Skip pushing.`); + return null; + } + + if (dryRun !== true) { + // Push the newly created branch to the target remote + await git(['push', '-u', remoteRepoAlias, newBranchName]); + } else { + console.log('[DRY RUN] Would have pushed branch to remote'); + } + + const octokit = new Octokit({ auth: githubPAT }); + + // Check for existing PRs with same title + const listPullRequest = await octokit.rest.pulls.list({ + owner: 'deepakrathore33', + repo: 'vscode-csharp', + }); + + if (listPullRequest.status !== 200) { + throw `Failed to get response from GitHub, http status code: ${listPullRequest.status}`; + } + + if (listPullRequest.data.some(pr => pr.title === title)) { + console.log('Pull request with the same name already exists. Skip creation.'); + return null; + } + + if (dryRun !== true) { + const pullRequest = await octokit.rest.pulls.create({ + body: body || title, + owner: 'deepakrathore33', + repo: 'vscode-csharp', + title: title, + head: newBranchName, + base: baseBranch, + }); + console.log(`Created pull request: ${pullRequest.data.html_url}.`); + return pullRequest.data.number; + } else { + console.log(`[DRY RUN] Would have created PR with title: "${title}" and body: "${body || title}"`); + return null; + } +} diff --git a/tasks/insertionTasks.ts b/tasks/insertionTasks.ts new file mode 100644 index 0000000000..6bc1e40f8d --- /dev/null +++ b/tasks/insertionTasks.ts @@ -0,0 +1,255 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as gulp from 'gulp'; +import * as fs from 'fs'; +import * as path from 'path'; +import minimist from 'minimist'; +import { exec } from 'child_process'; +import { promisify } from 'util'; +import * as xml2js from 'xml2js'; +import { allNugetPackages} from './offlinePackagingTasks'; +import {getCommitFromNugetAsync, logWarning, logError, createBranchAndPR, git } from './gitHelpers'; +import * as os from 'os'; + +const execAsync = promisify(exec); + +interface InsertionOptions { + roslynVersion?: string; + roslynEndSHA?: string; + roslynBuildId?: string; + roslynBuildNumber?: string; + assetManifestPath?: string; + roslynRepoPath?: string; + targetBranch?: string; + githubPAT?: string; + dryRun: boolean; +} + +gulp.task('insertion:roslyn', async (): Promise => { + const options = minimist(process.argv.slice(2)); + + console.log('Starting Roslyn insertion process...'); + + try { + // Step 1: Extract Roslyn version from AssetManifest + if (!options.assetManifestPath) { + throw new Error('assetManifestPath is required'); + } + + const newVersion = await extractRoslynVersionFromManifest(options.assetManifestPath); + if (!newVersion) { + throw new Error('Failed to extract Roslyn version from asset manifest'); + } + options.roslynVersion = newVersion; + console.log(`New Roslyn version: ${newVersion}`); + + // Step 2: Get current SHA from package + const currentSHA = await getCommitFromNugetAsync(allNugetPackages.roslyn); + if (!currentSHA) { + throw new Error('Could not determine current Roslyn SHA from package'); + } + console.log(`Current Roslyn SHA: ${currentSHA}`); + + // Step 3: Check if update needed + if (!options.roslynEndSHA) { + throw new Error('roslynEndSHA is required'); + } + + if (currentSHA === options.roslynEndSHA) { + console.log('No new commits to process - versions are identical'); + return; + } + + console.log(`Update needed: ${currentSHA}..${options.roslynEndSHA}`); + + // Step 4: Verify Roslyn repo exists + if (!options.roslynRepoPath) { + throw new Error('roslynRepoPath is required'); + } + await verifyRoslynRepo(options.roslynRepoPath); + + // Step 5: Generate PR list + const prList = await generatePRList(currentSHA, options.roslynEndSHA, options.roslynRepoPath, options); + console.log('PR List generated:', prList); + + // Check if PR list is null or empty (generation failed or no matching PRs) + if (!prList) { + console.log('No PRs with required labels found or PR list generation failed. Skipping insertion.'); + logWarning('No PRs with VSCode label found between the commits or PR list generation failed. Skipping insertion.'); + return; + } + + // Step 6: Update files + await updatePackageJson(options.roslynVersion); + + // Step 7: Create branch and PR + const prTitle = `Bump Roslyn to ${options.roslynVersion} (${options.roslynEndSHA?.substring(0, 8)})`; + + // Include build information in the PR description + let prBody = `This PR updates Roslyn to version ${options.roslynVersion} (${options.roslynEndSHA}).\n\n`; + + // Add build link if build information is available + if (options.roslynBuildNumber && options.roslynBuildId) { + prBody += `Build: [#${options.roslynBuildNumber}](https://dev.azure.com/dnceng/internal/_build/results?buildId=${options.roslynBuildId})\n\n`; + } + + // Add PR list + prBody += prList; + + const commitMessage = `Bump Roslyn to ${options.roslynVersion} (${options.roslynEndSHA?.substring(0, 8)})`; + + // Create the PR + const prNumber = await createBranchAndPR({ + ...options, + commitSha: options.roslynEndSHA!, + targetRemoteRepo: 'vscode-csharp', + baseBranch: options.targetBranch || 'main', + newBranchName: `insertion/${options.roslynEndSHA}`, + githubPAT: options.githubPAT!, + dryRun: options.dryRun, + userName: options.userName, + email: options.email + }, prTitle, commitMessage, prBody); + + // If PR was created and we're not in dry run mode, update the changelog with the PR number + if (prNumber && !options.dryRun) { + console.log(`PR #${prNumber} created. Updating changelog with PR link...`); + + // Update changelog with PR number (single call) + await updateChangelog(options.roslynVersion, prList, prNumber); + + // Create a second commit to include the updated changelog and push to update the PR + await git(['add', 'CHANGELOG.md']); + await git(['commit', '-m', `Update changelog with PR #${prNumber}`]); + await git(['push', 'target', `insertion/${options.roslynEndSHA}`]); + + console.log(`Changelog updated with PR #${prNumber} link.`); + } + + } catch (error) { + const errorMessage = error instanceof Error ? error.message : String(error); + logError(`Insertion failed: ${errorMessage}`); + if (error instanceof Error && error.stack) { + console.log(`##[debug]${error.stack}`); + } + throw error; + } +}); + +async function extractRoslynVersionFromManifest(manifestPath: string): Promise { + const xmlFile = path.join(manifestPath, 'OfficialBuild.xml'); + + if (!fs.existsSync(xmlFile)) { + logError(`OfficialBuild.xml not found at ${xmlFile}`); + return null; + } + + const xmlContent = fs.readFileSync(xmlFile, 'utf8'); + const parser = new xml2js.Parser(); + const result = await parser.parseStringPromise(xmlContent); + + const packages = result?.Build?.Package || []; + for (const pkg of packages) { + const attrs = pkg.$; + if (attrs?.Id === 'Microsoft.CodeAnalysis.Common') { + return attrs.Version; + } + } + + logError('Microsoft.CodeAnalysis.Common package not found in the asset manifest.'); + return null; +} + +async function verifyRoslynRepo(roslynRepoPath: string): Promise { + if (!fs.existsSync(roslynRepoPath)) { + throw new Error(`Roslyn repository not found at ${roslynRepoPath}`); + } + console.log(`Using Roslyn repository at ${roslynRepoPath}`); +} + +async function generatePRList(startSHA: string, endSHA: string, roslynRepoPath: string, _options: InsertionOptions): Promise { + console.log(`Generating PR list from ${startSHA} to ${endSHA}...`); + + try { + const { stdout } = await execAsync( + `cd "${roslynRepoPath}" && roslyn-tools pr-finder -s "${startSHA}" -e "${endSHA}" --format changelog --label VSCode`, + { maxBuffer: 10 * 1024 * 1024 } // 10MB buffer + ); + return stdout && stdout.trim() ? stdout : null; + } catch (error) { + const errorMessage = error instanceof Error ? error.message : String(error); + logWarning(`PR finder failed: ${errorMessage}`); + if (error instanceof Error && error.stack) { + console.log(`##[debug]${error.stack}`); + } + return null; + } +} + +async function updatePackageJson(newVersion: string): Promise { + console.log(`Updating package.json with Roslyn version ${newVersion}...`); + const packageJsonPath = 'package.json'; + const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8')); + + if (!packageJson.defaults) { + throw new Error('Could not find defaults section in package.json'); + } + packageJson.defaults.roslyn = newVersion; + + fs.writeFileSync(packageJsonPath, JSON.stringify(packageJson, null, 2) + '\n'); +} + +async function updateChangelog(version: string, prList: string | null, prNumber?: number): Promise { + console.log('Updating CHANGELOG.md...'); + const changelogPath = 'CHANGELOG.md'; + const text = fs.readFileSync(changelogPath, 'utf8'); + const NL = os.EOL; + + // Find the first top-level header "# ..." + const topHeaderRegex = /^(# .*?)(\r?\n|$)/m; + const headerMatch = topHeaderRegex.exec(text); + if (!headerMatch) { + throw new Error('CHANGELOG.md must contain at least one top-level header (#)'); + } + + const headerEndLineIndex = headerMatch.index + headerMatch[0].length; + + // Prepare new Roslyn block + let newRoslynBlock = `* Bump Roslyn to ${version}`; + + // Add PR number if available + if (prNumber) { + newRoslynBlock = `* Bump Roslyn to ${version} (PR: [#${prNumber}](https://github.com/dotnet/vscode-csharp/pull/${prNumber}))`; + } + + // Add PR list as sub-items if available + if (prList) { + const prLines = prList + .split(/\r?\n/) + .filter((l) => l.trim() && !l.includes('View Complete Diff')) + .map((line) => line.trim()); + + const formattedPRList = prLines.length > 0 + ? prLines.map((line) => ` ${line}`).join(NL) + : ''; + + if (formattedPRList) { + newRoslynBlock += NL + formattedPRList; + } + } + + // Insert the new block right after the header + const newText = + text.slice(0, headerEndLineIndex) + + NL + NL + // Add two newlines after the header + newRoslynBlock + + NL + // Add a newline after the block + (text.length > headerEndLineIndex ? NL + text.slice(headerEndLineIndex) : ''); + + // Write the updated content back to the file + fs.writeFileSync(changelogPath, newText, 'utf8'); + console.log('CHANGELOG.md updated successfully'); +} diff --git a/tasks/localizationTasks.ts b/tasks/localizationTasks.ts index bdb3d13c67..4fae9f9216 100644 --- a/tasks/localizationTasks.ts +++ b/tasks/localizationTasks.ts @@ -10,7 +10,7 @@ import { spawnSync } from 'node:child_process'; import * as path from 'path'; import * as util from 'node:util'; import { EOL } from 'node:os'; -import { Octokit } from '@octokit/rest'; +import { createBranchAndPR } from './gitHelpers'; type Options = { userName?: string; @@ -76,70 +76,29 @@ gulp.task('publish localization content', async () => { } console.log(`Changed files going to be staged: ${diff}`); - const newBranchName = `localization/${parsedArgs.commitSha}`; - // Make this optional so it can be tested locally by using dev's information. In real CI user name and email are always supplied. - if (parsedArgs.userName) { - await git(['config', '--local', 'user.name', parsedArgs.userName]); - } - if (parsedArgs.email) { - await git(['config', '--local', 'user.email', parsedArgs.email]); - } - - await git(['checkout', '-b', newBranchName]); - await git(['commit', '-m', `Localization result of ${parsedArgs.commitSha}.`]); - + const title = `Localization result based on ${parsedArgs.commitSha}`; + const commitMessage = `Localization result of ${parsedArgs.commitSha}`; const pat = process.env['GitHubPAT']; if (!pat) { throw 'No GitHub Pat found.'; } - - const remoteRepoAlias = 'targetRepo'; - await git( - [ - 'remote', - 'add', - remoteRepoAlias, - `https://${parsedArgs.userName}:${pat}@github.com/dotnet/${parsedArgs.targetRemoteRepo}.git`, - ], - // Note: don't print PAT to console - false - ); - await git(['fetch', remoteRepoAlias]); - - const lsRemote = await git(['ls-remote', remoteRepoAlias, 'refs/head/' + newBranchName]); - if (lsRemote.trim() !== '') { - // If the localization branch of this commit already exists, don't try to create another one. - console.log( - `##vso[task.logissue type=error]${newBranchName} already exists in ${parsedArgs.targetRemoteRepo}. Skip pushing.` + try { + await createBranchAndPR( + { + commitSha: parsedArgs.commitSha, + targetRemoteRepo: parsedArgs.targetRemoteRepo, + baseBranch: parsedArgs.baseBranch, + githubPAT: process.env['GitHubPAT'] || '', + dryRun: false, + newBranchName: `localization/${parsedArgs.commitSha}`, + userName: parsedArgs.userName, + email: parsedArgs.email + }, + title, + commitMessage ); - } else { - await git(['push', '-u', remoteRepoAlias]); - } - - const octokit = new Octokit({ auth: pat }); - const listPullRequest = await octokit.rest.pulls.list({ - owner: 'dotnet', - repo: parsedArgs.targetRemoteRepo, - }); - - if (listPullRequest.status != 200) { - throw `Failed get response from GitHub, http status code: ${listPullRequest.status}`; - } - - const title = `Localization result based on ${parsedArgs.commitSha}`; - if (listPullRequest.data.some((pr) => pr.title === title)) { - console.log('Pull request with the same name already exists. Skip creation.'); - return; + } catch (error) { + console.error('Error creating branch and PR:', error); + throw error; } - - const pullRequest = await octokit.rest.pulls.create({ - body: title, - owner: 'dotnet', - repo: parsedArgs.targetRemoteRepo, - title: title, - head: newBranchName, - base: parsedArgs.baseBranch, - }); - - console.log(`Created pull request: ${pullRequest.data.html_url}.`); }); diff --git a/test-manifests/OfficialBuild.xml b/test-manifests/OfficialBuild.xml new file mode 100644 index 0000000000..3d7fc46fd9 --- /dev/null +++ b/test-manifests/OfficialBuild.xml @@ -0,0 +1 @@ + \ No newline at end of file