diff --git a/.gitignore b/.gitignore index a8f29d87138e..08ece2b99eb6 100644 --- a/.gitignore +++ b/.gitignore @@ -213,3 +213,7 @@ LoadTest.code-workspace .idea/ .nyc_output/ _dotnetsdk/ + +# BuildConfigGen files +FilesOverriddenForConfigGoHereREADME.txt + diff --git a/BuildConfigGen/EnsureUpdateModeVerifier.cs b/BuildConfigGen/EnsureUpdateModeVerifier.cs index c7b4797f687f..6ad518ebefed 100644 --- a/BuildConfigGen/EnsureUpdateModeVerifier.cs +++ b/BuildConfigGen/EnsureUpdateModeVerifier.cs @@ -251,5 +251,23 @@ private string ResolveFile(string filePath) string targetFile = tempFile ?? sourceFile ?? filePath; return targetFile; } + + internal void DeleteDirectoryRecursive(string path) + { + if(verifyOnly) + { + if(Directory.Exists(path)) + { + VerifyErrors.Add($"Expected directory {path} to not exist"); + } + } + else + { + if(Directory.Exists(path)) + { + Directory.Delete(path, true); + } + } + } } } \ No newline at end of file diff --git a/BuildConfigGen/Program.cs b/BuildConfigGen/Program.cs index c8c1e17a21dc..7bb1a2f3d9ab 100644 --- a/BuildConfigGen/Program.cs +++ b/BuildConfigGen/Program.cs @@ -26,13 +26,13 @@ static class Config { public static readonly string[] ExtensionsToPreprocess = new[] { ".ts", ".json" }; - public record ConfigRecord(string name, string constMappingKey, bool isDefault, bool isNode, string nodePackageVersion, bool isWif, string nodeHandler, string preprocessorVariableName, bool enableBuildConfigOverrides, bool deprecated, bool shouldUpdateTypescript, string? overriddenDirectoryName = null); + public record ConfigRecord(string name, string constMappingKey, bool isDefault, bool isNode, string nodePackageVersion, bool isWif, string nodeHandler, string preprocessorVariableName, bool enableBuildConfigOverrides, bool deprecated, bool shouldUpdateTypescript, bool writeNpmrc, string? overriddenDirectoryName = null); - public static readonly ConfigRecord Default = new ConfigRecord(name: nameof(Default), constMappingKey: "Default", isDefault: true, isNode: false, nodePackageVersion: "", isWif: false, nodeHandler: "", preprocessorVariableName: "DEFAULT", enableBuildConfigOverrides: false, deprecated: false, shouldUpdateTypescript: false); - public static readonly ConfigRecord Node16 = new ConfigRecord(name: nameof(Node16), constMappingKey: "Node16-219", isDefault: false, isNode: true, nodePackageVersion: "^16.11.39", isWif: false, nodeHandler: "Node16", preprocessorVariableName: "NODE16", enableBuildConfigOverrides: true, deprecated: true, shouldUpdateTypescript: false); - public static readonly ConfigRecord Node16_225 = new ConfigRecord(name: nameof(Node16_225), constMappingKey: "Node16-225", isDefault: false, isNode: true, isWif: false, nodePackageVersion: "^16.11.39", nodeHandler: "Node16", preprocessorVariableName: "NODE16", enableBuildConfigOverrides: true, deprecated: false, shouldUpdateTypescript: false, overriddenDirectoryName: "Node16"); - public static readonly ConfigRecord Node20 = new ConfigRecord(name: nameof(Node20), constMappingKey: "Node20-225", isDefault: false, isNode: true, nodePackageVersion: "^20.3.1", isWif: false, nodeHandler: "Node20", preprocessorVariableName: "NODE20", enableBuildConfigOverrides: true, deprecated: false, shouldUpdateTypescript: true); - public static readonly ConfigRecord WorkloadIdentityFederation = new ConfigRecord(name: nameof(WorkloadIdentityFederation), constMappingKey: "WorkloadIdentityFederation", isDefault: false, isNode: true, nodePackageVersion: "^16.11.39", isWif: true, nodeHandler: "Node16", preprocessorVariableName: "WORKLOADIDENTITYFEDERATION", enableBuildConfigOverrides: true, deprecated: false, shouldUpdateTypescript: false); + public static readonly ConfigRecord Default = new ConfigRecord(name: nameof(Default), constMappingKey: "Default", isDefault: true, isNode: false, nodePackageVersion: "", isWif: false, nodeHandler: "", preprocessorVariableName: "DEFAULT", enableBuildConfigOverrides: false, deprecated: false, shouldUpdateTypescript: false, writeNpmrc: false); + public static readonly ConfigRecord Node16 = new ConfigRecord(name: nameof(Node16), constMappingKey: "Node16-219", isDefault: false, isNode: true, nodePackageVersion: "^16.11.39", isWif: false, nodeHandler: "Node16", preprocessorVariableName: "NODE16", enableBuildConfigOverrides: true, deprecated: true, shouldUpdateTypescript: false, writeNpmrc: false); + public static readonly ConfigRecord Node16_225 = new ConfigRecord(name: nameof(Node16_225), constMappingKey: "Node16-225", isDefault: false, isNode: true, isWif: false, nodePackageVersion: "^16.11.39", nodeHandler: "Node16", preprocessorVariableName: "NODE16", enableBuildConfigOverrides: true, deprecated: false, shouldUpdateTypescript: false, overriddenDirectoryName: "Node16", writeNpmrc: false); + public static readonly ConfigRecord Node20 = new ConfigRecord(name: nameof(Node20), constMappingKey: "Node20-225", isDefault: false, isNode: true, nodePackageVersion: "^20.3.1", isWif: false, nodeHandler: "Node20", preprocessorVariableName: "NODE20", enableBuildConfigOverrides: true, deprecated: false, shouldUpdateTypescript: true, writeNpmrc: true); + public static readonly ConfigRecord WorkloadIdentityFederation = new ConfigRecord(name: nameof(WorkloadIdentityFederation), constMappingKey: "WorkloadIdentityFederation", isDefault: false, isNode: true, nodePackageVersion: "^16.11.39", isWif: true, nodeHandler: "Node16", preprocessorVariableName: "WORKLOADIDENTITYFEDERATION", enableBuildConfigOverrides: true, deprecated: false, shouldUpdateTypescript: false, writeNpmrc: false); public static ConfigRecord[] Configs = { Default, Node16, Node16_225, Node20, WorkloadIdentityFederation }; } @@ -42,20 +42,21 @@ public record ConfigRecord(string name, string constMappingKey, bool isDefault, /// The task to generate build configs for /// List of configs to generate seperated by | + /// Overide current sprint; omit to get from whatsprintis.it /// Write updates if true, else validate that the output is up-to-date - static void Main(string task, string configs, bool writeUpdates = false) + static void Main(string task, string configs, int? currentSprint, bool writeUpdates = false) { // error handling strategy: // 1. design: anything goes wrong, try to detect and crash as early as possible to preserve the callstack to make debugging easier. // 2. we allow all exceptions to fall though. Non-zero exit code will be surfaced // 3. Ideally default windows exception will occur and errors reported to WER/watson. I'm not sure this is happening, perhaps DragonFruit is handling the exception - foreach (var t in task.Split(',')) + foreach (var t in task.Split(',', '|')) { - Main3(t, configs, writeUpdates); + Main3(t, configs, writeUpdates, currentSprint); } } - private static void Main3(string task, string configsString, bool writeUpdates) + private static void Main3(string task, string configsString, bool writeUpdates, int? currentSprint) { if (string.IsNullOrEmpty(task)) { @@ -76,8 +77,8 @@ private static void Main3(string task, string configsString, bool writeUpdates) foreach (var config in configs) { if (configdefs.TryGetValue(config, out var matchedConfig)) - { - if (matchedConfig.deprecated && writeUpdates) + { + if (matchedConfig.deprecated && writeUpdates) { errorMessage = "The config with the name: " + matchedConfig.name + " is deprecated. Writing updates for deprecated configs is not allowed."; throw new Exception(errorMessage); @@ -86,7 +87,7 @@ private static void Main3(string task, string configsString, bool writeUpdates) } else { - errorMessage = "Configs specified must be one of: " + string.Join(',', Config.Configs.Where(x=>!x.isDefault).Select(x => x.name)); + errorMessage = "Configs specified must be one of: " + string.Join(',', Config.Configs.Where(x => !x.isDefault).Select(x => x.name)); throw new Exception(errorMessage); } } @@ -95,7 +96,7 @@ private static void Main3(string task, string configsString, bool writeUpdates) { ensureUpdateModeVerifier = new EnsureUpdateModeVerifier(!writeUpdates); - Main2(task, targetConfigs); + Main2(task, currentSprint, targetConfigs); ThrowWithUserFriendlyErrorToRerunWithWriteUpdatesIfVeriferError(task, skipContentCheck: false); } @@ -108,6 +109,19 @@ private static void Main3(string task, string configsString, bool writeUpdates) } } + private static int GetCurrentSprint() + { + string url = "https://whatsprintis.it"; + var httpClient = new HttpClient(); + httpClient.DefaultRequestHeaders.Add("Accept", "application/json"); + + string json = httpClient.GetStringAsync(url).Result; + JsonDocument currentSprintData = JsonDocument.Parse(json); + int currentSprint = currentSprintData.RootElement.GetProperty("sprint").GetInt32(); + + return currentSprint; + } + private static void ThrowWithUserFriendlyErrorToRerunWithWriteUpdatesIfVeriferError(string task, bool skipContentCheck) { // if !writeUpdates, error if we have written any updates @@ -126,8 +140,13 @@ private static void ThrowWithUserFriendlyErrorToRerunWithWriteUpdatesIfVeriferEr } } - private static void Main2(string task, HashSet targetConfigs) + private static void Main2(string task, int? currentSprint, HashSet targetConfigs) { + if (!currentSprint.HasValue) + { + currentSprint = GetCurrentSprint(); + } + string currentDir = Environment.CurrentDirectory; string gitRootPath = GitUtil.GetGitRootPath(currentDir); @@ -158,7 +177,9 @@ private static void Main2(string task, HashSet targetConfig ensureUpdateModeVerifier!.DirectoryCreateDirectory(generatedFolder, false); } - UpdateVersions(gitRootPath, task, taskTargetPath, out var configTaskVersionMapping, targetConfigs: targetConfigs); + string versionMapFile = Path.Combine(gitRootPath, "_generated", @$"{task}.versionmap.txt"); + + UpdateVersions(gitRootPath, task, taskTargetPath, out var configTaskVersionMapping, targetConfigs: targetConfigs, currentSprint.Value, versionMapFile); foreach (var config in targetConfigs) { @@ -185,8 +206,6 @@ private static void Main2(string task, HashSet targetConfig CopyConfig(taskTargetPath, taskOutput, skipPathName: buildConfigs, skipFileName: null, removeExtraFiles: true, throwIfNotUpdatingFileForApplyingOverridesAndPreProcessor: false, config: config, allowPreprocessorDirectives: true); - - if (config.enableBuildConfigOverrides) { CopyConfigOverrides(taskTargetPath, taskOutput, config); @@ -208,12 +227,15 @@ private static void Main2(string task, HashSet targetConfig WriteNodePackageJson(taskOutput, config.nodePackageVersion, config.shouldUpdateTypescript); } } + + // delay updating version map file until after buildconfigs generated + WriteVersionMapFile(versionMapFile, configTaskVersionMapping, targetConfigs: targetConfigs); } private static void EnsureBuildConfigFileOverrides(Config.ConfigRecord config, string taskTargetPath) { - if(!config.enableBuildConfigOverrides) + if (!config.enableBuildConfigOverrides) { throw new Exception("BUG: should not get here: !config.enableBuildConfigOverrides"); } @@ -237,7 +259,7 @@ private static void GetBuildConfigFileOverridePaths(Config.ConfigRecord config, { throw new Exception("BUG: should not get here: !config.enableBuildConfigOverrides"); } - + if (config.overriddenDirectoryName != null) { directoryName = config.overriddenDirectoryName; @@ -369,7 +391,7 @@ private static void WriteNodePackageJson(string taskOutputNode, string nodeVersi string outputNodePackagePath = Path.Combine(taskOutputNode, "package.json"); JsonNode outputNodePackagePathJsonNode = JsonNode.Parse(ensureUpdateModeVerifier!.FileReadAllText(outputNodePackagePath))!; outputNodePackagePathJsonNode["dependencies"]!["@types/node"] = nodeVersion; - + // Upgrade typescript version for Node 20 if (shouldUpdateTypescript) { @@ -391,7 +413,7 @@ private static bool HasNodeHandler(JsonNode taskHandlerContents) var handlers = taskHandlerContents[possibleExecutor]?.AsObject(); if (ExecutorHasNodeHandler(handlers)) { return true; } } - + return false; } @@ -479,6 +501,12 @@ private static void CopyConfig(string taskTarget, string taskOutput, string? ski { foreach (var pathToRemoveFromOutput in pathsToRemoveFromOutput) { + // todo: handle .npmrc properly -- ensure it's content validated properly if written by buildconfiggen + if (pathToRemoveFromOutput == ".npmrc") + { + continue; + } + string targetPath = Path.Combine(taskOutput, pathToRemoveFromOutput); Console.WriteLine($"Adding .tmp extension to extra file in output directory (should cause it to be ignored by .gitignore): {pathToRemoveFromOutput}"); @@ -491,22 +519,43 @@ private static void CopyConfig(string taskTarget, string taskOutput, string? ski ensureUpdateModeVerifier!.Move(targetPath, destFileName); } } + + // https://stackoverflow.com/questions/51293566/how-to-include-the-path-for-the-node-binary-npm-was-executed-with + if (config.writeNpmrc) + { + string targetPath = Path.Combine(taskOutput, ".npmrc"); + ensureUpdateModeVerifier!.WriteAllText(targetPath, @"scripts-prepend-node-path=true +", false); + } } - private static void UpdateVersions(string gitRootPath, string task, string taskTarget, out Dictionary configTaskVersionMapping, HashSet targetConfigs) + private static void UpdateVersions(string gitRootPath, string task, string taskTarget, out Dictionary configTaskVersionMapping, HashSet targetConfigs, int currentSprint, string versionMapFile) { Dictionary versionMap; - TaskVersion? maxVersion; - - string versionMapFile = Path.Combine(gitRootPath, "_generated", @$"{task}.versionmap.txt"); - - ReadVersionMap(versionMapFile, out versionMap, out maxVersion); + TaskVersion maxVersion; var inputVersion = GetInputVersion(taskTarget); - if (!(maxVersion is null) && inputVersion < maxVersion) + bool defaultVersionMatchesSourceVersion; + { - throw new Exception($"version specified in task {taskTarget} must not be less than maxversion {maxVersion} specified in {versionMapFile}"); + TaskVersion? defaultVersion = null; + if (ReadVersionMap(versionMapFile, out versionMap, out var maxVersionNullable)) + { + maxVersion = maxVersionNullable!; + defaultVersion = versionMap[Config.Default.name]; + defaultVersionMatchesSourceVersion = defaultVersion == inputVersion; + } + else + { + maxVersion = inputVersion; + defaultVersionMatchesSourceVersion = true; + } + + if (inputVersion <= maxVersion && !defaultVersionMatchesSourceVersion) + { + throw new Exception($"inputVersion={inputVersion} version specified in task taskTarget={taskTarget} must not be less or equal to maxversion maxVersion={maxVersion} specified in versionMapFile{versionMapFile}, or must match defaultVersion={defaultVersion} in {versionMapFile}"); + } } configTaskVersionMapping = new(); @@ -538,25 +587,68 @@ private static void UpdateVersions(string gitRootPath, string task, string taskT } } - int c = 0; + TaskVersion baseVersion = maxVersion; + + bool baseVersionIsCurrentSprint = baseVersion.Minor == currentSprint; + + int offset = 0; + + if (baseVersionIsCurrentSprint) + { + offset = 1; + } + else + { + baseVersion = inputVersion.CloneWithMinorAndPatch(currentSprint, 0); + } + if (!allConfigsMappedAndValid) { + var old = new Dictionary(); + foreach (var x in configTaskVersionMapping) + { + old.Add(x.Key, x.Value); + } + configTaskVersionMapping.Clear(); - foreach (var config in targetConfigs) + if (defaultVersionMatchesSourceVersion) { - if (!config.isDefault) + configTaskVersionMapping.Add(Config.Default, inputVersion); + + foreach (var config in targetConfigs) { - configTaskVersionMapping.Add(config, inputVersion.CloneWithPatch(inputVersion.Patch + c)); - c++; + if (!config.isDefault) + { + if (old.TryGetValue(config, out var oldVersion)) + { + configTaskVersionMapping.Add(config, oldVersion); + } + } } } + else + { + configTaskVersionMapping.Add(Config.Default, baseVersion.CloneWithPatch(baseVersion.Patch + offset)); + offset++; + } - // ensure version goes last - configTaskVersionMapping.Add(Config.Default, inputVersion.CloneWithPatch(inputVersion.Patch + c)); - } + foreach (var config in targetConfigs) + { + if (!config.isDefault && !configTaskVersionMapping.ContainsKey(config)) + { + TaskVersion targetVersion; + do + { + targetVersion = baseVersion.CloneWithPatch(baseVersion.Patch + offset); + offset++; + } + while (configTaskVersionMapping.Values.Contains(targetVersion)); - WriteVersionMapFile(versionMapFile, configTaskVersionMapping, targetConfigs: targetConfigs); + configTaskVersionMapping.Add(config, targetVersion); + } + } + } } private static TaskVersion GetInputVersion(string taskTarget) @@ -585,11 +677,18 @@ private static void WriteInputTaskJson(string taskTarget, Dictionary configTaskVersion, HashSet targetConfigs) @@ -651,7 +750,7 @@ private static void AddHandler(JsonNode taskNode, string target, string nodeVers } } - private static void ReadVersionMap(string versionMapFile, out Dictionary versionMap, out TaskVersion? maxVersion) + private static bool ReadVersionMap(string versionMapFile, out Dictionary versionMap, [NotNullWhen(returnValue: true)] out TaskVersion? maxVersion) { versionMap = new(); maxVersion = null; @@ -677,7 +776,16 @@ private static void ReadVersionMap(string versionMapFile, out Dictionary=0.6.0", + "xmlbuilder": "~9.0.1" + } + }, + "xmlbuilder": { + "version": "9.0.6", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.6.tgz", + "integrity": "sha1-fIJtjYb0eISwWHLL6dJ7Ab7VA/Y=" + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } + } +} diff --git a/Tasks/ANTV1/_buildConfigs/Node20/package.json b/Tasks/ANTV1/_buildConfigs/Node20/package.json new file mode 100644 index 000000000000..4251b3770070 --- /dev/null +++ b/Tasks/ANTV1/_buildConfigs/Node20/package.json @@ -0,0 +1,20 @@ +{ + "name": "Ant", + "author": "Microsoft Corporation", + "description": "Build with Apache Ant", + "license": "MIT", + "bugs": { + "url": "https://github.com/Microsoft/vso-agent-tasks/issues" + }, + "dependencies": { + "azure-pipelines-task-lib": "^5.0.0-preview.0", + "azure-pipelines-tasks-java-common": "2.198.1", + "azure-pipelines-tasks-codecoverage-tools": "2.201.0", + "xml2js": "^0.4.16", + "@types/node": "^20.3.1", + "@types/mocha": "^5.2.7" + }, + "devDependencies": { + "typescript": "5.1.6" + } +} diff --git a/Tasks/AndroidSigningV2/_buildConfigs/Node20/Tests/package-lock.json b/Tasks/AndroidSigningV2/_buildConfigs/Node20/Tests/package-lock.json new file mode 100644 index 000000000000..332d9f2a0649 --- /dev/null +++ b/Tasks/AndroidSigningV2/_buildConfigs/Node20/Tests/package-lock.json @@ -0,0 +1,24 @@ +{ + "name": "vsts-tasks-androidsigningv2-tests", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/mocha": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", + "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==" + }, + "@types/node": { + "version": "10.17.44", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.44.tgz", + "integrity": "sha512-vHPAyBX1ffLcy4fQHmDyIUMUb42gHZjPHU66nhvbMzAWJqHnySGZ6STwN3rwrnSd1FHB0DI/RWgGELgKSYRDmw==" + }, + "typescript": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.2.tgz", + "integrity": "sha512-e4ERvRV2wb+rRZ/IQeb3jm2VxBsirQLpQhdxplZ2MEzGvDkkMmPglecnNDfSUBivMjP93vRbngYYDQqQ/78bcQ==", + "dev": true + } + } +} diff --git a/Tasks/AndroidSigningV2/_buildConfigs/Node20/Tests/package.json b/Tasks/AndroidSigningV2/_buildConfigs/Node20/Tests/package.json new file mode 100644 index 000000000000..5e7f1db091dc --- /dev/null +++ b/Tasks/AndroidSigningV2/_buildConfigs/Node20/Tests/package.json @@ -0,0 +1,26 @@ +{ + "name": "vsts-tasks-androidsigningv2-tests", + "version": "1.0.0", + "description": "Azure Pipelines Android Signing V2 Task Tests", + "main": "L0.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/Microsoft/azure-pipelines-tasks.git" + }, + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Microsoft/azure-pipelines-tasks/issues" + }, + "homepage": "https://github.com/Microsoft/azure-pipelines-tasks#readme", + "dependencies": { + "@types/node": "^10.17.0", + "@types/mocha": "^5.2.7" + }, + "devDependencies": { + "typescript": "4.0.2" + } +} diff --git a/Tasks/AndroidSigningV2/_buildConfigs/Node20/package-lock.json b/Tasks/AndroidSigningV2/_buildConfigs/Node20/package-lock.json new file mode 100644 index 000000000000..f5b107f51089 --- /dev/null +++ b/Tasks/AndroidSigningV2/_buildConfigs/Node20/package-lock.json @@ -0,0 +1,548 @@ +{ + "name": "vsts-androidsigning-task", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/concat-stream": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz", + "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==", + "requires": { + "@types/node": "*" + } + }, + "@types/form-data": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", + "integrity": "sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==", + "requires": { + "@types/node": "*" + } + }, + "@types/mocha": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", + "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==" + }, + "@types/node": { + "version": "20.7.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.7.0.tgz", + "integrity": "sha512-zI22/pJW2wUZOVyguFaUL1HABdmSVxpXrzIqkjsHmyUjNhPoWM1CKfvVuXfetHhIok4RY573cqS0mZ1SJEnoTg==" + }, + "@types/q": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.5.tgz", + "integrity": "sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ==" + }, + "@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "azure-devops-node-api": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/azure-devops-node-api/-/azure-devops-node-api-10.2.2.tgz", + "integrity": "sha512-4TVv2X7oNStT0vLaEfExmy3J4/CzfuXolEcQl/BRUmvGySqKStTG2O55/hUQ0kM7UJlZBLgniM0SBq4d/WkKow==", + "requires": { + "tunnel": "0.0.6", + "typed-rest-client": "^1.8.4" + } + }, + "azure-pipelines-task-lib": { + "version": "5.0.0-preview.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-5.0.0-preview.0.tgz", + "integrity": "sha512-uQJEv+q3/7RD7kgphFd33uXijaPwA1ePYoNkAgZpUhbZUtc2u4JL4ujTT/JJfgXBNW/QQNAiDQ2OC7vOQG/0tg==", + "requires": { + "minimatch": "3.0.5", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "sync-request": "6.1.0", + "uuid": "^3.0.1" + } + }, + "azure-pipelines-tasks-securefiles-common": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-tasks-securefiles-common/-/azure-pipelines-tasks-securefiles-common-2.1.0.tgz", + "integrity": "sha512-oE7VscWFZD+Ku0WM6e2b5Y0eDom4DTZvER/mSh3m/z9V0yN9JUahNR0Dye9NIj0BSIyfgcaxxNWBCzqJMsirIQ==", + "requires": { + "@types/node": "^10.17.0", + "@types/q": "^1.5.4", + "azure-devops-node-api": "10.2.2", + "azure-pipelines-task-lib": "^3.1.0" + }, + "dependencies": { + "@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + }, + "azure-pipelines-task-lib": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-3.4.0.tgz", + "integrity": "sha512-3eC4OTFw+7xD7A2aUhxR/j+jRlTI+vVfS0CGxt1pCLs4c/KmY0tQWgbqjD3157kmiucWxELBvgZHaD2gCBe9fg==", + "requires": { + "minimatch": "3.0.5", + "mockery": "^2.1.0", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "sync-request": "6.1.0", + "uuid": "^3.0.1" + } + } + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, + "form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-intrinsic": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", + "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + } + }, + "get-port": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", + "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==" + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "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" + }, + "dependencies": { + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "http-basic": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", + "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", + "requires": { + "caseless": "^0.12.0", + "concat-stream": "^1.6.2", + "http-response-object": "^3.0.1", + "parse-cache-control": "^1.0.1" + } + }, + "http-response-object": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", + "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", + "requires": { + "@types/node": "^10.0.3" + }, + "dependencies": { + "@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + } + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" + }, + "is-core-module": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", + "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", + "requires": { + "has": "^1.0.3" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "mockery": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mockery/-/mockery-2.1.0.tgz", + "integrity": "sha512-9VkOmxKlWXoDO/h1jDZaS4lH33aWfRiJiNT/tKj+8OGzrcFDLo8d0syGdbsc3Bc4GvRXPb+NMMvojotmuGJTvA==" + }, + "object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, + "parse-cache-control": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", + "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "promise": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", + "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", + "requires": { + "asap": "~2.0.6" + } + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==" + }, + "qs": { + "version": "6.11.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.1.tgz", + "integrity": "sha512-0wsrzgTz/kAVIeuxSjnpGC56rzYtr6JT/2BwEvMaPhFIoYa1aGO8LbzuU1R0uUYQkLpWBTOj0l/CLAJB64J6nQ==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "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" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "requires": { + "resolve": "^1.1.6" + } + }, + "resolve": { + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "requires": { + "is-core-module": "^2.11.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, + "sync-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", + "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==", + "requires": { + "http-response-object": "^3.0.1", + "sync-rpc": "^1.2.1", + "then-request": "^6.0.0" + } + }, + "sync-rpc": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz", + "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==", + "requires": { + "get-port": "^3.1.0" + } + }, + "then-request": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", + "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", + "requires": { + "@types/concat-stream": "^1.6.0", + "@types/form-data": "0.0.33", + "@types/node": "^8.0.0", + "@types/qs": "^6.2.31", + "caseless": "~0.12.0", + "concat-stream": "^1.6.0", + "form-data": "^2.2.0", + "http-basic": "^8.1.1", + "http-response-object": "^3.0.1", + "promise": "^8.0.0", + "qs": "^6.4.0" + }, + "dependencies": { + "@types/node": { + "version": "8.10.66", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", + "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==" + } + } + }, + "tunnel": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", + "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==" + }, + "typed-rest-client": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.8.5.tgz", + "integrity": "sha512-952/Aegu3lTqUAI1anbDLbewojnF/gh8at9iy1CIrfS1h/+MtNjB1Y9z6ZF5n2kZd+97em56lZ9uu7Zz3y/pwg==", + "requires": { + "qs": "^6.9.1", + "tunnel": "0.0.6", + "underscore": "^1.12.1" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, + "typescript": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "dev": true + }, + "underscore": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.1.tgz", + "integrity": "sha512-hzSoAVtJF+3ZtiFX0VgfFPHEDRm7Y/QPjGyNo4TVdnDTdft3tr8hEkD25a1jC+TjTuE7tkHGKkhwCgs9dgBB2g==" + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + } + } +} diff --git a/Tasks/AndroidSigningV2/_buildConfigs/Node20/package.json b/Tasks/AndroidSigningV2/_buildConfigs/Node20/package.json new file mode 100644 index 000000000000..d669be5308d4 --- /dev/null +++ b/Tasks/AndroidSigningV2/_buildConfigs/Node20/package.json @@ -0,0 +1,28 @@ +{ + "name": "vsts-androidsigning-task", + "version": "1.0.0", + "description": "Azure Pipelines Android Signing Task", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/Microsoft/azure-pipelines-tasks.git" + }, + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Microsoft/azure-pipelines-tasks/issues" + }, + "homepage": "https://github.com/Microsoft/azure-pipelines-tasks#readme", + "dependencies": { + "@types/node": "^20.3.1", + "@types/mocha": "^5.2.7", + "azure-pipelines-task-lib": "^5.0.0-preview.0", + "azure-pipelines-tasks-securefiles-common": "2.1.0" + }, + "devDependencies": { + "typescript": "5.1.6" + } +} diff --git a/Tasks/AndroidSigningV3/_buildConfigs/Node20/Tests/package-lock.json b/Tasks/AndroidSigningV3/_buildConfigs/Node20/Tests/package-lock.json new file mode 100644 index 000000000000..08d4c49fc636 --- /dev/null +++ b/Tasks/AndroidSigningV3/_buildConfigs/Node20/Tests/package-lock.json @@ -0,0 +1,24 @@ +{ + "name": "vsts-tasks-androidsigningv3-tests", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/mocha": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", + "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==" + }, + "@types/node": { + "version": "10.17.44", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.44.tgz", + "integrity": "sha512-vHPAyBX1ffLcy4fQHmDyIUMUb42gHZjPHU66nhvbMzAWJqHnySGZ6STwN3rwrnSd1FHB0DI/RWgGELgKSYRDmw==" + }, + "typescript": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.2.tgz", + "integrity": "sha512-e4ERvRV2wb+rRZ/IQeb3jm2VxBsirQLpQhdxplZ2MEzGvDkkMmPglecnNDfSUBivMjP93vRbngYYDQqQ/78bcQ==", + "dev": true + } + } +} diff --git a/Tasks/AndroidSigningV3/_buildConfigs/Node20/Tests/package.json b/Tasks/AndroidSigningV3/_buildConfigs/Node20/Tests/package.json new file mode 100644 index 000000000000..2a3b9dbf1026 --- /dev/null +++ b/Tasks/AndroidSigningV3/_buildConfigs/Node20/Tests/package.json @@ -0,0 +1,26 @@ +{ + "name": "vsts-tasks-androidsigningv3-tests", + "version": "1.0.0", + "description": "Azure Pipelines Android Signing V3 Task Tests", + "main": "L0.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/Microsoft/azure-pipelines-tasks.git" + }, + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Microsoft/azure-pipelines-tasks/issues" + }, + "homepage": "https://github.com/Microsoft/azure-pipelines-tasks#readme", + "dependencies": { + "@types/node": "^10.17.0", + "@types/mocha": "^5.2.7" + }, + "devDependencies": { + "typescript": "4.0.2" + } +} diff --git a/Tasks/AndroidSigningV3/_buildConfigs/Node20/package-lock.json b/Tasks/AndroidSigningV3/_buildConfigs/Node20/package-lock.json new file mode 100644 index 000000000000..f17b2dd4d900 --- /dev/null +++ b/Tasks/AndroidSigningV3/_buildConfigs/Node20/package-lock.json @@ -0,0 +1,554 @@ +{ + "name": "vsts-androidsigning-task", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/concat-stream": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz", + "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==", + "requires": { + "@types/node": "*" + } + }, + "@types/form-data": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", + "integrity": "sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==", + "requires": { + "@types/node": "*" + } + }, + "@types/mocha": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", + "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==" + }, + "@types/node": { + "version": "20.7.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.7.0.tgz", + "integrity": "sha512-zI22/pJW2wUZOVyguFaUL1HABdmSVxpXrzIqkjsHmyUjNhPoWM1CKfvVuXfetHhIok4RY573cqS0mZ1SJEnoTg==" + }, + "@types/q": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.5.tgz", + "integrity": "sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ==" + }, + "@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "azure-devops-node-api": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/azure-devops-node-api/-/azure-devops-node-api-10.2.2.tgz", + "integrity": "sha512-4TVv2X7oNStT0vLaEfExmy3J4/CzfuXolEcQl/BRUmvGySqKStTG2O55/hUQ0kM7UJlZBLgniM0SBq4d/WkKow==", + "requires": { + "tunnel": "0.0.6", + "typed-rest-client": "^1.8.4" + } + }, + "azure-pipelines-task-lib": { + "version": "5.0.0-preview.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-5.0.0-preview.0.tgz", + "integrity": "sha512-uQJEv+q3/7RD7kgphFd33uXijaPwA1ePYoNkAgZpUhbZUtc2u4JL4ujTT/JJfgXBNW/QQNAiDQ2OC7vOQG/0tg==", + "requires": { + "minimatch": "3.0.5", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "sync-request": "6.1.0", + "uuid": "^3.0.1" + } + }, + "azure-pipelines-tasks-securefiles-common": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-tasks-securefiles-common/-/azure-pipelines-tasks-securefiles-common-2.1.0.tgz", + "integrity": "sha512-oE7VscWFZD+Ku0WM6e2b5Y0eDom4DTZvER/mSh3m/z9V0yN9JUahNR0Dye9NIj0BSIyfgcaxxNWBCzqJMsirIQ==", + "requires": { + "@types/node": "^10.17.0", + "@types/q": "^1.5.4", + "azure-devops-node-api": "10.2.2", + "azure-pipelines-task-lib": "^3.1.0" + }, + "dependencies": { + "@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + }, + "azure-pipelines-task-lib": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-3.4.0.tgz", + "integrity": "sha512-3eC4OTFw+7xD7A2aUhxR/j+jRlTI+vVfS0CGxt1pCLs4c/KmY0tQWgbqjD3157kmiucWxELBvgZHaD2gCBe9fg==", + "requires": { + "minimatch": "3.0.5", + "mockery": "^2.1.0", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "sync-request": "6.1.0", + "uuid": "^3.0.1" + } + } + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, + "form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + } + }, + "get-port": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", + "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==" + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "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" + }, + "dependencies": { + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==" + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "http-basic": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", + "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", + "requires": { + "caseless": "^0.12.0", + "concat-stream": "^1.6.2", + "http-response-object": "^3.0.1", + "parse-cache-control": "^1.0.1" + } + }, + "http-response-object": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", + "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", + "requires": { + "@types/node": "^10.0.3" + }, + "dependencies": { + "@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + } + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" + }, + "is-core-module": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", + "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", + "requires": { + "has": "^1.0.3" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "mockery": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mockery/-/mockery-2.1.0.tgz", + "integrity": "sha512-9VkOmxKlWXoDO/h1jDZaS4lH33aWfRiJiNT/tKj+8OGzrcFDLo8d0syGdbsc3Bc4GvRXPb+NMMvojotmuGJTvA==" + }, + "object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, + "parse-cache-control": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", + "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "promise": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", + "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", + "requires": { + "asap": "~2.0.6" + } + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==" + }, + "qs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "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" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "requires": { + "resolve": "^1.1.6" + } + }, + "resolve": { + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "requires": { + "is-core-module": "^2.11.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, + "sync-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", + "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==", + "requires": { + "http-response-object": "^3.0.1", + "sync-rpc": "^1.2.1", + "then-request": "^6.0.0" + } + }, + "sync-rpc": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz", + "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==", + "requires": { + "get-port": "^3.1.0" + } + }, + "then-request": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", + "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", + "requires": { + "@types/concat-stream": "^1.6.0", + "@types/form-data": "0.0.33", + "@types/node": "^8.0.0", + "@types/qs": "^6.2.31", + "caseless": "~0.12.0", + "concat-stream": "^1.6.0", + "form-data": "^2.2.0", + "http-basic": "^8.1.1", + "http-response-object": "^3.0.1", + "promise": "^8.0.0", + "qs": "^6.4.0" + }, + "dependencies": { + "@types/node": { + "version": "8.10.66", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", + "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==" + } + } + }, + "tunnel": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", + "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==" + }, + "typed-rest-client": { + "version": "1.8.9", + "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.8.9.tgz", + "integrity": "sha512-uSmjE38B80wjL85UFX3sTYEUlvZ1JgCRhsWj/fJ4rZ0FqDUFoIuodtiVeE+cUqiVTOKPdKrp/sdftD15MDek6g==", + "requires": { + "qs": "^6.9.1", + "tunnel": "0.0.6", + "underscore": "^1.12.1" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, + "typescript": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "dev": true + }, + "underscore": { + "version": "1.13.6", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz", + "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==" + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + } + } +} diff --git a/Tasks/AndroidSigningV3/_buildConfigs/Node20/package.json b/Tasks/AndroidSigningV3/_buildConfigs/Node20/package.json new file mode 100644 index 000000000000..d669be5308d4 --- /dev/null +++ b/Tasks/AndroidSigningV3/_buildConfigs/Node20/package.json @@ -0,0 +1,28 @@ +{ + "name": "vsts-androidsigning-task", + "version": "1.0.0", + "description": "Azure Pipelines Android Signing Task", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/Microsoft/azure-pipelines-tasks.git" + }, + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Microsoft/azure-pipelines-tasks/issues" + }, + "homepage": "https://github.com/Microsoft/azure-pipelines-tasks#readme", + "dependencies": { + "@types/node": "^20.3.1", + "@types/mocha": "^5.2.7", + "azure-pipelines-task-lib": "^5.0.0-preview.0", + "azure-pipelines-tasks-securefiles-common": "2.1.0" + }, + "devDependencies": { + "typescript": "5.1.6" + } +} diff --git a/Tasks/ArchiveFilesV2/_buildConfigs/Node20/Tests/package-lock.json b/Tasks/ArchiveFilesV2/_buildConfigs/Node20/Tests/package-lock.json new file mode 100644 index 000000000000..b6192b6825a2 --- /dev/null +++ b/Tasks/ArchiveFilesV2/_buildConfigs/Node20/Tests/package-lock.json @@ -0,0 +1,14 @@ +{ + "name": "ArchiveFiles-tests", + "version": "1.0.7", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/mocha": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", + "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==", + "dev": true + } + } +} diff --git a/Tasks/ArchiveFilesV2/_buildConfigs/Node20/Tests/package.json b/Tasks/ArchiveFilesV2/_buildConfigs/Node20/Tests/package.json new file mode 100644 index 000000000000..d7e89b137c7b --- /dev/null +++ b/Tasks/ArchiveFilesV2/_buildConfigs/Node20/Tests/package.json @@ -0,0 +1,19 @@ +{ + "name": "ArchiveFiles-tests", + "version": "1.0.7", + "description": "Archive Files Task Tests", + "main": "L0.js", + "repository": { + "type": "git", + "url": "git+https://github.com/Microsoft/azure-pipelines-tasks.git" + }, + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Microsoft/azure-pipelines-tasks/issues" + }, + "homepage": "https://github.com/Microsoft/azure-pipelines-tasks#readme", + "devDependencies": { + "@types/mocha": "^5.2.0" + } +} diff --git a/Tasks/ArchiveFilesV2/_buildConfigs/Node20/package-lock.json b/Tasks/ArchiveFilesV2/_buildConfigs/Node20/package-lock.json new file mode 100644 index 000000000000..7edfbe091e35 --- /dev/null +++ b/Tasks/ArchiveFilesV2/_buildConfigs/Node20/package-lock.json @@ -0,0 +1,483 @@ +{ + "name": "ArchiveFiles", + "version": "1.0.7", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/concat-stream": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz", + "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==", + "requires": { + "@types/node": "*" + } + }, + "@types/form-data": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", + "integrity": "sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==", + "requires": { + "@types/node": "*" + } + }, + "@types/mocha": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.1.1.tgz", + "integrity": "sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==" + }, + "@types/node": { + "version": "20.7.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.7.0.tgz", + "integrity": "sha512-zI22/pJW2wUZOVyguFaUL1HABdmSVxpXrzIqkjsHmyUjNhPoWM1CKfvVuXfetHhIok4RY573cqS0mZ1SJEnoTg==" + }, + "@types/qs": { + "version": "6.9.8", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.8.tgz", + "integrity": "sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg==" + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "azure-pipelines-task-lib": { + "version": "5.0.0-preview.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-5.0.0-preview.0.tgz", + "integrity": "sha512-uQJEv+q3/7RD7kgphFd33uXijaPwA1ePYoNkAgZpUhbZUtc2u4JL4ujTT/JJfgXBNW/QQNAiDQ2OC7vOQG/0tg==", + "requires": { + "minimatch": "3.0.5", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "sync-request": "6.1.0", + "uuid": "^3.0.1" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, + "form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + } + }, + "get-port": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", + "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==" + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "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" + }, + "dependencies": { + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==" + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "http-basic": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", + "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", + "requires": { + "caseless": "^0.12.0", + "concat-stream": "^1.6.2", + "http-response-object": "^3.0.1", + "parse-cache-control": "^1.0.1" + } + }, + "http-response-object": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", + "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", + "requires": { + "@types/node": "^10.0.3" + }, + "dependencies": { + "@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + } + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" + }, + "is-core-module": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "requires": { + "has": "^1.0.3" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, + "parse-cache-control": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", + "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "promise": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", + "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", + "requires": { + "asap": "~2.0.6" + } + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==" + }, + "qs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "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" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "requires": { + "resolve": "^1.1.6" + } + }, + "resolve": { + "version": "1.22.6", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.6.tgz", + "integrity": "sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==", + "requires": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" + }, + "shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, + "sync-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", + "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==", + "requires": { + "http-response-object": "^3.0.1", + "sync-rpc": "^1.2.1", + "then-request": "^6.0.0" + } + }, + "sync-rpc": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz", + "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==", + "requires": { + "get-port": "^3.1.0" + } + }, + "then-request": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", + "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", + "requires": { + "@types/concat-stream": "^1.6.0", + "@types/form-data": "0.0.33", + "@types/node": "^8.0.0", + "@types/qs": "^6.2.31", + "caseless": "~0.12.0", + "concat-stream": "^1.6.0", + "form-data": "^2.2.0", + "http-basic": "^8.1.1", + "http-response-object": "^3.0.1", + "promise": "^8.0.0", + "qs": "^6.4.0" + }, + "dependencies": { + "@types/node": { + "version": "8.10.66", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", + "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==" + } + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, + "typescript": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + } + } +} diff --git a/Tasks/ArchiveFilesV2/_buildConfigs/Node20/package.json b/Tasks/ArchiveFilesV2/_buildConfigs/Node20/package.json new file mode 100644 index 000000000000..c2b278164ee0 --- /dev/null +++ b/Tasks/ArchiveFilesV2/_buildConfigs/Node20/package.json @@ -0,0 +1,24 @@ +{ + "name": "ArchiveFiles", + "version": "1.0.7", + "description": "Archive Files Task", + "main": "archivefilestask.js", + "repository": { + "type": "git", + "url": "git+https://github.com/Microsoft/azure-pipelines-tasks.git" + }, + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Microsoft/azure-pipelines-tasks/issues" + }, + "homepage": "https://github.com/Microsoft/azure-pipelines-tasks#readme", + "dependencies": { + "@types/node": "^20.3.1", + "@types/mocha": "^9.1.1", + "azure-pipelines-task-lib": "^5.0.0-preview.0" + }, + "devDependencies": { + "typescript": "5.1.6" + } +} diff --git a/Tasks/BashV3/_buildConfigs/Node20/package-lock.json b/Tasks/BashV3/_buildConfigs/Node20/package-lock.json new file mode 100644 index 000000000000..c3aee69cd408 --- /dev/null +++ b/Tasks/BashV3/_buildConfigs/Node20/package-lock.json @@ -0,0 +1,618 @@ +{ + "name": "vsts-tasks-bash", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true + }, + "@types/concat-stream": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz", + "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==", + "requires": { + "@types/node": "*" + } + }, + "@types/form-data": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", + "integrity": "sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==", + "requires": { + "@types/node": "*" + } + }, + "@types/mocha": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.1.1.tgz", + "integrity": "sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==" + }, + "@types/node": { + "version": "20.7.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.7.0.tgz", + "integrity": "sha512-zI22/pJW2wUZOVyguFaUL1HABdmSVxpXrzIqkjsHmyUjNhPoWM1CKfvVuXfetHhIok4RY573cqS0mZ1SJEnoTg==" + }, + "@types/qs": { + "version": "6.9.8", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.8.tgz", + "integrity": "sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg==" + }, + "@types/semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-41qEJgBH/TWgo5NFSvBCJ1qkoi3Q6ONSF2avrHq1LVEZfYpdHmj0y9SuTK+u9ZhG1sYQKBL1AWXKyLWP4RaUoQ==" + }, + "@types/uuid": { + "version": "3.4.10", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-3.4.10.tgz", + "integrity": "sha512-BgeaZuElf7DEYZhWYDTc/XcLZXdVgFkVSTa13BqKvbnmUrxr3TJFKofUxCtDO9UQOdhnV+HPOESdHiHKZOJV1A==" + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "azure-pipelines-task-lib": { + "version": "5.0.0-preview.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-5.0.0-preview.0.tgz", + "integrity": "sha512-uQJEv+q3/7RD7kgphFd33uXijaPwA1ePYoNkAgZpUhbZUtc2u4JL4ujTT/JJfgXBNW/QQNAiDQ2OC7vOQG/0tg==", + "requires": { + "minimatch": "3.0.5", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "sync-request": "6.1.0", + "uuid": "^3.0.1" + } + }, + "azure-pipelines-tasks-utility-common": { + "version": "3.225.1", + "resolved": "https://registry.npmjs.org/azure-pipelines-tasks-utility-common/-/azure-pipelines-tasks-utility-common-3.225.1.tgz", + "integrity": "sha512-4wtVKuvx2PcQI0W8xkMdS/S+tf9Qu7wMJl4HSTLE1gjQ2x9o/6QbhMogz6O1+8ofxvTqmI4scA7GHKccDAwQpQ==", + "requires": { + "@types/node": "^16.11.39", + "azure-pipelines-task-lib": "^4.4.0", + "azure-pipelines-tool-lib": "^2.0.0-preview", + "js-yaml": "3.13.1", + "semver": "^5.4.1" + }, + "dependencies": { + "@types/node": { + "version": "16.18.54", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.54.tgz", + "integrity": "sha512-oTmGy68gxZZ21FhTJVVvZBYpQHEBZxHKTsGshobMqm9qWpbqdZsA5jvsuPZcHu0KwpmLrOHWPdEfg7XDpNT9UA==" + }, + "azure-pipelines-task-lib": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-4.5.0.tgz", + "integrity": "sha512-NGxrpggmho4SxWeEnVID7xEClDHC3o4RndfdBzTO5iBWhMHkQp95N1Z4oaywJyiC5Xa92wkUvqzSm6MSLKzYoQ==", + "requires": { + "minimatch": "3.0.5", + "mockery": "^2.1.0", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "sync-request": "6.1.0", + "uuid": "^3.0.1" + } + } + } + }, + "azure-pipelines-tool-lib": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/azure-pipelines-tool-lib/-/azure-pipelines-tool-lib-2.0.4.tgz", + "integrity": "sha512-LgAelZKJe3k/t3NsKSKzjeRviphns0w0p5tgwz8uHN70I9m2TToiOKl+fogrdXcM6+jiLBk5KTqrcRBqPpv/XA==", + "requires": { + "@types/semver": "^5.3.0", + "@types/uuid": "^3.4.5", + "azure-pipelines-task-lib": "^4.1.0", + "semver": "^5.7.0", + "semver-compare": "^1.0.0", + "typed-rest-client": "^1.8.6", + "uuid": "^3.3.2" + }, + "dependencies": { + "azure-pipelines-task-lib": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-4.5.0.tgz", + "integrity": "sha512-NGxrpggmho4SxWeEnVID7xEClDHC3o4RndfdBzTO5iBWhMHkQp95N1Z4oaywJyiC5Xa92wkUvqzSm6MSLKzYoQ==", + "requires": { + "minimatch": "3.0.5", + "mockery": "^2.1.0", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "sync-request": "6.1.0", + "uuid": "^3.0.1" + } + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + } + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + }, + "form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-intrinsic": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", + "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + } + }, + "get-port": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", + "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==" + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "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" + }, + "dependencies": { + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "http-basic": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", + "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", + "requires": { + "caseless": "^0.12.0", + "concat-stream": "^1.6.2", + "http-response-object": "^3.0.1", + "parse-cache-control": "^1.0.1" + } + }, + "http-response-object": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", + "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", + "requires": { + "@types/node": "^10.0.3" + }, + "dependencies": { + "@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + } + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" + }, + "is-core-module": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "requires": { + "has": "^1.0.3" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "mockery": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mockery/-/mockery-2.1.0.tgz", + "integrity": "sha512-9VkOmxKlWXoDO/h1jDZaS4lH33aWfRiJiNT/tKj+8OGzrcFDLo8d0syGdbsc3Bc4GvRXPb+NMMvojotmuGJTvA==" + }, + "object-inspect": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, + "parse-cache-control": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", + "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "promise": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", + "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", + "requires": { + "asap": "~2.0.6" + } + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==" + }, + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "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" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "requires": { + "resolve": "^1.1.6" + } + }, + "resolve": { + "version": "1.22.6", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.6.tgz", + "integrity": "sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==", + "requires": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==" + }, + "shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, + "sync-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", + "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==", + "requires": { + "http-response-object": "^3.0.1", + "sync-rpc": "^1.2.1", + "then-request": "^6.0.0" + } + }, + "sync-rpc": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz", + "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==", + "requires": { + "get-port": "^3.1.0" + } + }, + "then-request": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", + "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", + "requires": { + "@types/concat-stream": "^1.6.0", + "@types/form-data": "0.0.33", + "@types/node": "^8.0.0", + "@types/qs": "^6.2.31", + "caseless": "~0.12.0", + "concat-stream": "^1.6.0", + "form-data": "^2.2.0", + "http-basic": "^8.1.1", + "http-response-object": "^3.0.1", + "promise": "^8.0.0", + "qs": "^6.4.0" + }, + "dependencies": { + "@types/node": { + "version": "8.10.66", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", + "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==" + } + } + }, + "tunnel": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", + "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==" + }, + "typed-rest-client": { + "version": "1.8.11", + "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.8.11.tgz", + "integrity": "sha512-5UvfMpd1oelmUPRbbaVnq+rHP7ng2cE4qoQkQeAqxRL6PklkxsM0g32/HL0yfvruK6ojQ5x8EE+HF4YV6DtuCA==", + "requires": { + "qs": "^6.9.1", + "tunnel": "0.0.6", + "underscore": "^1.12.1" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, + "typescript": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "dev": true + }, + "underscore": { + "version": "1.13.6", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz", + "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==" + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "uuid": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", + "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==" + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + } + } +} diff --git a/Tasks/BashV3/_buildConfigs/Node20/package.json b/Tasks/BashV3/_buildConfigs/Node20/package.json new file mode 100644 index 000000000000..6022bd1df350 --- /dev/null +++ b/Tasks/BashV3/_buildConfigs/Node20/package.json @@ -0,0 +1,31 @@ +{ + "name": "vsts-tasks-bash", + "version": "1.0.0", + "description": "Azure Pipelines Bash Task", + "main": "bash.js", + "scripts": { + "build": "node ../../make.js build --task BashV3", + "test": "node ../../make.js test --task BashV3" + }, + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/Microsoft/azure-pipelines-tasks.git" + }, + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Microsoft/azure-pipelines-tasks/issues" + }, + "homepage": "https://github.com/Microsoft/azure-pipelines-tasks#readme", + "dependencies": { + "@types/mocha": "^9.1.1", + "@types/node": "^20.3.1", + "azure-pipelines-task-lib": "^5.0.0-preview.0", + "azure-pipelines-tasks-utility-common": "^3.225.1", + "uuid": "^3.0.1" + }, + "devDependencies": { + "@tsconfig/node10": "1.0.9", + "typescript": "5.1.6" + } +} diff --git a/Tasks/CMakeV1/_buildConfigs/Node20/Tests/package-lock.json b/Tasks/CMakeV1/_buildConfigs/Node20/Tests/package-lock.json new file mode 100644 index 000000000000..161d7c3dff39 --- /dev/null +++ b/Tasks/CMakeV1/_buildConfigs/Node20/Tests/package-lock.json @@ -0,0 +1,14 @@ +{ + "name": "cmake-tests", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/mocha": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", + "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==", + "dev": true + } + } +} diff --git a/Tasks/CMakeV1/_buildConfigs/Node20/Tests/package.json b/Tasks/CMakeV1/_buildConfigs/Node20/Tests/package.json new file mode 100644 index 000000000000..5c3e780545a0 --- /dev/null +++ b/Tasks/CMakeV1/_buildConfigs/Node20/Tests/package.json @@ -0,0 +1,22 @@ +{ + "name": "cmake-tests", + "version": "1.0.0", + "description": "Azure Pipelines CMake V1 Task Tests", + "main": "L0.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/Microsoft/azure-pipelines-tasks.git" + }, + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Microsoft/azure-pipelines-tasks/issues" + }, + "homepage": "https://github.com/Microsoft/azure-pipelines-tasks#readme", + "devDependencies": { + "@types/mocha": "^5.2.7" + } +} diff --git a/Tasks/CMakeV1/_buildConfigs/Node20/package-lock.json b/Tasks/CMakeV1/_buildConfigs/Node20/package-lock.json new file mode 100644 index 000000000000..63ca65ab63d1 --- /dev/null +++ b/Tasks/CMakeV1/_buildConfigs/Node20/package-lock.json @@ -0,0 +1,483 @@ +{ + "name": "vsts-cmake-task", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/concat-stream": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz", + "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==", + "requires": { + "@types/node": "*" + } + }, + "@types/form-data": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", + "integrity": "sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==", + "requires": { + "@types/node": "*" + } + }, + "@types/mocha": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", + "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==" + }, + "@types/node": { + "version": "20.7.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.7.0.tgz", + "integrity": "sha512-zI22/pJW2wUZOVyguFaUL1HABdmSVxpXrzIqkjsHmyUjNhPoWM1CKfvVuXfetHhIok4RY573cqS0mZ1SJEnoTg==" + }, + "@types/qs": { + "version": "6.9.8", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.8.tgz", + "integrity": "sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg==" + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "azure-pipelines-task-lib": { + "version": "5.0.0-preview.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-5.0.0-preview.0.tgz", + "integrity": "sha512-uQJEv+q3/7RD7kgphFd33uXijaPwA1ePYoNkAgZpUhbZUtc2u4JL4ujTT/JJfgXBNW/QQNAiDQ2OC7vOQG/0tg==", + "requires": { + "minimatch": "3.0.5", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "sync-request": "6.1.0", + "uuid": "^3.0.1" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, + "form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + } + }, + "get-port": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", + "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==" + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "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" + }, + "dependencies": { + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==" + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "http-basic": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", + "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", + "requires": { + "caseless": "^0.12.0", + "concat-stream": "^1.6.2", + "http-response-object": "^3.0.1", + "parse-cache-control": "^1.0.1" + } + }, + "http-response-object": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", + "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", + "requires": { + "@types/node": "^10.0.3" + }, + "dependencies": { + "@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + } + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" + }, + "is-core-module": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "requires": { + "has": "^1.0.3" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, + "parse-cache-control": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", + "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "promise": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", + "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", + "requires": { + "asap": "~2.0.6" + } + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==" + }, + "qs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "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" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "requires": { + "resolve": "^1.1.6" + } + }, + "resolve": { + "version": "1.22.6", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.6.tgz", + "integrity": "sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==", + "requires": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" + }, + "shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, + "sync-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", + "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==", + "requires": { + "http-response-object": "^3.0.1", + "sync-rpc": "^1.2.1", + "then-request": "^6.0.0" + } + }, + "sync-rpc": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz", + "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==", + "requires": { + "get-port": "^3.1.0" + } + }, + "then-request": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", + "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", + "requires": { + "@types/concat-stream": "^1.6.0", + "@types/form-data": "0.0.33", + "@types/node": "^8.0.0", + "@types/qs": "^6.2.31", + "caseless": "~0.12.0", + "concat-stream": "^1.6.0", + "form-data": "^2.2.0", + "http-basic": "^8.1.1", + "http-response-object": "^3.0.1", + "promise": "^8.0.0", + "qs": "^6.4.0" + }, + "dependencies": { + "@types/node": { + "version": "8.10.66", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", + "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==" + } + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, + "typescript": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + } + } +} diff --git a/Tasks/CMakeV1/_buildConfigs/Node20/package.json b/Tasks/CMakeV1/_buildConfigs/Node20/package.json new file mode 100644 index 000000000000..235991d382cd --- /dev/null +++ b/Tasks/CMakeV1/_buildConfigs/Node20/package.json @@ -0,0 +1,27 @@ +{ + "name": "vsts-cmake-task", + "version": "1.0.0", + "description": "Azure Pipelines CMake Task", + "main": "cmaketask.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/Microsoft/azure-pipelines-tasks.git" + }, + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Microsoft/azure-pipelines-tasks/issues" + }, + "homepage": "https://github.com/Microsoft/azure-pipelines-tasks#readme", + "dependencies": { + "azure-pipelines-task-lib": "^5.0.0-preview.0", + "@types/node": "^20.3.1", + "@types/mocha": "^5.2.7" + }, + "devDependencies": { + "typescript": "5.1.6" + } +} diff --git a/Tasks/CUrlUploaderV2/_buildConfigs/Node20/Tests/package-lock.json b/Tasks/CUrlUploaderV2/_buildConfigs/Node20/Tests/package-lock.json new file mode 100644 index 000000000000..2249be616e7d --- /dev/null +++ b/Tasks/CUrlUploaderV2/_buildConfigs/Node20/Tests/package-lock.json @@ -0,0 +1,14 @@ +{ + "name": "curl-uploader-tests", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/mocha": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", + "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==", + "dev": true + } + } +} diff --git a/Tasks/CUrlUploaderV2/_buildConfigs/Node20/Tests/package.json b/Tasks/CUrlUploaderV2/_buildConfigs/Node20/Tests/package.json new file mode 100644 index 000000000000..c2e3f9a1554e --- /dev/null +++ b/Tasks/CUrlUploaderV2/_buildConfigs/Node20/Tests/package.json @@ -0,0 +1,22 @@ +{ + "name": "curl-uploader-tests", + "version": "1.0.0", + "description": "Azure Pipelines Curl Uploader V2 Task Tests", + "main": "L0.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/Microsoft/azure-pipelines-tasks.git" + }, + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Microsoft/azure-pipelines-tasks/issues" + }, + "homepage": "https://github.com/Microsoft/azure-pipelines-tasks#readme", + "devDependencies": { + "@types/mocha": "^5.2.0" + } +} diff --git a/Tasks/CUrlUploaderV2/_buildConfigs/Node20/package-lock.json b/Tasks/CUrlUploaderV2/_buildConfigs/Node20/package-lock.json new file mode 100644 index 000000000000..911c254ddd31 --- /dev/null +++ b/Tasks/CUrlUploaderV2/_buildConfigs/Node20/package-lock.json @@ -0,0 +1,488 @@ +{ + "name": "vsts-curluploader-task", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/concat-stream": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz", + "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==", + "requires": { + "@types/node": "*" + } + }, + "@types/form-data": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", + "integrity": "sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==", + "requires": { + "@types/node": "*" + } + }, + "@types/mocha": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.1.1.tgz", + "integrity": "sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==" + }, + "@types/node": { + "version": "20.7.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.7.0.tgz", + "integrity": "sha512-zI22/pJW2wUZOVyguFaUL1HABdmSVxpXrzIqkjsHmyUjNhPoWM1CKfvVuXfetHhIok4RY573cqS0mZ1SJEnoTg==" + }, + "@types/q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.1.tgz", + "integrity": "sha512-eqz8c/0kwNi/OEHQfvIuJVLTst3in0e7uTKeuY+WL/zfKn0xVujOTp42bS/vUUokhK5P2BppLd9JXMOMHcgbjA==" + }, + "@types/qs": { + "version": "6.9.8", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.8.tgz", + "integrity": "sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg==" + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "azure-pipelines-task-lib": { + "version": "5.0.0-preview.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-5.0.0-preview.0.tgz", + "integrity": "sha512-uQJEv+q3/7RD7kgphFd33uXijaPwA1ePYoNkAgZpUhbZUtc2u4JL4ujTT/JJfgXBNW/QQNAiDQ2OC7vOQG/0tg==", + "requires": { + "minimatch": "3.0.5", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "sync-request": "6.1.0", + "uuid": "^3.0.1" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, + "form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + } + }, + "get-port": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", + "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==" + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "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" + }, + "dependencies": { + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==" + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "http-basic": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", + "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", + "requires": { + "caseless": "^0.12.0", + "concat-stream": "^1.6.2", + "http-response-object": "^3.0.1", + "parse-cache-control": "^1.0.1" + } + }, + "http-response-object": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", + "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", + "requires": { + "@types/node": "^10.0.3" + }, + "dependencies": { + "@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + } + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" + }, + "is-core-module": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "requires": { + "has": "^1.0.3" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, + "parse-cache-control": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", + "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "promise": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", + "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", + "requires": { + "asap": "~2.0.6" + } + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==" + }, + "qs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "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" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "requires": { + "resolve": "^1.1.6" + } + }, + "resolve": { + "version": "1.22.6", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.6.tgz", + "integrity": "sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==", + "requires": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" + }, + "shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, + "sync-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", + "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==", + "requires": { + "http-response-object": "^3.0.1", + "sync-rpc": "^1.2.1", + "then-request": "^6.0.0" + } + }, + "sync-rpc": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz", + "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==", + "requires": { + "get-port": "^3.1.0" + } + }, + "then-request": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", + "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", + "requires": { + "@types/concat-stream": "^1.6.0", + "@types/form-data": "0.0.33", + "@types/node": "^8.0.0", + "@types/qs": "^6.2.31", + "caseless": "~0.12.0", + "concat-stream": "^1.6.0", + "form-data": "^2.2.0", + "http-basic": "^8.1.1", + "http-response-object": "^3.0.1", + "promise": "^8.0.0", + "qs": "^6.4.0" + }, + "dependencies": { + "@types/node": { + "version": "8.10.66", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", + "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==" + } + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, + "typescript": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + } + } +} diff --git a/Tasks/CUrlUploaderV2/_buildConfigs/Node20/package.json b/Tasks/CUrlUploaderV2/_buildConfigs/Node20/package.json new file mode 100644 index 000000000000..ed612a049813 --- /dev/null +++ b/Tasks/CUrlUploaderV2/_buildConfigs/Node20/package.json @@ -0,0 +1,28 @@ +{ + "name": "vsts-curluploader-task", + "version": "1.0.0", + "description": "Azure Pipelines Curl Uploader Task", + "main": "curluploader.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/Microsoft/azure-pipelines-tasks.git" + }, + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Microsoft/azure-pipelines-tasks/issues" + }, + "homepage": "https://github.com/Microsoft/azure-pipelines-tasks#readme", + "dependencies": { + "@types/node": "^20.3.1", + "@types/mocha": "^9.1.1", + "@types/q": "^1.0.7", + "azure-pipelines-task-lib": "^5.0.0-preview.0" + }, + "devDependencies": { + "typescript": "5.1.6" + } +} diff --git a/Tasks/CmdLineV2/_buildConfigs/Node20/package-lock.json b/Tasks/CmdLineV2/_buildConfigs/Node20/package-lock.json new file mode 100644 index 000000000000..7fe8adbb0b71 --- /dev/null +++ b/Tasks/CmdLineV2/_buildConfigs/Node20/package-lock.json @@ -0,0 +1,495 @@ +{ + "name": "vsts-cmdline-task", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/concat-stream": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz", + "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==", + "requires": { + "@types/node": "*" + } + }, + "@types/form-data": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", + "integrity": "sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==", + "requires": { + "@types/node": "*" + } + }, + "@types/mocha": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-8.0.3.tgz", + "integrity": "sha512-vyxR57nv8NfcU0GZu8EUXZLTbCMupIUwy95LJ6lllN+JRPG25CwMHoB1q5xKh8YKhQnHYRAn4yW2yuHbf/5xgg==" + }, + "@types/node": { + "version": "20.7.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.7.0.tgz", + "integrity": "sha512-zI22/pJW2wUZOVyguFaUL1HABdmSVxpXrzIqkjsHmyUjNhPoWM1CKfvVuXfetHhIok4RY573cqS0mZ1SJEnoTg==" + }, + "@types/qs": { + "version": "6.9.8", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.8.tgz", + "integrity": "sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg==" + }, + "@types/uuid": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.0.tgz", + "integrity": "sha512-eQ9qFW/fhfGJF8WKHGEHZEyVWfZxrT+6CLIJGBcZPfxUh/+BnEj+UCGYMlr9qZuX/2AltsvwrGqp0LhEW8D0zQ==" + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "azure-pipelines-task-lib": { + "version": "5.0.0-preview.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-5.0.0-preview.0.tgz", + "integrity": "sha512-uQJEv+q3/7RD7kgphFd33uXijaPwA1ePYoNkAgZpUhbZUtc2u4JL4ujTT/JJfgXBNW/QQNAiDQ2OC7vOQG/0tg==", + "requires": { + "minimatch": "3.0.5", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "sync-request": "6.1.0", + "uuid": "^3.0.1" + }, + "dependencies": { + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + } + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, + "form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + } + }, + "get-port": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", + "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==" + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "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" + }, + "dependencies": { + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==" + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "http-basic": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", + "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", + "requires": { + "caseless": "^0.12.0", + "concat-stream": "^1.6.2", + "http-response-object": "^3.0.1", + "parse-cache-control": "^1.0.1" + } + }, + "http-response-object": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", + "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", + "requires": { + "@types/node": "^10.0.3" + }, + "dependencies": { + "@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + } + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" + }, + "is-core-module": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "requires": { + "has": "^1.0.3" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, + "parse-cache-control": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", + "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "promise": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", + "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", + "requires": { + "asap": "~2.0.6" + } + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==" + }, + "qs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "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" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "requires": { + "resolve": "^1.1.6" + } + }, + "resolve": { + "version": "1.22.6", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.6.tgz", + "integrity": "sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==", + "requires": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" + }, + "shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, + "sync-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", + "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==", + "requires": { + "http-response-object": "^3.0.1", + "sync-rpc": "^1.2.1", + "then-request": "^6.0.0" + } + }, + "sync-rpc": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz", + "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==", + "requires": { + "get-port": "^3.1.0" + } + }, + "then-request": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", + "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", + "requires": { + "@types/concat-stream": "^1.6.0", + "@types/form-data": "0.0.33", + "@types/node": "^8.0.0", + "@types/qs": "^6.2.31", + "caseless": "~0.12.0", + "concat-stream": "^1.6.0", + "form-data": "^2.2.0", + "http-basic": "^8.1.1", + "http-response-object": "^3.0.1", + "promise": "^8.0.0", + "qs": "^6.4.0" + }, + "dependencies": { + "@types/node": { + "version": "8.10.66", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", + "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==" + } + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, + "typescript": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "uuid": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.0.tgz", + "integrity": "sha512-fX6Z5o4m6XsXBdli9g7DtWgAx+osMsRRZFKma1mIUsLCz6vRvv+pz5VNbyu9UEDzpMWulZfvpgb/cmDXVulYFQ==" + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + } + } +} diff --git a/Tasks/CmdLineV2/_buildConfigs/Node20/package.json b/Tasks/CmdLineV2/_buildConfigs/Node20/package.json new file mode 100644 index 000000000000..ddb23fec7a43 --- /dev/null +++ b/Tasks/CmdLineV2/_buildConfigs/Node20/package.json @@ -0,0 +1,29 @@ +{ + "name": "vsts-cmdline-task", + "version": "1.0.0", + "description": "Azure Pipelines Command Line Task", + "main": "cmdline.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/Microsoft/azure-pipelines-tasks.git" + }, + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Microsoft/azure-pipelines-tasks/issues" + }, + "homepage": "https://github.com/Microsoft/azure-pipelines-tasks#readme", + "dependencies": { + "@types/uuid": "^8.3.0", + "@types/mocha": "^8.0.3", + "@types/node": "^20.3.1", + "uuid": "^8.3.0", + "azure-pipelines-task-lib": "^5.0.0-preview.0" + }, + "devDependencies": { + "typescript": "5.1.6" + } +} diff --git a/Tasks/CocoaPodsV0/_buildConfigs/Node20/Tests/package-lock.json b/Tasks/CocoaPodsV0/_buildConfigs/Node20/Tests/package-lock.json new file mode 100644 index 000000000000..25b7cb983955 --- /dev/null +++ b/Tasks/CocoaPodsV0/_buildConfigs/Node20/Tests/package-lock.json @@ -0,0 +1,14 @@ +{ + "name": "cocoa-pods-tests", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/mocha": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", + "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==", + "dev": true + } + } +} diff --git a/Tasks/CocoaPodsV0/_buildConfigs/Node20/Tests/package.json b/Tasks/CocoaPodsV0/_buildConfigs/Node20/Tests/package.json new file mode 100644 index 000000000000..b31852dd557c --- /dev/null +++ b/Tasks/CocoaPodsV0/_buildConfigs/Node20/Tests/package.json @@ -0,0 +1,22 @@ +{ + "name": "cocoa-pods-tests", + "version": "1.0.0", + "description": "Azure Pipelines Cocoa Pods V0 Task Tests", + "main": "L0.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/Microsoft/azure-pipelines-tasks.git" + }, + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Microsoft/azure-pipelines-tasks/issues" + }, + "homepage": "https://github.com/Microsoft/azure-pipelines-tasks#readme", + "devDependencies": { + "@types/mocha": "^5.2.0" + } +} diff --git a/Tasks/CocoaPodsV0/_buildConfigs/Node20/package-lock.json b/Tasks/CocoaPodsV0/_buildConfigs/Node20/package-lock.json new file mode 100644 index 000000000000..a105f3c9686c --- /dev/null +++ b/Tasks/CocoaPodsV0/_buildConfigs/Node20/package-lock.json @@ -0,0 +1,483 @@ +{ + "name": "vsts-cocoapods-task", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/concat-stream": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz", + "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==", + "requires": { + "@types/node": "*" + } + }, + "@types/form-data": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", + "integrity": "sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==", + "requires": { + "@types/node": "*" + } + }, + "@types/mocha": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", + "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==" + }, + "@types/node": { + "version": "20.7.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.7.0.tgz", + "integrity": "sha512-zI22/pJW2wUZOVyguFaUL1HABdmSVxpXrzIqkjsHmyUjNhPoWM1CKfvVuXfetHhIok4RY573cqS0mZ1SJEnoTg==" + }, + "@types/qs": { + "version": "6.9.8", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.8.tgz", + "integrity": "sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg==" + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "azure-pipelines-task-lib": { + "version": "5.0.0-preview.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-5.0.0-preview.0.tgz", + "integrity": "sha512-uQJEv+q3/7RD7kgphFd33uXijaPwA1ePYoNkAgZpUhbZUtc2u4JL4ujTT/JJfgXBNW/QQNAiDQ2OC7vOQG/0tg==", + "requires": { + "minimatch": "3.0.5", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "sync-request": "6.1.0", + "uuid": "^3.0.1" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, + "form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + } + }, + "get-port": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", + "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==" + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "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" + }, + "dependencies": { + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==" + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "http-basic": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", + "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", + "requires": { + "caseless": "^0.12.0", + "concat-stream": "^1.6.2", + "http-response-object": "^3.0.1", + "parse-cache-control": "^1.0.1" + } + }, + "http-response-object": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", + "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", + "requires": { + "@types/node": "^10.0.3" + }, + "dependencies": { + "@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + } + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" + }, + "is-core-module": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "requires": { + "has": "^1.0.3" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, + "parse-cache-control": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", + "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "promise": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", + "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", + "requires": { + "asap": "~2.0.6" + } + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==" + }, + "qs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "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" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "requires": { + "resolve": "^1.1.6" + } + }, + "resolve": { + "version": "1.22.6", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.6.tgz", + "integrity": "sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==", + "requires": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" + }, + "shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, + "sync-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", + "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==", + "requires": { + "http-response-object": "^3.0.1", + "sync-rpc": "^1.2.1", + "then-request": "^6.0.0" + } + }, + "sync-rpc": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz", + "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==", + "requires": { + "get-port": "^3.1.0" + } + }, + "then-request": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", + "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", + "requires": { + "@types/concat-stream": "^1.6.0", + "@types/form-data": "0.0.33", + "@types/node": "^8.0.0", + "@types/qs": "^6.2.31", + "caseless": "~0.12.0", + "concat-stream": "^1.6.0", + "form-data": "^2.2.0", + "http-basic": "^8.1.1", + "http-response-object": "^3.0.1", + "promise": "^8.0.0", + "qs": "^6.4.0" + }, + "dependencies": { + "@types/node": { + "version": "8.10.66", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", + "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==" + } + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, + "typescript": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + } + } +} diff --git a/Tasks/CocoaPodsV0/_buildConfigs/Node20/package.json b/Tasks/CocoaPodsV0/_buildConfigs/Node20/package.json new file mode 100644 index 000000000000..84fd78e15050 --- /dev/null +++ b/Tasks/CocoaPodsV0/_buildConfigs/Node20/package.json @@ -0,0 +1,27 @@ +{ + "name": "vsts-cocoapods-task", + "version": "1.0.0", + "description": "Azure Pipelines Cocoa Pods Task", + "main": "cocoapods.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/Microsoft/azure-pipelines-tasks.git" + }, + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Microsoft/azure-pipelines-tasks/issues" + }, + "homepage": "https://github.com/Microsoft/azure-pipelines-tasks#readme", + "dependencies": { + "@types/mocha": "^5.2.7", + "@types/node": "^20.3.1", + "azure-pipelines-task-lib": "^5.0.0-preview.0" + }, + "devDependencies": { + "typescript": "5.1.6" + } +} diff --git a/Tasks/CopyFilesOverSSHV0/_buildConfigs/Node20/Tests/package-lock.json b/Tasks/CopyFilesOverSSHV0/_buildConfigs/Node20/Tests/package-lock.json new file mode 100644 index 000000000000..ba6519c9013a --- /dev/null +++ b/Tasks/CopyFilesOverSSHV0/_buildConfigs/Node20/Tests/package-lock.json @@ -0,0 +1,14 @@ +{ + "name": "copy-files-over-ssh-tests", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/mocha": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", + "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==", + "dev": true + } + } +} diff --git a/Tasks/CopyFilesOverSSHV0/_buildConfigs/Node20/Tests/package.json b/Tasks/CopyFilesOverSSHV0/_buildConfigs/Node20/Tests/package.json new file mode 100644 index 000000000000..0e2ac431ff28 --- /dev/null +++ b/Tasks/CopyFilesOverSSHV0/_buildConfigs/Node20/Tests/package.json @@ -0,0 +1,22 @@ +{ + "name": "copy-files-over-ssh-tests", + "version": "1.0.0", + "description": "Azure Pipelines Copy Files Over SSH V0 Task Tests", + "main": "L0.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/Microsoft/azure-pipelines-tasks.git" + }, + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Microsoft/azure-pipelines-tasks/issues" + }, + "homepage": "https://github.com/Microsoft/azure-pipelines-tasks#readme", + "devDependencies": { + "@types/mocha": "^5.2.7" + } +} diff --git a/Tasks/CopyFilesOverSSHV0/_buildConfigs/Node20/package-lock.json b/Tasks/CopyFilesOverSSHV0/_buildConfigs/Node20/package-lock.json new file mode 100644 index 000000000000..0c496021046e --- /dev/null +++ b/Tasks/CopyFilesOverSSHV0/_buildConfigs/Node20/package-lock.json @@ -0,0 +1,619 @@ +{ + "name": "vsts-copyssh-task", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/concat-stream": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz", + "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==", + "requires": { + "@types/node": "*" + } + }, + "@types/form-data": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", + "integrity": "sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==", + "requires": { + "@types/node": "*" + } + }, + "@types/mocha": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", + "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==" + }, + "@types/node": { + "version": "20.7.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.7.0.tgz", + "integrity": "sha512-zI22/pJW2wUZOVyguFaUL1HABdmSVxpXrzIqkjsHmyUjNhPoWM1CKfvVuXfetHhIok4RY573cqS0mZ1SJEnoTg==" + }, + "@types/qs": { + "version": "6.9.8", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.8.tgz", + "integrity": "sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg==" + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "azure-pipelines-task-lib": { + "version": "5.0.0-preview.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-5.0.0-preview.0.tgz", + "integrity": "sha512-uQJEv+q3/7RD7kgphFd33uXijaPwA1ePYoNkAgZpUhbZUtc2u4JL4ujTT/JJfgXBNW/QQNAiDQ2OC7vOQG/0tg==", + "requires": { + "minimatch": "3.0.5", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "sync-request": "6.1.0", + "uuid": "^3.0.1" + }, + "dependencies": { + "minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "brace-expansion": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", + "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "concat-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", + "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.0.2", + "typedarray": "^0.0.6" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "cpu-features": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/cpu-features/-/cpu-features-0.0.2.tgz", + "integrity": "sha512-/2yieBqvMcRj8McNzkycjW2v3OIUOibBfd2dLEJ0nWts8NobAxwiyw9phVNS6oDL8x8tz9F7uNVFEVpJncQpeA==", + "optional": true, + "requires": { + "nan": "^2.14.1" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, + "err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==" + }, + "form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + } + }, + "get-port": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", + "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==" + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "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" + }, + "dependencies": { + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==" + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "http-basic": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", + "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", + "requires": { + "caseless": "^0.12.0", + "concat-stream": "^1.6.2", + "http-response-object": "^3.0.1", + "parse-cache-control": "^1.0.1" + }, + "dependencies": { + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + } + } + }, + "http-response-object": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", + "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", + "requires": { + "@types/node": "^10.0.3" + }, + "dependencies": { + "@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + } + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" + }, + "is-core-module": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "requires": { + "has": "^1.0.3" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "nan": { + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz", + "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==", + "optional": true + }, + "object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, + "parse-cache-control": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", + "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "promise": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", + "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", + "requires": { + "asap": "~2.0.6" + } + }, + "promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "requires": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + } + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==" + }, + "qs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "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" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "requires": { + "resolve": "^1.1.6" + } + }, + "resolve": { + "version": "1.22.6", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.6.tgz", + "integrity": "sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==", + "requires": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==" + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" + }, + "shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "ssh2": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ssh2/-/ssh2-1.4.0.tgz", + "integrity": "sha512-XvXwcXKvS452DyQvCa6Ct+chpucwc/UyxgliYz+rWXJ3jDHdtBb9xgmxJdMmnIn5bpgGAEV3KaEsH98ZGPHqwg==", + "requires": { + "asn1": "^0.2.4", + "bcrypt-pbkdf": "^1.0.2", + "cpu-features": "0.0.2", + "nan": "^2.15.0" + }, + "dependencies": { + "asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "requires": { + "safer-buffer": "~2.1.0" + } + } + } + }, + "ssh2-sftp-client": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/ssh2-sftp-client/-/ssh2-sftp-client-7.0.4.tgz", + "integrity": "sha512-4fFSTgoYlzcAtGfEjiXN6N41s1jSUmPlI00f7uD7pQOjt9yK9susminINKTRvPp35dkrATrlNZVhUxNCt3z5+w==", + "requires": { + "concat-stream": "^2.0.0", + "promise-retry": "^2.0.1", + "ssh2": "^1.4.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + } + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, + "sync-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", + "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==", + "requires": { + "http-response-object": "^3.0.1", + "sync-rpc": "^1.2.1", + "then-request": "^6.0.0" + } + }, + "sync-rpc": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz", + "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==", + "requires": { + "get-port": "^3.1.0" + } + }, + "then-request": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", + "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", + "requires": { + "@types/concat-stream": "^1.6.0", + "@types/form-data": "0.0.33", + "@types/node": "^8.0.0", + "@types/qs": "^6.2.31", + "caseless": "~0.12.0", + "concat-stream": "^1.6.0", + "form-data": "^2.2.0", + "http-basic": "^8.1.1", + "http-response-object": "^3.0.1", + "promise": "^8.0.0", + "qs": "^6.4.0" + }, + "dependencies": { + "@types/node": { + "version": "8.10.66", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", + "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + } + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, + "typescript": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + } + } +} diff --git a/Tasks/CopyFilesOverSSHV0/_buildConfigs/Node20/package.json b/Tasks/CopyFilesOverSSHV0/_buildConfigs/Node20/package.json new file mode 100644 index 000000000000..c96ccab01154 --- /dev/null +++ b/Tasks/CopyFilesOverSSHV0/_buildConfigs/Node20/package.json @@ -0,0 +1,30 @@ +{ + "name": "vsts-copyssh-task", + "version": "1.0.0", + "description": "Azure Pipelines Copy Files over SSH Tasks", + "main": "copyfilesoverssh.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/Microsoft.com/vsts-tasks.git" + }, + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Microsoft.com/vsts-tasks/issues" + }, + "homepage": "https://github.com/Microsoft.com/vsts-tasks#readme", + "dependencies": { + "ssh2": "^1.4.0", + "ssh2-sftp-client": "^7.0.4", + "minimatch": "^3.0.4", + "azure-pipelines-task-lib": "^5.0.0-preview.0", + "@types/mocha": "^5.2.7", + "@types/node": "^20.3.1" + }, + "devDependencies": { + "typescript": "5.1.6" + } +} diff --git a/Tasks/CopyFilesV2/_buildConfigs/Node20/package-lock.json b/Tasks/CopyFilesV2/_buildConfigs/Node20/package-lock.json new file mode 100644 index 000000000000..172f1cd632ba --- /dev/null +++ b/Tasks/CopyFilesV2/_buildConfigs/Node20/package-lock.json @@ -0,0 +1,488 @@ +{ + "name": "vsts-copyfiles-task", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/concat-stream": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz", + "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==", + "requires": { + "@types/node": "*" + } + }, + "@types/form-data": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", + "integrity": "sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==", + "requires": { + "@types/node": "*" + } + }, + "@types/mocha": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", + "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==" + }, + "@types/node": { + "version": "20.7.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.7.0.tgz", + "integrity": "sha512-zI22/pJW2wUZOVyguFaUL1HABdmSVxpXrzIqkjsHmyUjNhPoWM1CKfvVuXfetHhIok4RY573cqS0mZ1SJEnoTg==" + }, + "@types/qs": { + "version": "6.9.8", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.8.tgz", + "integrity": "sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg==" + }, + "@types/uuid": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.4.tgz", + "integrity": "sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==" + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "azure-pipelines-task-lib": { + "version": "5.0.0-preview.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-5.0.0-preview.0.tgz", + "integrity": "sha512-uQJEv+q3/7RD7kgphFd33uXijaPwA1ePYoNkAgZpUhbZUtc2u4JL4ujTT/JJfgXBNW/QQNAiDQ2OC7vOQG/0tg==", + "requires": { + "minimatch": "3.0.5", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "sync-request": "6.1.0", + "uuid": "^3.0.1" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, + "form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + } + }, + "get-port": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", + "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==" + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "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" + }, + "dependencies": { + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==" + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "http-basic": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", + "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", + "requires": { + "caseless": "^0.12.0", + "concat-stream": "^1.6.2", + "http-response-object": "^3.0.1", + "parse-cache-control": "^1.0.1" + } + }, + "http-response-object": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", + "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", + "requires": { + "@types/node": "^10.0.3" + }, + "dependencies": { + "@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + } + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" + }, + "is-core-module": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "requires": { + "has": "^1.0.3" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, + "parse-cache-control": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", + "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "promise": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", + "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", + "requires": { + "asap": "~2.0.6" + } + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==" + }, + "qs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "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" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "requires": { + "resolve": "^1.1.6" + } + }, + "resolve": { + "version": "1.22.6", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.6.tgz", + "integrity": "sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==", + "requires": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" + }, + "shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, + "sync-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", + "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==", + "requires": { + "http-response-object": "^3.0.1", + "sync-rpc": "^1.2.1", + "then-request": "^6.0.0" + } + }, + "sync-rpc": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz", + "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==", + "requires": { + "get-port": "^3.1.0" + } + }, + "then-request": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", + "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", + "requires": { + "@types/concat-stream": "^1.6.0", + "@types/form-data": "0.0.33", + "@types/node": "^8.0.0", + "@types/qs": "^6.2.31", + "caseless": "~0.12.0", + "concat-stream": "^1.6.0", + "form-data": "^2.2.0", + "http-basic": "^8.1.1", + "http-response-object": "^3.0.1", + "promise": "^8.0.0", + "qs": "^6.4.0" + }, + "dependencies": { + "@types/node": { + "version": "8.10.66", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", + "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==" + } + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, + "typescript": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + } + } +} diff --git a/Tasks/CopyFilesV2/_buildConfigs/Node20/package.json b/Tasks/CopyFilesV2/_buildConfigs/Node20/package.json new file mode 100644 index 000000000000..fda842b3d2f6 --- /dev/null +++ b/Tasks/CopyFilesV2/_buildConfigs/Node20/package.json @@ -0,0 +1,21 @@ +{ + "name": "vsts-copyfiles-task", + "version": "1.0.0", + "description": "Azure Pipelines Copy Files Task", + "main": "copyfiles.js", + "repository": { + "type": "git", + "url": "git+https://github.com/Microsoft/azure-pipelines-tasks.git" + }, + "author": "Microsoft Corporation", + "license": "MIT", + "dependencies": { + "@types/node": "^20.3.1", + "@types/mocha": "^5.2.7", + "@types/uuid": "^8.3.0", + "azure-pipelines-task-lib": "^5.0.0-preview.0" + }, + "devDependencies": { + "typescript": "5.1.6" + } +} diff --git a/Tasks/DecryptFileV1/_buildConfigs/Node20/Tests/package-lock.json b/Tasks/DecryptFileV1/_buildConfigs/Node20/Tests/package-lock.json new file mode 100644 index 000000000000..3063ff7186f4 --- /dev/null +++ b/Tasks/DecryptFileV1/_buildConfigs/Node20/Tests/package-lock.json @@ -0,0 +1,14 @@ +{ + "name": "decrypt-file-tests", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/mocha": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", + "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==", + "dev": true + } + } +} diff --git a/Tasks/DecryptFileV1/_buildConfigs/Node20/Tests/package.json b/Tasks/DecryptFileV1/_buildConfigs/Node20/Tests/package.json new file mode 100644 index 000000000000..28f03b6fd07b --- /dev/null +++ b/Tasks/DecryptFileV1/_buildConfigs/Node20/Tests/package.json @@ -0,0 +1,22 @@ +{ + "name": "decrypt-file-tests", + "version": "1.0.0", + "description": "Azure Pipelines Decrypt File V1 Task Tests", + "main": "L0.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/Microsoft/azure-pipelines-tasks.git" + }, + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Microsoft/azure-pipelines-tasks/issues" + }, + "homepage": "https://github.com/Microsoft/azure-pipelines-tasks#readme", + "devDependencies": { + "@types/mocha": "^5.2.0" + } +} diff --git a/Tasks/DecryptFileV1/_buildConfigs/Node20/package-lock.json b/Tasks/DecryptFileV1/_buildConfigs/Node20/package-lock.json new file mode 100644 index 000000000000..92a8c2bcf17b --- /dev/null +++ b/Tasks/DecryptFileV1/_buildConfigs/Node20/package-lock.json @@ -0,0 +1,488 @@ +{ + "name": "vsts-decrypt-task", + "version": "1.0.1", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/concat-stream": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz", + "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==", + "requires": { + "@types/node": "*" + } + }, + "@types/form-data": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", + "integrity": "sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==", + "requires": { + "@types/node": "*" + } + }, + "@types/mocha": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", + "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==" + }, + "@types/node": { + "version": "20.7.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.7.0.tgz", + "integrity": "sha512-zI22/pJW2wUZOVyguFaUL1HABdmSVxpXrzIqkjsHmyUjNhPoWM1CKfvVuXfetHhIok4RY573cqS0mZ1SJEnoTg==" + }, + "@types/q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.1.tgz", + "integrity": "sha512-eqz8c/0kwNi/OEHQfvIuJVLTst3in0e7uTKeuY+WL/zfKn0xVujOTp42bS/vUUokhK5P2BppLd9JXMOMHcgbjA==" + }, + "@types/qs": { + "version": "6.9.8", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.8.tgz", + "integrity": "sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg==" + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "azure-pipelines-task-lib": { + "version": "5.0.0-preview.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-5.0.0-preview.0.tgz", + "integrity": "sha512-uQJEv+q3/7RD7kgphFd33uXijaPwA1ePYoNkAgZpUhbZUtc2u4JL4ujTT/JJfgXBNW/QQNAiDQ2OC7vOQG/0tg==", + "requires": { + "minimatch": "3.0.5", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "sync-request": "6.1.0", + "uuid": "^3.0.1" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, + "form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + } + }, + "get-port": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", + "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==" + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "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" + }, + "dependencies": { + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==" + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "http-basic": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", + "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", + "requires": { + "caseless": "^0.12.0", + "concat-stream": "^1.6.2", + "http-response-object": "^3.0.1", + "parse-cache-control": "^1.0.1" + } + }, + "http-response-object": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", + "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", + "requires": { + "@types/node": "^10.0.3" + }, + "dependencies": { + "@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + } + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" + }, + "is-core-module": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "requires": { + "has": "^1.0.3" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, + "parse-cache-control": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", + "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "promise": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", + "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", + "requires": { + "asap": "~2.0.6" + } + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==" + }, + "qs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "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" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "requires": { + "resolve": "^1.1.6" + } + }, + "resolve": { + "version": "1.22.6", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.6.tgz", + "integrity": "sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==", + "requires": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" + }, + "shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, + "sync-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", + "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==", + "requires": { + "http-response-object": "^3.0.1", + "sync-rpc": "^1.2.1", + "then-request": "^6.0.0" + } + }, + "sync-rpc": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz", + "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==", + "requires": { + "get-port": "^3.1.0" + } + }, + "then-request": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", + "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", + "requires": { + "@types/concat-stream": "^1.6.0", + "@types/form-data": "0.0.33", + "@types/node": "^8.0.0", + "@types/qs": "^6.2.31", + "caseless": "~0.12.0", + "concat-stream": "^1.6.0", + "form-data": "^2.2.0", + "http-basic": "^8.1.1", + "http-response-object": "^3.0.1", + "promise": "^8.0.0", + "qs": "^6.4.0" + }, + "dependencies": { + "@types/node": { + "version": "8.10.66", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", + "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==" + } + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, + "typescript": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + } + } +} diff --git a/Tasks/DecryptFileV1/_buildConfigs/Node20/package.json b/Tasks/DecryptFileV1/_buildConfigs/Node20/package.json new file mode 100644 index 000000000000..3ae85c9b340e --- /dev/null +++ b/Tasks/DecryptFileV1/_buildConfigs/Node20/package.json @@ -0,0 +1,28 @@ +{ + "name": "vsts-decrypt-task", + "version": "1.0.1", + "description": "Azure Pipelines Decrypt Task", + "main": "decrypt.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/Microsoft/azure-pipelines-tasks.git" + }, + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Microsoft/azure-pipelines-tasks/issues" + }, + "homepage": "https://github.com/Microsoft/azure-pipelines-tasks#readme", + "dependencies": { + "@types/node": "^20.3.1", + "@types/mocha": "^5.2.7", + "@types/q": "^1.0.7", + "azure-pipelines-task-lib": "^5.0.0-preview.0" + }, + "devDependencies": { + "typescript": "5.1.6" + } +} diff --git a/Tasks/DeleteFilesV1/_buildConfigs/Node20/package-lock.json b/Tasks/DeleteFilesV1/_buildConfigs/Node20/package-lock.json new file mode 100644 index 000000000000..c8662c2ef8e2 --- /dev/null +++ b/Tasks/DeleteFilesV1/_buildConfigs/Node20/package-lock.json @@ -0,0 +1,483 @@ +{ + "name": "vsts-deletefiles-tasks", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/concat-stream": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz", + "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==", + "requires": { + "@types/node": "*" + } + }, + "@types/form-data": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", + "integrity": "sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==", + "requires": { + "@types/node": "*" + } + }, + "@types/mocha": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", + "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==" + }, + "@types/node": { + "version": "20.7.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.7.0.tgz", + "integrity": "sha512-zI22/pJW2wUZOVyguFaUL1HABdmSVxpXrzIqkjsHmyUjNhPoWM1CKfvVuXfetHhIok4RY573cqS0mZ1SJEnoTg==" + }, + "@types/qs": { + "version": "6.9.8", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.8.tgz", + "integrity": "sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg==" + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "azure-pipelines-task-lib": { + "version": "5.0.0-preview.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-5.0.0-preview.0.tgz", + "integrity": "sha512-uQJEv+q3/7RD7kgphFd33uXijaPwA1ePYoNkAgZpUhbZUtc2u4JL4ujTT/JJfgXBNW/QQNAiDQ2OC7vOQG/0tg==", + "requires": { + "minimatch": "3.0.5", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "sync-request": "6.1.0", + "uuid": "^3.0.1" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, + "form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + } + }, + "get-port": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", + "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==" + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "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" + }, + "dependencies": { + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==" + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "http-basic": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", + "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", + "requires": { + "caseless": "^0.12.0", + "concat-stream": "^1.6.2", + "http-response-object": "^3.0.1", + "parse-cache-control": "^1.0.1" + } + }, + "http-response-object": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", + "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", + "requires": { + "@types/node": "^10.0.3" + }, + "dependencies": { + "@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + } + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" + }, + "is-core-module": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "requires": { + "has": "^1.0.3" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, + "parse-cache-control": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", + "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "promise": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", + "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", + "requires": { + "asap": "~2.0.6" + } + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==" + }, + "qs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "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" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "requires": { + "resolve": "^1.1.6" + } + }, + "resolve": { + "version": "1.22.6", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.6.tgz", + "integrity": "sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==", + "requires": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" + }, + "shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, + "sync-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", + "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==", + "requires": { + "http-response-object": "^3.0.1", + "sync-rpc": "^1.2.1", + "then-request": "^6.0.0" + } + }, + "sync-rpc": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz", + "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==", + "requires": { + "get-port": "^3.1.0" + } + }, + "then-request": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", + "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", + "requires": { + "@types/concat-stream": "^1.6.0", + "@types/form-data": "0.0.33", + "@types/node": "^8.0.0", + "@types/qs": "^6.2.31", + "caseless": "~0.12.0", + "concat-stream": "^1.6.0", + "form-data": "^2.2.0", + "http-basic": "^8.1.1", + "http-response-object": "^3.0.1", + "promise": "^8.0.0", + "qs": "^6.4.0" + }, + "dependencies": { + "@types/node": { + "version": "8.10.66", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", + "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==" + } + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, + "typescript": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + } + } +} diff --git a/Tasks/DeleteFilesV1/_buildConfigs/Node20/package.json b/Tasks/DeleteFilesV1/_buildConfigs/Node20/package.json new file mode 100644 index 000000000000..5f56f1aa9500 --- /dev/null +++ b/Tasks/DeleteFilesV1/_buildConfigs/Node20/package.json @@ -0,0 +1,27 @@ +{ + "name": "vsts-deletefiles-tasks", + "version": "1.0.0", + "description": "Azure Pipelines DeleteFiles Task", + "main": "deletefiles.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/Microsoft/azure-pipelines-tasks.git" + }, + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Microsoft/azure-pipelines-tasks/issues" + }, + "homepage": "https://github.com/Microsoft/azure-pipelines-tasks#readme", + "dependencies": { + "@types/node": "^20.3.1", + "@types/mocha": "^5.2.7", + "azure-pipelines-task-lib": "^5.0.0-preview.0" + }, + "devDependencies": { + "typescript": "5.1.6" + } +} diff --git a/Tasks/DownloadSecureFileV1/_buildConfigs/Node20/Tests/package-lock.json b/Tasks/DownloadSecureFileV1/_buildConfigs/Node20/Tests/package-lock.json new file mode 100644 index 000000000000..3126521ed43b --- /dev/null +++ b/Tasks/DownloadSecureFileV1/_buildConfigs/Node20/Tests/package-lock.json @@ -0,0 +1,14 @@ +{ + "name": "vsts-tasks-downloadsecurefile-tests", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/mocha": { + "version": "5.2.5", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.5.tgz", + "integrity": "sha512-lAVp+Kj54ui/vLUFxsJTMtWvZraZxum3w3Nwkble2dNuV5VnPA+Mi2oGX9XYJAaIvZi3tn3cbjS/qcJXRb6Bww==", + "dev": true + } + } +} diff --git a/Tasks/DownloadSecureFileV1/_buildConfigs/Node20/Tests/package.json b/Tasks/DownloadSecureFileV1/_buildConfigs/Node20/Tests/package.json new file mode 100644 index 000000000000..6dacc0eb5120 --- /dev/null +++ b/Tasks/DownloadSecureFileV1/_buildConfigs/Node20/Tests/package.json @@ -0,0 +1,22 @@ +{ + "name": "vsts-tasks-downloadsecurefile-tests", + "version": "1.0.0", + "description": "VSTS Download Secure File Task Tests", + "main": "L0.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/Microsoft/azure-pipelines-tasks.git" + }, + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Microsoft/azure-pipelines-tasks/issues" + }, + "homepage": "https://github.com/Microsoft/azure-pipelines-tasks#readme", + "devDependencies": { + "@types/mocha": "^5.2.0" + } +} diff --git a/Tasks/DownloadSecureFileV1/_buildConfigs/Node20/package-lock.json b/Tasks/DownloadSecureFileV1/_buildConfigs/Node20/package-lock.json new file mode 100644 index 000000000000..6b423ed00df8 --- /dev/null +++ b/Tasks/DownloadSecureFileV1/_buildConfigs/Node20/package-lock.json @@ -0,0 +1,548 @@ +{ + "name": "vsts-tasks-downloadsecurefile", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/concat-stream": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz", + "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==", + "requires": { + "@types/node": "*" + } + }, + "@types/form-data": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", + "integrity": "sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==", + "requires": { + "@types/node": "*" + } + }, + "@types/mocha": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", + "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==" + }, + "@types/node": { + "version": "20.7.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.7.0.tgz", + "integrity": "sha512-zI22/pJW2wUZOVyguFaUL1HABdmSVxpXrzIqkjsHmyUjNhPoWM1CKfvVuXfetHhIok4RY573cqS0mZ1SJEnoTg==" + }, + "@types/q": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.5.tgz", + "integrity": "sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ==" + }, + "@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "azure-devops-node-api": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/azure-devops-node-api/-/azure-devops-node-api-10.2.2.tgz", + "integrity": "sha512-4TVv2X7oNStT0vLaEfExmy3J4/CzfuXolEcQl/BRUmvGySqKStTG2O55/hUQ0kM7UJlZBLgniM0SBq4d/WkKow==", + "requires": { + "tunnel": "0.0.6", + "typed-rest-client": "^1.8.4" + } + }, + "azure-pipelines-task-lib": { + "version": "5.0.0-preview.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-5.0.0-preview.0.tgz", + "integrity": "sha512-uQJEv+q3/7RD7kgphFd33uXijaPwA1ePYoNkAgZpUhbZUtc2u4JL4ujTT/JJfgXBNW/QQNAiDQ2OC7vOQG/0tg==", + "requires": { + "minimatch": "3.0.5", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "sync-request": "6.1.0", + "uuid": "^3.0.1" + } + }, + "azure-pipelines-tasks-securefiles-common": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-tasks-securefiles-common/-/azure-pipelines-tasks-securefiles-common-2.1.0.tgz", + "integrity": "sha512-oE7VscWFZD+Ku0WM6e2b5Y0eDom4DTZvER/mSh3m/z9V0yN9JUahNR0Dye9NIj0BSIyfgcaxxNWBCzqJMsirIQ==", + "requires": { + "@types/node": "^10.17.0", + "@types/q": "^1.5.4", + "azure-devops-node-api": "10.2.2", + "azure-pipelines-task-lib": "^3.1.0" + }, + "dependencies": { + "@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + }, + "azure-pipelines-task-lib": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-3.3.1.tgz", + "integrity": "sha512-56ZAr4MHIoa24VNVuwPL4iUQ5MKaigPoYXkBG8E8fiVmh8yZdatUo25meNoQwg77vDY22F63Q44UzXoMWmy7ag==", + "requires": { + "minimatch": "3.0.5", + "mockery": "^1.7.0", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "sync-request": "6.1.0", + "uuid": "^3.0.1" + } + } + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, + "form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-intrinsic": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", + "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + } + }, + "get-port": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", + "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==" + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "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" + }, + "dependencies": { + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "http-basic": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", + "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", + "requires": { + "caseless": "^0.12.0", + "concat-stream": "^1.6.2", + "http-response-object": "^3.0.1", + "parse-cache-control": "^1.0.1" + } + }, + "http-response-object": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", + "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", + "requires": { + "@types/node": "^10.0.3" + }, + "dependencies": { + "@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + } + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" + }, + "is-core-module": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", + "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", + "requires": { + "has": "^1.0.3" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "mockery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/mockery/-/mockery-1.7.0.tgz", + "integrity": "sha512-gUQA33ayi0tuAhr/rJNZPr7Q7uvlBt4gyJPbi0CDcAfIzIrDu1YgGMFgmAu3stJqBpK57m7+RxUbcS+pt59fKQ==" + }, + "object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, + "parse-cache-control": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", + "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "promise": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.2.0.tgz", + "integrity": "sha512-+CMAlLHqwRYwBMXKCP+o8ns7DN+xHDUiI+0nArsiJ9y+kJVPLFxEaSw6Ha9s9H0tftxg2Yzl25wqj9G7m5wLZg==", + "requires": { + "asap": "~2.0.6" + } + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==" + }, + "qs": { + "version": "6.11.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.1.tgz", + "integrity": "sha512-0wsrzgTz/kAVIeuxSjnpGC56rzYtr6JT/2BwEvMaPhFIoYa1aGO8LbzuU1R0uUYQkLpWBTOj0l/CLAJB64J6nQ==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "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" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "requires": { + "resolve": "^1.1.6" + } + }, + "resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "requires": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, + "sync-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", + "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==", + "requires": { + "http-response-object": "^3.0.1", + "sync-rpc": "^1.2.1", + "then-request": "^6.0.0" + } + }, + "sync-rpc": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz", + "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==", + "requires": { + "get-port": "^3.1.0" + } + }, + "then-request": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", + "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", + "requires": { + "@types/concat-stream": "^1.6.0", + "@types/form-data": "0.0.33", + "@types/node": "^8.0.0", + "@types/qs": "^6.2.31", + "caseless": "~0.12.0", + "concat-stream": "^1.6.0", + "form-data": "^2.2.0", + "http-basic": "^8.1.1", + "http-response-object": "^3.0.1", + "promise": "^8.0.0", + "qs": "^6.4.0" + }, + "dependencies": { + "@types/node": { + "version": "8.10.66", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", + "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==" + } + } + }, + "tunnel": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", + "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==" + }, + "typed-rest-client": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.8.5.tgz", + "integrity": "sha512-952/Aegu3lTqUAI1anbDLbewojnF/gh8at9iy1CIrfS1h/+MtNjB1Y9z6ZF5n2kZd+97em56lZ9uu7Zz3y/pwg==", + "requires": { + "qs": "^6.9.1", + "tunnel": "0.0.6", + "underscore": "^1.12.1" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, + "typescript": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "dev": true + }, + "underscore": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.1.tgz", + "integrity": "sha512-hzSoAVtJF+3ZtiFX0VgfFPHEDRm7Y/QPjGyNo4TVdnDTdft3tr8hEkD25a1jC+TjTuE7tkHGKkhwCgs9dgBB2g==" + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + } + } +} diff --git a/Tasks/DownloadSecureFileV1/_buildConfigs/Node20/package.json b/Tasks/DownloadSecureFileV1/_buildConfigs/Node20/package.json new file mode 100644 index 000000000000..eff93eb05910 --- /dev/null +++ b/Tasks/DownloadSecureFileV1/_buildConfigs/Node20/package.json @@ -0,0 +1,28 @@ +{ + "name": "vsts-tasks-downloadsecurefile", + "version": "1.0.0", + "description": "Azure Pipelines Download Secure File Task", + "main": "predownloadsecurefile.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/Microsoft/azure-pipelines-tasks.git" + }, + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Microsoft/azure-pipelines-tasks/issues" + }, + "homepage": "https://github.com/Microsoft/azure-pipelines-tasks#readme", + "dependencies": { + "@types/node": "^20.3.1", + "@types/mocha": "^5.2.7", + "azure-pipelines-task-lib": "^5.0.0-preview.0", + "azure-pipelines-tasks-securefiles-common": "^2.1.0" + }, + "devDependencies": { + "typescript": "5.1.6" + } +} diff --git a/Tasks/ExtractFilesV1/_buildConfigs/Node20/package-lock.json b/Tasks/ExtractFilesV1/_buildConfigs/Node20/package-lock.json new file mode 100644 index 000000000000..84b73a336a78 --- /dev/null +++ b/Tasks/ExtractFilesV1/_buildConfigs/Node20/package-lock.json @@ -0,0 +1,511 @@ +{ + "name": "ExtractFiles", + "version": "1.0.2", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/concat-stream": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz", + "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==", + "requires": { + "@types/node": "*" + } + }, + "@types/form-data": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", + "integrity": "sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==", + "requires": { + "@types/node": "*" + } + }, + "@types/mocha": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.1.1.tgz", + "integrity": "sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==" + }, + "@types/node": { + "version": "20.7.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.7.0.tgz", + "integrity": "sha512-zI22/pJW2wUZOVyguFaUL1HABdmSVxpXrzIqkjsHmyUjNhPoWM1CKfvVuXfetHhIok4RY573cqS0mZ1SJEnoTg==" + }, + "@types/q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.1.tgz", + "integrity": "sha512-eqz8c/0kwNi/OEHQfvIuJVLTst3in0e7uTKeuY+WL/zfKn0xVujOTp42bS/vUUokhK5P2BppLd9JXMOMHcgbjA==" + }, + "@types/qs": { + "version": "6.9.8", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.8.tgz", + "integrity": "sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg==" + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "azure-pipelines-task-lib": { + "version": "5.0.0-preview.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-5.0.0-preview.0.tgz", + "integrity": "sha512-uQJEv+q3/7RD7kgphFd33uXijaPwA1ePYoNkAgZpUhbZUtc2u4JL4ujTT/JJfgXBNW/QQNAiDQ2OC7vOQG/0tg==", + "requires": { + "minimatch": "3.0.5", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "sync-request": "6.1.0", + "uuid": "^3.0.1" + }, + "dependencies": { + "minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "brace-expansion": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", + "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + }, + "collections": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/collections/-/collections-3.0.0.tgz", + "integrity": "sha512-ZcLwSBMEktp13cgsNTQGMVDoIKF6y2L7+0l3Ur6G3miB++aRpgiz7Hc4vvChtbALY7ce6LdUPnkw5goKQTmjdg==", + "requires": { + "weak-map": "~1.0.x" + } + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, + "form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + } + }, + "get-port": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", + "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==" + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "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" + }, + "dependencies": { + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==" + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "http-basic": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", + "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", + "requires": { + "caseless": "^0.12.0", + "concat-stream": "^1.6.2", + "http-response-object": "^3.0.1", + "parse-cache-control": "^1.0.1" + } + }, + "http-response-object": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", + "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", + "requires": { + "@types/node": "^10.0.3" + }, + "dependencies": { + "@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + } + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" + }, + "is-core-module": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "requires": { + "has": "^1.0.3" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, + "parse-cache-control": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", + "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "promise": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", + "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", + "requires": { + "asap": "~2.0.6" + } + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==" + }, + "qs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "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" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "requires": { + "resolve": "^1.1.6" + } + }, + "resolve": { + "version": "1.22.6", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.6.tgz", + "integrity": "sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==", + "requires": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" + }, + "shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, + "sync-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", + "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==", + "requires": { + "http-response-object": "^3.0.1", + "sync-rpc": "^1.2.1", + "then-request": "^6.0.0" + } + }, + "sync-rpc": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz", + "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==", + "requires": { + "get-port": "^3.1.0" + } + }, + "then-request": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", + "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", + "requires": { + "@types/concat-stream": "^1.6.0", + "@types/form-data": "0.0.33", + "@types/node": "^8.0.0", + "@types/qs": "^6.2.31", + "caseless": "~0.12.0", + "concat-stream": "^1.6.0", + "form-data": "^2.2.0", + "http-basic": "^8.1.1", + "http-response-object": "^3.0.1", + "promise": "^8.0.0", + "qs": "^6.4.0" + }, + "dependencies": { + "@types/node": { + "version": "8.10.66", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", + "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==" + } + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, + "typescript": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + }, + "weak-map": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/weak-map/-/weak-map-1.0.5.tgz", + "integrity": "sha1-eWkVhNmGB/UHC9O3CkDmuyLkAes=" + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + } + } +} diff --git a/Tasks/ExtractFilesV1/_buildConfigs/Node20/package.json b/Tasks/ExtractFilesV1/_buildConfigs/Node20/package.json new file mode 100644 index 000000000000..15521006a444 --- /dev/null +++ b/Tasks/ExtractFilesV1/_buildConfigs/Node20/package.json @@ -0,0 +1,27 @@ +{ + "name": "ExtractFiles", + "version": "1.0.2", + "description": "Extract Files Task", + "main": "extractfilestask.js", + "repository": { + "type": "git", + "url": "git+https://github.com/Microsoft/azure-pipelines-tasks.git" + }, + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Microsoft/azure-pipelines-tasks/issues" + }, + "homepage": "https://github.com/Microsoft/azure-pipelines-tasks#readme", + "dependencies": { + "@types/q": "^1.0.7", + "@types/node": "^20.3.1", + "@types/mocha": "^9.1.1", + "azure-pipelines-task-lib": "^5.0.0-preview.0", + "collections": "3.0.0", + "minimatch": "^3.0.4" + }, + "devDependencies": { + "typescript": "5.1.6" + } +} diff --git a/Tasks/FtpUploadV1/_buildConfigs/Node20/Tests/package-lock.json b/Tasks/FtpUploadV1/_buildConfigs/Node20/Tests/package-lock.json new file mode 100644 index 000000000000..04ef5eaf8472 --- /dev/null +++ b/Tasks/FtpUploadV1/_buildConfigs/Node20/Tests/package-lock.json @@ -0,0 +1,14 @@ +{ + "name": "ftp-upload-tests", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/mocha": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", + "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==", + "dev": true + } + } +} diff --git a/Tasks/FtpUploadV1/_buildConfigs/Node20/Tests/package.json b/Tasks/FtpUploadV1/_buildConfigs/Node20/Tests/package.json new file mode 100644 index 000000000000..743cd975ef68 --- /dev/null +++ b/Tasks/FtpUploadV1/_buildConfigs/Node20/Tests/package.json @@ -0,0 +1,22 @@ +{ + "name": "ftp-upload-tests", + "version": "1.0.0", + "description": "Azure Pipelines FTP Upload V1 Task Tests", + "main": "L0.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/Microsoft/azure-pipelines-tasks.git" + }, + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Microsoft/azure-pipelines-tasks/issues" + }, + "homepage": "https://github.com/Microsoft/azure-pipelines-tasks#readme", + "devDependencies": { + "@types/mocha": "^5.2.0" + } +} diff --git a/Tasks/FtpUploadV1/_buildConfigs/Node20/package-lock.json b/Tasks/FtpUploadV1/_buildConfigs/Node20/package-lock.json new file mode 100644 index 000000000000..010dc8da12d9 --- /dev/null +++ b/Tasks/FtpUploadV1/_buildConfigs/Node20/package-lock.json @@ -0,0 +1,535 @@ +{ + "name": "FTP", + "version": "1.0.1", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/concat-stream": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz", + "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==", + "requires": { + "@types/node": "*" + } + }, + "@types/form-data": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", + "integrity": "sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==", + "requires": { + "@types/node": "*" + } + }, + "@types/mocha": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.1.1.tgz", + "integrity": "sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==" + }, + "@types/node": { + "version": "20.7.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.7.0.tgz", + "integrity": "sha512-zI22/pJW2wUZOVyguFaUL1HABdmSVxpXrzIqkjsHmyUjNhPoWM1CKfvVuXfetHhIok4RY573cqS0mZ1SJEnoTg==" + }, + "@types/q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.1.tgz", + "integrity": "sha512-eqz8c/0kwNi/OEHQfvIuJVLTst3in0e7uTKeuY+WL/zfKn0xVujOTp42bS/vUUokhK5P2BppLd9JXMOMHcgbjA==" + }, + "@types/qs": { + "version": "6.9.8", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.8.tgz", + "integrity": "sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg==" + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "azure-pipelines-task-lib": { + "version": "5.0.0-preview.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-5.0.0-preview.0.tgz", + "integrity": "sha512-uQJEv+q3/7RD7kgphFd33uXijaPwA1ePYoNkAgZpUhbZUtc2u4JL4ujTT/JJfgXBNW/QQNAiDQ2OC7vOQG/0tg==", + "requires": { + "minimatch": "3.0.5", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "sync-request": "6.1.0", + "uuid": "^3.0.1" + }, + "dependencies": { + "minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "brace-expansion": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", + "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "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" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, + "form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "ftp": { + "version": "0.3.10", + "resolved": "https://registry.npmjs.org/ftp/-/ftp-0.3.10.tgz", + "integrity": "sha512-faFVML1aBx2UoDStmLwv2Wptt4vw5x03xxX172nhA5Y5HBshW5JweqQ2W4xL4dezQTG8inJsuYcpPHHU3X5OTQ==", + "requires": { + "readable-stream": "1.1.x", + "xregexp": "2.0.0" + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + } + }, + "get-port": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", + "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==" + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "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" + }, + "dependencies": { + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==" + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "http-basic": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", + "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", + "requires": { + "caseless": "^0.12.0", + "concat-stream": "^1.6.2", + "http-response-object": "^3.0.1", + "parse-cache-control": "^1.0.1" + } + }, + "http-response-object": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", + "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", + "requires": { + "@types/node": "^10.0.3" + }, + "dependencies": { + "@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + } + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" + }, + "is-core-module": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "requires": { + "has": "^1.0.3" + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, + "parse-cache-control": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", + "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "promise": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", + "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", + "requires": { + "asap": "~2.0.6" + } + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==" + }, + "qs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "requires": { + "resolve": "^1.1.6" + } + }, + "resolve": { + "version": "1.22.6", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.6.tgz", + "integrity": "sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==", + "requires": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" + }, + "shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, + "sync-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", + "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==", + "requires": { + "http-response-object": "^3.0.1", + "sync-rpc": "^1.2.1", + "then-request": "^6.0.0" + } + }, + "sync-rpc": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz", + "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==", + "requires": { + "get-port": "^3.1.0" + } + }, + "then-request": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", + "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", + "requires": { + "@types/concat-stream": "^1.6.0", + "@types/form-data": "0.0.33", + "@types/node": "^8.0.0", + "@types/qs": "^6.2.31", + "caseless": "~0.12.0", + "concat-stream": "^1.6.0", + "form-data": "^2.2.0", + "http-basic": "^8.1.1", + "http-response-object": "^3.0.1", + "promise": "^8.0.0", + "qs": "^6.4.0" + }, + "dependencies": { + "@types/node": { + "version": "8.10.66", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", + "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==" + } + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, + "typescript": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "xregexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-2.0.0.tgz", + "integrity": "sha512-xl/50/Cf32VsGq/1R8jJE5ajH1yMCQkpmoS10QbFZWl2Oor4H0Me64Pu2yxvsRWK3m6soJbmGfzSR7BYmDcWAA==" + } + } +} diff --git a/Tasks/FtpUploadV1/_buildConfigs/Node20/package.json b/Tasks/FtpUploadV1/_buildConfigs/Node20/package.json new file mode 100644 index 000000000000..4ed7e50cd20e --- /dev/null +++ b/Tasks/FtpUploadV1/_buildConfigs/Node20/package.json @@ -0,0 +1,27 @@ +{ + "name": "FTP", + "version": "1.0.1", + "description": "FTP Upload Task", + "main": "ftpuploadtask.js", + "repository": { + "type": "git", + "url": "git+https://github.com/Microsoft/azure-pipelines-tasks.git" + }, + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Microsoft/azure-pipelines-tasks/issues" + }, + "homepage": "https://github.com/Microsoft/azure-pipelines-tasks#readme", + "dependencies": { + "@types/node": "^20.3.1", + "@types/mocha": "^9.1.1", + "@types/q": "^1.0.7", + "azure-pipelines-task-lib": "^5.0.0-preview.0", + "ftp": "0.3.10", + "minimatch": "^3.0.4" + }, + "devDependencies": { + "typescript": "5.1.6" + } +} diff --git a/Tasks/GruntV0/_buildConfigs/Node20/Tests/package-lock.json b/Tasks/GruntV0/_buildConfigs/Node20/Tests/package-lock.json new file mode 100644 index 000000000000..e0ee3d5cab23 --- /dev/null +++ b/Tasks/GruntV0/_buildConfigs/Node20/Tests/package-lock.json @@ -0,0 +1,14 @@ +{ + "name": "grunt-tests", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/mocha": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", + "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==", + "dev": true + } + } +} diff --git a/Tasks/GruntV0/_buildConfigs/Node20/Tests/package.json b/Tasks/GruntV0/_buildConfigs/Node20/Tests/package.json new file mode 100644 index 000000000000..d1e8e3584150 --- /dev/null +++ b/Tasks/GruntV0/_buildConfigs/Node20/Tests/package.json @@ -0,0 +1,22 @@ +{ + "name": "grunt-tests", + "version": "1.0.0", + "description": "Azure Pipelines Grunt V0 Task Tests", + "main": "L0.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/Microsoft/azure-pipelines-tasks.git" + }, + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Microsoft/azure-pipelines-tasks/issues" + }, + "homepage": "https://github.com/Microsoft/azure-pipelines-tasks#readme", + "devDependencies": { + "@types/mocha": "^5.2.0" + } +} diff --git a/Tasks/GruntV0/_buildConfigs/Node20/package-lock.json b/Tasks/GruntV0/_buildConfigs/Node20/package-lock.json new file mode 100644 index 000000000000..91d1b0046a9a --- /dev/null +++ b/Tasks/GruntV0/_buildConfigs/Node20/package-lock.json @@ -0,0 +1,483 @@ +{ + "name": "vsts-grunt-task", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/concat-stream": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz", + "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==", + "requires": { + "@types/node": "*" + } + }, + "@types/form-data": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", + "integrity": "sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==", + "requires": { + "@types/node": "*" + } + }, + "@types/mocha": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", + "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==" + }, + "@types/node": { + "version": "20.7.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.7.0.tgz", + "integrity": "sha512-zI22/pJW2wUZOVyguFaUL1HABdmSVxpXrzIqkjsHmyUjNhPoWM1CKfvVuXfetHhIok4RY573cqS0mZ1SJEnoTg==" + }, + "@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "azure-pipelines-task-lib": { + "version": "4.0.0-preview", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-4.0.0-preview.tgz", + "integrity": "sha512-BK+VOo42Bec72Wic6Vsm2MaAJezNyF05OYAQS5FuZJM5Z972lZqYpujtSc4BFKUhC3HO+F/Yf4xhAV2tZCzN9Q==", + "requires": { + "minimatch": "3.0.5", + "mockery": "^1.7.0", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "sync-request": "6.1.0", + "uuid": "^3.0.1" + }, + "dependencies": { + "minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, + "form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-intrinsic": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", + "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + } + }, + "get-port": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", + "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==" + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "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" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "http-basic": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", + "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", + "requires": { + "caseless": "^0.12.0", + "concat-stream": "^1.6.2", + "http-response-object": "^3.0.1", + "parse-cache-control": "^1.0.1" + } + }, + "http-response-object": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", + "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", + "requires": { + "@types/node": "^10.0.3" + }, + "dependencies": { + "@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + } + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" + }, + "is-core-module": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", + "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", + "requires": { + "has": "^1.0.3" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "mockery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/mockery/-/mockery-1.7.0.tgz", + "integrity": "sha512-gUQA33ayi0tuAhr/rJNZPr7Q7uvlBt4gyJPbi0CDcAfIzIrDu1YgGMFgmAu3stJqBpK57m7+RxUbcS+pt59fKQ==" + }, + "object-inspect": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, + "parse-cache-control": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", + "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "promise": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.2.0.tgz", + "integrity": "sha512-+CMAlLHqwRYwBMXKCP+o8ns7DN+xHDUiI+0nArsiJ9y+kJVPLFxEaSw6Ha9s9H0tftxg2Yzl25wqj9G7m5wLZg==", + "requires": { + "asap": "~2.0.6" + } + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==" + }, + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "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" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "requires": { + "resolve": "^1.1.6" + } + }, + "resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "requires": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, + "sync-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", + "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==", + "requires": { + "http-response-object": "^3.0.1", + "sync-rpc": "^1.2.1", + "then-request": "^6.0.0" + } + }, + "sync-rpc": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz", + "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==", + "requires": { + "get-port": "^3.1.0" + } + }, + "then-request": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", + "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", + "requires": { + "@types/concat-stream": "^1.6.0", + "@types/form-data": "0.0.33", + "@types/node": "^8.0.0", + "@types/qs": "^6.2.31", + "caseless": "~0.12.0", + "concat-stream": "^1.6.0", + "form-data": "^2.2.0", + "http-basic": "^8.1.1", + "http-response-object": "^3.0.1", + "promise": "^8.0.0", + "qs": "^6.4.0" + }, + "dependencies": { + "@types/node": { + "version": "8.10.66", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", + "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==" + } + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, + "typescript": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + } + } +} diff --git a/Tasks/GruntV0/_buildConfigs/Node20/package.json b/Tasks/GruntV0/_buildConfigs/Node20/package.json new file mode 100644 index 000000000000..48cb92d6b225 --- /dev/null +++ b/Tasks/GruntV0/_buildConfigs/Node20/package.json @@ -0,0 +1,28 @@ +{ + "name": "vsts-grunt-task", + "version": "1.0.0", + "description": "Azure Pipelines Grunt Task", + "main": "grunttask.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/Microsoft/azure-pipelines-tasks.git" + }, + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Microsoft/azure-pipelines-tasks/issues" + }, + "homepage": "https://github.com/Microsoft/azure-pipelines-tasks#readme", + "dependencies": { + "azure-pipelines-task-lib": "^4.0.0-preview", + "minimatch": "^3.0.4", + "@types/node": "^20.3.1", + "@types/mocha": "^5.2.7" + }, + "devDependencies": { + "typescript": "5.1.6" + } +} diff --git a/Tasks/GulpV0/_buildConfigs/Node20/Tests/package-lock.json b/Tasks/GulpV0/_buildConfigs/Node20/Tests/package-lock.json new file mode 100644 index 000000000000..b4c44bb0b819 --- /dev/null +++ b/Tasks/GulpV0/_buildConfigs/Node20/Tests/package-lock.json @@ -0,0 +1,14 @@ +{ + "name": "gulp-tests", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/mocha": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", + "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==", + "dev": true + } + } +} diff --git a/Tasks/GulpV0/_buildConfigs/Node20/Tests/package.json b/Tasks/GulpV0/_buildConfigs/Node20/Tests/package.json new file mode 100644 index 000000000000..baedf0fe682c --- /dev/null +++ b/Tasks/GulpV0/_buildConfigs/Node20/Tests/package.json @@ -0,0 +1,22 @@ +{ + "name": "gulp-tests", + "version": "1.0.0", + "description": "Azure Pipelines Gulp V0 Task Tests", + "main": "L0.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/Microsoft/azure-pipelines-tasks.git" + }, + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Microsoft/azure-pipelines-tasks/issues" + }, + "homepage": "https://github.com/Microsoft/azure-pipelines-tasks#readme", + "devDependencies": { + "@types/mocha": "^5.2.7" + } +} diff --git a/Tasks/GulpV0/_buildConfigs/Node20/package-lock.json b/Tasks/GulpV0/_buildConfigs/Node20/package-lock.json new file mode 100644 index 000000000000..0e58c91cfea1 --- /dev/null +++ b/Tasks/GulpV0/_buildConfigs/Node20/package-lock.json @@ -0,0 +1,492 @@ +{ + "name": "vsts-gulp-task", + "requires": true, + "lockfileVersion": 1, + "dependencies": { + "@types/concat-stream": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz", + "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==", + "requires": { + "@types/node": "*" + } + }, + "@types/form-data": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", + "integrity": "sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==", + "requires": { + "@types/node": "*" + } + }, + "@types/mocha": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", + "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==" + }, + "@types/node": { + "version": "20.7.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.7.0.tgz", + "integrity": "sha512-zI22/pJW2wUZOVyguFaUL1HABdmSVxpXrzIqkjsHmyUjNhPoWM1CKfvVuXfetHhIok4RY573cqS0mZ1SJEnoTg==" + }, + "@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "azure-pipelines-task-lib": { + "version": "4.0.0-preview", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-4.0.0-preview.tgz", + "integrity": "sha512-BK+VOo42Bec72Wic6Vsm2MaAJezNyF05OYAQS5FuZJM5Z972lZqYpujtSc4BFKUhC3HO+F/Yf4xhAV2tZCzN9Q==", + "requires": { + "minimatch": "3.0.5", + "mockery": "^1.7.0", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "sync-request": "6.1.0", + "uuid": "^3.0.1" + }, + "dependencies": { + "minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "brace-expansion": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", + "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, + "form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-intrinsic": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", + "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + } + }, + "get-port": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", + "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==" + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "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" + }, + "dependencies": { + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "http-basic": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", + "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", + "requires": { + "caseless": "^0.12.0", + "concat-stream": "^1.6.2", + "http-response-object": "^3.0.1", + "parse-cache-control": "^1.0.1" + } + }, + "http-response-object": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", + "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", + "requires": { + "@types/node": "^10.0.3" + }, + "dependencies": { + "@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + } + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" + }, + "is-core-module": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", + "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", + "requires": { + "has": "^1.0.3" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "mockery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/mockery/-/mockery-1.7.0.tgz", + "integrity": "sha512-gUQA33ayi0tuAhr/rJNZPr7Q7uvlBt4gyJPbi0CDcAfIzIrDu1YgGMFgmAu3stJqBpK57m7+RxUbcS+pt59fKQ==" + }, + "object-inspect": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, + "parse-cache-control": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", + "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "promise": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.2.0.tgz", + "integrity": "sha512-+CMAlLHqwRYwBMXKCP+o8ns7DN+xHDUiI+0nArsiJ9y+kJVPLFxEaSw6Ha9s9H0tftxg2Yzl25wqj9G7m5wLZg==", + "requires": { + "asap": "~2.0.6" + } + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==" + }, + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "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" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "requires": { + "resolve": "^1.1.6" + } + }, + "resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "requires": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, + "sync-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", + "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==", + "requires": { + "http-response-object": "^3.0.1", + "sync-rpc": "^1.2.1", + "then-request": "^6.0.0" + } + }, + "sync-rpc": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz", + "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==", + "requires": { + "get-port": "^3.1.0" + } + }, + "then-request": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", + "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", + "requires": { + "@types/concat-stream": "^1.6.0", + "@types/form-data": "0.0.33", + "@types/node": "^8.0.0", + "@types/qs": "^6.2.31", + "caseless": "~0.12.0", + "concat-stream": "^1.6.0", + "form-data": "^2.2.0", + "http-basic": "^8.1.1", + "http-response-object": "^3.0.1", + "promise": "^8.0.0", + "qs": "^6.4.0" + }, + "dependencies": { + "@types/node": { + "version": "8.10.66", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", + "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==" + } + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, + "typescript": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + } + } +} diff --git a/Tasks/GulpV0/_buildConfigs/Node20/package.json b/Tasks/GulpV0/_buildConfigs/Node20/package.json new file mode 100644 index 000000000000..b092f36cde67 --- /dev/null +++ b/Tasks/GulpV0/_buildConfigs/Node20/package.json @@ -0,0 +1,23 @@ +{ + "name": "vsts-gulp-task", + "description": "Azure Pipelines gulp tasks", + "repository": { + "type": "git", + "url": "git+https://github.com/Microsoft/azure-pipelines-tasks.git" + }, + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Microsoft/azure-pipelines-tasks/issues" + }, + "homepage": "https://github.com/Microsoft/azure-pipelines-tasks#readme", + "dependencies": { + "azure-pipelines-task-lib": "^4.0.0-preview", + "minimatch": "^3.0.4", + "@types/node": "^20.3.1", + "@types/mocha": "^5.2.7" + }, + "devDependencies": { + "typescript": "5.1.6" + } +} diff --git a/Tasks/GulpV1/_buildConfigs/Node20/Tests/package-lock.json b/Tasks/GulpV1/_buildConfigs/Node20/Tests/package-lock.json new file mode 100644 index 000000000000..b4c44bb0b819 --- /dev/null +++ b/Tasks/GulpV1/_buildConfigs/Node20/Tests/package-lock.json @@ -0,0 +1,14 @@ +{ + "name": "gulp-tests", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/mocha": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", + "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==", + "dev": true + } + } +} diff --git a/Tasks/GulpV1/_buildConfigs/Node20/Tests/package.json b/Tasks/GulpV1/_buildConfigs/Node20/Tests/package.json new file mode 100644 index 000000000000..e15110b1b699 --- /dev/null +++ b/Tasks/GulpV1/_buildConfigs/Node20/Tests/package.json @@ -0,0 +1,22 @@ +{ + "name": "gulp-tests", + "version": "1.0.0", + "description": "Azure Pipelines Gulp V1 Task Tests", + "main": "L0.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/Microsoft/azure-pipelines-tasks.git" + }, + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Microsoft/azure-pipelines-tasks/issues" + }, + "homepage": "https://github.com/Microsoft/azure-pipelines-tasks#readme", + "devDependencies": { + "@types/mocha": "^5.2.7" + } +} diff --git a/Tasks/GulpV1/_buildConfigs/Node20/package-lock.json b/Tasks/GulpV1/_buildConfigs/Node20/package-lock.json new file mode 100644 index 000000000000..f8f9529c02e6 --- /dev/null +++ b/Tasks/GulpV1/_buildConfigs/Node20/package-lock.json @@ -0,0 +1,497 @@ +{ + "name": "vsts-gulp-task", + "requires": true, + "lockfileVersion": 1, + "dependencies": { + "@types/concat-stream": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz", + "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==", + "requires": { + "@types/node": "*" + } + }, + "@types/form-data": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", + "integrity": "sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==", + "requires": { + "@types/node": "*" + } + }, + "@types/mocha": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", + "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==" + }, + "@types/node": { + "version": "20.7.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.7.0.tgz", + "integrity": "sha512-zI22/pJW2wUZOVyguFaUL1HABdmSVxpXrzIqkjsHmyUjNhPoWM1CKfvVuXfetHhIok4RY573cqS0mZ1SJEnoTg==" + }, + "@types/q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.1.tgz", + "integrity": "sha512-eqz8c/0kwNi/OEHQfvIuJVLTst3in0e7uTKeuY+WL/zfKn0xVujOTp42bS/vUUokhK5P2BppLd9JXMOMHcgbjA==" + }, + "@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "azure-pipelines-task-lib": { + "version": "4.0.0-preview", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-4.0.0-preview.tgz", + "integrity": "sha512-BK+VOo42Bec72Wic6Vsm2MaAJezNyF05OYAQS5FuZJM5Z972lZqYpujtSc4BFKUhC3HO+F/Yf4xhAV2tZCzN9Q==", + "requires": { + "minimatch": "3.0.5", + "mockery": "^1.7.0", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "sync-request": "6.1.0", + "uuid": "^3.0.1" + }, + "dependencies": { + "minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "brace-expansion": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", + "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, + "form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-intrinsic": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", + "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + } + }, + "get-port": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", + "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==" + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "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" + }, + "dependencies": { + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "http-basic": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", + "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", + "requires": { + "caseless": "^0.12.0", + "concat-stream": "^1.6.2", + "http-response-object": "^3.0.1", + "parse-cache-control": "^1.0.1" + } + }, + "http-response-object": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", + "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", + "requires": { + "@types/node": "^10.0.3" + }, + "dependencies": { + "@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + } + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" + }, + "is-core-module": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", + "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", + "requires": { + "has": "^1.0.3" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "mockery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/mockery/-/mockery-1.7.0.tgz", + "integrity": "sha512-gUQA33ayi0tuAhr/rJNZPr7Q7uvlBt4gyJPbi0CDcAfIzIrDu1YgGMFgmAu3stJqBpK57m7+RxUbcS+pt59fKQ==" + }, + "object-inspect": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, + "parse-cache-control": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", + "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "promise": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.2.0.tgz", + "integrity": "sha512-+CMAlLHqwRYwBMXKCP+o8ns7DN+xHDUiI+0nArsiJ9y+kJVPLFxEaSw6Ha9s9H0tftxg2Yzl25wqj9G7m5wLZg==", + "requires": { + "asap": "~2.0.6" + } + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==" + }, + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "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" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "requires": { + "resolve": "^1.1.6" + } + }, + "resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "requires": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, + "sync-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", + "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==", + "requires": { + "http-response-object": "^3.0.1", + "sync-rpc": "^1.2.1", + "then-request": "^6.0.0" + } + }, + "sync-rpc": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz", + "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==", + "requires": { + "get-port": "^3.1.0" + } + }, + "then-request": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", + "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", + "requires": { + "@types/concat-stream": "^1.6.0", + "@types/form-data": "0.0.33", + "@types/node": "^8.0.0", + "@types/qs": "^6.2.31", + "caseless": "~0.12.0", + "concat-stream": "^1.6.0", + "form-data": "^2.2.0", + "http-basic": "^8.1.1", + "http-response-object": "^3.0.1", + "promise": "^8.0.0", + "qs": "^6.4.0" + }, + "dependencies": { + "@types/node": { + "version": "8.10.66", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", + "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==" + } + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, + "typescript": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + } + } +} diff --git a/Tasks/GulpV1/_buildConfigs/Node20/package.json b/Tasks/GulpV1/_buildConfigs/Node20/package.json new file mode 100644 index 000000000000..9c688814b9f7 --- /dev/null +++ b/Tasks/GulpV1/_buildConfigs/Node20/package.json @@ -0,0 +1,24 @@ +{ + "name": "vsts-gulp-task", + "description": "Azure Pipelines gulp tasks", + "repository": { + "type": "git", + "url": "git+https://github.com/microsoft/vsts-tasks.git" + }, + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/microsoft/vsts-tasks/issues" + }, + "homepage": "https://github.com/microsoft/vsts-tasks#readme", + "dependencies": { + "azure-pipelines-task-lib": "^4.0.0-preview", + "minimatch": "^3.0.4", + "@types/node": "^20.3.1", + "@types/mocha": "^5.2.7", + "@types/q": "^1.0.7" + }, + "devDependencies": { + "typescript": "5.1.6" + } +} diff --git a/Tasks/NodeTaskRunnerInstallerV0/_buildConfigs/Node20/package-lock.json b/Tasks/NodeTaskRunnerInstallerV0/_buildConfigs/Node20/package-lock.json new file mode 100644 index 000000000000..1e9c605c61cb --- /dev/null +++ b/Tasks/NodeTaskRunnerInstallerV0/_buildConfigs/Node20/package-lock.json @@ -0,0 +1,525 @@ +{ + "requires": true, + "lockfileVersion": 1, + "dependencies": { + "@types/concat-stream": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz", + "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==", + "requires": { + "@types/node": "*" + } + }, + "@types/form-data": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", + "integrity": "sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==", + "requires": { + "@types/node": "*" + } + }, + "@types/node": { + "version": "20.7.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.7.0.tgz", + "integrity": "sha512-zI22/pJW2wUZOVyguFaUL1HABdmSVxpXrzIqkjsHmyUjNhPoWM1CKfvVuXfetHhIok4RY573cqS0mZ1SJEnoTg==" + }, + "@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" + }, + "@types/semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-41qEJgBH/TWgo5NFSvBCJ1qkoi3Q6ONSF2avrHq1LVEZfYpdHmj0y9SuTK+u9ZhG1sYQKBL1AWXKyLWP4RaUoQ==" + }, + "@types/uuid": { + "version": "3.4.10", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-3.4.10.tgz", + "integrity": "sha512-BgeaZuElf7DEYZhWYDTc/XcLZXdVgFkVSTa13BqKvbnmUrxr3TJFKofUxCtDO9UQOdhnV+HPOESdHiHKZOJV1A==" + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "azure-pipelines-task-lib": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-4.2.0.tgz", + "integrity": "sha512-WUj3XxTWVKxcphLaIHB8OULXC1GT18EAHkibvF5nQ86+dhOtn/KQW44axV8D+udDSM5HAMZxOLe93CPGBqcC5w==", + "requires": { + "minimatch": "3.0.5", + "mockery": "^2.1.0", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "sync-request": "6.1.0", + "uuid": "^3.0.1" + } + }, + "azure-pipelines-tool-lib": { + "version": "2.0.0-preview", + "resolved": "https://registry.npmjs.org/azure-pipelines-tool-lib/-/azure-pipelines-tool-lib-2.0.0-preview.tgz", + "integrity": "sha512-OeivwKLpLMsvGpZ2H+2UPxFwwqNkV8TzfKByqjYAllzGDAw4BvciAdjCMwkpGdTOnzfPbRpr33sy48kn7RqfKA==", + "requires": { + "@types/semver": "^5.3.0", + "@types/uuid": "^3.4.5", + "azure-pipelines-task-lib": "^4.0.0-preview", + "semver": "^5.7.0", + "semver-compare": "^1.0.0", + "typed-rest-client": "^1.8.6", + "uuid": "^3.3.2" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, + "form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-intrinsic": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", + "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + } + }, + "get-port": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", + "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==" + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "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" + }, + "dependencies": { + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "http-basic": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", + "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", + "requires": { + "caseless": "^0.12.0", + "concat-stream": "^1.6.2", + "http-response-object": "^3.0.1", + "parse-cache-control": "^1.0.1" + } + }, + "http-response-object": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", + "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", + "requires": { + "@types/node": "^10.0.3" + }, + "dependencies": { + "@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + } + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" + }, + "is-core-module": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "requires": { + "has": "^1.0.3" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "mockery": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mockery/-/mockery-2.1.0.tgz", + "integrity": "sha512-9VkOmxKlWXoDO/h1jDZaS4lH33aWfRiJiNT/tKj+8OGzrcFDLo8d0syGdbsc3Bc4GvRXPb+NMMvojotmuGJTvA==" + }, + "object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, + "parse-cache-control": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", + "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "promise": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", + "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", + "requires": { + "asap": "~2.0.6" + } + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==" + }, + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "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" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "requires": { + "resolve": "^1.1.6" + } + }, + "resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "requires": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==" + }, + "shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, + "sync-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", + "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==", + "requires": { + "http-response-object": "^3.0.1", + "sync-rpc": "^1.2.1", + "then-request": "^6.0.0" + } + }, + "sync-rpc": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz", + "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==", + "requires": { + "get-port": "^3.1.0" + } + }, + "then-request": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", + "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", + "requires": { + "@types/concat-stream": "^1.6.0", + "@types/form-data": "0.0.33", + "@types/node": "^8.0.0", + "@types/qs": "^6.2.31", + "caseless": "~0.12.0", + "concat-stream": "^1.6.0", + "form-data": "^2.2.0", + "http-basic": "^8.1.1", + "http-response-object": "^3.0.1", + "promise": "^8.0.0", + "qs": "^6.4.0" + }, + "dependencies": { + "@types/node": { + "version": "8.10.66", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", + "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==" + } + } + }, + "tunnel": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", + "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==" + }, + "typed-rest-client": { + "version": "1.8.9", + "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.8.9.tgz", + "integrity": "sha512-uSmjE38B80wjL85UFX3sTYEUlvZ1JgCRhsWj/fJ4rZ0FqDUFoIuodtiVeE+cUqiVTOKPdKrp/sdftD15MDek6g==", + "requires": { + "qs": "^6.9.1", + "tunnel": "0.0.6", + "underscore": "^1.12.1" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, + "typescript": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "dev": true + }, + "underscore": { + "version": "1.13.6", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz", + "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==" + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + } + } +} diff --git a/Tasks/NodeTaskRunnerInstallerV0/_buildConfigs/Node20/package.json b/Tasks/NodeTaskRunnerInstallerV0/_buildConfigs/Node20/package.json new file mode 100644 index 000000000000..6f86f0c5fabb --- /dev/null +++ b/Tasks/NodeTaskRunnerInstallerV0/_buildConfigs/Node20/package.json @@ -0,0 +1,18 @@ +{ + "private": "true", + "main": "index.js", + "author": "Microsoft Corporation", + "license": "MIT", + "scripts": { + "build": "node ../../make.js build --task NodeTaskRunnerInstallerV0", + "test": "node ../../make.js test --task NodeTaskRunnerInstallerV0" + }, + "dependencies": { + "@types/node": "^20.3.1", + "azure-pipelines-task-lib": "^4.2.0", + "azure-pipelines-tool-lib": "^2.0.0-preview" + }, + "devDependencies": { + "typescript": "5.1.6" + } +} diff --git a/Tasks/PublishBuildArtifactsV1/_buildConfigs/Node20/package-lock.json b/Tasks/PublishBuildArtifactsV1/_buildConfigs/Node20/package-lock.json new file mode 100644 index 000000000000..6d5c04ce12fa --- /dev/null +++ b/Tasks/PublishBuildArtifactsV1/_buildConfigs/Node20/package-lock.json @@ -0,0 +1,483 @@ +{ + "name": "vsts-tasks-publishbuildartifacts", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/concat-stream": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz", + "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==", + "requires": { + "@types/node": "*" + } + }, + "@types/form-data": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", + "integrity": "sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==", + "requires": { + "@types/node": "*" + } + }, + "@types/mocha": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", + "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==" + }, + "@types/node": { + "version": "20.7.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.7.0.tgz", + "integrity": "sha512-zI22/pJW2wUZOVyguFaUL1HABdmSVxpXrzIqkjsHmyUjNhPoWM1CKfvVuXfetHhIok4RY573cqS0mZ1SJEnoTg==" + }, + "@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "azure-pipelines-task-lib": { + "version": "4.0.0-preview", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-4.0.0-preview.tgz", + "integrity": "sha512-BK+VOo42Bec72Wic6Vsm2MaAJezNyF05OYAQS5FuZJM5Z972lZqYpujtSc4BFKUhC3HO+F/Yf4xhAV2tZCzN9Q==", + "requires": { + "minimatch": "3.0.5", + "mockery": "^1.7.0", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "sync-request": "6.1.0", + "uuid": "^3.0.1" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, + "form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-intrinsic": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", + "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + } + }, + "get-port": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", + "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==" + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "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" + }, + "dependencies": { + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "http-basic": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", + "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", + "requires": { + "caseless": "^0.12.0", + "concat-stream": "^1.6.2", + "http-response-object": "^3.0.1", + "parse-cache-control": "^1.0.1" + } + }, + "http-response-object": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", + "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", + "requires": { + "@types/node": "^10.0.3" + }, + "dependencies": { + "@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + } + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" + }, + "is-core-module": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", + "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", + "requires": { + "has": "^1.0.3" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "mockery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/mockery/-/mockery-1.7.0.tgz", + "integrity": "sha512-gUQA33ayi0tuAhr/rJNZPr7Q7uvlBt4gyJPbi0CDcAfIzIrDu1YgGMFgmAu3stJqBpK57m7+RxUbcS+pt59fKQ==" + }, + "object-inspect": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, + "parse-cache-control": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", + "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "promise": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.2.0.tgz", + "integrity": "sha512-+CMAlLHqwRYwBMXKCP+o8ns7DN+xHDUiI+0nArsiJ9y+kJVPLFxEaSw6Ha9s9H0tftxg2Yzl25wqj9G7m5wLZg==", + "requires": { + "asap": "~2.0.6" + } + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==" + }, + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "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" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "requires": { + "resolve": "^1.1.6" + } + }, + "resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "requires": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, + "sync-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", + "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==", + "requires": { + "http-response-object": "^3.0.1", + "sync-rpc": "^1.2.1", + "then-request": "^6.0.0" + } + }, + "sync-rpc": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz", + "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==", + "requires": { + "get-port": "^3.1.0" + } + }, + "then-request": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", + "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", + "requires": { + "@types/concat-stream": "^1.6.0", + "@types/form-data": "0.0.33", + "@types/node": "^8.0.0", + "@types/qs": "^6.2.31", + "caseless": "~0.12.0", + "concat-stream": "^1.6.0", + "form-data": "^2.2.0", + "http-basic": "^8.1.1", + "http-response-object": "^3.0.1", + "promise": "^8.0.0", + "qs": "^6.4.0" + }, + "dependencies": { + "@types/node": { + "version": "8.10.66", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", + "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==" + } + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, + "typescript": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + } + } +} diff --git a/Tasks/PublishBuildArtifactsV1/_buildConfigs/Node20/package.json b/Tasks/PublishBuildArtifactsV1/_buildConfigs/Node20/package.json new file mode 100644 index 000000000000..b4e4ac326a05 --- /dev/null +++ b/Tasks/PublishBuildArtifactsV1/_buildConfigs/Node20/package.json @@ -0,0 +1,27 @@ +{ + "name": "vsts-tasks-publishbuildartifacts", + "version": "1.0.0", + "description": "Azure Pipelines Publish Build Artifacts Task", + "main": "publishbuildartifacts.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/Microsoft/azure-pipelines-tasks.git" + }, + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Microsoft/azure-pipelines-tasks/issues" + }, + "homepage": "https://github.com/Microsoft/azure-pipelines-tasks#readme", + "dependencies": { + "@types/node": "^20.3.1", + "@types/mocha": "^5.2.7", + "azure-pipelines-task-lib": "^4.0.0-preview" + }, + "devDependencies": { + "typescript": "5.1.6" + } +} diff --git a/_generated/ANTV1.versionmap.txt b/_generated/ANTV1.versionmap.txt new file mode 100644 index 000000000000..f74febd08e1e --- /dev/null +++ b/_generated/ANTV1.versionmap.txt @@ -0,0 +1,2 @@ +Default|1.229.0 +Node20-225|1.229.1 diff --git a/_generated/ANTV1/README.md b/_generated/ANTV1/README.md new file mode 100644 index 000000000000..8063be7bb416 --- /dev/null +++ b/_generated/ANTV1/README.md @@ -0,0 +1,31 @@ +# Build your code using Ant in Azure Pipelines + +### Parameters for Ant build task are explained below + +- **Ant Build File :** This is a Required field. Provide relative path from the repository root to the Ant build file. To know more [click here](https://ant.apache.org/manual/using.html#buildfile) + +- **Options :** Provide any options to pass to the Ant command line. You can provide your own properties (for example, `-DmyProperty=myPropertyValue`) and also use built-in variables (for example, `-DcollectionId=$(system.collectionId)`). Alternatively, the built-in variables are already set as environment variables during the build and can be passed directly (for example, `-DcollectionIdAsEnvVar=%SYSTEM_COLLECTIONID%)` To know more [click here](https://ant.apache.org/manual/running.html#options) + +- **Target(s) :** Provide The task(s) for Ant to execute for this build. To know more [click here](https://ant.apache.org/manual/targets.html#targets) + +#### JUnit Test Results +Use the next three options to manage your JUnit test results in Azure Pipelines + +- **Publish to Azure Pipelines/TFS :** Select this option to publish JUnit Test results produced by the Ant build to Azure Pipelines/TFS. Each test result file matching `Test Results Files` will be published as a test run in Azure Pipelines. + +- **Test Results Files :** This option will appear if you select the above option. Here, provide Test results files path. Wildcards can be used. For example, `**/TEST-*.xml` for all xml files whose name starts with `TEST-."` + +- **Test Run Title :** This option will appear if you select the `Publish to Azure Pipelines/TFS` option. Here provide a name for the Test Run + +#### Advanced +Use the next options to manage your `ANT_HOME` and `JAVA_HOME` attributes + +- **Set ANT_HOME Path :** If set, overrides any existing `ANT_HOME` environment variable with the given path. + +- **Set JAVA_HOME by :** Select to set `JAVA_HOME` either by providing a path or let Azure Pipelines set the `JAVA_HOME` based on JDK version choosen. By default it is set to `JDK Version` + +- **JDK Version/Path :** Here provide the PATH to `JAVA_HOME` if you want to set it by path or select the appropriate JDK version. + +- **JDK Architecture :** Select the approriate JDK Architecture. By default it is set to `x86` + +**We are discontinuing the support of automated Code Coverage report generation for Ant projects starting Sprint 107 deployment of Azure Pipelines and for Team Foundation Server “15”. Please enable Code Coverage in your Ant build.xml file manually.** diff --git a/_generated/ANTV1/Strings/resources.resjson/de-DE/resources.resjson b/_generated/ANTV1/Strings/resources.resjson/de-DE/resources.resjson new file mode 100644 index 000000000000..fdaeec624e2e --- /dev/null +++ b/_generated/ANTV1/Strings/resources.resjson/de-DE/resources.resjson @@ -0,0 +1,47 @@ +{ + "loc.friendlyName": "Ant", + "loc.helpMarkDown": "[Weitere Informationen zu dieser Aufgabe](https://go.microsoft.com/fwlink/?LinkID=613718) oder [Ant-Dokumentation anzeigen](http://ant.apache.org/)", + "loc.description": "Mit Apache Ant erstellen", + "loc.instanceNameFormat": "Ant $(options) $(antBuildFile)", + "loc.group.displayName.junitTestResults": "JUnit-Testergebnisse", + "loc.group.displayName.codeCoverage": "Code Coverage", + "loc.group.displayName.advanced": "Erweitert", + "loc.input.label.antBuildFile": "Ant-Builddatei", + "loc.input.help.antBuildFile": "Der relative Pfad vom Repositorystamm zur Ant-Builddatei.", + "loc.input.label.options": "Optionen", + "loc.input.help.options": "Geben Sie die Optionen an, die an die Ant-Befehlszeile übergeben werden sollen. Sie können Ihre eigenen Eigenschaften angeben (z. B. \"***-DmyProperty=meinEigenschaftenWert***\") und auch integrierte Variablen verwenden (z. B. \"***-DcollectionId=$(system.collectionId)***\"). Alternativ werden die integrierten Variablen bereits als Umgebungsvariablen während des Builds festgelegt und können direkt übergeben werden (z. B. \"***-DcollectionIdAsEnvVar=%SYSTEM_COLLECTIONID%***\").", + "loc.input.label.targets": "Ziel(e)", + "loc.input.help.targets": "Eine optionale, durch Leerzeichen getrennte Liste der zu erstellenden Ziele. Wenn keine Angabe erfolgt, wird das \"Standardziel\" verwendet. Wenn kein \"Standardziel\" definiert ist, wird Ant 1.6.0 verwendet, und alle Tasks auf oberster Ebene werden später erstellt.", + "loc.input.label.publishJUnitResults": "In Azure Pipelines veröffentlichen", + "loc.input.help.publishJUnitResults": "Wählen Sie diese Option aus, um vom Ant-Build generierte JUnit-Testergebnisse in Azure Pipelines zu veröffentlichen. Jede Testergebnisdatei, die mit \"Testergebnisdateien\" übereinstimmt, wird als Testlauf in Azure Pipelines veröffentlicht.", + "loc.input.label.testResultsFiles": "Testergebnisdateien", + "loc.input.help.testResultsFiles": "Pfad der Testergebnisdateien. Platzhalter können verwendet werden ([weitere Informationen](https://go.microsoft.com/fwlink/?linkid=856077)). Beispiel: \"**/TEST-*.xml\" für alle XML-Dateien, deren Name mit \"TEST-\" beginnt.", + "loc.input.label.testRunTitle": "Testlauftitel", + "loc.input.help.testRunTitle": "Geben Sie einen Namen für den Testlauf an.", + "loc.input.label.codeCoverageTool": "Code Coverage-Tool", + "loc.input.help.codeCoverageTool": "Wählen Sie das Code Coverage-Tool aus. Verwenden Sie den Link \"Weitere Informationen\" unten, um Support zum lokalen Agent zu erhalten.", + "loc.input.label.classFilesDirectories": "Klassendateiverzeichnisse", + "loc.input.help.classFilesDirectories": "Eine durch Kommas getrennte Liste der relativen Pfade von der Ant-Builddatei zu den Verzeichnissen, die Klassendateien und Archivdateien (JAR-, WAR-Dateien usw.) enthalten. Code Coverage wird für Klassendateien in diesen Verzeichnissen gemeldet, z. B. \"target/classes\", \"target/testClasses\".", + "loc.input.label.classFilter": "Filter für den Klasseneinschluss/-ausschluss", + "loc.input.help.classFilter": "Eine durch Kommas getrennte Liste der Filter, um Klassen in die Erfassung von Code Coverage ein- oder von dieser auszuschließen, z. B. \"+:com.*\", \"+:org.*\", \"-:my.app*.*\".", + "loc.input.label.srcDirectories": "Quelldateiverzeichnisse", + "loc.input.help.srcDirectories": "Eine durch Kommas getrennte Liste der relativen Pfade von der Ant-Builddatei zu den Quellcodeverzeichnissen. Code Coverage-Berichte verwenden diese, um Quellcode hervorzuheben, z. B. \"src/java\", \"src/Test\".", + "loc.input.label.failIfCoverageEmpty": "Fehler, wenn die Code Coverage-Ergebnisse fehlen", + "loc.input.help.failIfCoverageEmpty": "Buildfehler, wenn Code Coverage keine zu veröffentlichenden Ergebnisse ergeben hat.", + "loc.input.label.antHomeUserInputPath": "ANT_HOME-Pfad festlegen", + "loc.input.help.antHomeUserInputPath": "Wenn festgelegt, werden alle vorhandenen ANT_HOME-Umgebungsvariablen mit dem angegebenen Pfad überschrieben.", + "loc.input.label.javaHomeSelection": "JAVA_HOME festlegen durch", + "loc.input.help.javaHomeSelection": "Legt JAVA_HOME durch Auswählen einer JDK-Version fest, die während der Erstellung von Builds oder durch manuelles Eingeben eines JDK-Pfads ermittelt wird.", + "loc.input.label.jdkVersion": "JDK-Version", + "loc.input.help.jdkVersion": "Versucht, den Pfad zur ausgewählten JDK-Version zu ermitteln und JAVA_HOME entsprechend festzulegen.", + "loc.input.label.jdkUserInputPath": "JDK-Pfad", + "loc.input.help.jdkUserInputPath": "Legt JAVA_HOME auf den angegebenen Pfad fest.", + "loc.input.label.jdkArchitecture": "JDK-Architektur", + "loc.input.help.jdkArchitecture": "Geben Sie optional die JDK-Architektur an (x86, x64).", + "loc.messages.LocateJVMBasedOnVersionAndArch": "JAVA_HOME für Java %s %s finden", + "loc.messages.UnsupportedJdkWarning": "JDK 9 und JDK 10 werden nicht unterstützt. Wechseln Sie in Ihrem Projekt und Ihrer Pipeline zu einer neueren Version. Es wird versucht, die Erstellung mit JDK 11 durchzuführen...", + "loc.messages.FailedToLocateSpecifiedJVM": "Die angegebene JDK-Version wurde nicht gefunden. Stellen Sie sicher, dass die angegebene JDK-Version auf dem Agent installiert und die Umgebungsvariable \"%s\" vorhanden und auf den Speicherort eines entsprechenden JDK festgelegt ist. Sie können auch die Aufgabe [Installer für Java-Tools](https://go.microsoft.com/fwlink/?linkid=875287) verwenden, um das gewünschte JDK zu installieren.", + "loc.messages.DiscontinueAntCodeCoverage": "Die Unterstützung der automatisierten Code Coverage-Berichterstellung für Ant-Projekte wird eingestellt. Weitere Informationen erhalten Sie unter https://go.microsoft.com/fwlink/?linkid=875306.", + "loc.messages.NoCodeCoverage": "Keine Code Coverage-Ergebnisse zum Veröffentlichen gefunden.", + "loc.messages.NoTestResults": "Es wurden keine Testergebnisdateien gefunden, die mit %s übereinstimmen. Das Veröffentlichen von JUnit-Testergebnissen wird daher übersprungen." +} \ No newline at end of file diff --git a/_generated/ANTV1/Strings/resources.resjson/en-US/resources.resjson b/_generated/ANTV1/Strings/resources.resjson/en-US/resources.resjson new file mode 100644 index 000000000000..3aeb5196f2f5 --- /dev/null +++ b/_generated/ANTV1/Strings/resources.resjson/en-US/resources.resjson @@ -0,0 +1,47 @@ +{ + "loc.friendlyName": "Ant", + "loc.helpMarkDown": "[Learn more about this task](https://go.microsoft.com/fwlink/?LinkID=613718) or [see the Ant documentation](http://ant.apache.org/)", + "loc.description": "Build with Apache Ant", + "loc.instanceNameFormat": "Ant $(options) $(antBuildFile)", + "loc.group.displayName.junitTestResults": "JUnit Test Results", + "loc.group.displayName.codeCoverage": "Code Coverage", + "loc.group.displayName.advanced": "Advanced", + "loc.input.label.antBuildFile": "Ant build file", + "loc.input.help.antBuildFile": "Relative path from the repository root to the Ant build file.", + "loc.input.label.options": "Options", + "loc.input.help.options": "Provide any options to pass to the Ant command line. You can provide your own properties (for example, ***-DmyProperty=myPropertyValue***) and also use built-in variables (for example, ***-DcollectionId=$(system.collectionId)***). Alternatively, the built-in variables are already set as environment variables during the build and can be passed directly (for example, ***-DcollectionIdAsEnvVar=%SYSTEM_COLLECTIONID%***).", + "loc.input.label.targets": "Target(s)", + "loc.input.help.targets": "An optional, space-separated list of targets to build. If not specified, the `default` target will be used. If no `default` target is defined, Ant 1.6.0 and later will build all top-level tasks.", + "loc.input.label.publishJUnitResults": "Publish to Azure Pipelines", + "loc.input.help.publishJUnitResults": "Select this option to publish JUnit test results produced by the Ant build to Azure Pipelines. Each test results file matching `Test Results Files` will be published as a test run in Azure Pipelines.", + "loc.input.label.testResultsFiles": "Test results files", + "loc.input.help.testResultsFiles": "Test results files path. Wildcards can be used ([more information](https://go.microsoft.com/fwlink/?linkid=856077)). For example, `**/TEST-*.xml` for all XML files whose name starts with TEST-.", + "loc.input.label.testRunTitle": "Test run title", + "loc.input.help.testRunTitle": "Provide a name for the test run.", + "loc.input.label.codeCoverageTool": "Code coverage tool", + "loc.input.help.codeCoverageTool": "Select the code coverage tool. For on-premises agent support, refer to the `More Information` link below.", + "loc.input.label.classFilesDirectories": "Class files directories", + "loc.input.help.classFilesDirectories": "Comma-separated list of relative paths from the Ant build file to directories containing class files and archive files (JAR, WAR, etc.). Code coverage is reported for class files in these directories. For example: target/classes,target/testClasses.", + "loc.input.label.classFilter": "Class inclusion/exclusion filters", + "loc.input.help.classFilter": "Comma-separated list of filters to include or exclude classes from collecting code coverage. For example: +:com.*,+:org.*,-:my.app*.*.", + "loc.input.label.srcDirectories": "Source files directories", + "loc.input.help.srcDirectories": "Comma-separated list of relative paths from the Ant build file to source code directories. Code coverage reports will use these to highlight source code. For example: src/java,src/Test.", + "loc.input.label.failIfCoverageEmpty": "Fail when code coverage results are missing", + "loc.input.help.failIfCoverageEmpty": "Fail the build if code coverage did not produce any results to publish.", + "loc.input.label.antHomeUserInputPath": "Set ANT_HOME path", + "loc.input.help.antHomeUserInputPath": "If set, overrides any existing ANT_HOME environment variable with the given path.", + "loc.input.label.javaHomeSelection": "Set JAVA_HOME by", + "loc.input.help.javaHomeSelection": "Sets JAVA_HOME either by selecting a JDK version that will be discovered during builds or by manually entering a JDK path.", + "loc.input.label.jdkVersion": "JDK version", + "loc.input.help.jdkVersion": "Will attempt to discover the path to the selected JDK version and set JAVA_HOME accordingly.", + "loc.input.label.jdkUserInputPath": "JDK path", + "loc.input.help.jdkUserInputPath": "Sets JAVA_HOME to the given path.", + "loc.input.label.jdkArchitecture": "JDK architecture", + "loc.input.help.jdkArchitecture": "Optionally supply the architecture (x86, x64) of the JDK.", + "loc.messages.LocateJVMBasedOnVersionAndArch": "Locate JAVA_HOME for Java %s %s", + "loc.messages.UnsupportedJdkWarning": "JDK 9 and JDK 10 are out of support. Please switch to a later version in your project and pipeline. Attempting to build with JDK 11...", + "loc.messages.FailedToLocateSpecifiedJVM": "Failed to find the specified JDK version. Please ensure the specified JDK version is installed on the agent and the environment variable '%s' exists and is set to the location of a corresponding JDK or use the [Java Tool Installer](https://go.microsoft.com/fwlink/?linkid=875287) task to install the desired JDK.", + "loc.messages.DiscontinueAntCodeCoverage": "We are discontinuing the support of automated code coverage report generation for Ant projects. Please refer to https://go.microsoft.com/fwlink/?linkid=875306 for more details.", + "loc.messages.NoCodeCoverage": "No code coverage results were found to publish.", + "loc.messages.NoTestResults": "No test result files matching %s were found, so publishing JUnit test results is being skipped." +} \ No newline at end of file diff --git a/_generated/ANTV1/Strings/resources.resjson/es-ES/resources.resjson b/_generated/ANTV1/Strings/resources.resjson/es-ES/resources.resjson new file mode 100644 index 000000000000..f86e065e2355 --- /dev/null +++ b/_generated/ANTV1/Strings/resources.resjson/es-ES/resources.resjson @@ -0,0 +1,47 @@ +{ + "loc.friendlyName": "Ant", + "loc.helpMarkDown": "[Obtener más información acerca de esta tarea](https://go.microsoft.com/fwlink/?LinkID=613718) o [consultar la documentación de Ant](http://ant.apache.org/)", + "loc.description": "Compilar con Apache Ant", + "loc.instanceNameFormat": "Ant $(options) $(antBuildFile)", + "loc.group.displayName.junitTestResults": "Resultados de pruebas JUnit", + "loc.group.displayName.codeCoverage": "Cobertura de código", + "loc.group.displayName.advanced": "Avanzado", + "loc.input.label.antBuildFile": "Archivo de compilación de Ant", + "loc.input.help.antBuildFile": "Ruta de acceso relativa de la raíz del repositorio al archivo de compilación de Ant.", + "loc.input.label.options": "Opciones", + "loc.input.help.options": "Proporcione las opciones que se van a pasar a la línea de comandos de Ant. Puede proporcionar sus propiedades (por ejemplo, ***-DmyProperty=myPropertyValue***) y también usar variables integradas (por ejemplo, ***-DcollectionId=$(system.collectionId)***). Puede que las variables integradas ya se hayan establecido como variables de entorno durante la compilación y se puedan pasar directamente (por ejemplo, ***-DcollectionIdAsEnvVar=%SYSTEM_COLLECTIONID%***).", + "loc.input.label.targets": "Destinos", + "loc.input.help.targets": "Una lista opcional y separada por espacios de los destinos que se van a compilar. Si no se especifica, se usará el destino \"predeterminado\". Si no se define ningún destino \"predeterminado\", Ant 1.6.0 y las versiones posteriores compilarán todas las tareas de nivel superior.", + "loc.input.label.publishJUnitResults": "Publicar en Azure Pipelines", + "loc.input.help.publishJUnitResults": "Seleccione esta opción para publicar los resultados de pruebas JUnit generados por la compilación de Ant en Azure Pipelines. Cada archivo de resultados de pruebas que coincida con \"Archivos de resultados de pruebas\" se publicará como una serie de pruebas en Azure Pipelines.", + "loc.input.label.testResultsFiles": "Archivos de resultados de pruebas", + "loc.input.help.testResultsFiles": "Ruta de acceso de los archivos de resultados de pruebas. Puede usar caracteres comodín ([más información](https://go.microsoft.com/fwlink/?linkid=856077)). Por ejemplo, \"**\\*TEST-*.xml\" para todos los archivos XML cuyos nombres empiecen por TEST-.", + "loc.input.label.testRunTitle": "Título de la serie de pruebas", + "loc.input.help.testRunTitle": "Asigne un nombre a la serie de pruebas.", + "loc.input.label.codeCoverageTool": "Herramienta de cobertura de código", + "loc.input.help.codeCoverageTool": "Seleccione la herramienta de cobertura de código. Para el soporte técnico del agente local, consulte el vínculo siguiente \"Más información\".", + "loc.input.label.classFilesDirectories": "Directorios de archivos de clase", + "loc.input.help.classFilesDirectories": "Lista separada por comas de las rutas de acceso relativas desde el archivo de compilación de Ant a los directorios que contienen archivos de clase y archivos de almacenamiento (JAR, WAR, etc.). La cobertura de código se notifica para los archivos de clase que están en los directorios. Por ejemplo: target/classes,target/testClasses.", + "loc.input.label.classFilter": "Filtros de inclusión/exclusión de clase", + "loc.input.help.classFilter": "Lista separada por comas de los filtros para incluir o excluir clases de la recopilación de cobertura de código. Por ejemplo: +:com.*,+:org.*,-:my.app*.*.", + "loc.input.label.srcDirectories": "Directorios de archivos de origen", + "loc.input.help.srcDirectories": "Lista separada por comas de las rutas de acceso relativas desde el archivo de compilación de Ant a los directorios de código fuente. Los informes de cobertura de código las usarán para resaltar el código fuente. Por ejemplo: src/java,src/Test.", + "loc.input.label.failIfCoverageEmpty": "Error si faltan los resultados de cobertura de código", + "loc.input.help.failIfCoverageEmpty": "Error de compilación si la cobertura de código no generó ningún resultado para publicar.", + "loc.input.label.antHomeUserInputPath": "Establecer la ruta ANT_HOME", + "loc.input.help.antHomeUserInputPath": "Si se establece, reemplaza cualquier variable de entorno ANT_HOME existente por la ruta de acceso dada.", + "loc.input.label.javaHomeSelection": "Establecer JAVA_HOME por", + "loc.input.help.javaHomeSelection": "Establece JAVA_HOME seleccionando una versión de JDK que se detectará durante las compilaciones o especificando manualmente una ruta de acceso del JDK.", + "loc.input.label.jdkVersion": "Versión de JDK", + "loc.input.help.jdkVersion": "Se tratará de hallar la ruta de acceso a la versión de JDK seleccionada y establecer JAVA_HOME según sea el caso.", + "loc.input.label.jdkUserInputPath": "Ruta de acceso de JDK", + "loc.input.help.jdkUserInputPath": "Establece JAVA_HOME en la ruta de acceso especificada.", + "loc.input.label.jdkArchitecture": "Arquitectura JDK", + "loc.input.help.jdkArchitecture": "Indique opcionalmente la arquitectura (x86, x64) del JDK.", + "loc.messages.LocateJVMBasedOnVersionAndArch": "Buscar JAVA_HOME para Java %s %s", + "loc.messages.UnsupportedJdkWarning": "JDK 9 y JDK 10 no tienen soporte técnico. Cambie a una versión posterior del proyecto y la canalización. Intentando compilar con JDK 11...", + "loc.messages.FailedToLocateSpecifiedJVM": "No se encontró la versión de JDK especificada. Asegúrese de que dicha versión está instalada en el agente y de que la variable de entorno \"%s\" existe y está establecida en la ubicación de un JDK correspondiente. En caso contrario, use la tarea de [Instalador de herramientas de Java](https://go.microsoft.com/fwlink/?linkid=875287) para instalar el JDK deseado.", + "loc.messages.DiscontinueAntCodeCoverage": "Se va a interrumpir la compatibilidad con la generación automatizada de informes de cobertura de código para proyectos de Ant. Consulte https://go.microsoft.com/fwlink/?linkid=875306 para más información.", + "loc.messages.NoCodeCoverage": "No se encontraron resultados de cobertura de código para publicar.", + "loc.messages.NoTestResults": "No se encontraron archivos de resultados de pruebas que coincidan con %s, por lo que se omite la publicación de los resultados de las pruebas JUnit." +} \ No newline at end of file diff --git a/_generated/ANTV1/Strings/resources.resjson/fr-FR/resources.resjson b/_generated/ANTV1/Strings/resources.resjson/fr-FR/resources.resjson new file mode 100644 index 000000000000..b6a0ea35609c --- /dev/null +++ b/_generated/ANTV1/Strings/resources.resjson/fr-FR/resources.resjson @@ -0,0 +1,47 @@ +{ + "loc.friendlyName": "Ant", + "loc.helpMarkDown": "[En savoir plus sur cette tâche](https://go.microsoft.com/fwlink/?LinkID=613718) ou [consulter la documentation d'Ant](http://ant.apache.org/)", + "loc.description": "Générer avec Apache Ant", + "loc.instanceNameFormat": "Ant $(options) $(antBuildFile)", + "loc.group.displayName.junitTestResults": "Résultats du test JUnit", + "loc.group.displayName.codeCoverage": "Couverture du code", + "loc.group.displayName.advanced": "Avancé", + "loc.input.label.antBuildFile": "Fichier de build Ant", + "loc.input.help.antBuildFile": "Chemin relatif de la racine de dépôt au fichier de build Ant.", + "loc.input.label.options": "Options", + "loc.input.help.options": "Indiquez les options à passer à la ligne de commande Ant. Vous pouvez fournir vos propres propriétés (par exemple ***-DmyProperty=myPropertyValue***), et utiliser les variables intégrées (par exemple ***-DcollectionId=$(system.collectionId)***). Sinon, les variables intégrées sont déjà définies comme variables d'environnement durant la génération et peuvent être passées directement (par exemple ***-DcollectionIdAsEnvVar=%SYSTEM_COLLECTIONID%***).", + "loc.input.label.targets": "Cible(s)", + "loc.input.help.targets": "Liste facultative de cibles à générer, séparées par des espaces. Si rien n'est spécifié, la cible 'default' est utilisée. Si aucune cible 'default' n'est définie, Ant 1.6.0 ou ultérieur génère des tâches qui sont toutes de niveau supérieur.", + "loc.input.label.publishJUnitResults": "Publier sur Azure Pipelines", + "loc.input.help.publishJUnitResults": "Sélectionnez cette option pour publier les résultats des tests JUnit produits par la build Ant sur Azure Pipelines. Chaque fichier de résultats des tests correspondant à 'Fichiers de résultats des tests' est publié en tant que série de tests dans Azure Pipelines.", + "loc.input.label.testResultsFiles": "Fichiers de résultats des tests", + "loc.input.help.testResultsFiles": "Chemin des fichiers de résultats des tests. Les caractères génériques sont autorisés. ([Plus d'informations](https://go.microsoft.com/fwlink/?linkid=856077)). Par exemple, '**/TEST-*.xml' pour tous les fichiers XML dont le nom commence par TEST-.", + "loc.input.label.testRunTitle": "Titre de la série de tests", + "loc.input.help.testRunTitle": "Indiquez le nom de la série de tests.", + "loc.input.label.codeCoverageTool": "Outil de couverture du code", + "loc.input.help.codeCoverageTool": "Sélectionnez l'outil de couverture du code. Pour prendre en charge l'agent local, consultez le lien vers les informations supplémentaires ci-dessous.", + "loc.input.label.classFilesDirectories": "Répertoires de fichiers de classe", + "loc.input.help.classFilesDirectories": "Liste de chemins relatifs séparés par une virgule, allant du fichier de build Ant aux répertoires contenant les fichiers de classe et d'archive (JAR, WAR, etc.). La couverture du code est signalée pour les fichiers de classe dans ces répertoires. Exemple : target/classes,target/testClasses.", + "loc.input.label.classFilter": "Filtres d'inclusion/exclusion de classes", + "loc.input.help.classFilter": "Liste de filtres séparés par une virgule, permettant d'inclure ou d'exclure des classes dans la collecte de la couverture du code. Exemple : +:com.*,+:org.*,-:my.app*.*.", + "loc.input.label.srcDirectories": "Répertoires de fichiers sources", + "loc.input.help.srcDirectories": "Liste de chemins relatifs séparés par une virgule, allant du fichier de build Ant aux répertoires de code source. Les rapports de couverture du code les utilisent pour mettre le code source en surbrillance. Exemple : src/java,src/Test.", + "loc.input.label.failIfCoverageEmpty": "Échec quand les résultats de la couverture du code sont manquants", + "loc.input.help.failIfCoverageEmpty": "Échec de la build si la couverture du code ne produit aucun résultat à publier.", + "loc.input.label.antHomeUserInputPath": "Définir le chemin de ANT_HOME", + "loc.input.help.antHomeUserInputPath": "Si elle est définie, cette valeur remplace les variables d'environnement ANT_HOME existantes par le chemin spécifié.", + "loc.input.label.javaHomeSelection": "Définir JAVA_HOME par", + "loc.input.help.javaHomeSelection": "Définit JAVA_HOME en sélectionnant une version de JDK qui sera découverte au moment des builds ou en tapant le chemin de JDK.", + "loc.input.label.jdkVersion": "Version du kit JDK", + "loc.input.help.jdkVersion": "Essaiera de découvrir le chemin d'accès à la version du JDK sélectionné et définira JAVA_HOME en conséquence.", + "loc.input.label.jdkUserInputPath": "Chemin du kit JDK", + "loc.input.help.jdkUserInputPath": "Définissez JAVA_HOME sur le chemin d'accès indiqué.", + "loc.input.label.jdkArchitecture": "Architecture du kit JDK", + "loc.input.help.jdkArchitecture": "Indiquez éventuellement l'architecture (x86, x64) du JDK.", + "loc.messages.LocateJVMBasedOnVersionAndArch": "Localiser JAVA_HOME pour Java %s %s", + "loc.messages.UnsupportedJdkWarning": "JDK 9 et JDK 10 ne sont plus pris en charge. Passez à une version plus récente de votre projet et de votre pipeline. Tentative de génération avec JDK 11...", + "loc.messages.FailedToLocateSpecifiedJVM": "Échec de la localisation de la version spécifiée du kit JDK. Vérifiez que la version spécifiée du kit JDK est installée sur l'agent, que la variable d'environnement '%s' existe et que sa valeur correspond à l'emplacement d'un kit JDK correspondant. Sinon, utilisez la tâche [Programme d'installation de l'outil Java] (https://go.microsoft.com/fwlink/?linkid=875287) pour installer le kit JDK souhaité.", + "loc.messages.DiscontinueAntCodeCoverage": "Nous mettons fin au support de la génération automatisée de rapports de couverture du code pour les projets Ant. Pour plus d'informations, consultez https://go.microsoft.com/fwlink/?linkid=875306.", + "loc.messages.NoCodeCoverage": "Il n'existe aucun résultat de couverture du code à publier.", + "loc.messages.NoTestResults": "Les fichiers de résultats des tests correspondant à %s sont introuvables. La publication des résultats des tests JUnit est ignorée." +} \ No newline at end of file diff --git a/_generated/ANTV1/Strings/resources.resjson/it-IT/resources.resjson b/_generated/ANTV1/Strings/resources.resjson/it-IT/resources.resjson new file mode 100644 index 000000000000..aa3286ef0482 --- /dev/null +++ b/_generated/ANTV1/Strings/resources.resjson/it-IT/resources.resjson @@ -0,0 +1,47 @@ +{ + "loc.friendlyName": "Ant", + "loc.helpMarkDown": "[Altre informazioni su questa attività](https://go.microsoft.com/fwlink/?LinkID=613718). In alternativa [vedere la documentazione di Ant](http://ant.apache.org/)", + "loc.description": "Consente di compilare con Apache Ant", + "loc.instanceNameFormat": "Ant $(options) $(antBuildFile)", + "loc.group.displayName.junitTestResults": "Risultati del test JUnit", + "loc.group.displayName.codeCoverage": "Code coverage", + "loc.group.displayName.advanced": "Avanzate", + "loc.input.label.antBuildFile": "File di compilazione Ant", + "loc.input.help.antBuildFile": "Percorso relativo dalla radice del repository al file di compilazione Ant.", + "loc.input.label.options": "Opzioni", + "loc.input.help.options": "Consente di specificare tutte le opzioni da passare alla riga di comando di Ant. È possibile specificare proprietà personalizzate (ad esempio ***-DmyProperty=myPropertyValue***) e usare variabili predefinite (ad esempio ***-DcollectionId=$(system.collectionId)***). In alternativa, le variabili predefinite vengono già impostate come variabili di ambiente durante la compilazione e possono essere passate direttamente (ad esempio ***-DcollectionIdAsEnvVar=%SYSTEM_COLLECTIONID%***).", + "loc.input.label.targets": "Destinazione/i", + "loc.input.help.targets": "Elenco facoltativo di destinazioni per la compilazione separate da virgole. Se non viene specificato, verrà usata la destinazione `default`. Se non è definita alcuna destinazione `default`, Ant 1.6.0 o versioni successiva compilerà tutte le attività di primo livello.", + "loc.input.label.publishJUnitResults": "Pubblica in Azure Pipelines", + "loc.input.help.publishJUnitResults": "Selezionare questa opzione per pubblicare i risultati del test JUnit prodotti dalla compilazione Ant in Azure Pipelines. Ogni file dei risultati del test corrispondente al valore di `File dei risultati del test` verrà pubblicato come esecuzione dei test in Azure Pipelines.", + "loc.input.label.testResultsFiles": "File dei risultati del test", + "loc.input.help.testResultsFiles": "Percorso dei file dei risultati del test. È possibile usare i caratteri jolly, ad esempio `**/TEST-*.xml` per individuare tutti i file XML il cui nome inizia con TEST-. [Altre informazioni](https://go.microsoft.com/fwlink/?linkid=856077)", + "loc.input.label.testRunTitle": "Titolo dell'esecuzione dei test", + "loc.input.help.testRunTitle": "Consente di specificare un nome per l'esecuzione dei test.", + "loc.input.label.codeCoverageTool": "Strumento di code coverage", + "loc.input.help.codeCoverageTool": "Consente di selezionare lo strumento di code coverage. Per il supporto di agenti locali, fare riferimento al collegamento `Altre informazioni` sotto.", + "loc.input.label.classFilesDirectories": "Directory dei file di classe", + "loc.input.help.classFilesDirectories": "Elenco di percorsi relativi separati da virgole dal file di compilazione di Ant alle directory contenenti file di classe e file di archivio (JAR, WAR e così via). I report di code coverage vengono creati per i file di classe presenti in queste directory, ad esempio target/classes,target/testClasses.", + "loc.input.label.classFilter": "Filtri di inclusione/esclusione classi", + "loc.input.help.classFilter": "Elenco di filtri delimitati da virgole per includere o escludere classi dalla raccolta delle informazioni sul code coverage, ad esempio +:com.*,+:org.*,-:my.app*.*.", + "loc.input.label.srcDirectories": "Directory dei file di origine", + "loc.input.help.srcDirectories": "Elenco di percorsi relativi separati da virgole dal file di compilazione di Ant alle directory del codice sorgente. Tali percorsi verranno usati nei report di code coverage per evidenziare il codice sorgente, ad esempio src/java,src/Test.", + "loc.input.label.failIfCoverageEmpty": "Non eseguire se mancano i risultati del code coverage", + "loc.input.help.failIfCoverageEmpty": "Non esegue la compilazione se il code coverage non ha prodotto risultati da pubblicare.", + "loc.input.label.antHomeUserInputPath": "Imposta percorso di ANT_HOME", + "loc.input.help.antHomeUserInputPath": "Se è impostato, esegue l'override di eventuali variabili di ambiente ANT_HOME esistenti con il percorso specificato.", + "loc.input.label.javaHomeSelection": "Imposta JAVA_HOME per", + "loc.input.help.javaHomeSelection": "Consente di impostare JAVA_HOME selezionando una versione di JDK che verrà individuata durante le compilazioni oppure immettendo manualmente un percorso JDK.", + "loc.input.label.jdkVersion": "Versione del JDK", + "loc.input.help.jdkVersion": "Prova a individuare il percorso della versione selezionata di JDK e imposta JAVA_HOME di conseguenza.", + "loc.input.label.jdkUserInputPath": "Percorso del JDK", + "loc.input.help.jdkUserInputPath": "Consente di impostare JAVA_HOME sul percorso specificato.", + "loc.input.label.jdkArchitecture": "Architettura del JDK", + "loc.input.help.jdkArchitecture": "Consente facoltativamente di specificare l'architettura (x86, x64) di JDK.", + "loc.messages.LocateJVMBasedOnVersionAndArch": "Individuare JAVA_HOME per Java %s %s", + "loc.messages.UnsupportedJdkWarning": "JDK 9 e JDK 10 non sono supportati. Passare a una versione più recente nel progetto e nella pipeline. Verrà effettuato un tentativo di compilazione con JDK 11...", + "loc.messages.FailedToLocateSpecifiedJVM": "La versione del JDK specificata non è stata trovata. Assicurarsi che sia installata nell'agente e che la variabile di ambiente '%s' sia presente e impostata sul percorso di un JDK corrispondente oppure usare l'attività [Programma di installazione strumenti Java](https://go.microsoft.com/fwlink/?linkid=875287) per installare il JDK desiderato.", + "loc.messages.DiscontinueAntCodeCoverage": "Il supporto della generazione automatizzata di report di code coverage per progetti Ant a breve verrà sospeso. Per maggiori dettagli, vedere https://go.microsoft.com/fwlink/?linkid=875306.", + "loc.messages.NoCodeCoverage": "Non sono stati trovati risultati del code coverage da pubblicare.", + "loc.messages.NoTestResults": "Non sono stati trovati file dei risultati del test corrispondenti a %s, di conseguenza la pubblicazione dei risultati del test JUnit verrà ignorata." +} \ No newline at end of file diff --git a/_generated/ANTV1/Strings/resources.resjson/ja-JP/resources.resjson b/_generated/ANTV1/Strings/resources.resjson/ja-JP/resources.resjson new file mode 100644 index 000000000000..31ca3ed5393f --- /dev/null +++ b/_generated/ANTV1/Strings/resources.resjson/ja-JP/resources.resjson @@ -0,0 +1,47 @@ +{ + "loc.friendlyName": "Ant", + "loc.helpMarkDown": "[このタスクの詳細を表示](https://go.microsoft.com/fwlink/?LinkID=613718)、または [Ant のドキュメントを参照](http://ant.apache.org/)", + "loc.description": "Apache Ant を使用してビルドします", + "loc.instanceNameFormat": "Ant $(options) $(antBuildFile)", + "loc.group.displayName.junitTestResults": "JUnit のテスト結果", + "loc.group.displayName.codeCoverage": "コード カバレッジ", + "loc.group.displayName.advanced": "詳細設定", + "loc.input.label.antBuildFile": "Ant ビルド ファイル", + "loc.input.help.antBuildFile": "リポジトリのルートから Ant のビルド ファイルへの相対パス。", + "loc.input.label.options": "オプション", + "loc.input.help.options": "Ant コマンド ラインに渡すオプションを指定します。独自のプロパティ (たとえば、***-DmyProperty=myPropertyValue***) を指定することも、ビルトイン変数 (たとえば、***-DcollectionId=$(system.collectionId)***) を使用することもできます。あるいは、ビルトイン変数はビルド中は既に環境変数として設定されているため、直接渡すことができます (たとえば、***-DcollectionIdAsEnvVar=%SYSTEM_COLLECTIONID%***)。", + "loc.input.label.targets": "ターゲット", + "loc.input.help.targets": "作成するターゲットのオプションのスペース区切り一覧。指定しない場合、`既定` のターゲットが使用されます。`既定` のターゲットが定義されていない場合は、Ant 1.6.0 以降で最上位レベルのすべてのタスクが作成されます。", + "loc.input.label.publishJUnitResults": "Azure Pipelines に公開する", + "loc.input.help.publishJUnitResults": "Ant のビルドによって生成された JUnit のテスト結果を Azure Pipelines に公開するには、このオプションを選びます。'テスト結果ファイル' と一致する各テスト結果ファイルが、Azure Pipelines でテストの実行として公開されます。", + "loc.input.label.testResultsFiles": "テスト結果ファイル", + "loc.input.help.testResultsFiles": "テスト結果ファイルのパス。ワイルドカードを使用できます ([詳細情報](https://go.microsoft.com/fwlink/?linkid=856077))。たとえば、名前が TEST- で始まるすべての XML ファイルの場合は '**/TEST-*.xml' です。", + "loc.input.label.testRunTitle": "テストの実行のタイトル", + "loc.input.help.testRunTitle": "テストの実行の名前を指定します。", + "loc.input.label.codeCoverageTool": "コード カバレッジ ツール", + "loc.input.help.codeCoverageTool": "コード カバレッジ ツールを選びます。オンプレミスのエージェントのサポートについては、以下の `詳細` リンクをご覧ください。", + "loc.input.label.classFilesDirectories": "クラス ファイル ディレクトリ", + "loc.input.help.classFilesDirectories": "クラス ファイルやアーカイブ ファイル (JAR、WAR など) を格納するディレクトリのパス (Ant ビルド ファイルから見た相対パス) のコンマ区切り一覧。コード カバレッジはこれらのディレクトリ内のクラス ファイルに関して報告されます。たとえば、target/classes,target/testClasses と指定します。", + "loc.input.label.classFilter": "クラス包含/除外フィルター", + "loc.input.help.classFilter": "コード カバレッジの収集にクラスを含めたり除いたりするためのフィルターのコンマ区切り一覧。たとえば、+:com.*,+:org.*,-:my.app*.* と指定します。", + "loc.input.label.srcDirectories": "ソース ファイル ディレクトリ", + "loc.input.help.srcDirectories": "ソース コード ディレクトリのパス (Ant ビルド ファイルから見た相対パス) のコンマ区切り一覧。コード カバレッジ レポートはこれらを使用してソース コードをハイライトします。たとえば、src/java,src/Test と指定します。", + "loc.input.label.failIfCoverageEmpty": "コード カバレッジの結果がない場合に失敗する", + "loc.input.help.failIfCoverageEmpty": "コード カバレッジから発行するべき結果が生成されなかった場合に、ビルドを失敗にします。", + "loc.input.label.antHomeUserInputPath": "ANT_HOME パスの設定", + "loc.input.help.antHomeUserInputPath": "設定されると、指定したパスの既存のあらゆる ANT_HOME 環境変数をオーバーライドします。", + "loc.input.label.javaHomeSelection": "次の条件で JAVA_HOME を設定します", + "loc.input.help.javaHomeSelection": "ビルド中に検出される JDK バージョンを選択するか、JDK パスを手動で入力して JAVA_HOME を設定します。", + "loc.input.label.jdkVersion": "JDK バージョン", + "loc.input.help.jdkVersion": "選択した JDK のバージョンへのパスの検出を試みて、それに従って JAVA_HOME を設定します。", + "loc.input.label.jdkUserInputPath": "JDK パス", + "loc.input.help.jdkUserInputPath": "指定したパスに JAVA_HOME を設定します。", + "loc.input.label.jdkArchitecture": "JDK アーキテクチャ", + "loc.input.help.jdkArchitecture": "(省略可能) JDK のアーキテクチャ (x86、x64) を指定します。", + "loc.messages.LocateJVMBasedOnVersionAndArch": "Java %s %s の JAVA_HOME を検索する", + "loc.messages.UnsupportedJdkWarning": "JDK 9 および JDK 10 はサポートされていません。プロジェクトとパイプラインで新しいバージョンに切り替えてください。JDK 11 でのビルドを試行しています...", + "loc.messages.FailedToLocateSpecifiedJVM": "指定された JDK バージョンが見つかりませんでした。指定された JDK バージョンがエージェントにインストールされており、環境変数 '%s' が存在し、対応する JDK の場所に設定されていることを確認するか、[Java ツール インストーラー](https://go.microsoft.com/fwlink/?linkid=875287) タスクを使用して目的の JDK をインストールしてください。", + "loc.messages.DiscontinueAntCodeCoverage": "Ant プロジェクト向けの自動コード カバレッジ レポート生成のサポートを中止します。詳細については、https://go.microsoft.com/fwlink/?linkid=875306 をご覧ください。", + "loc.messages.NoCodeCoverage": "発行するコード カバレッジの結果が見つかりませんでした。", + "loc.messages.NoTestResults": "%s と一致するテスト結果ファイルが見つからないため、JUnit テスト結果の発行をスキップします。" +} \ No newline at end of file diff --git a/_generated/ANTV1/Strings/resources.resjson/ko-KR/resources.resjson b/_generated/ANTV1/Strings/resources.resjson/ko-KR/resources.resjson new file mode 100644 index 000000000000..e75db3aeeaaa --- /dev/null +++ b/_generated/ANTV1/Strings/resources.resjson/ko-KR/resources.resjson @@ -0,0 +1,47 @@ +{ + "loc.friendlyName": "Ant", + "loc.helpMarkDown": "[이 작업에 대한 자세한 정보](https://go.microsoft.com/fwlink/?LinkID=613718) 또는 [Ant 설명서 참조](http://ant.apache.org/)", + "loc.description": "Apache Ant로 빌드", + "loc.instanceNameFormat": "Ant $(options) $(antBuildFile)", + "loc.group.displayName.junitTestResults": "JUnit 테스트 결과", + "loc.group.displayName.codeCoverage": "코드 검사", + "loc.group.displayName.advanced": "고급", + "loc.input.label.antBuildFile": "Ant 빌드 파일", + "loc.input.help.antBuildFile": "Ant 빌드 파일의 리포지토리 루트로부터의 상대 경로입니다.", + "loc.input.label.options": "옵션", + "loc.input.help.options": "Ant 명령줄에 전달할 옵션을 지정하세요. 고유한 속성을 지정할 수도 있고(예: ***-DmyProperty=myPropertyValue***) 기본 제공 변수를 사용할 수도 있습니다(예: ***-DcollectionId=$(system.collectionId)***). 또는 기본 제공 변수가 빌드 중 이미 환경 변수로 설정되어 직접 전달될 수도 있습니다(예: ***-DcollectionIdAsEnvVar=%SYSTEM_COLLECTIONID%***).", + "loc.input.label.targets": "대상", + "loc.input.help.targets": "빌드할 대상의 공백으로 구분된 목록입니다(선택 사항). 지정되지 않은 경우 `기본` 대상이 사용됩니다. `기본` 대상이 정의되지 않은 경우 Ant 1.6.0 이상에서 모든 최상위 작업을 빌드합니다.", + "loc.input.label.publishJUnitResults": "Azure Pipelines/에 게시", + "loc.input.help.publishJUnitResults": "Ant 빌드에서 생성된 JUnit 테스트 결과를 Azure Pipelines에 게시하려면 이 옵션을 선택합니다. '테스트 결과 파일'과 일치하는 각 테스트 결과 파일이 Azure Pipelines에 테스트 실행으로 게시됩니다.", + "loc.input.label.testResultsFiles": "테스트 결과 파일", + "loc.input.help.testResultsFiles": "테스트 결과 파일 경로입니다. 와일드카드를 사용할 수 있습니다([자세한 정보](https://go.microsoft.com/fwlink/?linkid=856077)). 예를 들어 이름이 TEST-로 시작하는 모든 XML 파일을 표시하려면 '**/TEST-*.xml'을 지정합니다.", + "loc.input.label.testRunTitle": "테스트 실행 제목", + "loc.input.help.testRunTitle": "테스트 실행의 이름을 지정하세요.", + "loc.input.label.codeCoverageTool": "코드 검사 도구", + "loc.input.help.codeCoverageTool": "코드 검사 도구를 선택하세요. 온-프레미스 에이전트 지원의 경우 아래의 '추가 정보' 링크를 참조하세요.", + "loc.input.label.classFilesDirectories": "클래스 파일 디렉터리", + "loc.input.help.classFilesDirectories": "Ant 빌드 파일과 클래스 파일, 보관 파일(JAR, WAR 등)이 포함된 디렉터리 간 상대 경로의 쉼표로 구분된 목록입니다. 코드 검사는 이러한 디렉터리에 있는 클래스 파일에 대해 보고됩니다(예: target/classes,target/testClasses).", + "loc.input.label.classFilter": "클래스 포함/제외 필터", + "loc.input.help.classFilter": "코드 검사 수집에서 클래스를 포함하거나 제외할 필터의 쉼표로 구분된 목록입니다(예: +:com.*,+:org.*,-:my.app*.*).", + "loc.input.label.srcDirectories": "소스 파일 디렉터리", + "loc.input.help.srcDirectories": "Ant 빌드 파일과 소스 코드 디렉터리 간 상대 경로의 쉼표로 구분된 목록입니다. 코드 검사 보고서에서는 이를 사용하여 소스 코드를 강조 표시합니다(예: src/java,src/Test).", + "loc.input.label.failIfCoverageEmpty": "코드 검사 결과가 없는 경우 실패", + "loc.input.help.failIfCoverageEmpty": "코드 검사에서 게시할 결과를 생성하지 않은 경우 빌드가 실패합니다.", + "loc.input.label.antHomeUserInputPath": "ANT_HOME 경로 설정", + "loc.input.help.antHomeUserInputPath": "설정하는 경우 기존 ANT_HOME 환경 변수를 지정된 경로로 재정의합니다.", + "loc.input.label.javaHomeSelection": "JAVA_HOME 설정 방법", + "loc.input.help.javaHomeSelection": "빌드 중에 검색될 JDK 버전을 선택하거나 수동으로 JDK 경로를 입력하여 JAVA_HOME을 설정합니다.", + "loc.input.label.jdkVersion": "JDK 버전", + "loc.input.help.jdkVersion": "선택한 JDK 버전의 경로에 대한 검색을 시도하고 그에 따라 JAVA_HOME을 설정하게 됩니다.", + "loc.input.label.jdkUserInputPath": "JDK 경로", + "loc.input.help.jdkUserInputPath": "JAVA_HOME을 지정된 경로로 설정합니다.", + "loc.input.label.jdkArchitecture": "JDK 아키텍처", + "loc.input.help.jdkArchitecture": "선택적으로 JDK의 아키텍처(x86, x64)를 제공하세요.", + "loc.messages.LocateJVMBasedOnVersionAndArch": "Java %s %s에 대해 JAVA_HOME 찾기", + "loc.messages.UnsupportedJdkWarning": "JDK 9 및 JDK 10은 지원되지 않습니다. 프로젝트 및 파이프라인에서 최신 버전으로 전환하세요. JDK 11을 사용하여 빌드를 시도하는 중...", + "loc.messages.FailedToLocateSpecifiedJVM": "지정한 JDK 버전을 찾지 못했습니다. 지정한 JDK 버전이 에이전트에 설치되어 있으며 환경 변수 '%s'이(가) 있고 해당 JDK의 위치로 설정되었는지 확인하거나, [Java 도구 설치 관리자](https://go.microsoft.com/fwlink/?linkid=875287) 작업을 사용하여 원하는 JDK를 설치하세요.", + "loc.messages.DiscontinueAntCodeCoverage": "Ant 프로젝트에 대한 자동 코드 검사 보고서 생성을 더 이상 지원하지 않습니다. 자세한 내용은 https://go.microsoft.com/fwlink/?linkid=875306을 참조하세요.", + "loc.messages.NoCodeCoverage": "게시할 코드 검사 결과가 없습니다.", + "loc.messages.NoTestResults": "%s과(와) 일치하는 테스트 결과 파일을 찾을 수 없으므로 JUnit 테스트 결과 게시를 건너뜁니다." +} \ No newline at end of file diff --git a/_generated/ANTV1/Strings/resources.resjson/ru-RU/resources.resjson b/_generated/ANTV1/Strings/resources.resjson/ru-RU/resources.resjson new file mode 100644 index 000000000000..f913b01323ef --- /dev/null +++ b/_generated/ANTV1/Strings/resources.resjson/ru-RU/resources.resjson @@ -0,0 +1,47 @@ +{ + "loc.friendlyName": "Ant", + "loc.helpMarkDown": "[См. дополнительные сведения об этой задаче](https://go.microsoft.com/fwlink/?LinkID=613718) или [документацию по Ant](http://ant.apache.org/)", + "loc.description": "Сборка с помощью Apache Ant", + "loc.instanceNameFormat": "Ant $(options) $(antBuildFile)", + "loc.group.displayName.junitTestResults": "Результаты теста JUnit", + "loc.group.displayName.codeCoverage": "Объем протестированного кода", + "loc.group.displayName.advanced": "Дополнительно", + "loc.input.label.antBuildFile": "Файл сборки Ant", + "loc.input.help.antBuildFile": "Относительный путь от корня репозитория к файлу сборки Ant.", + "loc.input.label.options": "Параметры", + "loc.input.help.options": "Укажите параметры для передачи в командную строку Ant. Вы можете указать собственные свойства (например, ***-DmyProperty=myPropertyValue***), а также использовать встроенные переменные (например, ***-DcollectionId=$(system.collectionId)***). Кроме того, встроенные переменные уже заданы в качестве переменных среды во время сборки и могут быть переданы напрямую (например, ***-DcollectionIdAsEnvVar=%SYSTEM_COLLECTIONID%***).", + "loc.input.label.targets": "Платформы", + "loc.input.help.targets": "Необязательный список целевых объектов сборки с разделителями-пробелами. Если он не задан, будет использоваться целевой объект по умолчанию. Если целевой объект по умолчанию не определен, в Ant 1.6.0 и более поздних версиях будет выполнена сборка всех задач верхнего уровня.", + "loc.input.label.publishJUnitResults": "Опубликовать в Azure Pipelines", + "loc.input.help.publishJUnitResults": "Выберите этот параметр, чтобы опубликовать результаты теста JUnit, созданные сборкой Ant, в Azure Pipelines. Каждый файл результатов теста, соответствующий запросу \"Файлы результатов тестов\", будет опубликован как тестовый запуск в Azure Pipelines.", + "loc.input.label.testResultsFiles": "Файлы результатов теста", + "loc.input.help.testResultsFiles": "Путь к файлам результатов тестов. Можно использовать подстановочные знаки ([дополнительные сведения](https://go.microsoft.com/fwlink/?linkid=856077)). Пример: \"**/TEST-*.xml\" для всех XML-файлов, имена которых начинаются с \"TEST-\".", + "loc.input.label.testRunTitle": "Название тестового запуска", + "loc.input.help.testRunTitle": "Укажите имя для тестового запуска.", + "loc.input.label.codeCoverageTool": "Средство оценки объема протестированного кода", + "loc.input.help.codeCoverageTool": "Выберите средство оценки объема протестированного кода. Сведения о поддержке локального агента см. по ссылке \"Дополнительные сведения\" ниже.", + "loc.input.label.classFilesDirectories": "Каталоги файлов классов", + "loc.input.help.classFilesDirectories": "Список относительных путей с разделителями-запятыми от файла сборки ANT до каталогов, содержащих файлы классов и архивов (JAR, WAR и т. д.). Объем протестированного кода указывается для файлов классов в этих каталогах. Например: target/classes,target/testClasses.", + "loc.input.label.classFilter": "Фильтры включения и исключения классов", + "loc.input.help.classFilter": "Список фильтров с разделителями-запятыми для включения или исключения классов при сборе данных по объему протестированного кода. Например: +:com.*,+:org.*,-:my.app*.*.", + "loc.input.label.srcDirectories": "Каталоги файлов с исходным кодом", + "loc.input.help.srcDirectories": "Список относительных путей с разделителями-запятыми от файла сборки ANT до каталогов с исходным кодом. Он будет использоваться в отчетах об объеме протестированного кода для выделения исходного кода. Например: src/java,src/Test.", + "loc.input.label.failIfCoverageEmpty": "Сбой, если результаты для объема протестированного кода отсутствуют", + "loc.input.help.failIfCoverageEmpty": "Если объем протестированного кода не дал результатов для публикации, завершить сборку сбоем.", + "loc.input.label.antHomeUserInputPath": "Задать путь ANT_HOME", + "loc.input.help.antHomeUserInputPath": "Если этот параметр задан, переопределяет любую существующую переменную среды ANT_HOME заданным путем.", + "loc.input.label.javaHomeSelection": "Установка JAVA_HOME с помощью", + "loc.input.help.javaHomeSelection": "Задается JAVA_HOME указанием версии JDK, которая будет обнаруживаться во время сборок, или указанием пути к JDK вручную.", + "loc.input.label.jdkVersion": "Версия JDK", + "loc.input.help.jdkVersion": "Пытается определить путь к выбранной версии JDK и установить переменную JAVA_HOME соответствующим образом.", + "loc.input.label.jdkUserInputPath": "Путь к JDK", + "loc.input.help.jdkUserInputPath": "Установка для JAVA_HOME определенного пути.", + "loc.input.label.jdkArchitecture": "Архитектура JDK", + "loc.input.help.jdkArchitecture": "Дополнительно укажите архитектуру JDK (x86, x64).", + "loc.messages.LocateJVMBasedOnVersionAndArch": "Найдите JAVA_HOME для Java %s %s", + "loc.messages.UnsupportedJdkWarning": "Поддержка JDK 9 и JDK 10 прекращена. Переключитесь на более позднюю версию в проекте и конвейере. Выполняется попытка сборки с помощью JDK 11...", + "loc.messages.FailedToLocateSpecifiedJVM": "Не удалось найти указанную версию JDK. Убедитесь в том, что указанная версия JDK установлена в агенте и что переменная среды \"%s\" существует и ее значением является расположение соответствующего пакета JDK, или используйте [установщик средств Java] (https://go.microsoft.com/fwlink/?linkid=875287), чтобы установить требуемую версию JDK.", + "loc.messages.DiscontinueAntCodeCoverage": "Мы прекращаем поддержку автоматического создания отчетов об объемах протестированного кода для проектов Ant. Подробности см. на странице https://go.microsoft.com/fwlink/?linkid=875306.", + "loc.messages.NoCodeCoverage": "Результаты по объему протестированного кода для публикации не найдены.", + "loc.messages.NoTestResults": "Не найдены файлы результатов теста, соответствующие \"%s\". Публикация результатов теста JUnit пропускается." +} \ No newline at end of file diff --git a/_generated/ANTV1/Strings/resources.resjson/zh-CN/resources.resjson b/_generated/ANTV1/Strings/resources.resjson/zh-CN/resources.resjson new file mode 100644 index 000000000000..766dc3517e1c --- /dev/null +++ b/_generated/ANTV1/Strings/resources.resjson/zh-CN/resources.resjson @@ -0,0 +1,47 @@ +{ + "loc.friendlyName": "Ant", + "loc.helpMarkDown": "[详细了解此任务](https://go.microsoft.com/fwlink/?LinkID=613718)或[参阅 Ant 文档](http://ant.apache.org/)", + "loc.description": "使用 Apache Ant 生成", + "loc.instanceNameFormat": "Ant $(options) $(antBuildFile)", + "loc.group.displayName.junitTestResults": "JUnit 测试结果", + "loc.group.displayName.codeCoverage": "代码覆盖率", + "loc.group.displayName.advanced": "高级", + "loc.input.label.antBuildFile": "Ant 生成文件", + "loc.input.help.antBuildFile": "从存储库根路径到“Ant 生成文件”的相对路径。", + "loc.input.label.options": "选项", + "loc.input.help.options": "提供要传递到 Ant 命令行的任意选项。可以提供自己的属性(例如,***-DmyProperty=myPropertyValue***),也可使用内置变量(例如,**-DcollectionId=$(system.collectionId)***)。或者,已在生成过程中将内置变量设置为环境变量,且可直接传递(例如,***-DcollectionIdAsEnvVar=%SYSTEM_COLLECTIONID%***)。", + "loc.input.label.targets": "对象", + "loc.input.help.targets": "要生成的可选目标列表,以空格分隔。如果未指定,将使用“默认”目标。如果未定义“默认”目标,则 Ant 1.6.0 和更高版本将生成所有顶级任务。", + "loc.input.label.publishJUnitResults": "发布到 Azure Pipelines", + "loc.input.help.publishJUnitResults": "选择此选项可将 Ant 生成产生的 JUnit 测试结果发布到 Azure Pipelines。每个与 `Test Results Files` 匹配的测试结果文件都会在 Azure Pipelines 中发布为测试运行。", + "loc.input.label.testResultsFiles": "测试结果文件", + "loc.input.help.testResultsFiles": "测试结果文件路径。可以使用通配符([详细信息](https://go.microsoft.com/fwlink/?linkid=856077))。例如,\"**/TEST-*.xml\" 表示名称以 TEST- 开头的所有 xml 文件。", + "loc.input.label.testRunTitle": "测试运行标题", + "loc.input.help.testRunTitle": "为测试运行提供一个名称。", + "loc.input.label.codeCoverageTool": "代码覆盖率工具", + "loc.input.help.codeCoverageTool": "选择代码覆盖率工具。有关本地代理支持,请参阅下方的“详细信息”链接。", + "loc.input.label.classFilesDirectories": "类文件目录", + "loc.input.help.classFilesDirectories": "从 Ant 生成文件到目录的相对路径的列表,以逗号分隔,其中目录包含类文件和存档文件(JAR 和 WAR 等)。报告这些目录中类文件的代码覆盖率。例如: target/classes,target/testClasses。", + "loc.input.label.classFilter": "类包含/排除筛选器", + "loc.input.help.classFilter": "用于在收集代码覆盖率时包含或排除类的筛选器列表,以逗号分隔。例如: +:com.*、+:org.*、-:my.app*.*。", + "loc.input.label.srcDirectories": "源文件目录", + "loc.input.help.srcDirectories": "从 Ant 生成文件到源代码目录的相对路径列表,用逗号隔开。代码覆盖率报告将使用这些路径来突出显示源代码。例如: src/java,src/Test。", + "loc.input.label.failIfCoverageEmpty": "缺失代码覆盖率结果时失败", + "loc.input.help.failIfCoverageEmpty": "如果代码覆盖率未产生任何要发布的结果,则生成将失败。", + "loc.input.label.antHomeUserInputPath": "设置 ANT_HOME 路径", + "loc.input.help.antHomeUserInputPath": "如已设置,将用给定路径覆盖任何现有 ANT_HOME 环境变量。", + "loc.input.label.javaHomeSelection": "JAVA_HOME 设置方法", + "loc.input.help.javaHomeSelection": "可通过选择将在生成期间发现的 JDK 版本或手动输入 JDK 路径来设置 JAVA_HOME。", + "loc.input.label.jdkVersion": "JDK 版本", + "loc.input.help.jdkVersion": "将尝试发现所选 JDK 版本的路径并相应地设置 JAVA_HOME。", + "loc.input.label.jdkUserInputPath": "JDK 路径", + "loc.input.help.jdkUserInputPath": "将 JAVA_HOME 设置到给定路径。", + "loc.input.label.jdkArchitecture": "JDK 体系结构", + "loc.input.help.jdkArchitecture": "可以选择提供 JDK 的体系结构(x86、x64)。", + "loc.messages.LocateJVMBasedOnVersionAndArch": "为 Java %s %s 查找 JAVA_HOME", + "loc.messages.UnsupportedJdkWarning": "JDK 9 和 JDK 10 不受支持。请切换到项目和管道中的更高版本。正在尝试使用 JDK 11 进行生成...", + "loc.messages.FailedToLocateSpecifiedJVM": "未能找到指定的 JDK 版本。请确保代理上安装了指定的 JDK 版本,环境变量“%s”存在并设置为对应 JDK 的位置或使用[Java 工具安装程序](https://go.microsoft.com/fwlink/?linkid=875287)任务安装所需 JDK。", + "loc.messages.DiscontinueAntCodeCoverage": "我们将不再支持为 Ant 项目自动生成代码覆盖率报告。有关详细信息,请参阅 https://go.microsoft.com/fwlink/?linkid=875306。", + "loc.messages.NoCodeCoverage": "未找到可发布的代码覆盖率结果。", + "loc.messages.NoTestResults": "未找到匹配 %s 的测试结果文件,因此将跳过发布 JUnit 测试结果。" +} \ No newline at end of file diff --git a/_generated/ANTV1/Strings/resources.resjson/zh-TW/resources.resjson b/_generated/ANTV1/Strings/resources.resjson/zh-TW/resources.resjson new file mode 100644 index 000000000000..29a91dfd1ae4 --- /dev/null +++ b/_generated/ANTV1/Strings/resources.resjson/zh-TW/resources.resjson @@ -0,0 +1,47 @@ +{ + "loc.friendlyName": "Ant", + "loc.helpMarkDown": "[深入了解此工作](https://go.microsoft.com/fwlink/?LinkID=613718)或[參閱 Ant 文件](http://ant.apache.org/)", + "loc.description": "使用 Apache Ant 建置", + "loc.instanceNameFormat": "Ant $(options) $(antBuildFile)", + "loc.group.displayName.junitTestResults": "JUnit 測試結果", + "loc.group.displayName.codeCoverage": "程式碼涵蓋範圍", + "loc.group.displayName.advanced": "進階", + "loc.input.label.antBuildFile": "Ant 組建檔案", + "loc.input.help.antBuildFile": "從存放庫根路徑到 Ant 組建檔案的相對路徑。", + "loc.input.label.options": "選項", + "loc.input.help.options": "提供傳遞給 Ant 命令列的任何選項。您可以提供您自己的屬性 (例如 ***-DmyProperty=myPropertyValue***),並同時使用內建變數 (例如 ***-DmyProperty=myPropertyValue***)。或者,如果內建變數已在建置期間設為環境變數,則也可以直接傳遞 (例如 ***-DcollectionIdAsEnvVar=%SYSTEM_COLLECTIONID%***)。", + "loc.input.label.targets": "目標", + "loc.input.help.targets": "以空格分隔的選用清單,內含要建置的目標。若未指定,將使用 `default` 目標。如果未定義 `default` 目標,則 Ant 1.6.0 和更新版本將建置所有最上層工作。", + "loc.input.label.publishJUnitResults": "發佈至 Azure Pipelines", + "loc.input.help.publishJUnitResults": "選取此選項會將 Ant 組建所產生的 JUnit 測試結果發佈至 Azure Pipelines。每個與 `Test Results Files` 相符的測試結果檔案都將作為測試回合於 Azure Pipelines 中發佈。", + "loc.input.label.testResultsFiles": "測試結果檔案", + "loc.input.help.testResultsFiles": "測試結果檔案路徑。可使用萬用字元 ([詳細資訊](https://go.microsoft.com/fwlink/?linkid=856077))。例如 `**/TEST-*.xml` 表示名稱開頭為 TEST- 的所有 XML 檔案。", + "loc.input.label.testRunTitle": "測試回合標題", + "loc.input.help.testRunTitle": "提供測試回合的名稱。", + "loc.input.label.codeCoverageTool": "程式碼涵蓋範圍工具", + "loc.input.help.codeCoverageTool": "選取程式碼涵蓋範圍工具。如需內部部署代理程式支援,請參閱下面的<詳細資訊>連結。", + "loc.input.label.classFilesDirectories": "類別檔案目錄", + "loc.input.help.classFilesDirectories": "以逗號分隔的清單,內含從 Ant 組建檔案到包含類別檔案和封存檔案 (JAR、WAR 等) 之目錄的相對路徑。回報的程式碼涵蓋範圍為這些目錄中的類別檔案。例如: target/classes,target/testClasses。", + "loc.input.label.classFilter": "類別包含/排除篩選", + "loc.input.help.classFilter": "以逗號分隔的清單,內含可從收集程式碼涵蓋範圍將類別加以包含或排除的篩選條件。例如: +:com.*,+:org.*,-:my.app*.*。", + "loc.input.label.srcDirectories": "原始程式檔目錄", + "loc.input.help.srcDirectories": "以逗號分隔的清單,內含從 Ant 組建檔案到原始程式碼目錄的相對路徑。程式碼涵蓋範圍報表會加以使用,以強調顯示原始程式碼。例如: src/java,src/Test。", + "loc.input.label.failIfCoverageEmpty": "遺漏程式碼涵蓋範圍結果時失敗", + "loc.input.help.failIfCoverageEmpty": "如果程式碼涵蓋範圍未產生任何可發行的結果,則建置失敗。", + "loc.input.label.antHomeUserInputPath": "設定 ANT_HOME 路徑", + "loc.input.help.antHomeUserInputPath": "如有設定,將會以指定的路徑覆寫任何現有的 ANT_HOME 環境變數。", + "loc.input.label.javaHomeSelection": "設定 JAVA_HOME 由", + "loc.input.help.javaHomeSelection": "選取一個能在組建期間探索到的 JDK 版本,或者手動輸入 JDK 路徑,均能為 JAVA_HOME 進行設定。", + "loc.input.label.jdkVersion": "JDK 版本", + "loc.input.help.jdkVersion": "將嘗試探索所選取 JDK 版本的路徑並據此設定 JAVA_HOME。", + "loc.input.label.jdkUserInputPath": "JDK 路徑", + "loc.input.help.jdkUserInputPath": "將 JAVA_HOME 設定為指定路徑。", + "loc.input.label.jdkArchitecture": "JDK 架構", + "loc.input.help.jdkArchitecture": "選擇性地提供 JDK 的架構 (x86、x64)。", + "loc.messages.LocateJVMBasedOnVersionAndArch": "為 Java %s %s 找出 JAVA_HOME 的位置", + "loc.messages.UnsupportedJdkWarning": "JDK 9 與 JDK 10 已失去支援。請在您的專案和管線中切換至較新版本。正在嘗試以 JDK 11 進行建置...", + "loc.messages.FailedToLocateSpecifiedJVM": "找不到指定的 JDK 版本。請確認指定的 JDK 版本已安裝在代理程式上,且環境變數 '%s' 存在並已設定為對應 JDK 的位置,或者使用 [Java 工具安裝程式](https://go.microsoft.com/fwlink/?linkid=875287) 工作安裝所需的 JDK。", + "loc.messages.DiscontinueAntCodeCoverage": "我們即將中止對自動產生 Ant 專案程式碼涵蓋範圍報告的支援。如需更多詳細資料,請參閱 https://go.microsoft.com/fwlink/?linkid=875306。", + "loc.messages.NoCodeCoverage": "找不到要發行的程式碼涵蓋範圍結果。", + "loc.messages.NoTestResults": "找不到任何符合 %s 的測試結果,因此跳過發行 JUnit 測試結果。" +} \ No newline at end of file diff --git a/_generated/ANTV1/Tests/L0.ts b/_generated/ANTV1/Tests/L0.ts new file mode 100644 index 000000000000..e3d2322eb696 --- /dev/null +++ b/_generated/ANTV1/Tests/L0.ts @@ -0,0 +1,167 @@ +import assert = require('assert'); +import { MockTestRunner } from 'azure-pipelines-task-lib/mock-test'; +import path = require('path'); +import os = require('os'); + +var isWindows = os.type().match(/^Win/); + +describe('ANT Suite', function () { + this.timeout(parseInt(process.env.TASK_TEST_TIMEOUT) || 20000); + + it('run ANT with all inputs', (done) => { + const testPath = path.join(__dirname, 'L0AllInputs.js') + const runner: MockTestRunner = new MockTestRunner(testPath); + runner.run(); + + assert(runner.ran('/usr/local/bin/ANT -version'), 'it should have run ANT -version'); + assert(runner.ran('/usr/local/bin/ANT -buildfile /build/build.xml'), 'it should have run ANT -buildfile ...'); + assert(runner.invokedToolCount == 2, 'should have only run ANT 2 times'); + assert(runner.stderr.length == 0, 'should not have written to stderr'); + assert(runner.succeeded, 'task should have succeeded'); + done(); + }) + + it('fails if missing antBuildFile input', (done) => { + const testPath = path.join(__dirname, 'L0MissingAntBuildFile.js') + const runner: MockTestRunner = new MockTestRunner(testPath); + runner.run(); + + assert(runner.invokedToolCount == 0, 'should not have run ANT'); + assert(runner.failed, 'task should have failed'); + assert(runner.stdOutContained('Input required: antBuildFile'), 'wrong error message'); + done(); + }) + + it('fails if missing javaHomeSelection input', (done) => { + const testPath = path.join(__dirname, 'L0MissingJavaHomeSelection.js') + const runner: MockTestRunner = new MockTestRunner(testPath); + runner.run(); + + assert(runner.invokedToolCount == 0, 'should not have run ANT'); + assert(runner.failed, 'task should have failed'); + assert(runner.stdOutContained('Input required: javaHomeSelection'), 'wrong error message"'); + done(); + }) + + it('fails if missing testResultsFiles input', (done) => { + const testPath = path.join(__dirname, 'L0MissingTestResultsFiles.js') + const runner: MockTestRunner = new MockTestRunner(testPath); + runner.run(); + + assert(runner.invokedToolCount == 0, 'should not have run ANT'); + assert(runner.failed, 'task should have failed'); + assert(runner.stdOutContained('Input required: testResultsFiles'), 'wrong error message:"'); + done(); + }) + + it('run ANT with antHomeUserInputPath', (done) => { + const testPath = path.join(__dirname, 'L0RunWithAntHomeUserInputPath.js') + const runner: MockTestRunner = new MockTestRunner(testPath); + runner.run(); + + assert(runner.ran('/usr/local/bin/ANT -version'), 'it should have run ANT -version'); + assert(runner.ran('/usr/local/bin/ANT -buildfile /build/build.xml'), 'it should have run ANT -buildfile ...'); + assert(runner.invokedToolCount == 2, 'should have only run ANT 2 times'); + assert(runner.stderr.length == 0, 'should not have written to stderr'); + assert(runner.succeeded, 'task should have succeeded'); + assert(runner.stdOutContained('Set ANT_HOME to /usr/local/bin/ANT2'), 'ANT_HOME not set correctly'); + done(); + }) + + it('run ANT with antHomeUserInputPath set to invalid path', (done) => { + const testPath = path.join(__dirname, 'L0InvalidUserHomePath.js') + const runner: MockTestRunner = new MockTestRunner(testPath); + runner.run(); + + assert(runner.invokedToolCount == 0, 'should not have run ANT'); + assert(runner.failed, 'task should have failed'); + assert(runner.stdOutContained('Not found /usr/local/bin/ANT_invalid'), 'Invalid path not detected'); + done(); + }) + + it('run ANT with ANT_HOME not set', (done) => { + const testPath = path.join(__dirname, 'L0AntHomeNotSet.js') + const runner: MockTestRunner = new MockTestRunner(testPath); + runner.run(); + + // The response file will cause ANT to fail, but we are looking for the warning about ANT_HOME + assert(runner.ran('/usr/local/bin/ANT -version'), 'it should have run ANT -version'); + assert(runner.invokedToolCount == 1, 'should have only run ANT once'); + assert(runner.failed, 'task should have failed'); + assert(runner.stdOutContained('The ANT_HOME environment variable is not set'), 'Missing JAVA_HOME not detected'); + done(); + }) + + it('run ANT with jdkVersion set to 1.8', (done) => { + const testPath = path.join(__dirname, 'L0JDKSetTo8.js') + const runner: MockTestRunner = new MockTestRunner(testPath); + runner.run(); + + assert(runner.ran('/usr/local/bin/ANT -version'), 'it should have run ANT -version'); + assert(runner.ran('/usr/local/bin/ANT -buildfile /build/build.xml'), 'it should have run ANT -buildfile ...'); + assert.strictEqual(runner.invokedToolCount, 2, 'should have run ANT 2 times'); + assert(runner.stderr.length == 0, 'should not have written to stderr'); + assert(runner.succeeded, 'task should have succeeded'); + assert(runner.stdOutContained('Set JAVA_HOME to /user/local/bin/ANT8'), 'JAVA_HOME not set correctly'); + done(); + }) + + it('run ANT with jdkVersion set to 1.5', (done) => { + const testPath = path.join(__dirname, 'L0JDKSetTo5.js') + const runner: MockTestRunner = new MockTestRunner(testPath); + runner.run(); + + if (isWindows) { + assert.strictEqual(runner.invokedToolCount, 1, 'should have run the reg query toolrunner'); + } else { + assert.strictEqual(runner.invokedToolCount, 0, 'should not have run tools'); + } + assert(runner.failed, 'task should have failed'); + assert(runner.stdOutContained('FailedToLocateSpecifiedJVM'), 'Should write FailedToLocateSpecifiedJVM error'); + done(); + }) + + it('run ANT valid inputs but it fails', (done) => { + const testPath = path.join(__dirname, 'L0FailWithValidInputs.js') + const runner: MockTestRunner = new MockTestRunner(testPath); + runner.run(); + + // The response file will cause ANT to fail, but we are looking for the warning about ANT_HOME + assert(runner.ran('/usr/local/bin/ANT -version'), 'it should have run ANT -version'); + assert(runner.ran('/usr/local/bin/ANT -buildfile /build/build.xml'), 'it should have run ANT -buildfile ...'); + assert(runner.invokedToolCount == 2, 'should have only run ANT 2 times'); + assert(runner.failed, 'task should have failed'); + done(); + }) + + it('Ant build with Publish Test Results.', (done) => { + const testPath = path.join(__dirname, 'L0PublishTestResults.js') + const runner: MockTestRunner = new MockTestRunner(testPath); + runner.run(); + + assert(runner.succeeded, 'The task should not have failed'); + assert(runner.stdout.search(/##vso\[results.publish type=JUnit;mergeResults=true;publishRunAttachments=true;resultFiles=\/user\/build\/fun\/test-123.xml;\]/) >= 0) + done(); + }) + + it('Ant build with Publish Test Results with no matching test result files.', (done) => { + const testPath = path.join(__dirname, 'L0NoMatchingTestResults.js') + const runner: MockTestRunner = new MockTestRunner(testPath); + runner.run(); + + assert(runner.stdout.search(/##vso\[results.publish\]/) < 0, 'publish test results should have not got called.'); + assert(runner.stderr.length == 0, 'should not have written to stderr'); + assert(runner.stdOutContained('NoTestResults'), 'should have warned about lack of test results'); + assert(runner.succeeded, 'task should have succeeded'); + done(); + }) + + it('Ant build with Publish Test Results for failed builds.', (done) => { + const testPath = path.join(__dirname, 'L0FailedBuilds.js') + const runner: MockTestRunner = new MockTestRunner(testPath); + runner.run(); + + assert(runner.stdout.search(/##vso\[results.publish type=JUnit;mergeResults=true;publishRunAttachments=true;resultFiles=\/user\/build\/fun\/test-123.xml;\]/) >= 0); + done(); + }) +}); diff --git a/_generated/ANTV1/Tests/L0AllInputs.ts b/_generated/ANTV1/Tests/L0AllInputs.ts new file mode 100644 index 000000000000..10d215ac3943 --- /dev/null +++ b/_generated/ANTV1/Tests/L0AllInputs.ts @@ -0,0 +1,15 @@ +import path = require('path'); +import { TaskMockRunner } from 'azure-pipelines-task-lib/mock-run'; +import * as answers from './answers'; + +let taskPath = path.join(__dirname, '..', 'anttask.js'); +let runner: TaskMockRunner = new TaskMockRunner(taskPath); + +runner.setInput('antBuildFile', '/build/build.xml'); // Make that checkPath returns true for this filename in the response file +runner.setInput('javaHomeSelection', 'JDKVersion'); +runner.setInput('jdkVersion', 'default'); +runner.setInput('testResultsFiles', '**/TEST-*.xml'); + +runner.setAnswers(answers.successAnswers); + +runner.run(); diff --git a/_generated/ANTV1/Tests/L0AntHomeNotSet.ts b/_generated/ANTV1/Tests/L0AntHomeNotSet.ts new file mode 100644 index 000000000000..f2927496aa4c --- /dev/null +++ b/_generated/ANTV1/Tests/L0AntHomeNotSet.ts @@ -0,0 +1,17 @@ +import path = require('path'); +import { TaskMockRunner } from 'azure-pipelines-task-lib/mock-run'; +import * as answers from './answers'; + +let taskPath = path.join(__dirname, '..', 'anttask.js'); +let runner: TaskMockRunner = new TaskMockRunner(taskPath); + +runner.setInput('antBuildFile', '/build/build.xml'); // Make that checkPath returns true for this filename in the response file +runner.setInput('javaHomeSelection', 'JDKVersion'); +runner.setInput('jdkVersion', 'default'); +runner.setInput('testResultsFiles', '**/TEST-*.xml'); + +runner.setAnswers(answers.versionFailAnswers); + +delete process.env['ANT_HOME']; + +runner.run(); diff --git a/_generated/ANTV1/Tests/L0FailWithValidInputs.ts b/_generated/ANTV1/Tests/L0FailWithValidInputs.ts new file mode 100644 index 000000000000..9fc326d786d6 --- /dev/null +++ b/_generated/ANTV1/Tests/L0FailWithValidInputs.ts @@ -0,0 +1,15 @@ +import path = require('path'); +import { TaskMockRunner } from 'azure-pipelines-task-lib/mock-run'; +import * as answers from './answers'; + +let taskPath = path.join(__dirname, '..', 'anttask.js'); +let runner: TaskMockRunner = new TaskMockRunner(taskPath); + +runner.setInput('antBuildFile', '/build/build.xml'); +runner.setInput('javaHomeSelection', 'JDKVersion'); +runner.setInput('jdkVersion', 'default'); +runner.setInput('testResultsFiles', '**/TEST-*.xml'); + +runner.setAnswers(answers.failAnswers); + +runner.run(); diff --git a/_generated/ANTV1/Tests/L0FailedBuilds.ts b/_generated/ANTV1/Tests/L0FailedBuilds.ts new file mode 100644 index 000000000000..548228eddd73 --- /dev/null +++ b/_generated/ANTV1/Tests/L0FailedBuilds.ts @@ -0,0 +1,18 @@ +import path = require('path'); +import { TaskMockRunner } from 'azure-pipelines-task-lib/mock-run'; +import * as answers from './answers'; + + +let taskPath = path.join(__dirname, '..', 'anttask.js'); +let runner: TaskMockRunner = new TaskMockRunner(taskPath); + +runner.setInput('antBuildFile', '/build/build.xml'); // Make that checkPath returns true for this filename in the response file +runner.setInput('javaHomeSelection', 'JDKVersion'); +runner.setInput('jdkVersion', 'default'); +runner.setInput('testResultsFiles', '**/TEST-*.xml'); +runner.setInput('publishJUnitResults', 'true'); +runner.setInput('codeCoverageTool', 'None'); + +runner.setAnswers(answers.failAnswers); + +runner.run(); diff --git a/_generated/ANTV1/Tests/L0InvalidUserHomePath.ts b/_generated/ANTV1/Tests/L0InvalidUserHomePath.ts new file mode 100644 index 000000000000..e99d78796752 --- /dev/null +++ b/_generated/ANTV1/Tests/L0InvalidUserHomePath.ts @@ -0,0 +1,16 @@ +import path = require('path'); +import { TaskMockRunner } from 'azure-pipelines-task-lib/mock-run'; +import * as answers from './answers'; + +let taskPath = path.join(__dirname, '..', 'anttask.js'); +let runner: TaskMockRunner = new TaskMockRunner(taskPath); + +runner.setInput('antBuildFile', '/build/build.xml'); +runner.setInput('javaHomeSelection', 'JDKVersion'); +runner.setInput('jdkVersion', 'default'); +runner.setInput('testResultsFiles', '**/TEST-*.xml'); +runner.setInput('antHomeUserInputPath', '/usr/local/bin/ANT_invalid'); + +runner.setAnswers(answers.versionFailAnswers); + +runner.run(); diff --git a/_generated/ANTV1/Tests/L0JDKSetTo5.ts b/_generated/ANTV1/Tests/L0JDKSetTo5.ts new file mode 100644 index 000000000000..bbc0f0954791 --- /dev/null +++ b/_generated/ANTV1/Tests/L0JDKSetTo5.ts @@ -0,0 +1,16 @@ +import path = require('path'); +import { TaskMockRunner } from 'azure-pipelines-task-lib/mock-run'; +import * as answers from './answers'; + +let taskPath = path.join(__dirname, '..', 'anttask.js'); +let runner: TaskMockRunner = new TaskMockRunner(taskPath); + +runner.setInput('antBuildFile', '/build/build.xml'); +runner.setInput('javaHomeSelection', 'JDKVersion'); +runner.setInput('jdkVersion', '1.5'); +runner.setInput('jdkArchitecture', 'x86'); +runner.setInput('testResultsFiles', '**/TEST-*.xml'); + +runner.setAnswers(answers.successAnswers); + +runner.run(); diff --git a/_generated/ANTV1/Tests/L0JDKSetTo8.ts b/_generated/ANTV1/Tests/L0JDKSetTo8.ts new file mode 100644 index 000000000000..ee69c7d04d50 --- /dev/null +++ b/_generated/ANTV1/Tests/L0JDKSetTo8.ts @@ -0,0 +1,19 @@ +import path = require('path'); +import { TaskMockRunner } from 'azure-pipelines-task-lib/mock-run'; +import * as answers from './answers'; + +let taskPath = path.join(__dirname, '..', 'anttask.js'); +let runner: TaskMockRunner = new TaskMockRunner(taskPath); + +runner.setInput('antBuildFile', '/build/build.xml'); +runner.setInput('javaHomeSelection', 'JDKVersion'); +runner.setInput('jdkVersion', '1.8'); +runner.setInput('jdkArchitecture', 'x86'); +runner.setInput('testResultsFiles', '**/TEST-*.xml'); + +runner.setAnswers(answers.successAnswers); + +process.env['JAVA_HOME_8_X86'] = '/user/local/bin/ANT8'; +process.env['JAVA_HOME_8_X64'] = '/user/local/bin/ANT8'; + +runner.run(); diff --git a/_generated/ANTV1/Tests/L0MissingAntBuildFile.ts b/_generated/ANTV1/Tests/L0MissingAntBuildFile.ts new file mode 100644 index 000000000000..6e6ddeeed4d7 --- /dev/null +++ b/_generated/ANTV1/Tests/L0MissingAntBuildFile.ts @@ -0,0 +1,14 @@ +import path = require('path'); +import { TaskMockRunner } from 'azure-pipelines-task-lib/mock-run'; +import * as answers from './answers'; + +let taskPath = path.join(__dirname, '..', 'anttask.js'); +let runner: TaskMockRunner = new TaskMockRunner(taskPath); + +runner.setInput('javaHomeSelection', 'JDKVersion'); +runner.setInput('jdkVersion', 'default'); +runner.setInput('testResultsFiles', '**/TEST-*.xml'); + +runner.setAnswers(answers.successAnswers); + +runner.run(); diff --git a/_generated/ANTV1/Tests/L0MissingJavaHomeSelection.ts b/_generated/ANTV1/Tests/L0MissingJavaHomeSelection.ts new file mode 100644 index 000000000000..1df24ee56f42 --- /dev/null +++ b/_generated/ANTV1/Tests/L0MissingJavaHomeSelection.ts @@ -0,0 +1,14 @@ +import path = require('path'); +import { TaskMockRunner } from 'azure-pipelines-task-lib/mock-run'; +import * as answers from './answers'; + +let taskPath = path.join(__dirname, '..', 'anttask.js'); +let runner: TaskMockRunner = new TaskMockRunner(taskPath); + +runner.setInput('antBuildFile', '/build/build.xml'); +runner.setInput('jdkVersion', 'default'); +runner.setInput('testResultsFiles', '**/TEST-*.xml'); + +runner.setAnswers(answers.successAnswers); + +runner.run(); diff --git a/_generated/ANTV1/Tests/L0MissingTestResultsFiles.ts b/_generated/ANTV1/Tests/L0MissingTestResultsFiles.ts new file mode 100644 index 000000000000..e56109d5d6b2 --- /dev/null +++ b/_generated/ANTV1/Tests/L0MissingTestResultsFiles.ts @@ -0,0 +1,14 @@ +import path = require('path'); +import { TaskMockRunner } from 'azure-pipelines-task-lib/mock-run'; +import * as answers from './answers'; + +let taskPath = path.join(__dirname, '..', 'anttask.js'); +let runner: TaskMockRunner = new TaskMockRunner(taskPath); + +runner.setInput('antBuildFile', '/build/build.xml'); // Make that checkPath returns true for this filename in the response file +runner.setInput('javaHomeSelection', 'JDKVersion'); +runner.setInput('jdkVersion', 'default'); + +runner.setAnswers(answers.successAnswers); + +runner.run(); diff --git a/_generated/ANTV1/Tests/L0NoMatchingTestResults.ts b/_generated/ANTV1/Tests/L0NoMatchingTestResults.ts new file mode 100644 index 000000000000..249d2faaf53f --- /dev/null +++ b/_generated/ANTV1/Tests/L0NoMatchingTestResults.ts @@ -0,0 +1,17 @@ +import path = require('path'); +import { TaskMockRunner } from 'azure-pipelines-task-lib/mock-run'; +import * as answers from './answers'; + +let taskPath = path.join(__dirname, '..', 'anttask.js'); +let runner: TaskMockRunner = new TaskMockRunner(taskPath); + +runner.setInput('antBuildFile', '/build/build.xml'); // Make that checkPath returns true for this filename in the response file +runner.setInput('javaHomeSelection', 'JDKVersion'); +runner.setInput('jdkVersion', 'default'); +runner.setInput('testResultsFiles', '**/InvalidTestFilter-*.xml'); +runner.setInput('publishJUnitResults', 'true'); +runner.setInput('codeCoverageTool', 'None'); + +runner.setAnswers(answers.successAnswers); + +runner.run(); diff --git a/_generated/ANTV1/Tests/L0PublishTestResults.ts b/_generated/ANTV1/Tests/L0PublishTestResults.ts new file mode 100644 index 000000000000..e3cce17f80bd --- /dev/null +++ b/_generated/ANTV1/Tests/L0PublishTestResults.ts @@ -0,0 +1,19 @@ +import path = require('path'); +import { TaskMockRunner } from 'azure-pipelines-task-lib/mock-run'; +import * as answers from './answers'; + +let taskPath = path.join(__dirname, '..', 'anttask.js'); +let runner: TaskMockRunner = new TaskMockRunner(taskPath); + +runner.setInput('antBuildFile', '/build/build.xml'); // Make that checkPath returns true for this filename in the response file +runner.setInput('javaHomeSelection', 'JDKVersion'); +runner.setInput('jdkVersion', 'default'); +runner.setInput('testResultsFiles', '**/TEST-*.xml'); +runner.setInput('publishJUnitResults', 'true'); +runner.setInput('codeCoverageTool', 'None'); + +runner.setAnswers(answers.successAnswers); + +process.env['System.DefaultWorkingDirectory'] = '/user/build'; + +runner.run(); diff --git a/_generated/ANTV1/Tests/L0RunWithAntHomeUserInputPath.ts b/_generated/ANTV1/Tests/L0RunWithAntHomeUserInputPath.ts new file mode 100644 index 000000000000..53b3d2daa6ed --- /dev/null +++ b/_generated/ANTV1/Tests/L0RunWithAntHomeUserInputPath.ts @@ -0,0 +1,16 @@ +import path = require('path'); +import { TaskMockRunner } from 'azure-pipelines-task-lib/mock-run'; +import * as answers from './answers'; + +let taskPath = path.join(__dirname, '..', 'anttask.js'); +let runner: TaskMockRunner = new TaskMockRunner(taskPath); + +runner.setInput('antBuildFile', '/build/build.xml'); +runner.setInput('javaHomeSelection', 'JDKVersion'); +runner.setInput('jdkVersion', 'default'); +runner.setInput('testResultsFiles', '**/TEST-*.xml'); +runner.setInput('antHomeUserInputPath', '/usr/local/bin/ANT2'); + +runner.setAnswers(answers.successAnswers); + +runner.run(); diff --git a/_generated/ANTV1/Tests/answers.ts b/_generated/ANTV1/Tests/answers.ts new file mode 100644 index 000000000000..ed2ddf81c437 --- /dev/null +++ b/_generated/ANTV1/Tests/answers.ts @@ -0,0 +1,160 @@ +import { TaskLibAnswers } from 'azure-pipelines-task-lib/mock-answer'; + +export const successAnswers: TaskLibAnswers = { + "which": { + "ant": "/usr/local/bin/ANT", + "node": "/usr/local/bin/node" + }, + "exec": { + "/usr/local/bin/ANT -version": { + "code": 0, + "stdout": "Apache Ant(TM) version 1.9.7 compiled on April 9 2016" + }, + "/usr/local/bin/ANT -buildfile /build/build.xml": { + "code": 0, + "stdout": "" + }, + "/usr/local/bin/ANT -buildfile /build/build.xml CodeCoverage_9064e1d0": { + "code": 0, + "stdout": "" + }, + "reg query HKLM\\SOFTWARE\\JavaSoft\\Java Development Kit\\1.5 /v JavaHome /reg:32": { + "code": 222, + "stdout": "" + }, + "reg query HKLM\\SOFTWARE\\JavaSoft\\Java Development Kit\\ /f 1.5 /k": { + "code": 50, + "stdout": "" + } + }, + "checkPath": { + "/usr/local/bin/ANT": true, + "/build/build.xml": true, + "/usr/local/bin/ANT2": true + }, + "getVariable": { + "ANT_HOME": "/user/local/bin/ANT", + "JAVA_HOME_8_x86": "/user/local/bin/ANT8", + "JAVA_HOME_8_X64": "/user/local/bin/ANT8", + "System.DefaultWorkingDirectory": "/user/build" + }, + "rmRF": { + "\\build\\InstrumentedClasses": { + "success": true, + "message": "success" + }, + "\\build\\cobertura.ser": { + "success": true, + "message": "success" + }, + "\\build\\CCReport43F6D5EF": { + "success": true, + "message": "success" + }, + "\\build\\CCReportBuildA4D283EG.xml": { + "success": true, + "message": "success" + }, + "/build/InstrumentedClasses": { + "success": true, + "message": "success" + }, + "/build/cobertura.ser": { + "success": true, + "message": "success" + }, + "/build/CCReport43F6D5EF": { + "success": true, + "message": "success" + }, + "/build/CCReportBuildA4D283EG.xml": { + "success": true, + "message": "success" + } + }, + "find": { + "/user/build": [ + "/user/build/fun/test-123.xml" + ] + }, + "findMatch": { + "**/TEST-*.xml": [ + "/user/build/fun/test-123.xml" + ] + } +}; + +export const failAnswers: TaskLibAnswers = { + "which": { + "ant": "/usr/local/bin/ANT", + "node": "/usr/local/bin/node" + }, + "exec": { + "/usr/local/bin/ANT -version": { + "code": 0, + "stdout": "Apache Ant(TM) version 1.9.7 compiled on April 9 2016" + }, + "/usr/local/bin/ANT -buildfile /build/build.xml": { + "code": 222, + "stdout": "" + } + }, + "checkPath": { + "/usr/local/bin/ANT": true, + "/build/build.xml": true + }, + "getVariable": { + "ANT_HOME": "/user/local/bin/ANT" + }, + "rmRF": { + "\\build\\InstrumentedClasses": { + "success": true, + "message": "success" + }, + "/build/InstrumentedClasses": { + "success": true, + "message": "success" + } + }, + "find": { + "/user/build": [ + "/user/build/fun/test-123.xml" + ] + }, + "findMatch": { + "**/TEST-*.xml": [ + "/user/build/fun/test-123.xml" + ] + } +}; + +export const versionFailAnswers: TaskLibAnswers = { + "which": { + "ant": "/usr/local/bin/ANT", + "node": "/usr/local/bin/node" + }, + "exec": { + "/usr/local/bin/ANT -version": { + "code": 222, + "stdout": "Apache Ant(TM) version 1.9.7 compiled on April 9 2016" + }, + "/usr/local/bin/ANT -buildfile /build/build.xml": { + "code": 0, + "stdout": "" + } + }, + "checkPath" : { + "/usr/local/bin/ANT": true, + "/build/build.xml": true + }, + "rmRF": { + "\\build\\InstrumentedClasses": { + "success": true, + "message": "success" + }, + "/build/InstrumentedClasses": { + "success": true, + "message": "success" + } + } +} diff --git a/_generated/ANTV1/Tests/package-lock.json b/_generated/ANTV1/Tests/package-lock.json new file mode 100644 index 000000000000..0e52d1ddc30b --- /dev/null +++ b/_generated/ANTV1/Tests/package-lock.json @@ -0,0 +1,14 @@ +{ + "name": "antv1-tests", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/mocha": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", + "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==", + "dev": true + } + } +} diff --git a/_generated/ANTV1/Tests/package.json b/_generated/ANTV1/Tests/package.json new file mode 100644 index 000000000000..37725de724e6 --- /dev/null +++ b/_generated/ANTV1/Tests/package.json @@ -0,0 +1,22 @@ +{ + "name": "antv1-tests", + "version": "1.0.0", + "description": "Azure Pipelines Ant V1 Task Tests", + "main": "L0.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/Microsoft/azure-pipelines-tasks.git" + }, + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Microsoft/azure-pipelines-tasks/issues" + }, + "homepage": "https://github.com/Microsoft/azure-pipelines-tasks#readme", + "devDependencies": { + "@types/mocha": "^5.2.7" + } +} diff --git a/_generated/ANTV1/ThirdPartyNotice.txt b/_generated/ANTV1/ThirdPartyNotice.txt new file mode 100644 index 000000000000..e02a9dc6967a --- /dev/null +++ b/_generated/ANTV1/ThirdPartyNotice.txt @@ -0,0 +1,1935 @@ + +THIRD-PARTY SOFTWARE NOTICES AND INFORMATION +Do Not Translate or Localize + +This Azure DevOps extension (ANTV1) is based on or incorporates material from the projects listed below (Third Party IP). The original copyright notice and the license under which Microsoft received such Third Party IP, are set forth below. Such licenses and notices are provided for informational purposes only. Microsoft licenses the Third Party IP to you under the licensing terms for the Azure DevOps extension. Microsoft reserves all other rights not expressly granted under this agreement, whether by implication, estoppel or otherwise. + +1. @types/node (git+https://github.com/DefinitelyTyped/DefinitelyTyped.git) +2. @types/q (git+https://github.com/DefinitelyTyped/DefinitelyTyped.git) +3. balanced-match (git://github.com/juliangruber/balanced-match.git) +4. boolbase (git+https://github.com/fb55/boolbase.git) +5. brace-expansion (git://github.com/juliangruber/brace-expansion.git) +6. cheerio (git://github.com/cheeriojs/cheerio.git) +7. codecoverage-tools (git://github.com/microsoft/azure-pipelines-tasks-coverage-tools.git) +8. concat-map (git://github.com/substack/node-concat-map.git) +9. core-util-is (git://github.com/isaacs/core-util-is.git) +10. css-select (git://github.com/fb55/css-select.git) +11. css-what (git+https://github.com/fb55/css-what.git) +12. dom-serializer (git://github.com/cheeriojs/dom-renderer.git) +13. domelementtype (git://github.com/FB55/domelementtype.git) +14. domelementtype (git://github.com/FB55/domelementtype.git) +15. domhandler (git://github.com/fb55/DomHandler.git) +16. domutils (git://github.com/FB55/domutils.git) +17. entities (git://github.com/fb55/node-entities.git) +18. fs-extra (git+https://github.com/jprichardson/node-fs-extra.git) +19. fs.realpath (git+https://github.com/isaacs/fs.realpath.git) +20. glob (git://github.com/isaacs/node-glob.git) +21. glob (git://github.com/isaacs/node-glob.git) +22. glob (git://github.com/isaacs/node-glob.git) +23. graceful-fs (git+https://github.com/isaacs/node-graceful-fs.git) +24. htmlparser2 (git://github.com/fb55/htmlparser2.git) +25. inflight (git+https://github.com/npm/inflight.git) +26. inherits (git://github.com/isaacs/inherits.git) +27. isarray (git://github.com/juliangruber/isarray.git) +28. jsonfile (git+ssh://git@github.com/jprichardson/node-jsonfile.git) +29. klaw (git+https://github.com/jprichardson/node-klaw.git) +30. lodash.assignin (git+https://github.com/lodash/lodash.git) +31. lodash.bind (git+https://github.com/lodash/lodash.git) +32. lodash.defaults (git+https://github.com/lodash/lodash.git) +33. lodash.filter (git+https://github.com/lodash/lodash.git) +34. lodash.flatten (git+https://github.com/lodash/lodash.git) +35. lodash.foreach (git+https://github.com/lodash/lodash.git) +36. lodash.map (git+https://github.com/lodash/lodash.git) +37. lodash.merge (git+https://github.com/lodash/lodash.git) +38. lodash.pick (git+https://github.com/lodash/lodash.git) +39. lodash.reduce (git+https://github.com/lodash/lodash.git) +40. lodash.reject (git+https://github.com/lodash/lodash.git) +41. lodash.some (git+https://github.com/lodash/lodash.git) +42. minimatch (git://github.com/isaacs/minimatch.git) +43. mockery (git://github.com/mfncooper/mockery.git) +44. node-uuid (git+https://github.com/broofa/node-uuid.git) +45. nth-check (git+https://github.com/fb55/nth-check.git) +46. once (git://github.com/isaacs/once.git) +47. os (git+https://github.com/DiegoRBaquero/node-os.git) +48. path-is-absolute (git+https://github.com/sindresorhus/path-is-absolute.git) +49. process-nextick-args (git+https://github.com/calvinmetcalf/process-nextick-args.git) +50. q (git://github.com/kriskowal/q.git) +51. readable-stream (git://github.com/nodejs/readable-stream.git) +52. rimraf (git://github.com/isaacs/rimraf.git) +53. safe-buffer (git://github.com/feross/safe-buffer.git) +54. sax (git://github.com/isaacs/sax-js.git) +55. semver (git+https://github.com/npm/node-semver.git) +56. shelljs (git://github.com/arturadib/shelljs.git) +57. string_decoder (git://github.com/nodejs/string_decoder.git) +58. strip-bom (git+https://github.com/sindresorhus/strip-bom.git) +59. util-deprecate (git://github.com/TooTallNate/util-deprecate.git) +60. uuid (git+https://github.com/kelektiv/node-uuid.git) +61. vso-node-api (git+https://github.com/Microsoft/vso-node-api.git) +62. vsts-task-lib (git+https://github.com/Microsoft/vsts-task-lib.git) +63. vsts-task-lib (git+https://github.com/Microsoft/vsts-task-lib.git) +64. vsts-task-lib (git+https://github.com/Microsoft/vsts-task-lib.git) +65. wrappy (git+https://github.com/npm/wrappy.git) +66. xml2js (git+https://github.com/Leonidas-from-XIV/node-xml2js.git) +67. xmlbuilder (git://github.com/oozcitak/xmlbuilder-js.git) + + +%% @types/node NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +MIT License + + Copyright (c) Microsoft Corporation. All rights reserved. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE +========================================= +END OF @types/node NOTICES, INFORMATION, AND LICENSE + +%% @types/q NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +MIT License + + Copyright (c) Microsoft Corporation. All rights reserved. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE +========================================= +END OF @types/q NOTICES, INFORMATION, AND LICENSE + +%% balanced-match NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +(MIT) + +Copyright (c) 2013 Julian Gruber <julian@juliangruber.com> + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +========================================= +END OF balanced-match NOTICES, INFORMATION, AND LICENSE + +%% boolbase NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +NO LICENSE FOUND +========================================= +END OF boolbase NOTICES, INFORMATION, AND LICENSE + +%% brace-expansion NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +MIT License + +Copyright (c) 2013 Julian Gruber + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +========================================= +END OF brace-expansion NOTICES, INFORMATION, AND LICENSE + +%% cheerio NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +NO LICENSE FOUND +========================================= +END OF cheerio NOTICES, INFORMATION, AND LICENSE + +%% codecoverage-tools NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +NO LICENSE FOUND +========================================= +END OF codecoverage-tools NOTICES, INFORMATION, AND LICENSE + +%% concat-map NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +This software is released under the MIT license: + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF concat-map NOTICES, INFORMATION, AND LICENSE + +%% core-util-is NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright Node.js contributors. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. +========================================= +END OF core-util-is NOTICES, INFORMATION, AND LICENSE + +%% css-select NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) Felix Böhm +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +THIS IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +========================================= +END OF css-select NOTICES, INFORMATION, AND LICENSE + +%% css-what NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) Felix Böhm +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +THIS IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +========================================= +END OF css-what NOTICES, INFORMATION, AND LICENSE + +%% dom-serializer NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +License + +(The MIT License) + +Copyright (c) 2014 The cheeriojs contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF dom-serializer NOTICES, INFORMATION, AND LICENSE + +%% domelementtype NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) Felix Böhm +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +THIS IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +========================================= +END OF domelementtype NOTICES, INFORMATION, AND LICENSE + +%% domelementtype NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) Felix Böhm +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +THIS IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +========================================= +END OF domelementtype NOTICES, INFORMATION, AND LICENSE + +%% domhandler NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) Felix Böhm +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +THIS IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +========================================= +END OF domhandler NOTICES, INFORMATION, AND LICENSE + +%% domutils NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) Felix Böhm +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +THIS IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +========================================= +END OF domutils NOTICES, INFORMATION, AND LICENSE + +%% entities NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) Felix Böhm +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +THIS IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +========================================= +END OF entities NOTICES, INFORMATION, AND LICENSE + +%% fs-extra NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +(The MIT License) + +Copyright (c) 2011-2016 JP Richardson + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files +(the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, + merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS +OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF fs-extra NOTICES, INFORMATION, AND LICENSE + +%% fs.realpath NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +---- + +This library bundles a version of the `fs.realpath` and `fs.realpathSync` +methods from Node.js v0.10 under the terms of the Node.js MIT license. + +Node's license follows, also included at the header of `old.js` which contains +the licensed code: + + Copyright Joyent, Inc. and other Node contributors. + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. +========================================= +END OF fs.realpath NOTICES, INFORMATION, AND LICENSE + +%% glob NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF glob NOTICES, INFORMATION, AND LICENSE + +%% glob NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF glob NOTICES, INFORMATION, AND LICENSE + +%% glob NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF glob NOTICES, INFORMATION, AND LICENSE + +%% graceful-fs NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter, Ben Noordhuis, and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF graceful-fs NOTICES, INFORMATION, AND LICENSE + +%% htmlparser2 NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright 2010, 2011, Chris Winberry . All rights reserved. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. +========================================= +END OF htmlparser2 NOTICES, INFORMATION, AND LICENSE + +%% inflight NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF inflight NOTICES, INFORMATION, AND LICENSE + +%% inherits NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF inherits NOTICES, INFORMATION, AND LICENSE + +%% isarray NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +NO LICENSE FOUND +========================================= +END OF isarray NOTICES, INFORMATION, AND LICENSE + +%% jsonfile NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +(The MIT License) + +Copyright (c) 2012-2015, JP Richardson + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files +(the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, + merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS +OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF jsonfile NOTICES, INFORMATION, AND LICENSE + +%% klaw NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +(The MIT License) + +Copyright (c) 2015-2016 JP Richardson + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files +(the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, + merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS +OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF klaw NOTICES, INFORMATION, AND LICENSE + +%% lodash.assignin NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright jQuery Foundation and other contributors + +Based on Underscore.js, copyright Jeremy Ashkenas, +DocumentCloud and Investigative Reporters & Editors + +This software consists of voluntary contributions made by many +individuals. For exact contribution history, see the revision history +available at https://github.com/lodash/lodash + +The following license applies to all parts of this software except as +documented below: + +==== + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +==== + +Copyright and related rights for sample code are waived via CC0. Sample +code is defined as all source code displayed within the prose of the +documentation. + +CC0: http://creativecommons.org/publicdomain/zero/1.0/ + +==== + +Files located in the node_modules and vendor directories are externally +maintained libraries used by this software which have their own +licenses; we recommend you read them, as their terms may differ from the +terms above. +========================================= +END OF lodash.assignin NOTICES, INFORMATION, AND LICENSE + +%% lodash.bind NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright jQuery Foundation and other contributors + +Based on Underscore.js, copyright Jeremy Ashkenas, +DocumentCloud and Investigative Reporters & Editors + +This software consists of voluntary contributions made by many +individuals. For exact contribution history, see the revision history +available at https://github.com/lodash/lodash + +The following license applies to all parts of this software except as +documented below: + +==== + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +==== + +Copyright and related rights for sample code are waived via CC0. Sample +code is defined as all source code displayed within the prose of the +documentation. + +CC0: http://creativecommons.org/publicdomain/zero/1.0/ + +==== + +Files located in the node_modules and vendor directories are externally +maintained libraries used by this software which have their own +licenses; we recommend you read them, as their terms may differ from the +terms above. +========================================= +END OF lodash.bind NOTICES, INFORMATION, AND LICENSE + +%% lodash.defaults NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright jQuery Foundation and other contributors + +Based on Underscore.js, copyright Jeremy Ashkenas, +DocumentCloud and Investigative Reporters & Editors + +This software consists of voluntary contributions made by many +individuals. For exact contribution history, see the revision history +available at https://github.com/lodash/lodash + +The following license applies to all parts of this software except as +documented below: + +==== + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +==== + +Copyright and related rights for sample code are waived via CC0. Sample +code is defined as all source code displayed within the prose of the +documentation. + +CC0: http://creativecommons.org/publicdomain/zero/1.0/ + +==== + +Files located in the node_modules and vendor directories are externally +maintained libraries used by this software which have their own +licenses; we recommend you read them, as their terms may differ from the +terms above. +========================================= +END OF lodash.defaults NOTICES, INFORMATION, AND LICENSE + +%% lodash.filter NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright jQuery Foundation and other contributors + +Based on Underscore.js, copyright Jeremy Ashkenas, +DocumentCloud and Investigative Reporters & Editors + +This software consists of voluntary contributions made by many +individuals. For exact contribution history, see the revision history +available at https://github.com/lodash/lodash + +The following license applies to all parts of this software except as +documented below: + +==== + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +==== + +Copyright and related rights for sample code are waived via CC0. Sample +code is defined as all source code displayed within the prose of the +documentation. + +CC0: http://creativecommons.org/publicdomain/zero/1.0/ + +==== + +Files located in the node_modules and vendor directories are externally +maintained libraries used by this software which have their own +licenses; we recommend you read them, as their terms may differ from the +terms above. +========================================= +END OF lodash.filter NOTICES, INFORMATION, AND LICENSE + +%% lodash.flatten NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright jQuery Foundation and other contributors + +Based on Underscore.js, copyright Jeremy Ashkenas, +DocumentCloud and Investigative Reporters & Editors + +This software consists of voluntary contributions made by many +individuals. For exact contribution history, see the revision history +available at https://github.com/lodash/lodash + +The following license applies to all parts of this software except as +documented below: + +==== + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +==== + +Copyright and related rights for sample code are waived via CC0. Sample +code is defined as all source code displayed within the prose of the +documentation. + +CC0: http://creativecommons.org/publicdomain/zero/1.0/ + +==== + +Files located in the node_modules and vendor directories are externally +maintained libraries used by this software which have their own +licenses; we recommend you read them, as their terms may differ from the +terms above. +========================================= +END OF lodash.flatten NOTICES, INFORMATION, AND LICENSE + +%% lodash.foreach NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright jQuery Foundation and other contributors + +Based on Underscore.js, copyright Jeremy Ashkenas, +DocumentCloud and Investigative Reporters & Editors + +This software consists of voluntary contributions made by many +individuals. For exact contribution history, see the revision history +available at https://github.com/lodash/lodash + +The following license applies to all parts of this software except as +documented below: + +==== + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +==== + +Copyright and related rights for sample code are waived via CC0. Sample +code is defined as all source code displayed within the prose of the +documentation. + +CC0: http://creativecommons.org/publicdomain/zero/1.0/ + +==== + +Files located in the node_modules and vendor directories are externally +maintained libraries used by this software which have their own +licenses; we recommend you read them, as their terms may differ from the +terms above. +========================================= +END OF lodash.foreach NOTICES, INFORMATION, AND LICENSE + +%% lodash.map NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright jQuery Foundation and other contributors + +Based on Underscore.js, copyright Jeremy Ashkenas, +DocumentCloud and Investigative Reporters & Editors + +This software consists of voluntary contributions made by many +individuals. For exact contribution history, see the revision history +available at https://github.com/lodash/lodash + +The following license applies to all parts of this software except as +documented below: + +==== + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +==== + +Copyright and related rights for sample code are waived via CC0. Sample +code is defined as all source code displayed within the prose of the +documentation. + +CC0: http://creativecommons.org/publicdomain/zero/1.0/ + +==== + +Files located in the node_modules and vendor directories are externally +maintained libraries used by this software which have their own +licenses; we recommend you read them, as their terms may differ from the +terms above. +========================================= +END OF lodash.map NOTICES, INFORMATION, AND LICENSE + +%% lodash.merge NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright JS Foundation and other contributors + +Based on Underscore.js, copyright Jeremy Ashkenas, +DocumentCloud and Investigative Reporters & Editors + +This software consists of voluntary contributions made by many +individuals. For exact contribution history, see the revision history +available at https://github.com/lodash/lodash + +The following license applies to all parts of this software except as +documented below: + +==== + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +==== + +Copyright and related rights for sample code are waived via CC0. Sample +code is defined as all source code displayed within the prose of the +documentation. + +CC0: http://creativecommons.org/publicdomain/zero/1.0/ + +==== + +Files located in the node_modules and vendor directories are externally +maintained libraries used by this software which have their own +licenses; we recommend you read them, as their terms may differ from the +terms above. +========================================= +END OF lodash.merge NOTICES, INFORMATION, AND LICENSE + +%% lodash.pick NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright jQuery Foundation and other contributors + +Based on Underscore.js, copyright Jeremy Ashkenas, +DocumentCloud and Investigative Reporters & Editors + +This software consists of voluntary contributions made by many +individuals. For exact contribution history, see the revision history +available at https://github.com/lodash/lodash + +The following license applies to all parts of this software except as +documented below: + +==== + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +==== + +Copyright and related rights for sample code are waived via CC0. Sample +code is defined as all source code displayed within the prose of the +documentation. + +CC0: http://creativecommons.org/publicdomain/zero/1.0/ + +==== + +Files located in the node_modules and vendor directories are externally +maintained libraries used by this software which have their own +licenses; we recommend you read them, as their terms may differ from the +terms above. +========================================= +END OF lodash.pick NOTICES, INFORMATION, AND LICENSE + +%% lodash.reduce NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright jQuery Foundation and other contributors + +Based on Underscore.js, copyright Jeremy Ashkenas, +DocumentCloud and Investigative Reporters & Editors + +This software consists of voluntary contributions made by many +individuals. For exact contribution history, see the revision history +available at https://github.com/lodash/lodash + +The following license applies to all parts of this software except as +documented below: + +==== + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +==== + +Copyright and related rights for sample code are waived via CC0. Sample +code is defined as all source code displayed within the prose of the +documentation. + +CC0: http://creativecommons.org/publicdomain/zero/1.0/ + +==== + +Files located in the node_modules and vendor directories are externally +maintained libraries used by this software which have their own +licenses; we recommend you read them, as their terms may differ from the +terms above. +========================================= +END OF lodash.reduce NOTICES, INFORMATION, AND LICENSE + +%% lodash.reject NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright jQuery Foundation and other contributors + +Based on Underscore.js, copyright Jeremy Ashkenas, +DocumentCloud and Investigative Reporters & Editors + +This software consists of voluntary contributions made by many +individuals. For exact contribution history, see the revision history +available at https://github.com/lodash/lodash + +The following license applies to all parts of this software except as +documented below: + +==== + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +==== + +Copyright and related rights for sample code are waived via CC0. Sample +code is defined as all source code displayed within the prose of the +documentation. + +CC0: http://creativecommons.org/publicdomain/zero/1.0/ + +==== + +Files located in the node_modules and vendor directories are externally +maintained libraries used by this software which have their own +licenses; we recommend you read them, as their terms may differ from the +terms above. +========================================= +END OF lodash.reject NOTICES, INFORMATION, AND LICENSE + +%% lodash.some NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright jQuery Foundation and other contributors + +Based on Underscore.js, copyright Jeremy Ashkenas, +DocumentCloud and Investigative Reporters & Editors + +This software consists of voluntary contributions made by many +individuals. For exact contribution history, see the revision history +available at https://github.com/lodash/lodash + +The following license applies to all parts of this software except as +documented below: + +==== + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +==== + +Copyright and related rights for sample code are waived via CC0. Sample +code is defined as all source code displayed within the prose of the +documentation. + +CC0: http://creativecommons.org/publicdomain/zero/1.0/ + +==== + +Files located in the node_modules and vendor directories are externally +maintained libraries used by this software which have their own +licenses; we recommend you read them, as their terms may differ from the +terms above. +========================================= +END OF lodash.some NOTICES, INFORMATION, AND LICENSE + +%% minimatch NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF minimatch NOTICES, INFORMATION, AND LICENSE + +%% mockery NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyrights for code authored by Yahoo! Inc. is licensed under the following + terms: + + MIT License + + Copyright (c) 2011 Yahoo! Inc. All Rights Reserved. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to + deal in the Software without restriction, including without limitation the + rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. +========================================= +END OF mockery NOTICES, INFORMATION, AND LICENSE + +%% node-uuid NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) 2010-2012 Robert Kieffer + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +========================================= +END OF node-uuid NOTICES, INFORMATION, AND LICENSE + +%% nth-check NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +NO LICENSE FOUND +========================================= +END OF nth-check NOTICES, INFORMATION, AND LICENSE + +%% once NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF once NOTICES, INFORMATION, AND LICENSE + +%% os NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) 2016 Diego Rodríguez Baquero + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +========================================= +END OF os NOTICES, INFORMATION, AND LICENSE + +%% path-is-absolute NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF path-is-absolute NOTICES, INFORMATION, AND LICENSE + +%% process-nextick-args NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +# Copyright (c) 2015 Calvin Metcalf + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +**THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE.** +========================================= +END OF process-nextick-args NOTICES, INFORMATION, AND LICENSE + +%% q NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright 2009–2017 Kristopher Michael Kowal. All rights reserved. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. +========================================= +END OF q NOTICES, INFORMATION, AND LICENSE + +%% readable-stream NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Node.js is licensed for use as follows: + +""" +Copyright Node.js contributors. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. +""" + +This license applies to parts of Node.js originating from the +https://github.com/joyent/node repository: + +""" +Copyright Joyent, Inc. and other Node contributors. All rights reserved. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. +""" +========================================= +END OF readable-stream NOTICES, INFORMATION, AND LICENSE + +%% rimraf NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF rimraf NOTICES, INFORMATION, AND LICENSE + +%% safe-buffer NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) Feross Aboukhadijeh + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF safe-buffer NOTICES, INFORMATION, AND LICENSE + +%% sax NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +==== + +`String.fromCodePoint` by Mathias Bynens used according to terms of MIT +License, as follows: + + Copyright Mathias Bynens + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF sax NOTICES, INFORMATION, AND LICENSE + +%% semver NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF semver NOTICES, INFORMATION, AND LICENSE + +%% shelljs NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) 2012, Artur Adib +All rights reserved. + +You may use this project under the terms of the New BSD license as follows: + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of Artur Adib nor the + names of the contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL ARTUR ADIB BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +========================================= +END OF shelljs NOTICES, INFORMATION, AND LICENSE + +%% string_decoder NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Node.js is licensed for use as follows: + +""" +Copyright Node.js contributors. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. +""" + +This license applies to parts of Node.js originating from the +https://github.com/joyent/node repository: + +""" +Copyright Joyent, Inc. and other Node contributors. All rights reserved. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. +""" +========================================= +END OF string_decoder NOTICES, INFORMATION, AND LICENSE + +%% strip-bom NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF strip-bom NOTICES, INFORMATION, AND LICENSE + +%% util-deprecate NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +(The MIT License) + +Copyright (c) 2014 Nathan Rajlich + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF util-deprecate NOTICES, INFORMATION, AND LICENSE + +%% uuid NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) 2010-2016 Robert Kieffer and other contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +========================================= +END OF uuid NOTICES, INFORMATION, AND LICENSE + +%% vso-node-api NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +NO LICENSE FOUND +========================================= +END OF vso-node-api NOTICES, INFORMATION, AND LICENSE + +%% vsts-task-lib NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) Microsoft Corporation. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +========================================= +END OF vsts-task-lib NOTICES, INFORMATION, AND LICENSE + +%% vsts-task-lib NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) Microsoft Corporation. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +========================================= +END OF vsts-task-lib NOTICES, INFORMATION, AND LICENSE + +%% vsts-task-lib NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) Microsoft Corporation. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +========================================= +END OF vsts-task-lib NOTICES, INFORMATION, AND LICENSE + +%% wrappy NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF wrappy NOTICES, INFORMATION, AND LICENSE + +%% xml2js NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright 2010, 2011, 2012, 2013. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. +========================================= +END OF xml2js NOTICES, INFORMATION, AND LICENSE + +%% xmlbuilder NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) 2013 Ozgur Ozcitak + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF xmlbuilder NOTICES, INFORMATION, AND LICENSE + diff --git a/_generated/ANTV1/anttask.ts b/_generated/ANTV1/anttask.ts new file mode 100644 index 000000000000..51109b1dd815 --- /dev/null +++ b/_generated/ANTV1/anttask.ts @@ -0,0 +1,291 @@ +import * as fs from 'fs'; +import * as os from 'os'; +import * as path from 'path'; +import * as Q from "q"; +import * as tl from 'azure-pipelines-task-lib/task'; + +import * as javacommons from 'azure-pipelines-tasks-java-common/java-common'; +import * as ccUtils from 'azure-pipelines-tasks-codecoverage-tools/codecoverageutilities'; +import {CodeCoverageEnablerFactory} from 'azure-pipelines-tasks-codecoverage-tools/codecoveragefactory'; + +tl.setResourcePath(path.join(__dirname, 'task.json')); + +const TESTRUN_SYSTEM = "VSTS - ant"; +const isWindows = os.type().match(/^Win/); + +function pathExistsAsFile(path: string) { + try { + return tl.stats(path).isFile(); + } + catch (error) { + return false; + } +} + +function publishTestResults(publishJUnitResults, testResultsFiles: string) { + if (publishJUnitResults == 'true') { + //check for pattern in testResultsFiles + let matchingTestResultsFiles; + if (testResultsFiles.indexOf('*') >= 0 || testResultsFiles.indexOf('?') >= 0) { + tl.debug('Pattern found in testResultsFiles parameter'); + const buildFolder = tl.getVariable('System.DefaultWorkingDirectory'); + matchingTestResultsFiles = tl.findMatch(buildFolder, testResultsFiles, null, { matchBase: true }); + } + else { + tl.debug('No pattern found in testResultsFiles parameter'); + matchingTestResultsFiles = [testResultsFiles]; + } + + if (!matchingTestResultsFiles || matchingTestResultsFiles.length === 0) { + console.log(tl.loc('NoTestResults', testResultsFiles)); + return 0; + } + + let tp = new tl.TestPublisher("JUnit"); + const testRunTitle = tl.getInput('testRunTitle'); + + tp.publish(matchingTestResultsFiles, 'true', "", "", testRunTitle, 'true', TESTRUN_SYSTEM); + } +} + +function processAntOutputLine(line) { + if (line == null) { + return; + } + + const javacText = "[javac] "; + //[java] [javac] c:\path\to\file:100: error: error_msg + const compileErrorFileRegexWin = /^(\[java\])?\s*\[javac\]\s*([^:]:[^:]+):(\d+):\s*(.+)$/ + //[java] [javac] /path/to/file:100: error: error_msg + const compileErrorFileRegexUnix = /^(\[java\])?\s*\[javac\]\s*([^:]+):(\d+):\s*(.+)$/ + const compileErrorFileRegex = (isWindows) ? compileErrorFileRegexWin : compileErrorFileRegexUnix; + + let severity = null; + if (line.indexOf(javacText) >= 0) { + // parse javac errors and warnings + const matches = compileErrorFileRegex.exec(line); + if (matches) { + let errorMessage = matches[4]; + if (errorMessage) { + if (errorMessage.startsWith('warning:')) { + severity = 'warning'; + } else if (errorMessage.startsWith('error:')) { + severity = 'error'; + } + } + + tl.command('task.issue', { + type: severity, + sourcepath: matches[2], + linenumber: matches[3], + }, matches[0]); + } + } +} + + + +async function doWork() { + + function execEnableCodeCoverage(): Q.Promise { + return enableCodeCoverage() + .then(function (resp) { + tl.debug("Enabled code coverage successfully"); + return "CodeCoverage_9064e1d0"; + }).catch(function (err) { + tl.warning("Failed to enable code coverage: " + err); + return ""; + }); + }; + + function enableCodeCoverage(): Q.Promise { + if (!isCodeCoverageOpted) { + return Q.resolve(true); + } + + const classFilter: string = tl.getInput('classFilter'); + const classFilesDirectories: string = tl.getInput('classFilesDirectories', true); + const sourceDirectories: string = tl.getInput('srcDirectories'); + // appending with small guid to keep it unique. Avoiding full guid to ensure no long path issues. + const reportDirectoryName = "CCReport43F6D5EF"; + reportDirectory = path.join(buildRootPath, reportDirectoryName); + const reportBuildFileName = "CCReportBuildA4D283EG.xml"; + reportBuildFile = path.join(buildRootPath, reportBuildFileName); + let summaryFileName = ""; + if (ccTool.toLowerCase() == "jacoco") { + summaryFileName = "summary.xml"; + }else if (ccTool.toLowerCase() == "cobertura") { + summaryFileName = "coverage.xml"; + } + summaryFile = path.join(buildRootPath, reportDirectoryName, summaryFileName); + const coberturaCCFile = path.join(buildRootPath, "cobertura.ser"); + let instrumentedClassesDirectory = path.join(buildRootPath, "InstrumentedClasses"); + + // clean any previous reports. + try { + tl.rmRF(coberturaCCFile); + tl.rmRF(reportDirectory); + tl.rmRF(reportBuildFile); + tl.rmRF(instrumentedClassesDirectory); + } catch (err) { + tl.debug("Error removing previous cc files: " + err); + } + + let buildProps: { [key: string]: string } = {}; + buildProps['buildfile'] = antBuildFile; + buildProps['classfilter'] = classFilter + buildProps['classfilesdirectories'] = classFilesDirectories; + buildProps['sourcedirectories'] = sourceDirectories; + buildProps['summaryfile'] = summaryFileName; + buildProps['reportdirectory'] = reportDirectory; + buildProps['ccreporttask'] = "CodeCoverage_9064e1d0" + buildProps['reportbuildfile'] = reportBuildFile; + + let ccEnabler = new CodeCoverageEnablerFactory().getTool("ant", ccTool.toLowerCase()); + return ccEnabler.enableCodeCoverage(buildProps); + } + + async function publishCodeCoverage(codeCoverageOpted: boolean, ccReportTask: string) { + tl.debug("publishCodeCoverage f=" + failIfCodeCoverageEmpty + " opt=" + codeCoverageOpted + " task=" + ccReportTask); + if (failIfCodeCoverageEmpty && codeCoverageOpted && !ccReportTask) { + throw tl.loc('NoCodeCoverage'); + } + else if (codeCoverageOpted && ccReportTask) { + tl.debug("Collecting code coverage reports"); + var antRunner = tl.tool(anttool); + antRunner.arg('-buildfile'); + if (pathExistsAsFile(reportBuildFile)) { + antRunner.arg(reportBuildFile); + antRunner.arg(ccReportTask); + } + else { + antRunner.arg(antBuildFile); + antRunner.arg(ccReportTask); + } + antRunner.exec().then(async function (code) { + if (failIfCodeCoverageEmpty && await ccUtils.isCodeCoverageFileEmpty(summaryFile, ccTool)) { + throw tl.loc('NoCodeCoverage'); + } + if (pathExistsAsFile(summaryFile)) { + tl.debug("Summary file = " + summaryFile); + tl.debug("Report directory = " + reportDirectory); + tl.debug("Publishing code coverage results to TFS"); + let ccPublisher = new tl.CodeCoveragePublisher(); + ccPublisher.publish(ccTool, summaryFile, reportDirectory, ""); + } + else { + tl.warning("No code coverage results found to be published. This could occur if there were no tests executed or there was a build failure. Check the ant output for details."); + } + }).fail(function (err) { + tl.warning("No code coverage results found to be published. This could occur if there were no tests executed or there was a build failure. Check the ant output for details."); + }); + } + } + + try { + var anttool = tl.which('ant', true); + var antv = tl.tool(anttool); + antv.arg('-version'); + + var antb = tl.tool(anttool); + var antBuildFile = tl.getPathInput('antBuildFile', true, true); + antb.arg('-buildfile'); + antb.arg(antBuildFile); + + // options and targets are optional + antb.line(tl.getInput('options', false)); + antb.arg(tl.getDelimitedInput('targets', ' ', false)); + + // update ANT_HOME if user specified path manually (not required, but if so, check it) + var antHomeUserInputPath = tl.getPathInput('antHomeUserInputPath', false, true); + if (antHomeUserInputPath) { + tl.debug('Using path from user input to set ANT_HOME'); + tl.debug('Set ANT_HOME to ' + antHomeUserInputPath); + process.env['ANT_HOME'] = antHomeUserInputPath; + } + + // Warn if ANT_HOME is not set either locally or on the task via antHomeUserInputPath + var antHome = tl.getVariable('ANT_HOME'); + if (!antHome) { + tl.warning('The ANT_HOME environment variable is not set. Please make sure that it exists and is set to the location of the bin folder. See https://ant.apache.org/manual/install.html.'); + } + + // update JAVA_HOME if user selected specific JDK version or set path manually + var javaHomeSelection = tl.getInput('javaHomeSelection', true); + var specifiedJavaHome = null; + var javaTelemetryData = null; + if (javaHomeSelection == 'JDKVersion') { + tl.debug('Using JDK version to find and set JAVA_HOME'); + var jdkVersion = tl.getInput('jdkVersion'); + var jdkArchitecture = tl.getInput('jdkArchitecture'); + javaTelemetryData = { "jdkVersion": jdkVersion }; + + if (jdkVersion != 'default') { + specifiedJavaHome = javacommons.findJavaHome(jdkVersion, jdkArchitecture); + } + } + else { + tl.debug('Using path from user input to set JAVA_HOME'); + var jdkUserInputPath = tl.getPathInput('jdkUserInputPath', true, true); + specifiedJavaHome = jdkUserInputPath; + javaTelemetryData = { "jdkVersion": "custom" }; + } + javacommons.publishJavaTelemetry('Ant', javaTelemetryData); + + if (specifiedJavaHome) { + tl.debug('Set JAVA_HOME to ' + specifiedJavaHome); + process.env['JAVA_HOME'] = specifiedJavaHome; + } + + var ccTool = tl.getInput('codeCoverageTool'); + var isCodeCoverageOpted = (typeof ccTool != "undefined" && ccTool && ccTool.toLowerCase() != 'none'); + var failIfCodeCoverageEmpty: boolean = tl.getBoolInput('failIfCoverageEmpty'); + var buildRootPath = path.dirname(antBuildFile); + + var summaryFile: string = null; + var reportDirectory: string = null; + var ccReportTask: string = null; + var reportBuildFile: string = null; + var publishJUnitResults = tl.getInput('publishJUnitResults'); + var testResultsFiles = tl.getInput('testResultsFiles', true); + var publishJUnitResults = tl.getInput('publishJUnitResults'); + var testResultsFiles = tl.getInput('testResultsFiles', true); + + ccReportTask = await execEnableCodeCoverage(); + + await antv.exec(); + var buffer; + antb.on('stdout', (data) => { + if (data) { + buffer += data.toString(); + let idx = buffer.indexOf(os.EOL); + while (idx > -1) { + let line = buffer.substring(0, idx); + processAntOutputLine(line); + buffer = buffer.substring(idx + os.EOL.length); + idx = buffer.indexOf(os.EOL); + } + } + }); + + await antb.exec() + .then(async function (code) { + publishTestResults(publishJUnitResults, testResultsFiles); + await publishCodeCoverage(isCodeCoverageOpted, ccReportTask); + tl.setResult(tl.TaskResult.Succeeded, "Task succeeded"); + }) + .fail(function (err) { + console.error(err.message); + publishTestResults(publishJUnitResults, testResultsFiles); + tl.debug('taskRunner fail'); + tl.setResult(tl.TaskResult.Failed, err); + }); + } catch (e) { + tl.debug(e.message); + tl.error(e); + tl.setResult(tl.TaskResult.Failed, e.message); + } +} + +doWork(); + diff --git a/_generated/ANTV1/icon.png b/_generated/ANTV1/icon.png new file mode 100644 index 000000000000..b9b2b3db07b9 Binary files /dev/null and b/_generated/ANTV1/icon.png differ diff --git a/_generated/ANTV1/icon.svg b/_generated/ANTV1/icon.svg new file mode 100644 index 000000000000..c2bb6a7998f6 --- /dev/null +++ b/_generated/ANTV1/icon.svg @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_generated/ANTV1/make.json b/_generated/ANTV1/make.json new file mode 100644 index 000000000000..94be52b5a32d --- /dev/null +++ b/_generated/ANTV1/make.json @@ -0,0 +1,12 @@ +{ + "rm": [ + { + "items": [ + "node_modules/azure-pipelines-tasks-java-common/node_modules/azure-pipelines-task-lib", + "node_modules/azure-pipelines-tasks-codecoverage-tools/node_modules/azure-pipelines-task-lib", + "node_modules/mockery" + ], + "options": "-Rf" + } + ] +} \ No newline at end of file diff --git a/_generated/ANTV1/package-lock.json b/_generated/ANTV1/package-lock.json new file mode 100644 index 000000000000..ff3effb7a62e --- /dev/null +++ b/_generated/ANTV1/package-lock.json @@ -0,0 +1,796 @@ +{ + "name": "Ant", + "requires": true, + "lockfileVersion": 1, + "dependencies": { + "@types/cheerio": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@types/cheerio/-/cheerio-0.22.0.tgz", + "integrity": "sha512-dVL3RISC1jdrXilyqmPIga6LmjHwrDbWQoUyHuf/bGjP+HiNtyFJ3Gga1FCu55UYOqbuUGLPzkGkcsplkpSm8Q==" + }, + "@types/concat-stream": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz", + "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==", + "requires": { + "@types/node": "*" + } + }, + "@types/form-data": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", + "integrity": "sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==", + "requires": { + "@types/node": "*" + } + }, + "@types/mocha": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", + "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==" + }, + "@types/node": { + "version": "16.11.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.60.tgz", + "integrity": "sha512-kYIYa1D1L+HDv5M5RXQeEu1o0FKA6yedZIoyugm/MBPROkLpX4L7HRxMrPVyo8bnvjpW/wDlqFNGzXNMb7AdRw==" + }, + "@types/q": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.5.tgz", + "integrity": "sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ==" + }, + "@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" + }, + "@types/semver": { + "version": "7.3.9", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.9.tgz", + "integrity": "sha512-L/TMpyURfBkf+o/526Zb6kd/tchUP3iBDEPjqjb+U2MAJhVRxxrmr2fwpe08E7QsV7YLcpq0tUaQ9O9x97ZIxQ==" + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "azure-pipelines-task-lib": { + "version": "5.0.0-preview.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-5.0.0-preview.0.tgz", + "integrity": "sha512-uQJEv+q3/7RD7kgphFd33uXijaPwA1ePYoNkAgZpUhbZUtc2u4JL4ujTT/JJfgXBNW/QQNAiDQ2OC7vOQG/0tg==", + "requires": { + "minimatch": "3.0.5", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "sync-request": "6.1.0", + "uuid": "^3.0.1" + }, + "dependencies": { + "minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "azure-pipelines-tasks-codecoverage-tools": { + "version": "2.201.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-tasks-codecoverage-tools/-/azure-pipelines-tasks-codecoverage-tools-2.201.0.tgz", + "integrity": "sha512-3yl6vbw62gXWxBxMYi5XOF0Rq7JE3KjQtZHDeTDSNLGttsjlm88jEnYU+lsjOqFtnUbnWTX8HB96Vx5c5iL+fA==", + "requires": { + "@types/cheerio": "0.22.0", + "@types/node": "^10.17.0", + "@types/q": "^1.5.4", + "azure-pipelines-task-lib": "^3.1.0", + "cheerio": "1.0.0-rc.6", + "fs-extra": "^0.30.0", + "os": "^0.1.1", + "strip-bom": "^3.0.0", + "xml2js": "^0.4.17" + }, + "dependencies": { + "@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + }, + "azure-pipelines-task-lib": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-3.3.1.tgz", + "integrity": "sha512-56ZAr4MHIoa24VNVuwPL4iUQ5MKaigPoYXkBG8E8fiVmh8yZdatUo25meNoQwg77vDY22F63Q44UzXoMWmy7ag==", + "requires": { + "minimatch": "3.0.5", + "mockery": "^1.7.0", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "sync-request": "6.1.0", + "uuid": "^3.0.1" + } + }, + "minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "azure-pipelines-tasks-java-common": { + "version": "2.198.1", + "resolved": "https://registry.npmjs.org/azure-pipelines-tasks-java-common/-/azure-pipelines-tasks-java-common-2.198.1.tgz", + "integrity": "sha512-LaEdGpC4/5nt3krZOJNIH8r+ZxOEhxocpTH/J//Vx98LeYC6zLGyrmCdTLBrY58nJ9Bo7PD/0ARrasXFPv5VkQ==", + "requires": { + "@types/node": "^10.17.0", + "@types/semver": "^7.3.3", + "azure-pipelines-task-lib": "^3.1.0", + "semver": "^7.3.2" + }, + "dependencies": { + "@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + }, + "azure-pipelines-task-lib": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-3.3.1.tgz", + "integrity": "sha512-56ZAr4MHIoa24VNVuwPL4iUQ5MKaigPoYXkBG8E8fiVmh8yZdatUo25meNoQwg77vDY22F63Q44UzXoMWmy7ag==", + "requires": { + "minimatch": "3.0.5", + "mockery": "^1.7.0", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "sync-request": "6.1.0", + "uuid": "^3.0.1" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } + }, + "minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + }, + "cheerio": { + "version": "1.0.0-rc.6", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.6.tgz", + "integrity": "sha512-hjx1XE1M/D5pAtMgvWwE21QClmAEeGHOIDfycgmndisdNgI6PE1cGRQkMGBcsbUbmEQyWu5PJLUcAOjtQS8DWw==", + "requires": { + "cheerio-select": "^1.3.0", + "dom-serializer": "^1.3.1", + "domhandler": "^4.1.0", + "htmlparser2": "^6.1.0", + "parse5": "^6.0.1", + "parse5-htmlparser2-tree-adapter": "^6.0.1" + } + }, + "cheerio-select": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-1.6.0.tgz", + "integrity": "sha512-eq0GdBvxVFbqWgmCm7M3XGs1I8oLy/nExUnh6oLqmBditPO9AqQJrkslDpMun/hZ0yyTs8L0m85OHp4ho6Qm9g==", + "requires": { + "css-select": "^4.3.0", + "css-what": "^6.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.3.1", + "domutils": "^2.8.0" + } + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "requires": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + } + }, + "css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==" + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, + "dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + } + }, + "domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==" + }, + "domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "requires": { + "domelementtype": "^2.2.0" + } + }, + "domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "requires": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + } + }, + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" + }, + "form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fs-extra": { + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", + "integrity": "sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA==", + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^2.1.0", + "klaw": "^1.0.0", + "path-is-absolute": "^1.0.0", + "rimraf": "^2.2.8" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-intrinsic": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", + "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + } + }, + "get-port": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", + "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==" + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "http-basic": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", + "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", + "requires": { + "caseless": "^0.12.0", + "concat-stream": "^1.6.2", + "http-response-object": "^3.0.1", + "parse-cache-control": "^1.0.1" + } + }, + "http-response-object": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", + "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", + "requires": { + "@types/node": "^10.0.3" + }, + "dependencies": { + "@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + } + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" + }, + "is-core-module": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", + "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", + "requires": { + "has": "^1.0.3" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "jsonfile": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "integrity": "sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==", + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "klaw": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", + "integrity": "sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw==", + "requires": { + "graceful-fs": "^4.1.9" + } + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "mockery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/mockery/-/mockery-1.7.0.tgz", + "integrity": "sha512-gUQA33ayi0tuAhr/rJNZPr7Q7uvlBt4gyJPbi0CDcAfIzIrDu1YgGMFgmAu3stJqBpK57m7+RxUbcS+pt59fKQ==" + }, + "nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "requires": { + "boolbase": "^1.0.0" + } + }, + "object-inspect": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "os": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/os/-/os-0.1.2.tgz", + "integrity": "sha512-ZoXJkvAnljwvc56MbvhtKVWmSkzV712k42Is2mA0+0KTSRakq5XXuXpjZjgAt9ctzl51ojhQWakQQpmOvXWfjQ==" + }, + "parse-cache-control": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", + "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==" + }, + "parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" + }, + "parse5-htmlparser2-tree-adapter": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", + "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", + "requires": { + "parse5": "^6.0.1" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "promise": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.2.0.tgz", + "integrity": "sha512-+CMAlLHqwRYwBMXKCP+o8ns7DN+xHDUiI+0nArsiJ9y+kJVPLFxEaSw6Ha9s9H0tftxg2Yzl25wqj9G7m5wLZg==", + "requires": { + "asap": "~2.0.6" + } + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==" + }, + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "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" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "requires": { + "resolve": "^1.1.6" + } + }, + "resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "requires": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha1-KBYjTiN4vdxOU1T6tcqold9xANk=" + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==" + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, + "sync-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", + "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==", + "requires": { + "http-response-object": "^3.0.1", + "sync-rpc": "^1.2.1", + "then-request": "^6.0.0" + } + }, + "sync-rpc": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz", + "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==", + "requires": { + "get-port": "^3.1.0" + } + }, + "then-request": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", + "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", + "requires": { + "@types/concat-stream": "^1.6.0", + "@types/form-data": "0.0.33", + "@types/node": "^8.0.0", + "@types/qs": "^6.2.31", + "caseless": "~0.12.0", + "concat-stream": "^1.6.0", + "form-data": "^2.2.0", + "http-basic": "^8.1.1", + "http-response-object": "^3.0.1", + "promise": "^8.0.0", + "qs": "^6.4.0" + }, + "dependencies": { + "@types/node": { + "version": "8.10.66", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", + "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==" + } + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, + "typescript": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.2.tgz", + "integrity": "sha512-e4ERvRV2wb+rRZ/IQeb3jm2VxBsirQLpQhdxplZ2MEzGvDkkMmPglecnNDfSUBivMjP93vRbngYYDQqQ/78bcQ==", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "xml2js": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", + "integrity": "sha1-aGwg8hMgnpSr8NG88e+qKRx4J6c=", + "requires": { + "sax": ">=0.6.0", + "xmlbuilder": "~9.0.1" + } + }, + "xmlbuilder": { + "version": "9.0.6", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.6.tgz", + "integrity": "sha1-fIJtjYb0eISwWHLL6dJ7Ab7VA/Y=" + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } + } +} diff --git a/_generated/ANTV1/package.json b/_generated/ANTV1/package.json new file mode 100644 index 000000000000..4650d1c1cd4d --- /dev/null +++ b/_generated/ANTV1/package.json @@ -0,0 +1,20 @@ +{ + "name": "Ant", + "author": "Microsoft Corporation", + "description": "Build with Apache Ant", + "license": "MIT", + "bugs": { + "url": "https://github.com/Microsoft/vso-agent-tasks/issues" + }, + "dependencies": { + "azure-pipelines-task-lib": "^5.0.0-preview.0", + "azure-pipelines-tasks-java-common": "2.198.1", + "azure-pipelines-tasks-codecoverage-tools": "2.201.0", + "xml2js": "^0.4.16", + "@types/node": "^16.11.39", + "@types/mocha": "^5.2.7" + }, + "devDependencies": { + "typescript": "4.0.2" + } +} diff --git a/_generated/ANTV1/task.json b/_generated/ANTV1/task.json new file mode 100644 index 000000000000..87bb79ddc4f6 --- /dev/null +++ b/_generated/ANTV1/task.json @@ -0,0 +1,274 @@ +{ + "id": "3A6A2D63-F2B2-4E93-BCF9-0CBE22F5DC26", + "name": "Ant", + "friendlyName": "Ant", + "description": "Build with Apache Ant", + "helpUrl": "https://docs.microsoft.com/azure/devops/pipelines/tasks/build/ant", + "helpMarkDown": "[Learn more about this task](https://go.microsoft.com/fwlink/?LinkID=613718) or [see the Ant documentation](http://ant.apache.org/)", + "category": "Build", + "visibility": [ + "Build", + "Release" + ], + "runsOn": [ + "Agent", + "DeploymentGroup" + ], + "author": "Microsoft Corporation", + "version": { + "Major": 1, + "Minor": 229, + "Patch": 0 + }, + "demands": [ + "ant" + ], + "minimumAgentVersion": "1.89.0", + "groups": [ + { + "name": "junitTestResults", + "displayName": "JUnit Test Results", + "isExpanded": true + }, + { + "name": "codeCoverage", + "displayName": "Code Coverage", + "isExpanded": true + }, + { + "name": "advanced", + "displayName": "Advanced", + "isExpanded": false + } + ], + "instanceNameFormat": "Ant $(options) $(antBuildFile)", + "inputs": [ + { + "name": "antBuildFile", + "aliases": [ + "buildFile" + ], + "type": "filePath", + "label": "Ant build file", + "defaultValue": "build.xml", + "required": true, + "helpMarkDown": "Relative path from the repository root to the Ant build file." + }, + { + "name": "options", + "type": "string", + "label": "Options", + "defaultValue": "", + "required": false, + "helpMarkDown": "Provide any options to pass to the Ant command line. You can provide your own properties (for example, ***-DmyProperty=myPropertyValue***) and also use built-in variables (for example, ***-DcollectionId=$(system.collectionId)***). Alternatively, the built-in variables are already set as environment variables during the build and can be passed directly (for example, ***-DcollectionIdAsEnvVar=%SYSTEM_COLLECTIONID%***)." + }, + { + "name": "targets", + "type": "string", + "label": "Target(s)", + "defaultValue": "", + "required": false, + "helpMarkDown": "An optional, space-separated list of targets to build. If not specified, the `default` target will be used. If no `default` target is defined, Ant 1.6.0 and later will build all top-level tasks." + }, + { + "name": "publishJUnitResults", + "type": "boolean", + "label": "Publish to Azure Pipelines", + "required": true, + "defaultValue": "true", + "groupName": "junitTestResults", + "helpMarkDown": "Select this option to publish JUnit test results produced by the Ant build to Azure Pipelines. Each test results file matching `Test Results Files` will be published as a test run in Azure Pipelines." + }, + { + "name": "testResultsFiles", + "type": "filePath", + "label": "Test results files", + "defaultValue": "**/TEST-*.xml", + "required": true, + "groupName": "junitTestResults", + "helpMarkDown": "Test results files path. Wildcards can be used ([more information](https://go.microsoft.com/fwlink/?linkid=856077)). For example, `**/TEST-*.xml` for all XML files whose name starts with TEST-.", + "visibleRule": "publishJUnitResults = true" + }, + { + "name": "testRunTitle", + "type": "string", + "label": "Test run title", + "defaultValue": "", + "required": false, + "groupName": "junitTestResults", + "helpMarkDown": "Provide a name for the test run.", + "visibleRule": "publishJUnitResults = true" + }, + { + "name": "codeCoverageTool", + "aliases": [ + "codeCoverageToolOptions" + ], + "type": "pickList", + "label": "Code coverage tool", + "required": false, + "groupName": "codeCoverage", + "defaultValue": "None", + "helpMarkDown": "Select the code coverage tool. For on-premises agent support, refer to the `More Information` link below.", + "options": { + "None": "None", + "Cobertura": "Cobertura", + "JaCoCo": "JaCoCo" + } + }, + { + "name": "classFilesDirectories", + "aliases": [ + "codeCoverageClassFilesDirectories" + ], + "type": "string", + "label": "Class files directories", + "defaultValue": ".", + "required": true, + "groupName": "codeCoverage", + "helpMarkDown": "Comma-separated list of relative paths from the Ant build file to directories containing class files and archive files (JAR, WAR, etc.). Code coverage is reported for class files in these directories. For example: target/classes,target/testClasses.", + "visibleRule": "codeCoverageTool != None" + }, + { + "name": "classFilter", + "aliases": [ + "codeCoverageClassFilter" + ], + "type": "string", + "label": "Class inclusion/exclusion filters", + "defaultValue": "", + "required": false, + "groupName": "codeCoverage", + "helpMarkDown": "Comma-separated list of filters to include or exclude classes from collecting code coverage. For example: +:com.*,+:org.*,-:my.app*.*.", + "visibleRule": "codeCoverageTool != None" + }, + { + "name": "srcDirectories", + "aliases": [ + "codeCoverageSourceDirectories" + ], + "type": "string", + "label": "Source files directories", + "defaultValue": "", + "required": false, + "groupName": "codeCoverage", + "helpMarkDown": "Comma-separated list of relative paths from the Ant build file to source code directories. Code coverage reports will use these to highlight source code. For example: src/java,src/Test.", + "visibleRule": "codeCoverageTool != None" + }, + { + "name": "failIfCoverageEmpty", + "aliases": [ + "codeCoverageFailIfEmpty" + ], + "type": "boolean", + "label": "Fail when code coverage results are missing", + "defaultValue": "false", + "required": false, + "groupName": "codeCoverage", + "helpMarkDown": "Fail the build if code coverage did not produce any results to publish.", + "visibleRule": "codeCoverageTool != None" + }, + { + "name": "antHomeUserInputPath", + "aliases": [ + "antHomeDirectory" + ], + "type": "string", + "label": "Set ANT_HOME path", + "required": false, + "groupName": "advanced", + "defaultValue": "", + "helpMarkDown": "If set, overrides any existing ANT_HOME environment variable with the given path." + }, + { + "name": "javaHomeSelection", + "aliases": [ + "javaHomeOption" + ], + "type": "radio", + "label": "Set JAVA_HOME by", + "required": true, + "groupName": "advanced", + "defaultValue": "JDKVersion", + "helpMarkDown": "Sets JAVA_HOME either by selecting a JDK version that will be discovered during builds or by manually entering a JDK path.", + "options": { + "JDKVersion": "JDK Version", + "Path": "Path" + } + }, + { + "name": "jdkVersion", + "aliases": [ + "jdkVersionOption" + ], + "type": "pickList", + "label": "JDK version", + "required": false, + "groupName": "advanced", + "defaultValue": "default", + "helpMarkDown": "Will attempt to discover the path to the selected JDK version and set JAVA_HOME accordingly.", + "visibleRule": "javaHomeSelection = JDKVersion", + "options": { + "default": "default", + "1.11": "JDK 11", + "1.10": "JDK 10 (out of support)", + "1.9": "JDK 9 (out of support)", + "1.8": "JDK 8", + "1.7": "JDK 7", + "1.6": "JDK 6 (out of support)" + } + }, + { + "name": "jdkUserInputPath", + "aliases": [ + "jdkUserInputDirectory" + ], + "type": "string", + "label": "JDK path", + "required": true, + "groupName": "advanced", + "defaultValue": "", + "helpMarkDown": "Sets JAVA_HOME to the given path.", + "visibleRule": "javaHomeSelection = Path" + }, + { + "name": "jdkArchitecture", + "aliases": [ + "jdkArchitectureOption" + ], + "type": "pickList", + "label": "JDK architecture", + "defaultValue": "x64", + "required": false, + "helpMarkDown": "Optionally supply the architecture (x86, x64) of the JDK.", + "visibleRule": "jdkVersion != default", + "groupName": "advanced", + "options": { + "x86": "x86", + "x64": "x64" + } + } + ], + "execution": { + "Node10": { + "target": "anttask.js", + "argumentFormat": "" + }, + "Node16": { + "target": "anttask.js", + "argumentFormat": "" + } + }, + "messages": { + "LocateJVMBasedOnVersionAndArch": "Locate JAVA_HOME for Java %s %s", + "UnsupportedJdkWarning": "JDK 9 and JDK 10 are out of support. Please switch to a later version in your project and pipeline. Attempting to build with JDK 11...", + "FailedToLocateSpecifiedJVM": "Failed to find the specified JDK version. Please ensure the specified JDK version is installed on the agent and the environment variable '%s' exists and is set to the location of a corresponding JDK or use the [Java Tool Installer](https://go.microsoft.com/fwlink/?linkid=875287) task to install the desired JDK.", + "DiscontinueAntCodeCoverage": "We are discontinuing the support of automated code coverage report generation for Ant projects. Please refer to https://go.microsoft.com/fwlink/?linkid=875306 for more details.", + "NoCodeCoverage": "No code coverage results were found to publish.", + "NoTestResults": "No test result files matching %s were found, so publishing JUnit test results is being skipped." + }, + "_buildConfigMapping": { + "Default": "1.229.0", + "Node20-225": "1.229.1" + } +} \ No newline at end of file diff --git a/_generated/ANTV1/task.loc.json b/_generated/ANTV1/task.loc.json new file mode 100644 index 000000000000..b0ce070688ea --- /dev/null +++ b/_generated/ANTV1/task.loc.json @@ -0,0 +1,274 @@ +{ + "id": "3A6A2D63-F2B2-4E93-BCF9-0CBE22F5DC26", + "name": "Ant", + "friendlyName": "ms-resource:loc.friendlyName", + "description": "ms-resource:loc.description", + "helpUrl": "https://docs.microsoft.com/azure/devops/pipelines/tasks/build/ant", + "helpMarkDown": "ms-resource:loc.helpMarkDown", + "category": "Build", + "visibility": [ + "Build", + "Release" + ], + "runsOn": [ + "Agent", + "DeploymentGroup" + ], + "author": "Microsoft Corporation", + "version": { + "Major": 1, + "Minor": 229, + "Patch": 0 + }, + "demands": [ + "ant" + ], + "minimumAgentVersion": "1.89.0", + "groups": [ + { + "name": "junitTestResults", + "displayName": "ms-resource:loc.group.displayName.junitTestResults", + "isExpanded": true + }, + { + "name": "codeCoverage", + "displayName": "ms-resource:loc.group.displayName.codeCoverage", + "isExpanded": true + }, + { + "name": "advanced", + "displayName": "ms-resource:loc.group.displayName.advanced", + "isExpanded": false + } + ], + "instanceNameFormat": "ms-resource:loc.instanceNameFormat", + "inputs": [ + { + "name": "antBuildFile", + "aliases": [ + "buildFile" + ], + "type": "filePath", + "label": "ms-resource:loc.input.label.antBuildFile", + "defaultValue": "build.xml", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.antBuildFile" + }, + { + "name": "options", + "type": "string", + "label": "ms-resource:loc.input.label.options", + "defaultValue": "", + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.options" + }, + { + "name": "targets", + "type": "string", + "label": "ms-resource:loc.input.label.targets", + "defaultValue": "", + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.targets" + }, + { + "name": "publishJUnitResults", + "type": "boolean", + "label": "ms-resource:loc.input.label.publishJUnitResults", + "required": true, + "defaultValue": "true", + "groupName": "junitTestResults", + "helpMarkDown": "ms-resource:loc.input.help.publishJUnitResults" + }, + { + "name": "testResultsFiles", + "type": "filePath", + "label": "ms-resource:loc.input.label.testResultsFiles", + "defaultValue": "**/TEST-*.xml", + "required": true, + "groupName": "junitTestResults", + "helpMarkDown": "ms-resource:loc.input.help.testResultsFiles", + "visibleRule": "publishJUnitResults = true" + }, + { + "name": "testRunTitle", + "type": "string", + "label": "ms-resource:loc.input.label.testRunTitle", + "defaultValue": "", + "required": false, + "groupName": "junitTestResults", + "helpMarkDown": "ms-resource:loc.input.help.testRunTitle", + "visibleRule": "publishJUnitResults = true" + }, + { + "name": "codeCoverageTool", + "aliases": [ + "codeCoverageToolOptions" + ], + "type": "pickList", + "label": "ms-resource:loc.input.label.codeCoverageTool", + "required": false, + "groupName": "codeCoverage", + "defaultValue": "None", + "helpMarkDown": "ms-resource:loc.input.help.codeCoverageTool", + "options": { + "None": "None", + "Cobertura": "Cobertura", + "JaCoCo": "JaCoCo" + } + }, + { + "name": "classFilesDirectories", + "aliases": [ + "codeCoverageClassFilesDirectories" + ], + "type": "string", + "label": "ms-resource:loc.input.label.classFilesDirectories", + "defaultValue": ".", + "required": true, + "groupName": "codeCoverage", + "helpMarkDown": "ms-resource:loc.input.help.classFilesDirectories", + "visibleRule": "codeCoverageTool != None" + }, + { + "name": "classFilter", + "aliases": [ + "codeCoverageClassFilter" + ], + "type": "string", + "label": "ms-resource:loc.input.label.classFilter", + "defaultValue": "", + "required": false, + "groupName": "codeCoverage", + "helpMarkDown": "ms-resource:loc.input.help.classFilter", + "visibleRule": "codeCoverageTool != None" + }, + { + "name": "srcDirectories", + "aliases": [ + "codeCoverageSourceDirectories" + ], + "type": "string", + "label": "ms-resource:loc.input.label.srcDirectories", + "defaultValue": "", + "required": false, + "groupName": "codeCoverage", + "helpMarkDown": "ms-resource:loc.input.help.srcDirectories", + "visibleRule": "codeCoverageTool != None" + }, + { + "name": "failIfCoverageEmpty", + "aliases": [ + "codeCoverageFailIfEmpty" + ], + "type": "boolean", + "label": "ms-resource:loc.input.label.failIfCoverageEmpty", + "defaultValue": "false", + "required": false, + "groupName": "codeCoverage", + "helpMarkDown": "ms-resource:loc.input.help.failIfCoverageEmpty", + "visibleRule": "codeCoverageTool != None" + }, + { + "name": "antHomeUserInputPath", + "aliases": [ + "antHomeDirectory" + ], + "type": "string", + "label": "ms-resource:loc.input.label.antHomeUserInputPath", + "required": false, + "groupName": "advanced", + "defaultValue": "", + "helpMarkDown": "ms-resource:loc.input.help.antHomeUserInputPath" + }, + { + "name": "javaHomeSelection", + "aliases": [ + "javaHomeOption" + ], + "type": "radio", + "label": "ms-resource:loc.input.label.javaHomeSelection", + "required": true, + "groupName": "advanced", + "defaultValue": "JDKVersion", + "helpMarkDown": "ms-resource:loc.input.help.javaHomeSelection", + "options": { + "JDKVersion": "JDK Version", + "Path": "Path" + } + }, + { + "name": "jdkVersion", + "aliases": [ + "jdkVersionOption" + ], + "type": "pickList", + "label": "ms-resource:loc.input.label.jdkVersion", + "required": false, + "groupName": "advanced", + "defaultValue": "default", + "helpMarkDown": "ms-resource:loc.input.help.jdkVersion", + "visibleRule": "javaHomeSelection = JDKVersion", + "options": { + "default": "default", + "1.11": "JDK 11", + "1.10": "JDK 10 (out of support)", + "1.9": "JDK 9 (out of support)", + "1.8": "JDK 8", + "1.7": "JDK 7", + "1.6": "JDK 6 (out of support)" + } + }, + { + "name": "jdkUserInputPath", + "aliases": [ + "jdkUserInputDirectory" + ], + "type": "string", + "label": "ms-resource:loc.input.label.jdkUserInputPath", + "required": true, + "groupName": "advanced", + "defaultValue": "", + "helpMarkDown": "ms-resource:loc.input.help.jdkUserInputPath", + "visibleRule": "javaHomeSelection = Path" + }, + { + "name": "jdkArchitecture", + "aliases": [ + "jdkArchitectureOption" + ], + "type": "pickList", + "label": "ms-resource:loc.input.label.jdkArchitecture", + "defaultValue": "x64", + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.jdkArchitecture", + "visibleRule": "jdkVersion != default", + "groupName": "advanced", + "options": { + "x86": "x86", + "x64": "x64" + } + } + ], + "execution": { + "Node10": { + "target": "anttask.js", + "argumentFormat": "" + }, + "Node16": { + "target": "anttask.js", + "argumentFormat": "" + } + }, + "messages": { + "LocateJVMBasedOnVersionAndArch": "ms-resource:loc.messages.LocateJVMBasedOnVersionAndArch", + "UnsupportedJdkWarning": "ms-resource:loc.messages.UnsupportedJdkWarning", + "FailedToLocateSpecifiedJVM": "ms-resource:loc.messages.FailedToLocateSpecifiedJVM", + "DiscontinueAntCodeCoverage": "ms-resource:loc.messages.DiscontinueAntCodeCoverage", + "NoCodeCoverage": "ms-resource:loc.messages.NoCodeCoverage", + "NoTestResults": "ms-resource:loc.messages.NoTestResults" + }, + "_buildConfigMapping": { + "Default": "1.229.0", + "Node20-225": "1.229.1" + } +} \ No newline at end of file diff --git a/_generated/ANTV1/tsconfig.json b/_generated/ANTV1/tsconfig.json new file mode 100644 index 000000000000..79a868c8d1e3 --- /dev/null +++ b/_generated/ANTV1/tsconfig.json @@ -0,0 +1,9 @@ +{ + "compilerOptions": { + "target": "ES6", + "module": "commonjs" + }, + "exclude": [ + "node_modules" + ] +} \ No newline at end of file diff --git a/_generated/ANTV1_Node20/.npmrc b/_generated/ANTV1_Node20/.npmrc new file mode 100644 index 000000000000..5fca0d518be7 --- /dev/null +++ b/_generated/ANTV1_Node20/.npmrc @@ -0,0 +1 @@ +scripts-prepend-node-path=true diff --git a/_generated/ANTV1_Node20/README.md b/_generated/ANTV1_Node20/README.md new file mode 100644 index 000000000000..8063be7bb416 --- /dev/null +++ b/_generated/ANTV1_Node20/README.md @@ -0,0 +1,31 @@ +# Build your code using Ant in Azure Pipelines + +### Parameters for Ant build task are explained below + +- **Ant Build File :** This is a Required field. Provide relative path from the repository root to the Ant build file. To know more [click here](https://ant.apache.org/manual/using.html#buildfile) + +- **Options :** Provide any options to pass to the Ant command line. You can provide your own properties (for example, `-DmyProperty=myPropertyValue`) and also use built-in variables (for example, `-DcollectionId=$(system.collectionId)`). Alternatively, the built-in variables are already set as environment variables during the build and can be passed directly (for example, `-DcollectionIdAsEnvVar=%SYSTEM_COLLECTIONID%)` To know more [click here](https://ant.apache.org/manual/running.html#options) + +- **Target(s) :** Provide The task(s) for Ant to execute for this build. To know more [click here](https://ant.apache.org/manual/targets.html#targets) + +#### JUnit Test Results +Use the next three options to manage your JUnit test results in Azure Pipelines + +- **Publish to Azure Pipelines/TFS :** Select this option to publish JUnit Test results produced by the Ant build to Azure Pipelines/TFS. Each test result file matching `Test Results Files` will be published as a test run in Azure Pipelines. + +- **Test Results Files :** This option will appear if you select the above option. Here, provide Test results files path. Wildcards can be used. For example, `**/TEST-*.xml` for all xml files whose name starts with `TEST-."` + +- **Test Run Title :** This option will appear if you select the `Publish to Azure Pipelines/TFS` option. Here provide a name for the Test Run + +#### Advanced +Use the next options to manage your `ANT_HOME` and `JAVA_HOME` attributes + +- **Set ANT_HOME Path :** If set, overrides any existing `ANT_HOME` environment variable with the given path. + +- **Set JAVA_HOME by :** Select to set `JAVA_HOME` either by providing a path or let Azure Pipelines set the `JAVA_HOME` based on JDK version choosen. By default it is set to `JDK Version` + +- **JDK Version/Path :** Here provide the PATH to `JAVA_HOME` if you want to set it by path or select the appropriate JDK version. + +- **JDK Architecture :** Select the approriate JDK Architecture. By default it is set to `x86` + +**We are discontinuing the support of automated Code Coverage report generation for Ant projects starting Sprint 107 deployment of Azure Pipelines and for Team Foundation Server “15”. Please enable Code Coverage in your Ant build.xml file manually.** diff --git a/_generated/ANTV1_Node20/Strings/resources.resjson/de-DE/resources.resjson b/_generated/ANTV1_Node20/Strings/resources.resjson/de-DE/resources.resjson new file mode 100644 index 000000000000..fdaeec624e2e --- /dev/null +++ b/_generated/ANTV1_Node20/Strings/resources.resjson/de-DE/resources.resjson @@ -0,0 +1,47 @@ +{ + "loc.friendlyName": "Ant", + "loc.helpMarkDown": "[Weitere Informationen zu dieser Aufgabe](https://go.microsoft.com/fwlink/?LinkID=613718) oder [Ant-Dokumentation anzeigen](http://ant.apache.org/)", + "loc.description": "Mit Apache Ant erstellen", + "loc.instanceNameFormat": "Ant $(options) $(antBuildFile)", + "loc.group.displayName.junitTestResults": "JUnit-Testergebnisse", + "loc.group.displayName.codeCoverage": "Code Coverage", + "loc.group.displayName.advanced": "Erweitert", + "loc.input.label.antBuildFile": "Ant-Builddatei", + "loc.input.help.antBuildFile": "Der relative Pfad vom Repositorystamm zur Ant-Builddatei.", + "loc.input.label.options": "Optionen", + "loc.input.help.options": "Geben Sie die Optionen an, die an die Ant-Befehlszeile übergeben werden sollen. Sie können Ihre eigenen Eigenschaften angeben (z. B. \"***-DmyProperty=meinEigenschaftenWert***\") und auch integrierte Variablen verwenden (z. B. \"***-DcollectionId=$(system.collectionId)***\"). Alternativ werden die integrierten Variablen bereits als Umgebungsvariablen während des Builds festgelegt und können direkt übergeben werden (z. B. \"***-DcollectionIdAsEnvVar=%SYSTEM_COLLECTIONID%***\").", + "loc.input.label.targets": "Ziel(e)", + "loc.input.help.targets": "Eine optionale, durch Leerzeichen getrennte Liste der zu erstellenden Ziele. Wenn keine Angabe erfolgt, wird das \"Standardziel\" verwendet. Wenn kein \"Standardziel\" definiert ist, wird Ant 1.6.0 verwendet, und alle Tasks auf oberster Ebene werden später erstellt.", + "loc.input.label.publishJUnitResults": "In Azure Pipelines veröffentlichen", + "loc.input.help.publishJUnitResults": "Wählen Sie diese Option aus, um vom Ant-Build generierte JUnit-Testergebnisse in Azure Pipelines zu veröffentlichen. Jede Testergebnisdatei, die mit \"Testergebnisdateien\" übereinstimmt, wird als Testlauf in Azure Pipelines veröffentlicht.", + "loc.input.label.testResultsFiles": "Testergebnisdateien", + "loc.input.help.testResultsFiles": "Pfad der Testergebnisdateien. Platzhalter können verwendet werden ([weitere Informationen](https://go.microsoft.com/fwlink/?linkid=856077)). Beispiel: \"**/TEST-*.xml\" für alle XML-Dateien, deren Name mit \"TEST-\" beginnt.", + "loc.input.label.testRunTitle": "Testlauftitel", + "loc.input.help.testRunTitle": "Geben Sie einen Namen für den Testlauf an.", + "loc.input.label.codeCoverageTool": "Code Coverage-Tool", + "loc.input.help.codeCoverageTool": "Wählen Sie das Code Coverage-Tool aus. Verwenden Sie den Link \"Weitere Informationen\" unten, um Support zum lokalen Agent zu erhalten.", + "loc.input.label.classFilesDirectories": "Klassendateiverzeichnisse", + "loc.input.help.classFilesDirectories": "Eine durch Kommas getrennte Liste der relativen Pfade von der Ant-Builddatei zu den Verzeichnissen, die Klassendateien und Archivdateien (JAR-, WAR-Dateien usw.) enthalten. Code Coverage wird für Klassendateien in diesen Verzeichnissen gemeldet, z. B. \"target/classes\", \"target/testClasses\".", + "loc.input.label.classFilter": "Filter für den Klasseneinschluss/-ausschluss", + "loc.input.help.classFilter": "Eine durch Kommas getrennte Liste der Filter, um Klassen in die Erfassung von Code Coverage ein- oder von dieser auszuschließen, z. B. \"+:com.*\", \"+:org.*\", \"-:my.app*.*\".", + "loc.input.label.srcDirectories": "Quelldateiverzeichnisse", + "loc.input.help.srcDirectories": "Eine durch Kommas getrennte Liste der relativen Pfade von der Ant-Builddatei zu den Quellcodeverzeichnissen. Code Coverage-Berichte verwenden diese, um Quellcode hervorzuheben, z. B. \"src/java\", \"src/Test\".", + "loc.input.label.failIfCoverageEmpty": "Fehler, wenn die Code Coverage-Ergebnisse fehlen", + "loc.input.help.failIfCoverageEmpty": "Buildfehler, wenn Code Coverage keine zu veröffentlichenden Ergebnisse ergeben hat.", + "loc.input.label.antHomeUserInputPath": "ANT_HOME-Pfad festlegen", + "loc.input.help.antHomeUserInputPath": "Wenn festgelegt, werden alle vorhandenen ANT_HOME-Umgebungsvariablen mit dem angegebenen Pfad überschrieben.", + "loc.input.label.javaHomeSelection": "JAVA_HOME festlegen durch", + "loc.input.help.javaHomeSelection": "Legt JAVA_HOME durch Auswählen einer JDK-Version fest, die während der Erstellung von Builds oder durch manuelles Eingeben eines JDK-Pfads ermittelt wird.", + "loc.input.label.jdkVersion": "JDK-Version", + "loc.input.help.jdkVersion": "Versucht, den Pfad zur ausgewählten JDK-Version zu ermitteln und JAVA_HOME entsprechend festzulegen.", + "loc.input.label.jdkUserInputPath": "JDK-Pfad", + "loc.input.help.jdkUserInputPath": "Legt JAVA_HOME auf den angegebenen Pfad fest.", + "loc.input.label.jdkArchitecture": "JDK-Architektur", + "loc.input.help.jdkArchitecture": "Geben Sie optional die JDK-Architektur an (x86, x64).", + "loc.messages.LocateJVMBasedOnVersionAndArch": "JAVA_HOME für Java %s %s finden", + "loc.messages.UnsupportedJdkWarning": "JDK 9 und JDK 10 werden nicht unterstützt. Wechseln Sie in Ihrem Projekt und Ihrer Pipeline zu einer neueren Version. Es wird versucht, die Erstellung mit JDK 11 durchzuführen...", + "loc.messages.FailedToLocateSpecifiedJVM": "Die angegebene JDK-Version wurde nicht gefunden. Stellen Sie sicher, dass die angegebene JDK-Version auf dem Agent installiert und die Umgebungsvariable \"%s\" vorhanden und auf den Speicherort eines entsprechenden JDK festgelegt ist. Sie können auch die Aufgabe [Installer für Java-Tools](https://go.microsoft.com/fwlink/?linkid=875287) verwenden, um das gewünschte JDK zu installieren.", + "loc.messages.DiscontinueAntCodeCoverage": "Die Unterstützung der automatisierten Code Coverage-Berichterstellung für Ant-Projekte wird eingestellt. Weitere Informationen erhalten Sie unter https://go.microsoft.com/fwlink/?linkid=875306.", + "loc.messages.NoCodeCoverage": "Keine Code Coverage-Ergebnisse zum Veröffentlichen gefunden.", + "loc.messages.NoTestResults": "Es wurden keine Testergebnisdateien gefunden, die mit %s übereinstimmen. Das Veröffentlichen von JUnit-Testergebnissen wird daher übersprungen." +} \ No newline at end of file diff --git a/_generated/ANTV1_Node20/Strings/resources.resjson/en-US/resources.resjson b/_generated/ANTV1_Node20/Strings/resources.resjson/en-US/resources.resjson new file mode 100644 index 000000000000..3aeb5196f2f5 --- /dev/null +++ b/_generated/ANTV1_Node20/Strings/resources.resjson/en-US/resources.resjson @@ -0,0 +1,47 @@ +{ + "loc.friendlyName": "Ant", + "loc.helpMarkDown": "[Learn more about this task](https://go.microsoft.com/fwlink/?LinkID=613718) or [see the Ant documentation](http://ant.apache.org/)", + "loc.description": "Build with Apache Ant", + "loc.instanceNameFormat": "Ant $(options) $(antBuildFile)", + "loc.group.displayName.junitTestResults": "JUnit Test Results", + "loc.group.displayName.codeCoverage": "Code Coverage", + "loc.group.displayName.advanced": "Advanced", + "loc.input.label.antBuildFile": "Ant build file", + "loc.input.help.antBuildFile": "Relative path from the repository root to the Ant build file.", + "loc.input.label.options": "Options", + "loc.input.help.options": "Provide any options to pass to the Ant command line. You can provide your own properties (for example, ***-DmyProperty=myPropertyValue***) and also use built-in variables (for example, ***-DcollectionId=$(system.collectionId)***). Alternatively, the built-in variables are already set as environment variables during the build and can be passed directly (for example, ***-DcollectionIdAsEnvVar=%SYSTEM_COLLECTIONID%***).", + "loc.input.label.targets": "Target(s)", + "loc.input.help.targets": "An optional, space-separated list of targets to build. If not specified, the `default` target will be used. If no `default` target is defined, Ant 1.6.0 and later will build all top-level tasks.", + "loc.input.label.publishJUnitResults": "Publish to Azure Pipelines", + "loc.input.help.publishJUnitResults": "Select this option to publish JUnit test results produced by the Ant build to Azure Pipelines. Each test results file matching `Test Results Files` will be published as a test run in Azure Pipelines.", + "loc.input.label.testResultsFiles": "Test results files", + "loc.input.help.testResultsFiles": "Test results files path. Wildcards can be used ([more information](https://go.microsoft.com/fwlink/?linkid=856077)). For example, `**/TEST-*.xml` for all XML files whose name starts with TEST-.", + "loc.input.label.testRunTitle": "Test run title", + "loc.input.help.testRunTitle": "Provide a name for the test run.", + "loc.input.label.codeCoverageTool": "Code coverage tool", + "loc.input.help.codeCoverageTool": "Select the code coverage tool. For on-premises agent support, refer to the `More Information` link below.", + "loc.input.label.classFilesDirectories": "Class files directories", + "loc.input.help.classFilesDirectories": "Comma-separated list of relative paths from the Ant build file to directories containing class files and archive files (JAR, WAR, etc.). Code coverage is reported for class files in these directories. For example: target/classes,target/testClasses.", + "loc.input.label.classFilter": "Class inclusion/exclusion filters", + "loc.input.help.classFilter": "Comma-separated list of filters to include or exclude classes from collecting code coverage. For example: +:com.*,+:org.*,-:my.app*.*.", + "loc.input.label.srcDirectories": "Source files directories", + "loc.input.help.srcDirectories": "Comma-separated list of relative paths from the Ant build file to source code directories. Code coverage reports will use these to highlight source code. For example: src/java,src/Test.", + "loc.input.label.failIfCoverageEmpty": "Fail when code coverage results are missing", + "loc.input.help.failIfCoverageEmpty": "Fail the build if code coverage did not produce any results to publish.", + "loc.input.label.antHomeUserInputPath": "Set ANT_HOME path", + "loc.input.help.antHomeUserInputPath": "If set, overrides any existing ANT_HOME environment variable with the given path.", + "loc.input.label.javaHomeSelection": "Set JAVA_HOME by", + "loc.input.help.javaHomeSelection": "Sets JAVA_HOME either by selecting a JDK version that will be discovered during builds or by manually entering a JDK path.", + "loc.input.label.jdkVersion": "JDK version", + "loc.input.help.jdkVersion": "Will attempt to discover the path to the selected JDK version and set JAVA_HOME accordingly.", + "loc.input.label.jdkUserInputPath": "JDK path", + "loc.input.help.jdkUserInputPath": "Sets JAVA_HOME to the given path.", + "loc.input.label.jdkArchitecture": "JDK architecture", + "loc.input.help.jdkArchitecture": "Optionally supply the architecture (x86, x64) of the JDK.", + "loc.messages.LocateJVMBasedOnVersionAndArch": "Locate JAVA_HOME for Java %s %s", + "loc.messages.UnsupportedJdkWarning": "JDK 9 and JDK 10 are out of support. Please switch to a later version in your project and pipeline. Attempting to build with JDK 11...", + "loc.messages.FailedToLocateSpecifiedJVM": "Failed to find the specified JDK version. Please ensure the specified JDK version is installed on the agent and the environment variable '%s' exists and is set to the location of a corresponding JDK or use the [Java Tool Installer](https://go.microsoft.com/fwlink/?linkid=875287) task to install the desired JDK.", + "loc.messages.DiscontinueAntCodeCoverage": "We are discontinuing the support of automated code coverage report generation for Ant projects. Please refer to https://go.microsoft.com/fwlink/?linkid=875306 for more details.", + "loc.messages.NoCodeCoverage": "No code coverage results were found to publish.", + "loc.messages.NoTestResults": "No test result files matching %s were found, so publishing JUnit test results is being skipped." +} \ No newline at end of file diff --git a/_generated/ANTV1_Node20/Strings/resources.resjson/es-ES/resources.resjson b/_generated/ANTV1_Node20/Strings/resources.resjson/es-ES/resources.resjson new file mode 100644 index 000000000000..f86e065e2355 --- /dev/null +++ b/_generated/ANTV1_Node20/Strings/resources.resjson/es-ES/resources.resjson @@ -0,0 +1,47 @@ +{ + "loc.friendlyName": "Ant", + "loc.helpMarkDown": "[Obtener más información acerca de esta tarea](https://go.microsoft.com/fwlink/?LinkID=613718) o [consultar la documentación de Ant](http://ant.apache.org/)", + "loc.description": "Compilar con Apache Ant", + "loc.instanceNameFormat": "Ant $(options) $(antBuildFile)", + "loc.group.displayName.junitTestResults": "Resultados de pruebas JUnit", + "loc.group.displayName.codeCoverage": "Cobertura de código", + "loc.group.displayName.advanced": "Avanzado", + "loc.input.label.antBuildFile": "Archivo de compilación de Ant", + "loc.input.help.antBuildFile": "Ruta de acceso relativa de la raíz del repositorio al archivo de compilación de Ant.", + "loc.input.label.options": "Opciones", + "loc.input.help.options": "Proporcione las opciones que se van a pasar a la línea de comandos de Ant. Puede proporcionar sus propiedades (por ejemplo, ***-DmyProperty=myPropertyValue***) y también usar variables integradas (por ejemplo, ***-DcollectionId=$(system.collectionId)***). Puede que las variables integradas ya se hayan establecido como variables de entorno durante la compilación y se puedan pasar directamente (por ejemplo, ***-DcollectionIdAsEnvVar=%SYSTEM_COLLECTIONID%***).", + "loc.input.label.targets": "Destinos", + "loc.input.help.targets": "Una lista opcional y separada por espacios de los destinos que se van a compilar. Si no se especifica, se usará el destino \"predeterminado\". Si no se define ningún destino \"predeterminado\", Ant 1.6.0 y las versiones posteriores compilarán todas las tareas de nivel superior.", + "loc.input.label.publishJUnitResults": "Publicar en Azure Pipelines", + "loc.input.help.publishJUnitResults": "Seleccione esta opción para publicar los resultados de pruebas JUnit generados por la compilación de Ant en Azure Pipelines. Cada archivo de resultados de pruebas que coincida con \"Archivos de resultados de pruebas\" se publicará como una serie de pruebas en Azure Pipelines.", + "loc.input.label.testResultsFiles": "Archivos de resultados de pruebas", + "loc.input.help.testResultsFiles": "Ruta de acceso de los archivos de resultados de pruebas. Puede usar caracteres comodín ([más información](https://go.microsoft.com/fwlink/?linkid=856077)). Por ejemplo, \"**\\*TEST-*.xml\" para todos los archivos XML cuyos nombres empiecen por TEST-.", + "loc.input.label.testRunTitle": "Título de la serie de pruebas", + "loc.input.help.testRunTitle": "Asigne un nombre a la serie de pruebas.", + "loc.input.label.codeCoverageTool": "Herramienta de cobertura de código", + "loc.input.help.codeCoverageTool": "Seleccione la herramienta de cobertura de código. Para el soporte técnico del agente local, consulte el vínculo siguiente \"Más información\".", + "loc.input.label.classFilesDirectories": "Directorios de archivos de clase", + "loc.input.help.classFilesDirectories": "Lista separada por comas de las rutas de acceso relativas desde el archivo de compilación de Ant a los directorios que contienen archivos de clase y archivos de almacenamiento (JAR, WAR, etc.). La cobertura de código se notifica para los archivos de clase que están en los directorios. Por ejemplo: target/classes,target/testClasses.", + "loc.input.label.classFilter": "Filtros de inclusión/exclusión de clase", + "loc.input.help.classFilter": "Lista separada por comas de los filtros para incluir o excluir clases de la recopilación de cobertura de código. Por ejemplo: +:com.*,+:org.*,-:my.app*.*.", + "loc.input.label.srcDirectories": "Directorios de archivos de origen", + "loc.input.help.srcDirectories": "Lista separada por comas de las rutas de acceso relativas desde el archivo de compilación de Ant a los directorios de código fuente. Los informes de cobertura de código las usarán para resaltar el código fuente. Por ejemplo: src/java,src/Test.", + "loc.input.label.failIfCoverageEmpty": "Error si faltan los resultados de cobertura de código", + "loc.input.help.failIfCoverageEmpty": "Error de compilación si la cobertura de código no generó ningún resultado para publicar.", + "loc.input.label.antHomeUserInputPath": "Establecer la ruta ANT_HOME", + "loc.input.help.antHomeUserInputPath": "Si se establece, reemplaza cualquier variable de entorno ANT_HOME existente por la ruta de acceso dada.", + "loc.input.label.javaHomeSelection": "Establecer JAVA_HOME por", + "loc.input.help.javaHomeSelection": "Establece JAVA_HOME seleccionando una versión de JDK que se detectará durante las compilaciones o especificando manualmente una ruta de acceso del JDK.", + "loc.input.label.jdkVersion": "Versión de JDK", + "loc.input.help.jdkVersion": "Se tratará de hallar la ruta de acceso a la versión de JDK seleccionada y establecer JAVA_HOME según sea el caso.", + "loc.input.label.jdkUserInputPath": "Ruta de acceso de JDK", + "loc.input.help.jdkUserInputPath": "Establece JAVA_HOME en la ruta de acceso especificada.", + "loc.input.label.jdkArchitecture": "Arquitectura JDK", + "loc.input.help.jdkArchitecture": "Indique opcionalmente la arquitectura (x86, x64) del JDK.", + "loc.messages.LocateJVMBasedOnVersionAndArch": "Buscar JAVA_HOME para Java %s %s", + "loc.messages.UnsupportedJdkWarning": "JDK 9 y JDK 10 no tienen soporte técnico. Cambie a una versión posterior del proyecto y la canalización. Intentando compilar con JDK 11...", + "loc.messages.FailedToLocateSpecifiedJVM": "No se encontró la versión de JDK especificada. Asegúrese de que dicha versión está instalada en el agente y de que la variable de entorno \"%s\" existe y está establecida en la ubicación de un JDK correspondiente. En caso contrario, use la tarea de [Instalador de herramientas de Java](https://go.microsoft.com/fwlink/?linkid=875287) para instalar el JDK deseado.", + "loc.messages.DiscontinueAntCodeCoverage": "Se va a interrumpir la compatibilidad con la generación automatizada de informes de cobertura de código para proyectos de Ant. Consulte https://go.microsoft.com/fwlink/?linkid=875306 para más información.", + "loc.messages.NoCodeCoverage": "No se encontraron resultados de cobertura de código para publicar.", + "loc.messages.NoTestResults": "No se encontraron archivos de resultados de pruebas que coincidan con %s, por lo que se omite la publicación de los resultados de las pruebas JUnit." +} \ No newline at end of file diff --git a/_generated/ANTV1_Node20/Strings/resources.resjson/fr-FR/resources.resjson b/_generated/ANTV1_Node20/Strings/resources.resjson/fr-FR/resources.resjson new file mode 100644 index 000000000000..b6a0ea35609c --- /dev/null +++ b/_generated/ANTV1_Node20/Strings/resources.resjson/fr-FR/resources.resjson @@ -0,0 +1,47 @@ +{ + "loc.friendlyName": "Ant", + "loc.helpMarkDown": "[En savoir plus sur cette tâche](https://go.microsoft.com/fwlink/?LinkID=613718) ou [consulter la documentation d'Ant](http://ant.apache.org/)", + "loc.description": "Générer avec Apache Ant", + "loc.instanceNameFormat": "Ant $(options) $(antBuildFile)", + "loc.group.displayName.junitTestResults": "Résultats du test JUnit", + "loc.group.displayName.codeCoverage": "Couverture du code", + "loc.group.displayName.advanced": "Avancé", + "loc.input.label.antBuildFile": "Fichier de build Ant", + "loc.input.help.antBuildFile": "Chemin relatif de la racine de dépôt au fichier de build Ant.", + "loc.input.label.options": "Options", + "loc.input.help.options": "Indiquez les options à passer à la ligne de commande Ant. Vous pouvez fournir vos propres propriétés (par exemple ***-DmyProperty=myPropertyValue***), et utiliser les variables intégrées (par exemple ***-DcollectionId=$(system.collectionId)***). Sinon, les variables intégrées sont déjà définies comme variables d'environnement durant la génération et peuvent être passées directement (par exemple ***-DcollectionIdAsEnvVar=%SYSTEM_COLLECTIONID%***).", + "loc.input.label.targets": "Cible(s)", + "loc.input.help.targets": "Liste facultative de cibles à générer, séparées par des espaces. Si rien n'est spécifié, la cible 'default' est utilisée. Si aucune cible 'default' n'est définie, Ant 1.6.0 ou ultérieur génère des tâches qui sont toutes de niveau supérieur.", + "loc.input.label.publishJUnitResults": "Publier sur Azure Pipelines", + "loc.input.help.publishJUnitResults": "Sélectionnez cette option pour publier les résultats des tests JUnit produits par la build Ant sur Azure Pipelines. Chaque fichier de résultats des tests correspondant à 'Fichiers de résultats des tests' est publié en tant que série de tests dans Azure Pipelines.", + "loc.input.label.testResultsFiles": "Fichiers de résultats des tests", + "loc.input.help.testResultsFiles": "Chemin des fichiers de résultats des tests. Les caractères génériques sont autorisés. ([Plus d'informations](https://go.microsoft.com/fwlink/?linkid=856077)). Par exemple, '**/TEST-*.xml' pour tous les fichiers XML dont le nom commence par TEST-.", + "loc.input.label.testRunTitle": "Titre de la série de tests", + "loc.input.help.testRunTitle": "Indiquez le nom de la série de tests.", + "loc.input.label.codeCoverageTool": "Outil de couverture du code", + "loc.input.help.codeCoverageTool": "Sélectionnez l'outil de couverture du code. Pour prendre en charge l'agent local, consultez le lien vers les informations supplémentaires ci-dessous.", + "loc.input.label.classFilesDirectories": "Répertoires de fichiers de classe", + "loc.input.help.classFilesDirectories": "Liste de chemins relatifs séparés par une virgule, allant du fichier de build Ant aux répertoires contenant les fichiers de classe et d'archive (JAR, WAR, etc.). La couverture du code est signalée pour les fichiers de classe dans ces répertoires. Exemple : target/classes,target/testClasses.", + "loc.input.label.classFilter": "Filtres d'inclusion/exclusion de classes", + "loc.input.help.classFilter": "Liste de filtres séparés par une virgule, permettant d'inclure ou d'exclure des classes dans la collecte de la couverture du code. Exemple : +:com.*,+:org.*,-:my.app*.*.", + "loc.input.label.srcDirectories": "Répertoires de fichiers sources", + "loc.input.help.srcDirectories": "Liste de chemins relatifs séparés par une virgule, allant du fichier de build Ant aux répertoires de code source. Les rapports de couverture du code les utilisent pour mettre le code source en surbrillance. Exemple : src/java,src/Test.", + "loc.input.label.failIfCoverageEmpty": "Échec quand les résultats de la couverture du code sont manquants", + "loc.input.help.failIfCoverageEmpty": "Échec de la build si la couverture du code ne produit aucun résultat à publier.", + "loc.input.label.antHomeUserInputPath": "Définir le chemin de ANT_HOME", + "loc.input.help.antHomeUserInputPath": "Si elle est définie, cette valeur remplace les variables d'environnement ANT_HOME existantes par le chemin spécifié.", + "loc.input.label.javaHomeSelection": "Définir JAVA_HOME par", + "loc.input.help.javaHomeSelection": "Définit JAVA_HOME en sélectionnant une version de JDK qui sera découverte au moment des builds ou en tapant le chemin de JDK.", + "loc.input.label.jdkVersion": "Version du kit JDK", + "loc.input.help.jdkVersion": "Essaiera de découvrir le chemin d'accès à la version du JDK sélectionné et définira JAVA_HOME en conséquence.", + "loc.input.label.jdkUserInputPath": "Chemin du kit JDK", + "loc.input.help.jdkUserInputPath": "Définissez JAVA_HOME sur le chemin d'accès indiqué.", + "loc.input.label.jdkArchitecture": "Architecture du kit JDK", + "loc.input.help.jdkArchitecture": "Indiquez éventuellement l'architecture (x86, x64) du JDK.", + "loc.messages.LocateJVMBasedOnVersionAndArch": "Localiser JAVA_HOME pour Java %s %s", + "loc.messages.UnsupportedJdkWarning": "JDK 9 et JDK 10 ne sont plus pris en charge. Passez à une version plus récente de votre projet et de votre pipeline. Tentative de génération avec JDK 11...", + "loc.messages.FailedToLocateSpecifiedJVM": "Échec de la localisation de la version spécifiée du kit JDK. Vérifiez que la version spécifiée du kit JDK est installée sur l'agent, que la variable d'environnement '%s' existe et que sa valeur correspond à l'emplacement d'un kit JDK correspondant. Sinon, utilisez la tâche [Programme d'installation de l'outil Java] (https://go.microsoft.com/fwlink/?linkid=875287) pour installer le kit JDK souhaité.", + "loc.messages.DiscontinueAntCodeCoverage": "Nous mettons fin au support de la génération automatisée de rapports de couverture du code pour les projets Ant. Pour plus d'informations, consultez https://go.microsoft.com/fwlink/?linkid=875306.", + "loc.messages.NoCodeCoverage": "Il n'existe aucun résultat de couverture du code à publier.", + "loc.messages.NoTestResults": "Les fichiers de résultats des tests correspondant à %s sont introuvables. La publication des résultats des tests JUnit est ignorée." +} \ No newline at end of file diff --git a/_generated/ANTV1_Node20/Strings/resources.resjson/it-IT/resources.resjson b/_generated/ANTV1_Node20/Strings/resources.resjson/it-IT/resources.resjson new file mode 100644 index 000000000000..aa3286ef0482 --- /dev/null +++ b/_generated/ANTV1_Node20/Strings/resources.resjson/it-IT/resources.resjson @@ -0,0 +1,47 @@ +{ + "loc.friendlyName": "Ant", + "loc.helpMarkDown": "[Altre informazioni su questa attività](https://go.microsoft.com/fwlink/?LinkID=613718). In alternativa [vedere la documentazione di Ant](http://ant.apache.org/)", + "loc.description": "Consente di compilare con Apache Ant", + "loc.instanceNameFormat": "Ant $(options) $(antBuildFile)", + "loc.group.displayName.junitTestResults": "Risultati del test JUnit", + "loc.group.displayName.codeCoverage": "Code coverage", + "loc.group.displayName.advanced": "Avanzate", + "loc.input.label.antBuildFile": "File di compilazione Ant", + "loc.input.help.antBuildFile": "Percorso relativo dalla radice del repository al file di compilazione Ant.", + "loc.input.label.options": "Opzioni", + "loc.input.help.options": "Consente di specificare tutte le opzioni da passare alla riga di comando di Ant. È possibile specificare proprietà personalizzate (ad esempio ***-DmyProperty=myPropertyValue***) e usare variabili predefinite (ad esempio ***-DcollectionId=$(system.collectionId)***). In alternativa, le variabili predefinite vengono già impostate come variabili di ambiente durante la compilazione e possono essere passate direttamente (ad esempio ***-DcollectionIdAsEnvVar=%SYSTEM_COLLECTIONID%***).", + "loc.input.label.targets": "Destinazione/i", + "loc.input.help.targets": "Elenco facoltativo di destinazioni per la compilazione separate da virgole. Se non viene specificato, verrà usata la destinazione `default`. Se non è definita alcuna destinazione `default`, Ant 1.6.0 o versioni successiva compilerà tutte le attività di primo livello.", + "loc.input.label.publishJUnitResults": "Pubblica in Azure Pipelines", + "loc.input.help.publishJUnitResults": "Selezionare questa opzione per pubblicare i risultati del test JUnit prodotti dalla compilazione Ant in Azure Pipelines. Ogni file dei risultati del test corrispondente al valore di `File dei risultati del test` verrà pubblicato come esecuzione dei test in Azure Pipelines.", + "loc.input.label.testResultsFiles": "File dei risultati del test", + "loc.input.help.testResultsFiles": "Percorso dei file dei risultati del test. È possibile usare i caratteri jolly, ad esempio `**/TEST-*.xml` per individuare tutti i file XML il cui nome inizia con TEST-. [Altre informazioni](https://go.microsoft.com/fwlink/?linkid=856077)", + "loc.input.label.testRunTitle": "Titolo dell'esecuzione dei test", + "loc.input.help.testRunTitle": "Consente di specificare un nome per l'esecuzione dei test.", + "loc.input.label.codeCoverageTool": "Strumento di code coverage", + "loc.input.help.codeCoverageTool": "Consente di selezionare lo strumento di code coverage. Per il supporto di agenti locali, fare riferimento al collegamento `Altre informazioni` sotto.", + "loc.input.label.classFilesDirectories": "Directory dei file di classe", + "loc.input.help.classFilesDirectories": "Elenco di percorsi relativi separati da virgole dal file di compilazione di Ant alle directory contenenti file di classe e file di archivio (JAR, WAR e così via). I report di code coverage vengono creati per i file di classe presenti in queste directory, ad esempio target/classes,target/testClasses.", + "loc.input.label.classFilter": "Filtri di inclusione/esclusione classi", + "loc.input.help.classFilter": "Elenco di filtri delimitati da virgole per includere o escludere classi dalla raccolta delle informazioni sul code coverage, ad esempio +:com.*,+:org.*,-:my.app*.*.", + "loc.input.label.srcDirectories": "Directory dei file di origine", + "loc.input.help.srcDirectories": "Elenco di percorsi relativi separati da virgole dal file di compilazione di Ant alle directory del codice sorgente. Tali percorsi verranno usati nei report di code coverage per evidenziare il codice sorgente, ad esempio src/java,src/Test.", + "loc.input.label.failIfCoverageEmpty": "Non eseguire se mancano i risultati del code coverage", + "loc.input.help.failIfCoverageEmpty": "Non esegue la compilazione se il code coverage non ha prodotto risultati da pubblicare.", + "loc.input.label.antHomeUserInputPath": "Imposta percorso di ANT_HOME", + "loc.input.help.antHomeUserInputPath": "Se è impostato, esegue l'override di eventuali variabili di ambiente ANT_HOME esistenti con il percorso specificato.", + "loc.input.label.javaHomeSelection": "Imposta JAVA_HOME per", + "loc.input.help.javaHomeSelection": "Consente di impostare JAVA_HOME selezionando una versione di JDK che verrà individuata durante le compilazioni oppure immettendo manualmente un percorso JDK.", + "loc.input.label.jdkVersion": "Versione del JDK", + "loc.input.help.jdkVersion": "Prova a individuare il percorso della versione selezionata di JDK e imposta JAVA_HOME di conseguenza.", + "loc.input.label.jdkUserInputPath": "Percorso del JDK", + "loc.input.help.jdkUserInputPath": "Consente di impostare JAVA_HOME sul percorso specificato.", + "loc.input.label.jdkArchitecture": "Architettura del JDK", + "loc.input.help.jdkArchitecture": "Consente facoltativamente di specificare l'architettura (x86, x64) di JDK.", + "loc.messages.LocateJVMBasedOnVersionAndArch": "Individuare JAVA_HOME per Java %s %s", + "loc.messages.UnsupportedJdkWarning": "JDK 9 e JDK 10 non sono supportati. Passare a una versione più recente nel progetto e nella pipeline. Verrà effettuato un tentativo di compilazione con JDK 11...", + "loc.messages.FailedToLocateSpecifiedJVM": "La versione del JDK specificata non è stata trovata. Assicurarsi che sia installata nell'agente e che la variabile di ambiente '%s' sia presente e impostata sul percorso di un JDK corrispondente oppure usare l'attività [Programma di installazione strumenti Java](https://go.microsoft.com/fwlink/?linkid=875287) per installare il JDK desiderato.", + "loc.messages.DiscontinueAntCodeCoverage": "Il supporto della generazione automatizzata di report di code coverage per progetti Ant a breve verrà sospeso. Per maggiori dettagli, vedere https://go.microsoft.com/fwlink/?linkid=875306.", + "loc.messages.NoCodeCoverage": "Non sono stati trovati risultati del code coverage da pubblicare.", + "loc.messages.NoTestResults": "Non sono stati trovati file dei risultati del test corrispondenti a %s, di conseguenza la pubblicazione dei risultati del test JUnit verrà ignorata." +} \ No newline at end of file diff --git a/_generated/ANTV1_Node20/Strings/resources.resjson/ja-JP/resources.resjson b/_generated/ANTV1_Node20/Strings/resources.resjson/ja-JP/resources.resjson new file mode 100644 index 000000000000..31ca3ed5393f --- /dev/null +++ b/_generated/ANTV1_Node20/Strings/resources.resjson/ja-JP/resources.resjson @@ -0,0 +1,47 @@ +{ + "loc.friendlyName": "Ant", + "loc.helpMarkDown": "[このタスクの詳細を表示](https://go.microsoft.com/fwlink/?LinkID=613718)、または [Ant のドキュメントを参照](http://ant.apache.org/)", + "loc.description": "Apache Ant を使用してビルドします", + "loc.instanceNameFormat": "Ant $(options) $(antBuildFile)", + "loc.group.displayName.junitTestResults": "JUnit のテスト結果", + "loc.group.displayName.codeCoverage": "コード カバレッジ", + "loc.group.displayName.advanced": "詳細設定", + "loc.input.label.antBuildFile": "Ant ビルド ファイル", + "loc.input.help.antBuildFile": "リポジトリのルートから Ant のビルド ファイルへの相対パス。", + "loc.input.label.options": "オプション", + "loc.input.help.options": "Ant コマンド ラインに渡すオプションを指定します。独自のプロパティ (たとえば、***-DmyProperty=myPropertyValue***) を指定することも、ビルトイン変数 (たとえば、***-DcollectionId=$(system.collectionId)***) を使用することもできます。あるいは、ビルトイン変数はビルド中は既に環境変数として設定されているため、直接渡すことができます (たとえば、***-DcollectionIdAsEnvVar=%SYSTEM_COLLECTIONID%***)。", + "loc.input.label.targets": "ターゲット", + "loc.input.help.targets": "作成するターゲットのオプションのスペース区切り一覧。指定しない場合、`既定` のターゲットが使用されます。`既定` のターゲットが定義されていない場合は、Ant 1.6.0 以降で最上位レベルのすべてのタスクが作成されます。", + "loc.input.label.publishJUnitResults": "Azure Pipelines に公開する", + "loc.input.help.publishJUnitResults": "Ant のビルドによって生成された JUnit のテスト結果を Azure Pipelines に公開するには、このオプションを選びます。'テスト結果ファイル' と一致する各テスト結果ファイルが、Azure Pipelines でテストの実行として公開されます。", + "loc.input.label.testResultsFiles": "テスト結果ファイル", + "loc.input.help.testResultsFiles": "テスト結果ファイルのパス。ワイルドカードを使用できます ([詳細情報](https://go.microsoft.com/fwlink/?linkid=856077))。たとえば、名前が TEST- で始まるすべての XML ファイルの場合は '**/TEST-*.xml' です。", + "loc.input.label.testRunTitle": "テストの実行のタイトル", + "loc.input.help.testRunTitle": "テストの実行の名前を指定します。", + "loc.input.label.codeCoverageTool": "コード カバレッジ ツール", + "loc.input.help.codeCoverageTool": "コード カバレッジ ツールを選びます。オンプレミスのエージェントのサポートについては、以下の `詳細` リンクをご覧ください。", + "loc.input.label.classFilesDirectories": "クラス ファイル ディレクトリ", + "loc.input.help.classFilesDirectories": "クラス ファイルやアーカイブ ファイル (JAR、WAR など) を格納するディレクトリのパス (Ant ビルド ファイルから見た相対パス) のコンマ区切り一覧。コード カバレッジはこれらのディレクトリ内のクラス ファイルに関して報告されます。たとえば、target/classes,target/testClasses と指定します。", + "loc.input.label.classFilter": "クラス包含/除外フィルター", + "loc.input.help.classFilter": "コード カバレッジの収集にクラスを含めたり除いたりするためのフィルターのコンマ区切り一覧。たとえば、+:com.*,+:org.*,-:my.app*.* と指定します。", + "loc.input.label.srcDirectories": "ソース ファイル ディレクトリ", + "loc.input.help.srcDirectories": "ソース コード ディレクトリのパス (Ant ビルド ファイルから見た相対パス) のコンマ区切り一覧。コード カバレッジ レポートはこれらを使用してソース コードをハイライトします。たとえば、src/java,src/Test と指定します。", + "loc.input.label.failIfCoverageEmpty": "コード カバレッジの結果がない場合に失敗する", + "loc.input.help.failIfCoverageEmpty": "コード カバレッジから発行するべき結果が生成されなかった場合に、ビルドを失敗にします。", + "loc.input.label.antHomeUserInputPath": "ANT_HOME パスの設定", + "loc.input.help.antHomeUserInputPath": "設定されると、指定したパスの既存のあらゆる ANT_HOME 環境変数をオーバーライドします。", + "loc.input.label.javaHomeSelection": "次の条件で JAVA_HOME を設定します", + "loc.input.help.javaHomeSelection": "ビルド中に検出される JDK バージョンを選択するか、JDK パスを手動で入力して JAVA_HOME を設定します。", + "loc.input.label.jdkVersion": "JDK バージョン", + "loc.input.help.jdkVersion": "選択した JDK のバージョンへのパスの検出を試みて、それに従って JAVA_HOME を設定します。", + "loc.input.label.jdkUserInputPath": "JDK パス", + "loc.input.help.jdkUserInputPath": "指定したパスに JAVA_HOME を設定します。", + "loc.input.label.jdkArchitecture": "JDK アーキテクチャ", + "loc.input.help.jdkArchitecture": "(省略可能) JDK のアーキテクチャ (x86、x64) を指定します。", + "loc.messages.LocateJVMBasedOnVersionAndArch": "Java %s %s の JAVA_HOME を検索する", + "loc.messages.UnsupportedJdkWarning": "JDK 9 および JDK 10 はサポートされていません。プロジェクトとパイプラインで新しいバージョンに切り替えてください。JDK 11 でのビルドを試行しています...", + "loc.messages.FailedToLocateSpecifiedJVM": "指定された JDK バージョンが見つかりませんでした。指定された JDK バージョンがエージェントにインストールされており、環境変数 '%s' が存在し、対応する JDK の場所に設定されていることを確認するか、[Java ツール インストーラー](https://go.microsoft.com/fwlink/?linkid=875287) タスクを使用して目的の JDK をインストールしてください。", + "loc.messages.DiscontinueAntCodeCoverage": "Ant プロジェクト向けの自動コード カバレッジ レポート生成のサポートを中止します。詳細については、https://go.microsoft.com/fwlink/?linkid=875306 をご覧ください。", + "loc.messages.NoCodeCoverage": "発行するコード カバレッジの結果が見つかりませんでした。", + "loc.messages.NoTestResults": "%s と一致するテスト結果ファイルが見つからないため、JUnit テスト結果の発行をスキップします。" +} \ No newline at end of file diff --git a/_generated/ANTV1_Node20/Strings/resources.resjson/ko-KR/resources.resjson b/_generated/ANTV1_Node20/Strings/resources.resjson/ko-KR/resources.resjson new file mode 100644 index 000000000000..e75db3aeeaaa --- /dev/null +++ b/_generated/ANTV1_Node20/Strings/resources.resjson/ko-KR/resources.resjson @@ -0,0 +1,47 @@ +{ + "loc.friendlyName": "Ant", + "loc.helpMarkDown": "[이 작업에 대한 자세한 정보](https://go.microsoft.com/fwlink/?LinkID=613718) 또는 [Ant 설명서 참조](http://ant.apache.org/)", + "loc.description": "Apache Ant로 빌드", + "loc.instanceNameFormat": "Ant $(options) $(antBuildFile)", + "loc.group.displayName.junitTestResults": "JUnit 테스트 결과", + "loc.group.displayName.codeCoverage": "코드 검사", + "loc.group.displayName.advanced": "고급", + "loc.input.label.antBuildFile": "Ant 빌드 파일", + "loc.input.help.antBuildFile": "Ant 빌드 파일의 리포지토리 루트로부터의 상대 경로입니다.", + "loc.input.label.options": "옵션", + "loc.input.help.options": "Ant 명령줄에 전달할 옵션을 지정하세요. 고유한 속성을 지정할 수도 있고(예: ***-DmyProperty=myPropertyValue***) 기본 제공 변수를 사용할 수도 있습니다(예: ***-DcollectionId=$(system.collectionId)***). 또는 기본 제공 변수가 빌드 중 이미 환경 변수로 설정되어 직접 전달될 수도 있습니다(예: ***-DcollectionIdAsEnvVar=%SYSTEM_COLLECTIONID%***).", + "loc.input.label.targets": "대상", + "loc.input.help.targets": "빌드할 대상의 공백으로 구분된 목록입니다(선택 사항). 지정되지 않은 경우 `기본` 대상이 사용됩니다. `기본` 대상이 정의되지 않은 경우 Ant 1.6.0 이상에서 모든 최상위 작업을 빌드합니다.", + "loc.input.label.publishJUnitResults": "Azure Pipelines/에 게시", + "loc.input.help.publishJUnitResults": "Ant 빌드에서 생성된 JUnit 테스트 결과를 Azure Pipelines에 게시하려면 이 옵션을 선택합니다. '테스트 결과 파일'과 일치하는 각 테스트 결과 파일이 Azure Pipelines에 테스트 실행으로 게시됩니다.", + "loc.input.label.testResultsFiles": "테스트 결과 파일", + "loc.input.help.testResultsFiles": "테스트 결과 파일 경로입니다. 와일드카드를 사용할 수 있습니다([자세한 정보](https://go.microsoft.com/fwlink/?linkid=856077)). 예를 들어 이름이 TEST-로 시작하는 모든 XML 파일을 표시하려면 '**/TEST-*.xml'을 지정합니다.", + "loc.input.label.testRunTitle": "테스트 실행 제목", + "loc.input.help.testRunTitle": "테스트 실행의 이름을 지정하세요.", + "loc.input.label.codeCoverageTool": "코드 검사 도구", + "loc.input.help.codeCoverageTool": "코드 검사 도구를 선택하세요. 온-프레미스 에이전트 지원의 경우 아래의 '추가 정보' 링크를 참조하세요.", + "loc.input.label.classFilesDirectories": "클래스 파일 디렉터리", + "loc.input.help.classFilesDirectories": "Ant 빌드 파일과 클래스 파일, 보관 파일(JAR, WAR 등)이 포함된 디렉터리 간 상대 경로의 쉼표로 구분된 목록입니다. 코드 검사는 이러한 디렉터리에 있는 클래스 파일에 대해 보고됩니다(예: target/classes,target/testClasses).", + "loc.input.label.classFilter": "클래스 포함/제외 필터", + "loc.input.help.classFilter": "코드 검사 수집에서 클래스를 포함하거나 제외할 필터의 쉼표로 구분된 목록입니다(예: +:com.*,+:org.*,-:my.app*.*).", + "loc.input.label.srcDirectories": "소스 파일 디렉터리", + "loc.input.help.srcDirectories": "Ant 빌드 파일과 소스 코드 디렉터리 간 상대 경로의 쉼표로 구분된 목록입니다. 코드 검사 보고서에서는 이를 사용하여 소스 코드를 강조 표시합니다(예: src/java,src/Test).", + "loc.input.label.failIfCoverageEmpty": "코드 검사 결과가 없는 경우 실패", + "loc.input.help.failIfCoverageEmpty": "코드 검사에서 게시할 결과를 생성하지 않은 경우 빌드가 실패합니다.", + "loc.input.label.antHomeUserInputPath": "ANT_HOME 경로 설정", + "loc.input.help.antHomeUserInputPath": "설정하는 경우 기존 ANT_HOME 환경 변수를 지정된 경로로 재정의합니다.", + "loc.input.label.javaHomeSelection": "JAVA_HOME 설정 방법", + "loc.input.help.javaHomeSelection": "빌드 중에 검색될 JDK 버전을 선택하거나 수동으로 JDK 경로를 입력하여 JAVA_HOME을 설정합니다.", + "loc.input.label.jdkVersion": "JDK 버전", + "loc.input.help.jdkVersion": "선택한 JDK 버전의 경로에 대한 검색을 시도하고 그에 따라 JAVA_HOME을 설정하게 됩니다.", + "loc.input.label.jdkUserInputPath": "JDK 경로", + "loc.input.help.jdkUserInputPath": "JAVA_HOME을 지정된 경로로 설정합니다.", + "loc.input.label.jdkArchitecture": "JDK 아키텍처", + "loc.input.help.jdkArchitecture": "선택적으로 JDK의 아키텍처(x86, x64)를 제공하세요.", + "loc.messages.LocateJVMBasedOnVersionAndArch": "Java %s %s에 대해 JAVA_HOME 찾기", + "loc.messages.UnsupportedJdkWarning": "JDK 9 및 JDK 10은 지원되지 않습니다. 프로젝트 및 파이프라인에서 최신 버전으로 전환하세요. JDK 11을 사용하여 빌드를 시도하는 중...", + "loc.messages.FailedToLocateSpecifiedJVM": "지정한 JDK 버전을 찾지 못했습니다. 지정한 JDK 버전이 에이전트에 설치되어 있으며 환경 변수 '%s'이(가) 있고 해당 JDK의 위치로 설정되었는지 확인하거나, [Java 도구 설치 관리자](https://go.microsoft.com/fwlink/?linkid=875287) 작업을 사용하여 원하는 JDK를 설치하세요.", + "loc.messages.DiscontinueAntCodeCoverage": "Ant 프로젝트에 대한 자동 코드 검사 보고서 생성을 더 이상 지원하지 않습니다. 자세한 내용은 https://go.microsoft.com/fwlink/?linkid=875306을 참조하세요.", + "loc.messages.NoCodeCoverage": "게시할 코드 검사 결과가 없습니다.", + "loc.messages.NoTestResults": "%s과(와) 일치하는 테스트 결과 파일을 찾을 수 없으므로 JUnit 테스트 결과 게시를 건너뜁니다." +} \ No newline at end of file diff --git a/_generated/ANTV1_Node20/Strings/resources.resjson/ru-RU/resources.resjson b/_generated/ANTV1_Node20/Strings/resources.resjson/ru-RU/resources.resjson new file mode 100644 index 000000000000..f913b01323ef --- /dev/null +++ b/_generated/ANTV1_Node20/Strings/resources.resjson/ru-RU/resources.resjson @@ -0,0 +1,47 @@ +{ + "loc.friendlyName": "Ant", + "loc.helpMarkDown": "[См. дополнительные сведения об этой задаче](https://go.microsoft.com/fwlink/?LinkID=613718) или [документацию по Ant](http://ant.apache.org/)", + "loc.description": "Сборка с помощью Apache Ant", + "loc.instanceNameFormat": "Ant $(options) $(antBuildFile)", + "loc.group.displayName.junitTestResults": "Результаты теста JUnit", + "loc.group.displayName.codeCoverage": "Объем протестированного кода", + "loc.group.displayName.advanced": "Дополнительно", + "loc.input.label.antBuildFile": "Файл сборки Ant", + "loc.input.help.antBuildFile": "Относительный путь от корня репозитория к файлу сборки Ant.", + "loc.input.label.options": "Параметры", + "loc.input.help.options": "Укажите параметры для передачи в командную строку Ant. Вы можете указать собственные свойства (например, ***-DmyProperty=myPropertyValue***), а также использовать встроенные переменные (например, ***-DcollectionId=$(system.collectionId)***). Кроме того, встроенные переменные уже заданы в качестве переменных среды во время сборки и могут быть переданы напрямую (например, ***-DcollectionIdAsEnvVar=%SYSTEM_COLLECTIONID%***).", + "loc.input.label.targets": "Платформы", + "loc.input.help.targets": "Необязательный список целевых объектов сборки с разделителями-пробелами. Если он не задан, будет использоваться целевой объект по умолчанию. Если целевой объект по умолчанию не определен, в Ant 1.6.0 и более поздних версиях будет выполнена сборка всех задач верхнего уровня.", + "loc.input.label.publishJUnitResults": "Опубликовать в Azure Pipelines", + "loc.input.help.publishJUnitResults": "Выберите этот параметр, чтобы опубликовать результаты теста JUnit, созданные сборкой Ant, в Azure Pipelines. Каждый файл результатов теста, соответствующий запросу \"Файлы результатов тестов\", будет опубликован как тестовый запуск в Azure Pipelines.", + "loc.input.label.testResultsFiles": "Файлы результатов теста", + "loc.input.help.testResultsFiles": "Путь к файлам результатов тестов. Можно использовать подстановочные знаки ([дополнительные сведения](https://go.microsoft.com/fwlink/?linkid=856077)). Пример: \"**/TEST-*.xml\" для всех XML-файлов, имена которых начинаются с \"TEST-\".", + "loc.input.label.testRunTitle": "Название тестового запуска", + "loc.input.help.testRunTitle": "Укажите имя для тестового запуска.", + "loc.input.label.codeCoverageTool": "Средство оценки объема протестированного кода", + "loc.input.help.codeCoverageTool": "Выберите средство оценки объема протестированного кода. Сведения о поддержке локального агента см. по ссылке \"Дополнительные сведения\" ниже.", + "loc.input.label.classFilesDirectories": "Каталоги файлов классов", + "loc.input.help.classFilesDirectories": "Список относительных путей с разделителями-запятыми от файла сборки ANT до каталогов, содержащих файлы классов и архивов (JAR, WAR и т. д.). Объем протестированного кода указывается для файлов классов в этих каталогах. Например: target/classes,target/testClasses.", + "loc.input.label.classFilter": "Фильтры включения и исключения классов", + "loc.input.help.classFilter": "Список фильтров с разделителями-запятыми для включения или исключения классов при сборе данных по объему протестированного кода. Например: +:com.*,+:org.*,-:my.app*.*.", + "loc.input.label.srcDirectories": "Каталоги файлов с исходным кодом", + "loc.input.help.srcDirectories": "Список относительных путей с разделителями-запятыми от файла сборки ANT до каталогов с исходным кодом. Он будет использоваться в отчетах об объеме протестированного кода для выделения исходного кода. Например: src/java,src/Test.", + "loc.input.label.failIfCoverageEmpty": "Сбой, если результаты для объема протестированного кода отсутствуют", + "loc.input.help.failIfCoverageEmpty": "Если объем протестированного кода не дал результатов для публикации, завершить сборку сбоем.", + "loc.input.label.antHomeUserInputPath": "Задать путь ANT_HOME", + "loc.input.help.antHomeUserInputPath": "Если этот параметр задан, переопределяет любую существующую переменную среды ANT_HOME заданным путем.", + "loc.input.label.javaHomeSelection": "Установка JAVA_HOME с помощью", + "loc.input.help.javaHomeSelection": "Задается JAVA_HOME указанием версии JDK, которая будет обнаруживаться во время сборок, или указанием пути к JDK вручную.", + "loc.input.label.jdkVersion": "Версия JDK", + "loc.input.help.jdkVersion": "Пытается определить путь к выбранной версии JDK и установить переменную JAVA_HOME соответствующим образом.", + "loc.input.label.jdkUserInputPath": "Путь к JDK", + "loc.input.help.jdkUserInputPath": "Установка для JAVA_HOME определенного пути.", + "loc.input.label.jdkArchitecture": "Архитектура JDK", + "loc.input.help.jdkArchitecture": "Дополнительно укажите архитектуру JDK (x86, x64).", + "loc.messages.LocateJVMBasedOnVersionAndArch": "Найдите JAVA_HOME для Java %s %s", + "loc.messages.UnsupportedJdkWarning": "Поддержка JDK 9 и JDK 10 прекращена. Переключитесь на более позднюю версию в проекте и конвейере. Выполняется попытка сборки с помощью JDK 11...", + "loc.messages.FailedToLocateSpecifiedJVM": "Не удалось найти указанную версию JDK. Убедитесь в том, что указанная версия JDK установлена в агенте и что переменная среды \"%s\" существует и ее значением является расположение соответствующего пакета JDK, или используйте [установщик средств Java] (https://go.microsoft.com/fwlink/?linkid=875287), чтобы установить требуемую версию JDK.", + "loc.messages.DiscontinueAntCodeCoverage": "Мы прекращаем поддержку автоматического создания отчетов об объемах протестированного кода для проектов Ant. Подробности см. на странице https://go.microsoft.com/fwlink/?linkid=875306.", + "loc.messages.NoCodeCoverage": "Результаты по объему протестированного кода для публикации не найдены.", + "loc.messages.NoTestResults": "Не найдены файлы результатов теста, соответствующие \"%s\". Публикация результатов теста JUnit пропускается." +} \ No newline at end of file diff --git a/_generated/ANTV1_Node20/Strings/resources.resjson/zh-CN/resources.resjson b/_generated/ANTV1_Node20/Strings/resources.resjson/zh-CN/resources.resjson new file mode 100644 index 000000000000..766dc3517e1c --- /dev/null +++ b/_generated/ANTV1_Node20/Strings/resources.resjson/zh-CN/resources.resjson @@ -0,0 +1,47 @@ +{ + "loc.friendlyName": "Ant", + "loc.helpMarkDown": "[详细了解此任务](https://go.microsoft.com/fwlink/?LinkID=613718)或[参阅 Ant 文档](http://ant.apache.org/)", + "loc.description": "使用 Apache Ant 生成", + "loc.instanceNameFormat": "Ant $(options) $(antBuildFile)", + "loc.group.displayName.junitTestResults": "JUnit 测试结果", + "loc.group.displayName.codeCoverage": "代码覆盖率", + "loc.group.displayName.advanced": "高级", + "loc.input.label.antBuildFile": "Ant 生成文件", + "loc.input.help.antBuildFile": "从存储库根路径到“Ant 生成文件”的相对路径。", + "loc.input.label.options": "选项", + "loc.input.help.options": "提供要传递到 Ant 命令行的任意选项。可以提供自己的属性(例如,***-DmyProperty=myPropertyValue***),也可使用内置变量(例如,**-DcollectionId=$(system.collectionId)***)。或者,已在生成过程中将内置变量设置为环境变量,且可直接传递(例如,***-DcollectionIdAsEnvVar=%SYSTEM_COLLECTIONID%***)。", + "loc.input.label.targets": "对象", + "loc.input.help.targets": "要生成的可选目标列表,以空格分隔。如果未指定,将使用“默认”目标。如果未定义“默认”目标,则 Ant 1.6.0 和更高版本将生成所有顶级任务。", + "loc.input.label.publishJUnitResults": "发布到 Azure Pipelines", + "loc.input.help.publishJUnitResults": "选择此选项可将 Ant 生成产生的 JUnit 测试结果发布到 Azure Pipelines。每个与 `Test Results Files` 匹配的测试结果文件都会在 Azure Pipelines 中发布为测试运行。", + "loc.input.label.testResultsFiles": "测试结果文件", + "loc.input.help.testResultsFiles": "测试结果文件路径。可以使用通配符([详细信息](https://go.microsoft.com/fwlink/?linkid=856077))。例如,\"**/TEST-*.xml\" 表示名称以 TEST- 开头的所有 xml 文件。", + "loc.input.label.testRunTitle": "测试运行标题", + "loc.input.help.testRunTitle": "为测试运行提供一个名称。", + "loc.input.label.codeCoverageTool": "代码覆盖率工具", + "loc.input.help.codeCoverageTool": "选择代码覆盖率工具。有关本地代理支持,请参阅下方的“详细信息”链接。", + "loc.input.label.classFilesDirectories": "类文件目录", + "loc.input.help.classFilesDirectories": "从 Ant 生成文件到目录的相对路径的列表,以逗号分隔,其中目录包含类文件和存档文件(JAR 和 WAR 等)。报告这些目录中类文件的代码覆盖率。例如: target/classes,target/testClasses。", + "loc.input.label.classFilter": "类包含/排除筛选器", + "loc.input.help.classFilter": "用于在收集代码覆盖率时包含或排除类的筛选器列表,以逗号分隔。例如: +:com.*、+:org.*、-:my.app*.*。", + "loc.input.label.srcDirectories": "源文件目录", + "loc.input.help.srcDirectories": "从 Ant 生成文件到源代码目录的相对路径列表,用逗号隔开。代码覆盖率报告将使用这些路径来突出显示源代码。例如: src/java,src/Test。", + "loc.input.label.failIfCoverageEmpty": "缺失代码覆盖率结果时失败", + "loc.input.help.failIfCoverageEmpty": "如果代码覆盖率未产生任何要发布的结果,则生成将失败。", + "loc.input.label.antHomeUserInputPath": "设置 ANT_HOME 路径", + "loc.input.help.antHomeUserInputPath": "如已设置,将用给定路径覆盖任何现有 ANT_HOME 环境变量。", + "loc.input.label.javaHomeSelection": "JAVA_HOME 设置方法", + "loc.input.help.javaHomeSelection": "可通过选择将在生成期间发现的 JDK 版本或手动输入 JDK 路径来设置 JAVA_HOME。", + "loc.input.label.jdkVersion": "JDK 版本", + "loc.input.help.jdkVersion": "将尝试发现所选 JDK 版本的路径并相应地设置 JAVA_HOME。", + "loc.input.label.jdkUserInputPath": "JDK 路径", + "loc.input.help.jdkUserInputPath": "将 JAVA_HOME 设置到给定路径。", + "loc.input.label.jdkArchitecture": "JDK 体系结构", + "loc.input.help.jdkArchitecture": "可以选择提供 JDK 的体系结构(x86、x64)。", + "loc.messages.LocateJVMBasedOnVersionAndArch": "为 Java %s %s 查找 JAVA_HOME", + "loc.messages.UnsupportedJdkWarning": "JDK 9 和 JDK 10 不受支持。请切换到项目和管道中的更高版本。正在尝试使用 JDK 11 进行生成...", + "loc.messages.FailedToLocateSpecifiedJVM": "未能找到指定的 JDK 版本。请确保代理上安装了指定的 JDK 版本,环境变量“%s”存在并设置为对应 JDK 的位置或使用[Java 工具安装程序](https://go.microsoft.com/fwlink/?linkid=875287)任务安装所需 JDK。", + "loc.messages.DiscontinueAntCodeCoverage": "我们将不再支持为 Ant 项目自动生成代码覆盖率报告。有关详细信息,请参阅 https://go.microsoft.com/fwlink/?linkid=875306。", + "loc.messages.NoCodeCoverage": "未找到可发布的代码覆盖率结果。", + "loc.messages.NoTestResults": "未找到匹配 %s 的测试结果文件,因此将跳过发布 JUnit 测试结果。" +} \ No newline at end of file diff --git a/_generated/ANTV1_Node20/Strings/resources.resjson/zh-TW/resources.resjson b/_generated/ANTV1_Node20/Strings/resources.resjson/zh-TW/resources.resjson new file mode 100644 index 000000000000..29a91dfd1ae4 --- /dev/null +++ b/_generated/ANTV1_Node20/Strings/resources.resjson/zh-TW/resources.resjson @@ -0,0 +1,47 @@ +{ + "loc.friendlyName": "Ant", + "loc.helpMarkDown": "[深入了解此工作](https://go.microsoft.com/fwlink/?LinkID=613718)或[參閱 Ant 文件](http://ant.apache.org/)", + "loc.description": "使用 Apache Ant 建置", + "loc.instanceNameFormat": "Ant $(options) $(antBuildFile)", + "loc.group.displayName.junitTestResults": "JUnit 測試結果", + "loc.group.displayName.codeCoverage": "程式碼涵蓋範圍", + "loc.group.displayName.advanced": "進階", + "loc.input.label.antBuildFile": "Ant 組建檔案", + "loc.input.help.antBuildFile": "從存放庫根路徑到 Ant 組建檔案的相對路徑。", + "loc.input.label.options": "選項", + "loc.input.help.options": "提供傳遞給 Ant 命令列的任何選項。您可以提供您自己的屬性 (例如 ***-DmyProperty=myPropertyValue***),並同時使用內建變數 (例如 ***-DmyProperty=myPropertyValue***)。或者,如果內建變數已在建置期間設為環境變數,則也可以直接傳遞 (例如 ***-DcollectionIdAsEnvVar=%SYSTEM_COLLECTIONID%***)。", + "loc.input.label.targets": "目標", + "loc.input.help.targets": "以空格分隔的選用清單,內含要建置的目標。若未指定,將使用 `default` 目標。如果未定義 `default` 目標,則 Ant 1.6.0 和更新版本將建置所有最上層工作。", + "loc.input.label.publishJUnitResults": "發佈至 Azure Pipelines", + "loc.input.help.publishJUnitResults": "選取此選項會將 Ant 組建所產生的 JUnit 測試結果發佈至 Azure Pipelines。每個與 `Test Results Files` 相符的測試結果檔案都將作為測試回合於 Azure Pipelines 中發佈。", + "loc.input.label.testResultsFiles": "測試結果檔案", + "loc.input.help.testResultsFiles": "測試結果檔案路徑。可使用萬用字元 ([詳細資訊](https://go.microsoft.com/fwlink/?linkid=856077))。例如 `**/TEST-*.xml` 表示名稱開頭為 TEST- 的所有 XML 檔案。", + "loc.input.label.testRunTitle": "測試回合標題", + "loc.input.help.testRunTitle": "提供測試回合的名稱。", + "loc.input.label.codeCoverageTool": "程式碼涵蓋範圍工具", + "loc.input.help.codeCoverageTool": "選取程式碼涵蓋範圍工具。如需內部部署代理程式支援,請參閱下面的<詳細資訊>連結。", + "loc.input.label.classFilesDirectories": "類別檔案目錄", + "loc.input.help.classFilesDirectories": "以逗號分隔的清單,內含從 Ant 組建檔案到包含類別檔案和封存檔案 (JAR、WAR 等) 之目錄的相對路徑。回報的程式碼涵蓋範圍為這些目錄中的類別檔案。例如: target/classes,target/testClasses。", + "loc.input.label.classFilter": "類別包含/排除篩選", + "loc.input.help.classFilter": "以逗號分隔的清單,內含可從收集程式碼涵蓋範圍將類別加以包含或排除的篩選條件。例如: +:com.*,+:org.*,-:my.app*.*。", + "loc.input.label.srcDirectories": "原始程式檔目錄", + "loc.input.help.srcDirectories": "以逗號分隔的清單,內含從 Ant 組建檔案到原始程式碼目錄的相對路徑。程式碼涵蓋範圍報表會加以使用,以強調顯示原始程式碼。例如: src/java,src/Test。", + "loc.input.label.failIfCoverageEmpty": "遺漏程式碼涵蓋範圍結果時失敗", + "loc.input.help.failIfCoverageEmpty": "如果程式碼涵蓋範圍未產生任何可發行的結果,則建置失敗。", + "loc.input.label.antHomeUserInputPath": "設定 ANT_HOME 路徑", + "loc.input.help.antHomeUserInputPath": "如有設定,將會以指定的路徑覆寫任何現有的 ANT_HOME 環境變數。", + "loc.input.label.javaHomeSelection": "設定 JAVA_HOME 由", + "loc.input.help.javaHomeSelection": "選取一個能在組建期間探索到的 JDK 版本,或者手動輸入 JDK 路徑,均能為 JAVA_HOME 進行設定。", + "loc.input.label.jdkVersion": "JDK 版本", + "loc.input.help.jdkVersion": "將嘗試探索所選取 JDK 版本的路徑並據此設定 JAVA_HOME。", + "loc.input.label.jdkUserInputPath": "JDK 路徑", + "loc.input.help.jdkUserInputPath": "將 JAVA_HOME 設定為指定路徑。", + "loc.input.label.jdkArchitecture": "JDK 架構", + "loc.input.help.jdkArchitecture": "選擇性地提供 JDK 的架構 (x86、x64)。", + "loc.messages.LocateJVMBasedOnVersionAndArch": "為 Java %s %s 找出 JAVA_HOME 的位置", + "loc.messages.UnsupportedJdkWarning": "JDK 9 與 JDK 10 已失去支援。請在您的專案和管線中切換至較新版本。正在嘗試以 JDK 11 進行建置...", + "loc.messages.FailedToLocateSpecifiedJVM": "找不到指定的 JDK 版本。請確認指定的 JDK 版本已安裝在代理程式上,且環境變數 '%s' 存在並已設定為對應 JDK 的位置,或者使用 [Java 工具安裝程式](https://go.microsoft.com/fwlink/?linkid=875287) 工作安裝所需的 JDK。", + "loc.messages.DiscontinueAntCodeCoverage": "我們即將中止對自動產生 Ant 專案程式碼涵蓋範圍報告的支援。如需更多詳細資料,請參閱 https://go.microsoft.com/fwlink/?linkid=875306。", + "loc.messages.NoCodeCoverage": "找不到要發行的程式碼涵蓋範圍結果。", + "loc.messages.NoTestResults": "找不到任何符合 %s 的測試結果,因此跳過發行 JUnit 測試結果。" +} \ No newline at end of file diff --git a/_generated/ANTV1_Node20/Tests/L0.ts b/_generated/ANTV1_Node20/Tests/L0.ts new file mode 100644 index 000000000000..e3d2322eb696 --- /dev/null +++ b/_generated/ANTV1_Node20/Tests/L0.ts @@ -0,0 +1,167 @@ +import assert = require('assert'); +import { MockTestRunner } from 'azure-pipelines-task-lib/mock-test'; +import path = require('path'); +import os = require('os'); + +var isWindows = os.type().match(/^Win/); + +describe('ANT Suite', function () { + this.timeout(parseInt(process.env.TASK_TEST_TIMEOUT) || 20000); + + it('run ANT with all inputs', (done) => { + const testPath = path.join(__dirname, 'L0AllInputs.js') + const runner: MockTestRunner = new MockTestRunner(testPath); + runner.run(); + + assert(runner.ran('/usr/local/bin/ANT -version'), 'it should have run ANT -version'); + assert(runner.ran('/usr/local/bin/ANT -buildfile /build/build.xml'), 'it should have run ANT -buildfile ...'); + assert(runner.invokedToolCount == 2, 'should have only run ANT 2 times'); + assert(runner.stderr.length == 0, 'should not have written to stderr'); + assert(runner.succeeded, 'task should have succeeded'); + done(); + }) + + it('fails if missing antBuildFile input', (done) => { + const testPath = path.join(__dirname, 'L0MissingAntBuildFile.js') + const runner: MockTestRunner = new MockTestRunner(testPath); + runner.run(); + + assert(runner.invokedToolCount == 0, 'should not have run ANT'); + assert(runner.failed, 'task should have failed'); + assert(runner.stdOutContained('Input required: antBuildFile'), 'wrong error message'); + done(); + }) + + it('fails if missing javaHomeSelection input', (done) => { + const testPath = path.join(__dirname, 'L0MissingJavaHomeSelection.js') + const runner: MockTestRunner = new MockTestRunner(testPath); + runner.run(); + + assert(runner.invokedToolCount == 0, 'should not have run ANT'); + assert(runner.failed, 'task should have failed'); + assert(runner.stdOutContained('Input required: javaHomeSelection'), 'wrong error message"'); + done(); + }) + + it('fails if missing testResultsFiles input', (done) => { + const testPath = path.join(__dirname, 'L0MissingTestResultsFiles.js') + const runner: MockTestRunner = new MockTestRunner(testPath); + runner.run(); + + assert(runner.invokedToolCount == 0, 'should not have run ANT'); + assert(runner.failed, 'task should have failed'); + assert(runner.stdOutContained('Input required: testResultsFiles'), 'wrong error message:"'); + done(); + }) + + it('run ANT with antHomeUserInputPath', (done) => { + const testPath = path.join(__dirname, 'L0RunWithAntHomeUserInputPath.js') + const runner: MockTestRunner = new MockTestRunner(testPath); + runner.run(); + + assert(runner.ran('/usr/local/bin/ANT -version'), 'it should have run ANT -version'); + assert(runner.ran('/usr/local/bin/ANT -buildfile /build/build.xml'), 'it should have run ANT -buildfile ...'); + assert(runner.invokedToolCount == 2, 'should have only run ANT 2 times'); + assert(runner.stderr.length == 0, 'should not have written to stderr'); + assert(runner.succeeded, 'task should have succeeded'); + assert(runner.stdOutContained('Set ANT_HOME to /usr/local/bin/ANT2'), 'ANT_HOME not set correctly'); + done(); + }) + + it('run ANT with antHomeUserInputPath set to invalid path', (done) => { + const testPath = path.join(__dirname, 'L0InvalidUserHomePath.js') + const runner: MockTestRunner = new MockTestRunner(testPath); + runner.run(); + + assert(runner.invokedToolCount == 0, 'should not have run ANT'); + assert(runner.failed, 'task should have failed'); + assert(runner.stdOutContained('Not found /usr/local/bin/ANT_invalid'), 'Invalid path not detected'); + done(); + }) + + it('run ANT with ANT_HOME not set', (done) => { + const testPath = path.join(__dirname, 'L0AntHomeNotSet.js') + const runner: MockTestRunner = new MockTestRunner(testPath); + runner.run(); + + // The response file will cause ANT to fail, but we are looking for the warning about ANT_HOME + assert(runner.ran('/usr/local/bin/ANT -version'), 'it should have run ANT -version'); + assert(runner.invokedToolCount == 1, 'should have only run ANT once'); + assert(runner.failed, 'task should have failed'); + assert(runner.stdOutContained('The ANT_HOME environment variable is not set'), 'Missing JAVA_HOME not detected'); + done(); + }) + + it('run ANT with jdkVersion set to 1.8', (done) => { + const testPath = path.join(__dirname, 'L0JDKSetTo8.js') + const runner: MockTestRunner = new MockTestRunner(testPath); + runner.run(); + + assert(runner.ran('/usr/local/bin/ANT -version'), 'it should have run ANT -version'); + assert(runner.ran('/usr/local/bin/ANT -buildfile /build/build.xml'), 'it should have run ANT -buildfile ...'); + assert.strictEqual(runner.invokedToolCount, 2, 'should have run ANT 2 times'); + assert(runner.stderr.length == 0, 'should not have written to stderr'); + assert(runner.succeeded, 'task should have succeeded'); + assert(runner.stdOutContained('Set JAVA_HOME to /user/local/bin/ANT8'), 'JAVA_HOME not set correctly'); + done(); + }) + + it('run ANT with jdkVersion set to 1.5', (done) => { + const testPath = path.join(__dirname, 'L0JDKSetTo5.js') + const runner: MockTestRunner = new MockTestRunner(testPath); + runner.run(); + + if (isWindows) { + assert.strictEqual(runner.invokedToolCount, 1, 'should have run the reg query toolrunner'); + } else { + assert.strictEqual(runner.invokedToolCount, 0, 'should not have run tools'); + } + assert(runner.failed, 'task should have failed'); + assert(runner.stdOutContained('FailedToLocateSpecifiedJVM'), 'Should write FailedToLocateSpecifiedJVM error'); + done(); + }) + + it('run ANT valid inputs but it fails', (done) => { + const testPath = path.join(__dirname, 'L0FailWithValidInputs.js') + const runner: MockTestRunner = new MockTestRunner(testPath); + runner.run(); + + // The response file will cause ANT to fail, but we are looking for the warning about ANT_HOME + assert(runner.ran('/usr/local/bin/ANT -version'), 'it should have run ANT -version'); + assert(runner.ran('/usr/local/bin/ANT -buildfile /build/build.xml'), 'it should have run ANT -buildfile ...'); + assert(runner.invokedToolCount == 2, 'should have only run ANT 2 times'); + assert(runner.failed, 'task should have failed'); + done(); + }) + + it('Ant build with Publish Test Results.', (done) => { + const testPath = path.join(__dirname, 'L0PublishTestResults.js') + const runner: MockTestRunner = new MockTestRunner(testPath); + runner.run(); + + assert(runner.succeeded, 'The task should not have failed'); + assert(runner.stdout.search(/##vso\[results.publish type=JUnit;mergeResults=true;publishRunAttachments=true;resultFiles=\/user\/build\/fun\/test-123.xml;\]/) >= 0) + done(); + }) + + it('Ant build with Publish Test Results with no matching test result files.', (done) => { + const testPath = path.join(__dirname, 'L0NoMatchingTestResults.js') + const runner: MockTestRunner = new MockTestRunner(testPath); + runner.run(); + + assert(runner.stdout.search(/##vso\[results.publish\]/) < 0, 'publish test results should have not got called.'); + assert(runner.stderr.length == 0, 'should not have written to stderr'); + assert(runner.stdOutContained('NoTestResults'), 'should have warned about lack of test results'); + assert(runner.succeeded, 'task should have succeeded'); + done(); + }) + + it('Ant build with Publish Test Results for failed builds.', (done) => { + const testPath = path.join(__dirname, 'L0FailedBuilds.js') + const runner: MockTestRunner = new MockTestRunner(testPath); + runner.run(); + + assert(runner.stdout.search(/##vso\[results.publish type=JUnit;mergeResults=true;publishRunAttachments=true;resultFiles=\/user\/build\/fun\/test-123.xml;\]/) >= 0); + done(); + }) +}); diff --git a/_generated/ANTV1_Node20/Tests/L0AllInputs.ts b/_generated/ANTV1_Node20/Tests/L0AllInputs.ts new file mode 100644 index 000000000000..10d215ac3943 --- /dev/null +++ b/_generated/ANTV1_Node20/Tests/L0AllInputs.ts @@ -0,0 +1,15 @@ +import path = require('path'); +import { TaskMockRunner } from 'azure-pipelines-task-lib/mock-run'; +import * as answers from './answers'; + +let taskPath = path.join(__dirname, '..', 'anttask.js'); +let runner: TaskMockRunner = new TaskMockRunner(taskPath); + +runner.setInput('antBuildFile', '/build/build.xml'); // Make that checkPath returns true for this filename in the response file +runner.setInput('javaHomeSelection', 'JDKVersion'); +runner.setInput('jdkVersion', 'default'); +runner.setInput('testResultsFiles', '**/TEST-*.xml'); + +runner.setAnswers(answers.successAnswers); + +runner.run(); diff --git a/_generated/ANTV1_Node20/Tests/L0AntHomeNotSet.ts b/_generated/ANTV1_Node20/Tests/L0AntHomeNotSet.ts new file mode 100644 index 000000000000..f2927496aa4c --- /dev/null +++ b/_generated/ANTV1_Node20/Tests/L0AntHomeNotSet.ts @@ -0,0 +1,17 @@ +import path = require('path'); +import { TaskMockRunner } from 'azure-pipelines-task-lib/mock-run'; +import * as answers from './answers'; + +let taskPath = path.join(__dirname, '..', 'anttask.js'); +let runner: TaskMockRunner = new TaskMockRunner(taskPath); + +runner.setInput('antBuildFile', '/build/build.xml'); // Make that checkPath returns true for this filename in the response file +runner.setInput('javaHomeSelection', 'JDKVersion'); +runner.setInput('jdkVersion', 'default'); +runner.setInput('testResultsFiles', '**/TEST-*.xml'); + +runner.setAnswers(answers.versionFailAnswers); + +delete process.env['ANT_HOME']; + +runner.run(); diff --git a/_generated/ANTV1_Node20/Tests/L0FailWithValidInputs.ts b/_generated/ANTV1_Node20/Tests/L0FailWithValidInputs.ts new file mode 100644 index 000000000000..9fc326d786d6 --- /dev/null +++ b/_generated/ANTV1_Node20/Tests/L0FailWithValidInputs.ts @@ -0,0 +1,15 @@ +import path = require('path'); +import { TaskMockRunner } from 'azure-pipelines-task-lib/mock-run'; +import * as answers from './answers'; + +let taskPath = path.join(__dirname, '..', 'anttask.js'); +let runner: TaskMockRunner = new TaskMockRunner(taskPath); + +runner.setInput('antBuildFile', '/build/build.xml'); +runner.setInput('javaHomeSelection', 'JDKVersion'); +runner.setInput('jdkVersion', 'default'); +runner.setInput('testResultsFiles', '**/TEST-*.xml'); + +runner.setAnswers(answers.failAnswers); + +runner.run(); diff --git a/_generated/ANTV1_Node20/Tests/L0FailedBuilds.ts b/_generated/ANTV1_Node20/Tests/L0FailedBuilds.ts new file mode 100644 index 000000000000..548228eddd73 --- /dev/null +++ b/_generated/ANTV1_Node20/Tests/L0FailedBuilds.ts @@ -0,0 +1,18 @@ +import path = require('path'); +import { TaskMockRunner } from 'azure-pipelines-task-lib/mock-run'; +import * as answers from './answers'; + + +let taskPath = path.join(__dirname, '..', 'anttask.js'); +let runner: TaskMockRunner = new TaskMockRunner(taskPath); + +runner.setInput('antBuildFile', '/build/build.xml'); // Make that checkPath returns true for this filename in the response file +runner.setInput('javaHomeSelection', 'JDKVersion'); +runner.setInput('jdkVersion', 'default'); +runner.setInput('testResultsFiles', '**/TEST-*.xml'); +runner.setInput('publishJUnitResults', 'true'); +runner.setInput('codeCoverageTool', 'None'); + +runner.setAnswers(answers.failAnswers); + +runner.run(); diff --git a/_generated/ANTV1_Node20/Tests/L0InvalidUserHomePath.ts b/_generated/ANTV1_Node20/Tests/L0InvalidUserHomePath.ts new file mode 100644 index 000000000000..e99d78796752 --- /dev/null +++ b/_generated/ANTV1_Node20/Tests/L0InvalidUserHomePath.ts @@ -0,0 +1,16 @@ +import path = require('path'); +import { TaskMockRunner } from 'azure-pipelines-task-lib/mock-run'; +import * as answers from './answers'; + +let taskPath = path.join(__dirname, '..', 'anttask.js'); +let runner: TaskMockRunner = new TaskMockRunner(taskPath); + +runner.setInput('antBuildFile', '/build/build.xml'); +runner.setInput('javaHomeSelection', 'JDKVersion'); +runner.setInput('jdkVersion', 'default'); +runner.setInput('testResultsFiles', '**/TEST-*.xml'); +runner.setInput('antHomeUserInputPath', '/usr/local/bin/ANT_invalid'); + +runner.setAnswers(answers.versionFailAnswers); + +runner.run(); diff --git a/_generated/ANTV1_Node20/Tests/L0JDKSetTo5.ts b/_generated/ANTV1_Node20/Tests/L0JDKSetTo5.ts new file mode 100644 index 000000000000..bbc0f0954791 --- /dev/null +++ b/_generated/ANTV1_Node20/Tests/L0JDKSetTo5.ts @@ -0,0 +1,16 @@ +import path = require('path'); +import { TaskMockRunner } from 'azure-pipelines-task-lib/mock-run'; +import * as answers from './answers'; + +let taskPath = path.join(__dirname, '..', 'anttask.js'); +let runner: TaskMockRunner = new TaskMockRunner(taskPath); + +runner.setInput('antBuildFile', '/build/build.xml'); +runner.setInput('javaHomeSelection', 'JDKVersion'); +runner.setInput('jdkVersion', '1.5'); +runner.setInput('jdkArchitecture', 'x86'); +runner.setInput('testResultsFiles', '**/TEST-*.xml'); + +runner.setAnswers(answers.successAnswers); + +runner.run(); diff --git a/_generated/ANTV1_Node20/Tests/L0JDKSetTo8.ts b/_generated/ANTV1_Node20/Tests/L0JDKSetTo8.ts new file mode 100644 index 000000000000..ee69c7d04d50 --- /dev/null +++ b/_generated/ANTV1_Node20/Tests/L0JDKSetTo8.ts @@ -0,0 +1,19 @@ +import path = require('path'); +import { TaskMockRunner } from 'azure-pipelines-task-lib/mock-run'; +import * as answers from './answers'; + +let taskPath = path.join(__dirname, '..', 'anttask.js'); +let runner: TaskMockRunner = new TaskMockRunner(taskPath); + +runner.setInput('antBuildFile', '/build/build.xml'); +runner.setInput('javaHomeSelection', 'JDKVersion'); +runner.setInput('jdkVersion', '1.8'); +runner.setInput('jdkArchitecture', 'x86'); +runner.setInput('testResultsFiles', '**/TEST-*.xml'); + +runner.setAnswers(answers.successAnswers); + +process.env['JAVA_HOME_8_X86'] = '/user/local/bin/ANT8'; +process.env['JAVA_HOME_8_X64'] = '/user/local/bin/ANT8'; + +runner.run(); diff --git a/_generated/ANTV1_Node20/Tests/L0MissingAntBuildFile.ts b/_generated/ANTV1_Node20/Tests/L0MissingAntBuildFile.ts new file mode 100644 index 000000000000..6e6ddeeed4d7 --- /dev/null +++ b/_generated/ANTV1_Node20/Tests/L0MissingAntBuildFile.ts @@ -0,0 +1,14 @@ +import path = require('path'); +import { TaskMockRunner } from 'azure-pipelines-task-lib/mock-run'; +import * as answers from './answers'; + +let taskPath = path.join(__dirname, '..', 'anttask.js'); +let runner: TaskMockRunner = new TaskMockRunner(taskPath); + +runner.setInput('javaHomeSelection', 'JDKVersion'); +runner.setInput('jdkVersion', 'default'); +runner.setInput('testResultsFiles', '**/TEST-*.xml'); + +runner.setAnswers(answers.successAnswers); + +runner.run(); diff --git a/_generated/ANTV1_Node20/Tests/L0MissingJavaHomeSelection.ts b/_generated/ANTV1_Node20/Tests/L0MissingJavaHomeSelection.ts new file mode 100644 index 000000000000..1df24ee56f42 --- /dev/null +++ b/_generated/ANTV1_Node20/Tests/L0MissingJavaHomeSelection.ts @@ -0,0 +1,14 @@ +import path = require('path'); +import { TaskMockRunner } from 'azure-pipelines-task-lib/mock-run'; +import * as answers from './answers'; + +let taskPath = path.join(__dirname, '..', 'anttask.js'); +let runner: TaskMockRunner = new TaskMockRunner(taskPath); + +runner.setInput('antBuildFile', '/build/build.xml'); +runner.setInput('jdkVersion', 'default'); +runner.setInput('testResultsFiles', '**/TEST-*.xml'); + +runner.setAnswers(answers.successAnswers); + +runner.run(); diff --git a/_generated/ANTV1_Node20/Tests/L0MissingTestResultsFiles.ts b/_generated/ANTV1_Node20/Tests/L0MissingTestResultsFiles.ts new file mode 100644 index 000000000000..e56109d5d6b2 --- /dev/null +++ b/_generated/ANTV1_Node20/Tests/L0MissingTestResultsFiles.ts @@ -0,0 +1,14 @@ +import path = require('path'); +import { TaskMockRunner } from 'azure-pipelines-task-lib/mock-run'; +import * as answers from './answers'; + +let taskPath = path.join(__dirname, '..', 'anttask.js'); +let runner: TaskMockRunner = new TaskMockRunner(taskPath); + +runner.setInput('antBuildFile', '/build/build.xml'); // Make that checkPath returns true for this filename in the response file +runner.setInput('javaHomeSelection', 'JDKVersion'); +runner.setInput('jdkVersion', 'default'); + +runner.setAnswers(answers.successAnswers); + +runner.run(); diff --git a/_generated/ANTV1_Node20/Tests/L0NoMatchingTestResults.ts b/_generated/ANTV1_Node20/Tests/L0NoMatchingTestResults.ts new file mode 100644 index 000000000000..249d2faaf53f --- /dev/null +++ b/_generated/ANTV1_Node20/Tests/L0NoMatchingTestResults.ts @@ -0,0 +1,17 @@ +import path = require('path'); +import { TaskMockRunner } from 'azure-pipelines-task-lib/mock-run'; +import * as answers from './answers'; + +let taskPath = path.join(__dirname, '..', 'anttask.js'); +let runner: TaskMockRunner = new TaskMockRunner(taskPath); + +runner.setInput('antBuildFile', '/build/build.xml'); // Make that checkPath returns true for this filename in the response file +runner.setInput('javaHomeSelection', 'JDKVersion'); +runner.setInput('jdkVersion', 'default'); +runner.setInput('testResultsFiles', '**/InvalidTestFilter-*.xml'); +runner.setInput('publishJUnitResults', 'true'); +runner.setInput('codeCoverageTool', 'None'); + +runner.setAnswers(answers.successAnswers); + +runner.run(); diff --git a/_generated/ANTV1_Node20/Tests/L0PublishTestResults.ts b/_generated/ANTV1_Node20/Tests/L0PublishTestResults.ts new file mode 100644 index 000000000000..e3cce17f80bd --- /dev/null +++ b/_generated/ANTV1_Node20/Tests/L0PublishTestResults.ts @@ -0,0 +1,19 @@ +import path = require('path'); +import { TaskMockRunner } from 'azure-pipelines-task-lib/mock-run'; +import * as answers from './answers'; + +let taskPath = path.join(__dirname, '..', 'anttask.js'); +let runner: TaskMockRunner = new TaskMockRunner(taskPath); + +runner.setInput('antBuildFile', '/build/build.xml'); // Make that checkPath returns true for this filename in the response file +runner.setInput('javaHomeSelection', 'JDKVersion'); +runner.setInput('jdkVersion', 'default'); +runner.setInput('testResultsFiles', '**/TEST-*.xml'); +runner.setInput('publishJUnitResults', 'true'); +runner.setInput('codeCoverageTool', 'None'); + +runner.setAnswers(answers.successAnswers); + +process.env['System.DefaultWorkingDirectory'] = '/user/build'; + +runner.run(); diff --git a/_generated/ANTV1_Node20/Tests/L0RunWithAntHomeUserInputPath.ts b/_generated/ANTV1_Node20/Tests/L0RunWithAntHomeUserInputPath.ts new file mode 100644 index 000000000000..53b3d2daa6ed --- /dev/null +++ b/_generated/ANTV1_Node20/Tests/L0RunWithAntHomeUserInputPath.ts @@ -0,0 +1,16 @@ +import path = require('path'); +import { TaskMockRunner } from 'azure-pipelines-task-lib/mock-run'; +import * as answers from './answers'; + +let taskPath = path.join(__dirname, '..', 'anttask.js'); +let runner: TaskMockRunner = new TaskMockRunner(taskPath); + +runner.setInput('antBuildFile', '/build/build.xml'); +runner.setInput('javaHomeSelection', 'JDKVersion'); +runner.setInput('jdkVersion', 'default'); +runner.setInput('testResultsFiles', '**/TEST-*.xml'); +runner.setInput('antHomeUserInputPath', '/usr/local/bin/ANT2'); + +runner.setAnswers(answers.successAnswers); + +runner.run(); diff --git a/_generated/ANTV1_Node20/Tests/answers.ts b/_generated/ANTV1_Node20/Tests/answers.ts new file mode 100644 index 000000000000..ed2ddf81c437 --- /dev/null +++ b/_generated/ANTV1_Node20/Tests/answers.ts @@ -0,0 +1,160 @@ +import { TaskLibAnswers } from 'azure-pipelines-task-lib/mock-answer'; + +export const successAnswers: TaskLibAnswers = { + "which": { + "ant": "/usr/local/bin/ANT", + "node": "/usr/local/bin/node" + }, + "exec": { + "/usr/local/bin/ANT -version": { + "code": 0, + "stdout": "Apache Ant(TM) version 1.9.7 compiled on April 9 2016" + }, + "/usr/local/bin/ANT -buildfile /build/build.xml": { + "code": 0, + "stdout": "" + }, + "/usr/local/bin/ANT -buildfile /build/build.xml CodeCoverage_9064e1d0": { + "code": 0, + "stdout": "" + }, + "reg query HKLM\\SOFTWARE\\JavaSoft\\Java Development Kit\\1.5 /v JavaHome /reg:32": { + "code": 222, + "stdout": "" + }, + "reg query HKLM\\SOFTWARE\\JavaSoft\\Java Development Kit\\ /f 1.5 /k": { + "code": 50, + "stdout": "" + } + }, + "checkPath": { + "/usr/local/bin/ANT": true, + "/build/build.xml": true, + "/usr/local/bin/ANT2": true + }, + "getVariable": { + "ANT_HOME": "/user/local/bin/ANT", + "JAVA_HOME_8_x86": "/user/local/bin/ANT8", + "JAVA_HOME_8_X64": "/user/local/bin/ANT8", + "System.DefaultWorkingDirectory": "/user/build" + }, + "rmRF": { + "\\build\\InstrumentedClasses": { + "success": true, + "message": "success" + }, + "\\build\\cobertura.ser": { + "success": true, + "message": "success" + }, + "\\build\\CCReport43F6D5EF": { + "success": true, + "message": "success" + }, + "\\build\\CCReportBuildA4D283EG.xml": { + "success": true, + "message": "success" + }, + "/build/InstrumentedClasses": { + "success": true, + "message": "success" + }, + "/build/cobertura.ser": { + "success": true, + "message": "success" + }, + "/build/CCReport43F6D5EF": { + "success": true, + "message": "success" + }, + "/build/CCReportBuildA4D283EG.xml": { + "success": true, + "message": "success" + } + }, + "find": { + "/user/build": [ + "/user/build/fun/test-123.xml" + ] + }, + "findMatch": { + "**/TEST-*.xml": [ + "/user/build/fun/test-123.xml" + ] + } +}; + +export const failAnswers: TaskLibAnswers = { + "which": { + "ant": "/usr/local/bin/ANT", + "node": "/usr/local/bin/node" + }, + "exec": { + "/usr/local/bin/ANT -version": { + "code": 0, + "stdout": "Apache Ant(TM) version 1.9.7 compiled on April 9 2016" + }, + "/usr/local/bin/ANT -buildfile /build/build.xml": { + "code": 222, + "stdout": "" + } + }, + "checkPath": { + "/usr/local/bin/ANT": true, + "/build/build.xml": true + }, + "getVariable": { + "ANT_HOME": "/user/local/bin/ANT" + }, + "rmRF": { + "\\build\\InstrumentedClasses": { + "success": true, + "message": "success" + }, + "/build/InstrumentedClasses": { + "success": true, + "message": "success" + } + }, + "find": { + "/user/build": [ + "/user/build/fun/test-123.xml" + ] + }, + "findMatch": { + "**/TEST-*.xml": [ + "/user/build/fun/test-123.xml" + ] + } +}; + +export const versionFailAnswers: TaskLibAnswers = { + "which": { + "ant": "/usr/local/bin/ANT", + "node": "/usr/local/bin/node" + }, + "exec": { + "/usr/local/bin/ANT -version": { + "code": 222, + "stdout": "Apache Ant(TM) version 1.9.7 compiled on April 9 2016" + }, + "/usr/local/bin/ANT -buildfile /build/build.xml": { + "code": 0, + "stdout": "" + } + }, + "checkPath" : { + "/usr/local/bin/ANT": true, + "/build/build.xml": true + }, + "rmRF": { + "\\build\\InstrumentedClasses": { + "success": true, + "message": "success" + }, + "/build/InstrumentedClasses": { + "success": true, + "message": "success" + } + } +} diff --git a/_generated/ANTV1_Node20/Tests/package-lock.json b/_generated/ANTV1_Node20/Tests/package-lock.json new file mode 100644 index 000000000000..0e52d1ddc30b --- /dev/null +++ b/_generated/ANTV1_Node20/Tests/package-lock.json @@ -0,0 +1,14 @@ +{ + "name": "antv1-tests", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/mocha": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", + "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==", + "dev": true + } + } +} diff --git a/_generated/ANTV1_Node20/Tests/package.json b/_generated/ANTV1_Node20/Tests/package.json new file mode 100644 index 000000000000..37725de724e6 --- /dev/null +++ b/_generated/ANTV1_Node20/Tests/package.json @@ -0,0 +1,22 @@ +{ + "name": "antv1-tests", + "version": "1.0.0", + "description": "Azure Pipelines Ant V1 Task Tests", + "main": "L0.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/Microsoft/azure-pipelines-tasks.git" + }, + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Microsoft/azure-pipelines-tasks/issues" + }, + "homepage": "https://github.com/Microsoft/azure-pipelines-tasks#readme", + "devDependencies": { + "@types/mocha": "^5.2.7" + } +} diff --git a/_generated/ANTV1_Node20/ThirdPartyNotice.txt b/_generated/ANTV1_Node20/ThirdPartyNotice.txt new file mode 100644 index 000000000000..e02a9dc6967a --- /dev/null +++ b/_generated/ANTV1_Node20/ThirdPartyNotice.txt @@ -0,0 +1,1935 @@ + +THIRD-PARTY SOFTWARE NOTICES AND INFORMATION +Do Not Translate or Localize + +This Azure DevOps extension (ANTV1) is based on or incorporates material from the projects listed below (Third Party IP). The original copyright notice and the license under which Microsoft received such Third Party IP, are set forth below. Such licenses and notices are provided for informational purposes only. Microsoft licenses the Third Party IP to you under the licensing terms for the Azure DevOps extension. Microsoft reserves all other rights not expressly granted under this agreement, whether by implication, estoppel or otherwise. + +1. @types/node (git+https://github.com/DefinitelyTyped/DefinitelyTyped.git) +2. @types/q (git+https://github.com/DefinitelyTyped/DefinitelyTyped.git) +3. balanced-match (git://github.com/juliangruber/balanced-match.git) +4. boolbase (git+https://github.com/fb55/boolbase.git) +5. brace-expansion (git://github.com/juliangruber/brace-expansion.git) +6. cheerio (git://github.com/cheeriojs/cheerio.git) +7. codecoverage-tools (git://github.com/microsoft/azure-pipelines-tasks-coverage-tools.git) +8. concat-map (git://github.com/substack/node-concat-map.git) +9. core-util-is (git://github.com/isaacs/core-util-is.git) +10. css-select (git://github.com/fb55/css-select.git) +11. css-what (git+https://github.com/fb55/css-what.git) +12. dom-serializer (git://github.com/cheeriojs/dom-renderer.git) +13. domelementtype (git://github.com/FB55/domelementtype.git) +14. domelementtype (git://github.com/FB55/domelementtype.git) +15. domhandler (git://github.com/fb55/DomHandler.git) +16. domutils (git://github.com/FB55/domutils.git) +17. entities (git://github.com/fb55/node-entities.git) +18. fs-extra (git+https://github.com/jprichardson/node-fs-extra.git) +19. fs.realpath (git+https://github.com/isaacs/fs.realpath.git) +20. glob (git://github.com/isaacs/node-glob.git) +21. glob (git://github.com/isaacs/node-glob.git) +22. glob (git://github.com/isaacs/node-glob.git) +23. graceful-fs (git+https://github.com/isaacs/node-graceful-fs.git) +24. htmlparser2 (git://github.com/fb55/htmlparser2.git) +25. inflight (git+https://github.com/npm/inflight.git) +26. inherits (git://github.com/isaacs/inherits.git) +27. isarray (git://github.com/juliangruber/isarray.git) +28. jsonfile (git+ssh://git@github.com/jprichardson/node-jsonfile.git) +29. klaw (git+https://github.com/jprichardson/node-klaw.git) +30. lodash.assignin (git+https://github.com/lodash/lodash.git) +31. lodash.bind (git+https://github.com/lodash/lodash.git) +32. lodash.defaults (git+https://github.com/lodash/lodash.git) +33. lodash.filter (git+https://github.com/lodash/lodash.git) +34. lodash.flatten (git+https://github.com/lodash/lodash.git) +35. lodash.foreach (git+https://github.com/lodash/lodash.git) +36. lodash.map (git+https://github.com/lodash/lodash.git) +37. lodash.merge (git+https://github.com/lodash/lodash.git) +38. lodash.pick (git+https://github.com/lodash/lodash.git) +39. lodash.reduce (git+https://github.com/lodash/lodash.git) +40. lodash.reject (git+https://github.com/lodash/lodash.git) +41. lodash.some (git+https://github.com/lodash/lodash.git) +42. minimatch (git://github.com/isaacs/minimatch.git) +43. mockery (git://github.com/mfncooper/mockery.git) +44. node-uuid (git+https://github.com/broofa/node-uuid.git) +45. nth-check (git+https://github.com/fb55/nth-check.git) +46. once (git://github.com/isaacs/once.git) +47. os (git+https://github.com/DiegoRBaquero/node-os.git) +48. path-is-absolute (git+https://github.com/sindresorhus/path-is-absolute.git) +49. process-nextick-args (git+https://github.com/calvinmetcalf/process-nextick-args.git) +50. q (git://github.com/kriskowal/q.git) +51. readable-stream (git://github.com/nodejs/readable-stream.git) +52. rimraf (git://github.com/isaacs/rimraf.git) +53. safe-buffer (git://github.com/feross/safe-buffer.git) +54. sax (git://github.com/isaacs/sax-js.git) +55. semver (git+https://github.com/npm/node-semver.git) +56. shelljs (git://github.com/arturadib/shelljs.git) +57. string_decoder (git://github.com/nodejs/string_decoder.git) +58. strip-bom (git+https://github.com/sindresorhus/strip-bom.git) +59. util-deprecate (git://github.com/TooTallNate/util-deprecate.git) +60. uuid (git+https://github.com/kelektiv/node-uuid.git) +61. vso-node-api (git+https://github.com/Microsoft/vso-node-api.git) +62. vsts-task-lib (git+https://github.com/Microsoft/vsts-task-lib.git) +63. vsts-task-lib (git+https://github.com/Microsoft/vsts-task-lib.git) +64. vsts-task-lib (git+https://github.com/Microsoft/vsts-task-lib.git) +65. wrappy (git+https://github.com/npm/wrappy.git) +66. xml2js (git+https://github.com/Leonidas-from-XIV/node-xml2js.git) +67. xmlbuilder (git://github.com/oozcitak/xmlbuilder-js.git) + + +%% @types/node NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +MIT License + + Copyright (c) Microsoft Corporation. All rights reserved. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE +========================================= +END OF @types/node NOTICES, INFORMATION, AND LICENSE + +%% @types/q NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +MIT License + + Copyright (c) Microsoft Corporation. All rights reserved. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE +========================================= +END OF @types/q NOTICES, INFORMATION, AND LICENSE + +%% balanced-match NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +(MIT) + +Copyright (c) 2013 Julian Gruber <julian@juliangruber.com> + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +========================================= +END OF balanced-match NOTICES, INFORMATION, AND LICENSE + +%% boolbase NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +NO LICENSE FOUND +========================================= +END OF boolbase NOTICES, INFORMATION, AND LICENSE + +%% brace-expansion NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +MIT License + +Copyright (c) 2013 Julian Gruber + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +========================================= +END OF brace-expansion NOTICES, INFORMATION, AND LICENSE + +%% cheerio NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +NO LICENSE FOUND +========================================= +END OF cheerio NOTICES, INFORMATION, AND LICENSE + +%% codecoverage-tools NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +NO LICENSE FOUND +========================================= +END OF codecoverage-tools NOTICES, INFORMATION, AND LICENSE + +%% concat-map NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +This software is released under the MIT license: + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF concat-map NOTICES, INFORMATION, AND LICENSE + +%% core-util-is NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright Node.js contributors. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. +========================================= +END OF core-util-is NOTICES, INFORMATION, AND LICENSE + +%% css-select NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) Felix Böhm +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +THIS IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +========================================= +END OF css-select NOTICES, INFORMATION, AND LICENSE + +%% css-what NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) Felix Böhm +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +THIS IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +========================================= +END OF css-what NOTICES, INFORMATION, AND LICENSE + +%% dom-serializer NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +License + +(The MIT License) + +Copyright (c) 2014 The cheeriojs contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF dom-serializer NOTICES, INFORMATION, AND LICENSE + +%% domelementtype NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) Felix Böhm +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +THIS IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +========================================= +END OF domelementtype NOTICES, INFORMATION, AND LICENSE + +%% domelementtype NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) Felix Böhm +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +THIS IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +========================================= +END OF domelementtype NOTICES, INFORMATION, AND LICENSE + +%% domhandler NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) Felix Böhm +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +THIS IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +========================================= +END OF domhandler NOTICES, INFORMATION, AND LICENSE + +%% domutils NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) Felix Böhm +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +THIS IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +========================================= +END OF domutils NOTICES, INFORMATION, AND LICENSE + +%% entities NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) Felix Böhm +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +THIS IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +========================================= +END OF entities NOTICES, INFORMATION, AND LICENSE + +%% fs-extra NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +(The MIT License) + +Copyright (c) 2011-2016 JP Richardson + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files +(the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, + merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS +OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF fs-extra NOTICES, INFORMATION, AND LICENSE + +%% fs.realpath NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +---- + +This library bundles a version of the `fs.realpath` and `fs.realpathSync` +methods from Node.js v0.10 under the terms of the Node.js MIT license. + +Node's license follows, also included at the header of `old.js` which contains +the licensed code: + + Copyright Joyent, Inc. and other Node contributors. + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. +========================================= +END OF fs.realpath NOTICES, INFORMATION, AND LICENSE + +%% glob NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF glob NOTICES, INFORMATION, AND LICENSE + +%% glob NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF glob NOTICES, INFORMATION, AND LICENSE + +%% glob NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF glob NOTICES, INFORMATION, AND LICENSE + +%% graceful-fs NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter, Ben Noordhuis, and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF graceful-fs NOTICES, INFORMATION, AND LICENSE + +%% htmlparser2 NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright 2010, 2011, Chris Winberry . All rights reserved. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. +========================================= +END OF htmlparser2 NOTICES, INFORMATION, AND LICENSE + +%% inflight NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF inflight NOTICES, INFORMATION, AND LICENSE + +%% inherits NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF inherits NOTICES, INFORMATION, AND LICENSE + +%% isarray NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +NO LICENSE FOUND +========================================= +END OF isarray NOTICES, INFORMATION, AND LICENSE + +%% jsonfile NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +(The MIT License) + +Copyright (c) 2012-2015, JP Richardson + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files +(the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, + merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS +OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF jsonfile NOTICES, INFORMATION, AND LICENSE + +%% klaw NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +(The MIT License) + +Copyright (c) 2015-2016 JP Richardson + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files +(the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, + merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS +OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF klaw NOTICES, INFORMATION, AND LICENSE + +%% lodash.assignin NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright jQuery Foundation and other contributors + +Based on Underscore.js, copyright Jeremy Ashkenas, +DocumentCloud and Investigative Reporters & Editors + +This software consists of voluntary contributions made by many +individuals. For exact contribution history, see the revision history +available at https://github.com/lodash/lodash + +The following license applies to all parts of this software except as +documented below: + +==== + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +==== + +Copyright and related rights for sample code are waived via CC0. Sample +code is defined as all source code displayed within the prose of the +documentation. + +CC0: http://creativecommons.org/publicdomain/zero/1.0/ + +==== + +Files located in the node_modules and vendor directories are externally +maintained libraries used by this software which have their own +licenses; we recommend you read them, as their terms may differ from the +terms above. +========================================= +END OF lodash.assignin NOTICES, INFORMATION, AND LICENSE + +%% lodash.bind NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright jQuery Foundation and other contributors + +Based on Underscore.js, copyright Jeremy Ashkenas, +DocumentCloud and Investigative Reporters & Editors + +This software consists of voluntary contributions made by many +individuals. For exact contribution history, see the revision history +available at https://github.com/lodash/lodash + +The following license applies to all parts of this software except as +documented below: + +==== + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +==== + +Copyright and related rights for sample code are waived via CC0. Sample +code is defined as all source code displayed within the prose of the +documentation. + +CC0: http://creativecommons.org/publicdomain/zero/1.0/ + +==== + +Files located in the node_modules and vendor directories are externally +maintained libraries used by this software which have their own +licenses; we recommend you read them, as their terms may differ from the +terms above. +========================================= +END OF lodash.bind NOTICES, INFORMATION, AND LICENSE + +%% lodash.defaults NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright jQuery Foundation and other contributors + +Based on Underscore.js, copyright Jeremy Ashkenas, +DocumentCloud and Investigative Reporters & Editors + +This software consists of voluntary contributions made by many +individuals. For exact contribution history, see the revision history +available at https://github.com/lodash/lodash + +The following license applies to all parts of this software except as +documented below: + +==== + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +==== + +Copyright and related rights for sample code are waived via CC0. Sample +code is defined as all source code displayed within the prose of the +documentation. + +CC0: http://creativecommons.org/publicdomain/zero/1.0/ + +==== + +Files located in the node_modules and vendor directories are externally +maintained libraries used by this software which have their own +licenses; we recommend you read them, as their terms may differ from the +terms above. +========================================= +END OF lodash.defaults NOTICES, INFORMATION, AND LICENSE + +%% lodash.filter NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright jQuery Foundation and other contributors + +Based on Underscore.js, copyright Jeremy Ashkenas, +DocumentCloud and Investigative Reporters & Editors + +This software consists of voluntary contributions made by many +individuals. For exact contribution history, see the revision history +available at https://github.com/lodash/lodash + +The following license applies to all parts of this software except as +documented below: + +==== + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +==== + +Copyright and related rights for sample code are waived via CC0. Sample +code is defined as all source code displayed within the prose of the +documentation. + +CC0: http://creativecommons.org/publicdomain/zero/1.0/ + +==== + +Files located in the node_modules and vendor directories are externally +maintained libraries used by this software which have their own +licenses; we recommend you read them, as their terms may differ from the +terms above. +========================================= +END OF lodash.filter NOTICES, INFORMATION, AND LICENSE + +%% lodash.flatten NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright jQuery Foundation and other contributors + +Based on Underscore.js, copyright Jeremy Ashkenas, +DocumentCloud and Investigative Reporters & Editors + +This software consists of voluntary contributions made by many +individuals. For exact contribution history, see the revision history +available at https://github.com/lodash/lodash + +The following license applies to all parts of this software except as +documented below: + +==== + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +==== + +Copyright and related rights for sample code are waived via CC0. Sample +code is defined as all source code displayed within the prose of the +documentation. + +CC0: http://creativecommons.org/publicdomain/zero/1.0/ + +==== + +Files located in the node_modules and vendor directories are externally +maintained libraries used by this software which have their own +licenses; we recommend you read them, as their terms may differ from the +terms above. +========================================= +END OF lodash.flatten NOTICES, INFORMATION, AND LICENSE + +%% lodash.foreach NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright jQuery Foundation and other contributors + +Based on Underscore.js, copyright Jeremy Ashkenas, +DocumentCloud and Investigative Reporters & Editors + +This software consists of voluntary contributions made by many +individuals. For exact contribution history, see the revision history +available at https://github.com/lodash/lodash + +The following license applies to all parts of this software except as +documented below: + +==== + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +==== + +Copyright and related rights for sample code are waived via CC0. Sample +code is defined as all source code displayed within the prose of the +documentation. + +CC0: http://creativecommons.org/publicdomain/zero/1.0/ + +==== + +Files located in the node_modules and vendor directories are externally +maintained libraries used by this software which have their own +licenses; we recommend you read them, as their terms may differ from the +terms above. +========================================= +END OF lodash.foreach NOTICES, INFORMATION, AND LICENSE + +%% lodash.map NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright jQuery Foundation and other contributors + +Based on Underscore.js, copyright Jeremy Ashkenas, +DocumentCloud and Investigative Reporters & Editors + +This software consists of voluntary contributions made by many +individuals. For exact contribution history, see the revision history +available at https://github.com/lodash/lodash + +The following license applies to all parts of this software except as +documented below: + +==== + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +==== + +Copyright and related rights for sample code are waived via CC0. Sample +code is defined as all source code displayed within the prose of the +documentation. + +CC0: http://creativecommons.org/publicdomain/zero/1.0/ + +==== + +Files located in the node_modules and vendor directories are externally +maintained libraries used by this software which have their own +licenses; we recommend you read them, as their terms may differ from the +terms above. +========================================= +END OF lodash.map NOTICES, INFORMATION, AND LICENSE + +%% lodash.merge NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright JS Foundation and other contributors + +Based on Underscore.js, copyright Jeremy Ashkenas, +DocumentCloud and Investigative Reporters & Editors + +This software consists of voluntary contributions made by many +individuals. For exact contribution history, see the revision history +available at https://github.com/lodash/lodash + +The following license applies to all parts of this software except as +documented below: + +==== + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +==== + +Copyright and related rights for sample code are waived via CC0. Sample +code is defined as all source code displayed within the prose of the +documentation. + +CC0: http://creativecommons.org/publicdomain/zero/1.0/ + +==== + +Files located in the node_modules and vendor directories are externally +maintained libraries used by this software which have their own +licenses; we recommend you read them, as their terms may differ from the +terms above. +========================================= +END OF lodash.merge NOTICES, INFORMATION, AND LICENSE + +%% lodash.pick NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright jQuery Foundation and other contributors + +Based on Underscore.js, copyright Jeremy Ashkenas, +DocumentCloud and Investigative Reporters & Editors + +This software consists of voluntary contributions made by many +individuals. For exact contribution history, see the revision history +available at https://github.com/lodash/lodash + +The following license applies to all parts of this software except as +documented below: + +==== + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +==== + +Copyright and related rights for sample code are waived via CC0. Sample +code is defined as all source code displayed within the prose of the +documentation. + +CC0: http://creativecommons.org/publicdomain/zero/1.0/ + +==== + +Files located in the node_modules and vendor directories are externally +maintained libraries used by this software which have their own +licenses; we recommend you read them, as their terms may differ from the +terms above. +========================================= +END OF lodash.pick NOTICES, INFORMATION, AND LICENSE + +%% lodash.reduce NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright jQuery Foundation and other contributors + +Based on Underscore.js, copyright Jeremy Ashkenas, +DocumentCloud and Investigative Reporters & Editors + +This software consists of voluntary contributions made by many +individuals. For exact contribution history, see the revision history +available at https://github.com/lodash/lodash + +The following license applies to all parts of this software except as +documented below: + +==== + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +==== + +Copyright and related rights for sample code are waived via CC0. Sample +code is defined as all source code displayed within the prose of the +documentation. + +CC0: http://creativecommons.org/publicdomain/zero/1.0/ + +==== + +Files located in the node_modules and vendor directories are externally +maintained libraries used by this software which have their own +licenses; we recommend you read them, as their terms may differ from the +terms above. +========================================= +END OF lodash.reduce NOTICES, INFORMATION, AND LICENSE + +%% lodash.reject NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright jQuery Foundation and other contributors + +Based on Underscore.js, copyright Jeremy Ashkenas, +DocumentCloud and Investigative Reporters & Editors + +This software consists of voluntary contributions made by many +individuals. For exact contribution history, see the revision history +available at https://github.com/lodash/lodash + +The following license applies to all parts of this software except as +documented below: + +==== + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +==== + +Copyright and related rights for sample code are waived via CC0. Sample +code is defined as all source code displayed within the prose of the +documentation. + +CC0: http://creativecommons.org/publicdomain/zero/1.0/ + +==== + +Files located in the node_modules and vendor directories are externally +maintained libraries used by this software which have their own +licenses; we recommend you read them, as their terms may differ from the +terms above. +========================================= +END OF lodash.reject NOTICES, INFORMATION, AND LICENSE + +%% lodash.some NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright jQuery Foundation and other contributors + +Based on Underscore.js, copyright Jeremy Ashkenas, +DocumentCloud and Investigative Reporters & Editors + +This software consists of voluntary contributions made by many +individuals. For exact contribution history, see the revision history +available at https://github.com/lodash/lodash + +The following license applies to all parts of this software except as +documented below: + +==== + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +==== + +Copyright and related rights for sample code are waived via CC0. Sample +code is defined as all source code displayed within the prose of the +documentation. + +CC0: http://creativecommons.org/publicdomain/zero/1.0/ + +==== + +Files located in the node_modules and vendor directories are externally +maintained libraries used by this software which have their own +licenses; we recommend you read them, as their terms may differ from the +terms above. +========================================= +END OF lodash.some NOTICES, INFORMATION, AND LICENSE + +%% minimatch NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF minimatch NOTICES, INFORMATION, AND LICENSE + +%% mockery NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyrights for code authored by Yahoo! Inc. is licensed under the following + terms: + + MIT License + + Copyright (c) 2011 Yahoo! Inc. All Rights Reserved. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to + deal in the Software without restriction, including without limitation the + rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. +========================================= +END OF mockery NOTICES, INFORMATION, AND LICENSE + +%% node-uuid NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) 2010-2012 Robert Kieffer + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +========================================= +END OF node-uuid NOTICES, INFORMATION, AND LICENSE + +%% nth-check NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +NO LICENSE FOUND +========================================= +END OF nth-check NOTICES, INFORMATION, AND LICENSE + +%% once NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF once NOTICES, INFORMATION, AND LICENSE + +%% os NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) 2016 Diego Rodríguez Baquero + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +========================================= +END OF os NOTICES, INFORMATION, AND LICENSE + +%% path-is-absolute NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF path-is-absolute NOTICES, INFORMATION, AND LICENSE + +%% process-nextick-args NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +# Copyright (c) 2015 Calvin Metcalf + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +**THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE.** +========================================= +END OF process-nextick-args NOTICES, INFORMATION, AND LICENSE + +%% q NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright 2009–2017 Kristopher Michael Kowal. All rights reserved. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. +========================================= +END OF q NOTICES, INFORMATION, AND LICENSE + +%% readable-stream NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Node.js is licensed for use as follows: + +""" +Copyright Node.js contributors. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. +""" + +This license applies to parts of Node.js originating from the +https://github.com/joyent/node repository: + +""" +Copyright Joyent, Inc. and other Node contributors. All rights reserved. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. +""" +========================================= +END OF readable-stream NOTICES, INFORMATION, AND LICENSE + +%% rimraf NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF rimraf NOTICES, INFORMATION, AND LICENSE + +%% safe-buffer NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) Feross Aboukhadijeh + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF safe-buffer NOTICES, INFORMATION, AND LICENSE + +%% sax NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +==== + +`String.fromCodePoint` by Mathias Bynens used according to terms of MIT +License, as follows: + + Copyright Mathias Bynens + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF sax NOTICES, INFORMATION, AND LICENSE + +%% semver NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF semver NOTICES, INFORMATION, AND LICENSE + +%% shelljs NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) 2012, Artur Adib +All rights reserved. + +You may use this project under the terms of the New BSD license as follows: + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of Artur Adib nor the + names of the contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL ARTUR ADIB BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +========================================= +END OF shelljs NOTICES, INFORMATION, AND LICENSE + +%% string_decoder NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Node.js is licensed for use as follows: + +""" +Copyright Node.js contributors. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. +""" + +This license applies to parts of Node.js originating from the +https://github.com/joyent/node repository: + +""" +Copyright Joyent, Inc. and other Node contributors. All rights reserved. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. +""" +========================================= +END OF string_decoder NOTICES, INFORMATION, AND LICENSE + +%% strip-bom NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF strip-bom NOTICES, INFORMATION, AND LICENSE + +%% util-deprecate NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +(The MIT License) + +Copyright (c) 2014 Nathan Rajlich + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF util-deprecate NOTICES, INFORMATION, AND LICENSE + +%% uuid NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) 2010-2016 Robert Kieffer and other contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +========================================= +END OF uuid NOTICES, INFORMATION, AND LICENSE + +%% vso-node-api NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +NO LICENSE FOUND +========================================= +END OF vso-node-api NOTICES, INFORMATION, AND LICENSE + +%% vsts-task-lib NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) Microsoft Corporation. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +========================================= +END OF vsts-task-lib NOTICES, INFORMATION, AND LICENSE + +%% vsts-task-lib NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) Microsoft Corporation. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +========================================= +END OF vsts-task-lib NOTICES, INFORMATION, AND LICENSE + +%% vsts-task-lib NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) Microsoft Corporation. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +========================================= +END OF vsts-task-lib NOTICES, INFORMATION, AND LICENSE + +%% wrappy NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF wrappy NOTICES, INFORMATION, AND LICENSE + +%% xml2js NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright 2010, 2011, 2012, 2013. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. +========================================= +END OF xml2js NOTICES, INFORMATION, AND LICENSE + +%% xmlbuilder NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) 2013 Ozgur Ozcitak + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF xmlbuilder NOTICES, INFORMATION, AND LICENSE + diff --git a/_generated/ANTV1_Node20/anttask.ts b/_generated/ANTV1_Node20/anttask.ts new file mode 100644 index 000000000000..51109b1dd815 --- /dev/null +++ b/_generated/ANTV1_Node20/anttask.ts @@ -0,0 +1,291 @@ +import * as fs from 'fs'; +import * as os from 'os'; +import * as path from 'path'; +import * as Q from "q"; +import * as tl from 'azure-pipelines-task-lib/task'; + +import * as javacommons from 'azure-pipelines-tasks-java-common/java-common'; +import * as ccUtils from 'azure-pipelines-tasks-codecoverage-tools/codecoverageutilities'; +import {CodeCoverageEnablerFactory} from 'azure-pipelines-tasks-codecoverage-tools/codecoveragefactory'; + +tl.setResourcePath(path.join(__dirname, 'task.json')); + +const TESTRUN_SYSTEM = "VSTS - ant"; +const isWindows = os.type().match(/^Win/); + +function pathExistsAsFile(path: string) { + try { + return tl.stats(path).isFile(); + } + catch (error) { + return false; + } +} + +function publishTestResults(publishJUnitResults, testResultsFiles: string) { + if (publishJUnitResults == 'true') { + //check for pattern in testResultsFiles + let matchingTestResultsFiles; + if (testResultsFiles.indexOf('*') >= 0 || testResultsFiles.indexOf('?') >= 0) { + tl.debug('Pattern found in testResultsFiles parameter'); + const buildFolder = tl.getVariable('System.DefaultWorkingDirectory'); + matchingTestResultsFiles = tl.findMatch(buildFolder, testResultsFiles, null, { matchBase: true }); + } + else { + tl.debug('No pattern found in testResultsFiles parameter'); + matchingTestResultsFiles = [testResultsFiles]; + } + + if (!matchingTestResultsFiles || matchingTestResultsFiles.length === 0) { + console.log(tl.loc('NoTestResults', testResultsFiles)); + return 0; + } + + let tp = new tl.TestPublisher("JUnit"); + const testRunTitle = tl.getInput('testRunTitle'); + + tp.publish(matchingTestResultsFiles, 'true', "", "", testRunTitle, 'true', TESTRUN_SYSTEM); + } +} + +function processAntOutputLine(line) { + if (line == null) { + return; + } + + const javacText = "[javac] "; + //[java] [javac] c:\path\to\file:100: error: error_msg + const compileErrorFileRegexWin = /^(\[java\])?\s*\[javac\]\s*([^:]:[^:]+):(\d+):\s*(.+)$/ + //[java] [javac] /path/to/file:100: error: error_msg + const compileErrorFileRegexUnix = /^(\[java\])?\s*\[javac\]\s*([^:]+):(\d+):\s*(.+)$/ + const compileErrorFileRegex = (isWindows) ? compileErrorFileRegexWin : compileErrorFileRegexUnix; + + let severity = null; + if (line.indexOf(javacText) >= 0) { + // parse javac errors and warnings + const matches = compileErrorFileRegex.exec(line); + if (matches) { + let errorMessage = matches[4]; + if (errorMessage) { + if (errorMessage.startsWith('warning:')) { + severity = 'warning'; + } else if (errorMessage.startsWith('error:')) { + severity = 'error'; + } + } + + tl.command('task.issue', { + type: severity, + sourcepath: matches[2], + linenumber: matches[3], + }, matches[0]); + } + } +} + + + +async function doWork() { + + function execEnableCodeCoverage(): Q.Promise { + return enableCodeCoverage() + .then(function (resp) { + tl.debug("Enabled code coverage successfully"); + return "CodeCoverage_9064e1d0"; + }).catch(function (err) { + tl.warning("Failed to enable code coverage: " + err); + return ""; + }); + }; + + function enableCodeCoverage(): Q.Promise { + if (!isCodeCoverageOpted) { + return Q.resolve(true); + } + + const classFilter: string = tl.getInput('classFilter'); + const classFilesDirectories: string = tl.getInput('classFilesDirectories', true); + const sourceDirectories: string = tl.getInput('srcDirectories'); + // appending with small guid to keep it unique. Avoiding full guid to ensure no long path issues. + const reportDirectoryName = "CCReport43F6D5EF"; + reportDirectory = path.join(buildRootPath, reportDirectoryName); + const reportBuildFileName = "CCReportBuildA4D283EG.xml"; + reportBuildFile = path.join(buildRootPath, reportBuildFileName); + let summaryFileName = ""; + if (ccTool.toLowerCase() == "jacoco") { + summaryFileName = "summary.xml"; + }else if (ccTool.toLowerCase() == "cobertura") { + summaryFileName = "coverage.xml"; + } + summaryFile = path.join(buildRootPath, reportDirectoryName, summaryFileName); + const coberturaCCFile = path.join(buildRootPath, "cobertura.ser"); + let instrumentedClassesDirectory = path.join(buildRootPath, "InstrumentedClasses"); + + // clean any previous reports. + try { + tl.rmRF(coberturaCCFile); + tl.rmRF(reportDirectory); + tl.rmRF(reportBuildFile); + tl.rmRF(instrumentedClassesDirectory); + } catch (err) { + tl.debug("Error removing previous cc files: " + err); + } + + let buildProps: { [key: string]: string } = {}; + buildProps['buildfile'] = antBuildFile; + buildProps['classfilter'] = classFilter + buildProps['classfilesdirectories'] = classFilesDirectories; + buildProps['sourcedirectories'] = sourceDirectories; + buildProps['summaryfile'] = summaryFileName; + buildProps['reportdirectory'] = reportDirectory; + buildProps['ccreporttask'] = "CodeCoverage_9064e1d0" + buildProps['reportbuildfile'] = reportBuildFile; + + let ccEnabler = new CodeCoverageEnablerFactory().getTool("ant", ccTool.toLowerCase()); + return ccEnabler.enableCodeCoverage(buildProps); + } + + async function publishCodeCoverage(codeCoverageOpted: boolean, ccReportTask: string) { + tl.debug("publishCodeCoverage f=" + failIfCodeCoverageEmpty + " opt=" + codeCoverageOpted + " task=" + ccReportTask); + if (failIfCodeCoverageEmpty && codeCoverageOpted && !ccReportTask) { + throw tl.loc('NoCodeCoverage'); + } + else if (codeCoverageOpted && ccReportTask) { + tl.debug("Collecting code coverage reports"); + var antRunner = tl.tool(anttool); + antRunner.arg('-buildfile'); + if (pathExistsAsFile(reportBuildFile)) { + antRunner.arg(reportBuildFile); + antRunner.arg(ccReportTask); + } + else { + antRunner.arg(antBuildFile); + antRunner.arg(ccReportTask); + } + antRunner.exec().then(async function (code) { + if (failIfCodeCoverageEmpty && await ccUtils.isCodeCoverageFileEmpty(summaryFile, ccTool)) { + throw tl.loc('NoCodeCoverage'); + } + if (pathExistsAsFile(summaryFile)) { + tl.debug("Summary file = " + summaryFile); + tl.debug("Report directory = " + reportDirectory); + tl.debug("Publishing code coverage results to TFS"); + let ccPublisher = new tl.CodeCoveragePublisher(); + ccPublisher.publish(ccTool, summaryFile, reportDirectory, ""); + } + else { + tl.warning("No code coverage results found to be published. This could occur if there were no tests executed or there was a build failure. Check the ant output for details."); + } + }).fail(function (err) { + tl.warning("No code coverage results found to be published. This could occur if there were no tests executed or there was a build failure. Check the ant output for details."); + }); + } + } + + try { + var anttool = tl.which('ant', true); + var antv = tl.tool(anttool); + antv.arg('-version'); + + var antb = tl.tool(anttool); + var antBuildFile = tl.getPathInput('antBuildFile', true, true); + antb.arg('-buildfile'); + antb.arg(antBuildFile); + + // options and targets are optional + antb.line(tl.getInput('options', false)); + antb.arg(tl.getDelimitedInput('targets', ' ', false)); + + // update ANT_HOME if user specified path manually (not required, but if so, check it) + var antHomeUserInputPath = tl.getPathInput('antHomeUserInputPath', false, true); + if (antHomeUserInputPath) { + tl.debug('Using path from user input to set ANT_HOME'); + tl.debug('Set ANT_HOME to ' + antHomeUserInputPath); + process.env['ANT_HOME'] = antHomeUserInputPath; + } + + // Warn if ANT_HOME is not set either locally or on the task via antHomeUserInputPath + var antHome = tl.getVariable('ANT_HOME'); + if (!antHome) { + tl.warning('The ANT_HOME environment variable is not set. Please make sure that it exists and is set to the location of the bin folder. See https://ant.apache.org/manual/install.html.'); + } + + // update JAVA_HOME if user selected specific JDK version or set path manually + var javaHomeSelection = tl.getInput('javaHomeSelection', true); + var specifiedJavaHome = null; + var javaTelemetryData = null; + if (javaHomeSelection == 'JDKVersion') { + tl.debug('Using JDK version to find and set JAVA_HOME'); + var jdkVersion = tl.getInput('jdkVersion'); + var jdkArchitecture = tl.getInput('jdkArchitecture'); + javaTelemetryData = { "jdkVersion": jdkVersion }; + + if (jdkVersion != 'default') { + specifiedJavaHome = javacommons.findJavaHome(jdkVersion, jdkArchitecture); + } + } + else { + tl.debug('Using path from user input to set JAVA_HOME'); + var jdkUserInputPath = tl.getPathInput('jdkUserInputPath', true, true); + specifiedJavaHome = jdkUserInputPath; + javaTelemetryData = { "jdkVersion": "custom" }; + } + javacommons.publishJavaTelemetry('Ant', javaTelemetryData); + + if (specifiedJavaHome) { + tl.debug('Set JAVA_HOME to ' + specifiedJavaHome); + process.env['JAVA_HOME'] = specifiedJavaHome; + } + + var ccTool = tl.getInput('codeCoverageTool'); + var isCodeCoverageOpted = (typeof ccTool != "undefined" && ccTool && ccTool.toLowerCase() != 'none'); + var failIfCodeCoverageEmpty: boolean = tl.getBoolInput('failIfCoverageEmpty'); + var buildRootPath = path.dirname(antBuildFile); + + var summaryFile: string = null; + var reportDirectory: string = null; + var ccReportTask: string = null; + var reportBuildFile: string = null; + var publishJUnitResults = tl.getInput('publishJUnitResults'); + var testResultsFiles = tl.getInput('testResultsFiles', true); + var publishJUnitResults = tl.getInput('publishJUnitResults'); + var testResultsFiles = tl.getInput('testResultsFiles', true); + + ccReportTask = await execEnableCodeCoverage(); + + await antv.exec(); + var buffer; + antb.on('stdout', (data) => { + if (data) { + buffer += data.toString(); + let idx = buffer.indexOf(os.EOL); + while (idx > -1) { + let line = buffer.substring(0, idx); + processAntOutputLine(line); + buffer = buffer.substring(idx + os.EOL.length); + idx = buffer.indexOf(os.EOL); + } + } + }); + + await antb.exec() + .then(async function (code) { + publishTestResults(publishJUnitResults, testResultsFiles); + await publishCodeCoverage(isCodeCoverageOpted, ccReportTask); + tl.setResult(tl.TaskResult.Succeeded, "Task succeeded"); + }) + .fail(function (err) { + console.error(err.message); + publishTestResults(publishJUnitResults, testResultsFiles); + tl.debug('taskRunner fail'); + tl.setResult(tl.TaskResult.Failed, err); + }); + } catch (e) { + tl.debug(e.message); + tl.error(e); + tl.setResult(tl.TaskResult.Failed, e.message); + } +} + +doWork(); + diff --git a/_generated/ANTV1_Node20/icon.png b/_generated/ANTV1_Node20/icon.png new file mode 100644 index 000000000000..b9b2b3db07b9 Binary files /dev/null and b/_generated/ANTV1_Node20/icon.png differ diff --git a/_generated/ANTV1_Node20/icon.svg b/_generated/ANTV1_Node20/icon.svg new file mode 100644 index 000000000000..c2bb6a7998f6 --- /dev/null +++ b/_generated/ANTV1_Node20/icon.svg @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_generated/ANTV1_Node20/make.json b/_generated/ANTV1_Node20/make.json new file mode 100644 index 000000000000..94be52b5a32d --- /dev/null +++ b/_generated/ANTV1_Node20/make.json @@ -0,0 +1,12 @@ +{ + "rm": [ + { + "items": [ + "node_modules/azure-pipelines-tasks-java-common/node_modules/azure-pipelines-task-lib", + "node_modules/azure-pipelines-tasks-codecoverage-tools/node_modules/azure-pipelines-task-lib", + "node_modules/mockery" + ], + "options": "-Rf" + } + ] +} \ No newline at end of file diff --git a/_generated/ANTV1_Node20/package-lock.json b/_generated/ANTV1_Node20/package-lock.json new file mode 100644 index 000000000000..ef1f1c885203 --- /dev/null +++ b/_generated/ANTV1_Node20/package-lock.json @@ -0,0 +1,796 @@ +{ + "name": "Ant", + "requires": true, + "lockfileVersion": 1, + "dependencies": { + "@types/cheerio": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@types/cheerio/-/cheerio-0.22.0.tgz", + "integrity": "sha512-dVL3RISC1jdrXilyqmPIga6LmjHwrDbWQoUyHuf/bGjP+HiNtyFJ3Gga1FCu55UYOqbuUGLPzkGkcsplkpSm8Q==" + }, + "@types/concat-stream": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz", + "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==", + "requires": { + "@types/node": "*" + } + }, + "@types/form-data": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", + "integrity": "sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==", + "requires": { + "@types/node": "*" + } + }, + "@types/mocha": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", + "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==" + }, + "@types/node": { + "version": "20.7.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.7.0.tgz", + "integrity": "sha512-zI22/pJW2wUZOVyguFaUL1HABdmSVxpXrzIqkjsHmyUjNhPoWM1CKfvVuXfetHhIok4RY573cqS0mZ1SJEnoTg==" + }, + "@types/q": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.5.tgz", + "integrity": "sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ==" + }, + "@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" + }, + "@types/semver": { + "version": "7.3.9", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.9.tgz", + "integrity": "sha512-L/TMpyURfBkf+o/526Zb6kd/tchUP3iBDEPjqjb+U2MAJhVRxxrmr2fwpe08E7QsV7YLcpq0tUaQ9O9x97ZIxQ==" + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "azure-pipelines-task-lib": { + "version": "5.0.0-preview.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-5.0.0-preview.0.tgz", + "integrity": "sha512-uQJEv+q3/7RD7kgphFd33uXijaPwA1ePYoNkAgZpUhbZUtc2u4JL4ujTT/JJfgXBNW/QQNAiDQ2OC7vOQG/0tg==", + "requires": { + "minimatch": "3.0.5", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "sync-request": "6.1.0", + "uuid": "^3.0.1" + }, + "dependencies": { + "minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "azure-pipelines-tasks-codecoverage-tools": { + "version": "2.201.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-tasks-codecoverage-tools/-/azure-pipelines-tasks-codecoverage-tools-2.201.0.tgz", + "integrity": "sha512-3yl6vbw62gXWxBxMYi5XOF0Rq7JE3KjQtZHDeTDSNLGttsjlm88jEnYU+lsjOqFtnUbnWTX8HB96Vx5c5iL+fA==", + "requires": { + "@types/cheerio": "0.22.0", + "@types/node": "^10.17.0", + "@types/q": "^1.5.4", + "azure-pipelines-task-lib": "^3.1.0", + "cheerio": "1.0.0-rc.6", + "fs-extra": "^0.30.0", + "os": "^0.1.1", + "strip-bom": "^3.0.0", + "xml2js": "^0.4.17" + }, + "dependencies": { + "@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + }, + "azure-pipelines-task-lib": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-3.3.1.tgz", + "integrity": "sha512-56ZAr4MHIoa24VNVuwPL4iUQ5MKaigPoYXkBG8E8fiVmh8yZdatUo25meNoQwg77vDY22F63Q44UzXoMWmy7ag==", + "requires": { + "minimatch": "3.0.5", + "mockery": "^1.7.0", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "sync-request": "6.1.0", + "uuid": "^3.0.1" + } + }, + "minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "azure-pipelines-tasks-java-common": { + "version": "2.198.1", + "resolved": "https://registry.npmjs.org/azure-pipelines-tasks-java-common/-/azure-pipelines-tasks-java-common-2.198.1.tgz", + "integrity": "sha512-LaEdGpC4/5nt3krZOJNIH8r+ZxOEhxocpTH/J//Vx98LeYC6zLGyrmCdTLBrY58nJ9Bo7PD/0ARrasXFPv5VkQ==", + "requires": { + "@types/node": "^10.17.0", + "@types/semver": "^7.3.3", + "azure-pipelines-task-lib": "^3.1.0", + "semver": "^7.3.2" + }, + "dependencies": { + "@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + }, + "azure-pipelines-task-lib": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-3.3.1.tgz", + "integrity": "sha512-56ZAr4MHIoa24VNVuwPL4iUQ5MKaigPoYXkBG8E8fiVmh8yZdatUo25meNoQwg77vDY22F63Q44UzXoMWmy7ag==", + "requires": { + "minimatch": "3.0.5", + "mockery": "^1.7.0", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "sync-request": "6.1.0", + "uuid": "^3.0.1" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } + }, + "minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + }, + "cheerio": { + "version": "1.0.0-rc.6", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.6.tgz", + "integrity": "sha512-hjx1XE1M/D5pAtMgvWwE21QClmAEeGHOIDfycgmndisdNgI6PE1cGRQkMGBcsbUbmEQyWu5PJLUcAOjtQS8DWw==", + "requires": { + "cheerio-select": "^1.3.0", + "dom-serializer": "^1.3.1", + "domhandler": "^4.1.0", + "htmlparser2": "^6.1.0", + "parse5": "^6.0.1", + "parse5-htmlparser2-tree-adapter": "^6.0.1" + } + }, + "cheerio-select": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-1.6.0.tgz", + "integrity": "sha512-eq0GdBvxVFbqWgmCm7M3XGs1I8oLy/nExUnh6oLqmBditPO9AqQJrkslDpMun/hZ0yyTs8L0m85OHp4ho6Qm9g==", + "requires": { + "css-select": "^4.3.0", + "css-what": "^6.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.3.1", + "domutils": "^2.8.0" + } + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "requires": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + } + }, + "css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==" + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, + "dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + } + }, + "domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==" + }, + "domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "requires": { + "domelementtype": "^2.2.0" + } + }, + "domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "requires": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + } + }, + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" + }, + "form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fs-extra": { + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", + "integrity": "sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA==", + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^2.1.0", + "klaw": "^1.0.0", + "path-is-absolute": "^1.0.0", + "rimraf": "^2.2.8" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-intrinsic": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", + "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + } + }, + "get-port": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", + "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==" + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "http-basic": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", + "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", + "requires": { + "caseless": "^0.12.0", + "concat-stream": "^1.6.2", + "http-response-object": "^3.0.1", + "parse-cache-control": "^1.0.1" + } + }, + "http-response-object": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", + "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", + "requires": { + "@types/node": "^10.0.3" + }, + "dependencies": { + "@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + } + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" + }, + "is-core-module": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", + "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", + "requires": { + "has": "^1.0.3" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "jsonfile": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "integrity": "sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==", + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "klaw": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", + "integrity": "sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw==", + "requires": { + "graceful-fs": "^4.1.9" + } + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "mockery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/mockery/-/mockery-1.7.0.tgz", + "integrity": "sha512-gUQA33ayi0tuAhr/rJNZPr7Q7uvlBt4gyJPbi0CDcAfIzIrDu1YgGMFgmAu3stJqBpK57m7+RxUbcS+pt59fKQ==" + }, + "nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "requires": { + "boolbase": "^1.0.0" + } + }, + "object-inspect": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, + "os": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/os/-/os-0.1.2.tgz", + "integrity": "sha512-ZoXJkvAnljwvc56MbvhtKVWmSkzV712k42Is2mA0+0KTSRakq5XXuXpjZjgAt9ctzl51ojhQWakQQpmOvXWfjQ==" + }, + "parse-cache-control": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", + "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==" + }, + "parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" + }, + "parse5-htmlparser2-tree-adapter": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", + "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", + "requires": { + "parse5": "^6.0.1" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "promise": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.2.0.tgz", + "integrity": "sha512-+CMAlLHqwRYwBMXKCP+o8ns7DN+xHDUiI+0nArsiJ9y+kJVPLFxEaSw6Ha9s9H0tftxg2Yzl25wqj9G7m5wLZg==", + "requires": { + "asap": "~2.0.6" + } + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==" + }, + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "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" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "requires": { + "resolve": "^1.1.6" + } + }, + "resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "requires": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==" + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, + "sync-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", + "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==", + "requires": { + "http-response-object": "^3.0.1", + "sync-rpc": "^1.2.1", + "then-request": "^6.0.0" + } + }, + "sync-rpc": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz", + "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==", + "requires": { + "get-port": "^3.1.0" + } + }, + "then-request": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", + "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", + "requires": { + "@types/concat-stream": "^1.6.0", + "@types/form-data": "0.0.33", + "@types/node": "^8.0.0", + "@types/qs": "^6.2.31", + "caseless": "~0.12.0", + "concat-stream": "^1.6.0", + "form-data": "^2.2.0", + "http-basic": "^8.1.1", + "http-response-object": "^3.0.1", + "promise": "^8.0.0", + "qs": "^6.4.0" + }, + "dependencies": { + "@types/node": { + "version": "8.10.66", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", + "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==" + } + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, + "typescript": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "xml2js": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", + "integrity": "sha1-aGwg8hMgnpSr8NG88e+qKRx4J6c=", + "requires": { + "sax": ">=0.6.0", + "xmlbuilder": "~9.0.1" + } + }, + "xmlbuilder": { + "version": "9.0.6", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.6.tgz", + "integrity": "sha1-fIJtjYb0eISwWHLL6dJ7Ab7VA/Y=" + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } + } +} diff --git a/_generated/ANTV1_Node20/package.json b/_generated/ANTV1_Node20/package.json new file mode 100644 index 000000000000..4251b3770070 --- /dev/null +++ b/_generated/ANTV1_Node20/package.json @@ -0,0 +1,20 @@ +{ + "name": "Ant", + "author": "Microsoft Corporation", + "description": "Build with Apache Ant", + "license": "MIT", + "bugs": { + "url": "https://github.com/Microsoft/vso-agent-tasks/issues" + }, + "dependencies": { + "azure-pipelines-task-lib": "^5.0.0-preview.0", + "azure-pipelines-tasks-java-common": "2.198.1", + "azure-pipelines-tasks-codecoverage-tools": "2.201.0", + "xml2js": "^0.4.16", + "@types/node": "^20.3.1", + "@types/mocha": "^5.2.7" + }, + "devDependencies": { + "typescript": "5.1.6" + } +} diff --git a/_generated/ANTV1_Node20/task.json b/_generated/ANTV1_Node20/task.json new file mode 100644 index 000000000000..f67913050571 --- /dev/null +++ b/_generated/ANTV1_Node20/task.json @@ -0,0 +1,278 @@ +{ + "id": "3A6A2D63-F2B2-4E93-BCF9-0CBE22F5DC26", + "name": "Ant", + "friendlyName": "Ant", + "description": "Build with Apache Ant", + "helpUrl": "https://docs.microsoft.com/azure/devops/pipelines/tasks/build/ant", + "helpMarkDown": "[Learn more about this task](https://go.microsoft.com/fwlink/?LinkID=613718) or [see the Ant documentation](http://ant.apache.org/)", + "category": "Build", + "visibility": [ + "Build", + "Release" + ], + "runsOn": [ + "Agent", + "DeploymentGroup" + ], + "author": "Microsoft Corporation", + "version": { + "Major": 1, + "Minor": 229, + "Patch": 1 + }, + "demands": [ + "ant" + ], + "minimumAgentVersion": "1.89.0", + "groups": [ + { + "name": "junitTestResults", + "displayName": "JUnit Test Results", + "isExpanded": true + }, + { + "name": "codeCoverage", + "displayName": "Code Coverage", + "isExpanded": true + }, + { + "name": "advanced", + "displayName": "Advanced", + "isExpanded": false + } + ], + "instanceNameFormat": "Ant $(options) $(antBuildFile)", + "inputs": [ + { + "name": "antBuildFile", + "aliases": [ + "buildFile" + ], + "type": "filePath", + "label": "Ant build file", + "defaultValue": "build.xml", + "required": true, + "helpMarkDown": "Relative path from the repository root to the Ant build file." + }, + { + "name": "options", + "type": "string", + "label": "Options", + "defaultValue": "", + "required": false, + "helpMarkDown": "Provide any options to pass to the Ant command line. You can provide your own properties (for example, ***-DmyProperty=myPropertyValue***) and also use built-in variables (for example, ***-DcollectionId=$(system.collectionId)***). Alternatively, the built-in variables are already set as environment variables during the build and can be passed directly (for example, ***-DcollectionIdAsEnvVar=%SYSTEM_COLLECTIONID%***)." + }, + { + "name": "targets", + "type": "string", + "label": "Target(s)", + "defaultValue": "", + "required": false, + "helpMarkDown": "An optional, space-separated list of targets to build. If not specified, the `default` target will be used. If no `default` target is defined, Ant 1.6.0 and later will build all top-level tasks." + }, + { + "name": "publishJUnitResults", + "type": "boolean", + "label": "Publish to Azure Pipelines", + "required": true, + "defaultValue": "true", + "groupName": "junitTestResults", + "helpMarkDown": "Select this option to publish JUnit test results produced by the Ant build to Azure Pipelines. Each test results file matching `Test Results Files` will be published as a test run in Azure Pipelines." + }, + { + "name": "testResultsFiles", + "type": "filePath", + "label": "Test results files", + "defaultValue": "**/TEST-*.xml", + "required": true, + "groupName": "junitTestResults", + "helpMarkDown": "Test results files path. Wildcards can be used ([more information](https://go.microsoft.com/fwlink/?linkid=856077)). For example, `**/TEST-*.xml` for all XML files whose name starts with TEST-.", + "visibleRule": "publishJUnitResults = true" + }, + { + "name": "testRunTitle", + "type": "string", + "label": "Test run title", + "defaultValue": "", + "required": false, + "groupName": "junitTestResults", + "helpMarkDown": "Provide a name for the test run.", + "visibleRule": "publishJUnitResults = true" + }, + { + "name": "codeCoverageTool", + "aliases": [ + "codeCoverageToolOptions" + ], + "type": "pickList", + "label": "Code coverage tool", + "required": false, + "groupName": "codeCoverage", + "defaultValue": "None", + "helpMarkDown": "Select the code coverage tool. For on-premises agent support, refer to the `More Information` link below.", + "options": { + "None": "None", + "Cobertura": "Cobertura", + "JaCoCo": "JaCoCo" + } + }, + { + "name": "classFilesDirectories", + "aliases": [ + "codeCoverageClassFilesDirectories" + ], + "type": "string", + "label": "Class files directories", + "defaultValue": ".", + "required": true, + "groupName": "codeCoverage", + "helpMarkDown": "Comma-separated list of relative paths from the Ant build file to directories containing class files and archive files (JAR, WAR, etc.). Code coverage is reported for class files in these directories. For example: target/classes,target/testClasses.", + "visibleRule": "codeCoverageTool != None" + }, + { + "name": "classFilter", + "aliases": [ + "codeCoverageClassFilter" + ], + "type": "string", + "label": "Class inclusion/exclusion filters", + "defaultValue": "", + "required": false, + "groupName": "codeCoverage", + "helpMarkDown": "Comma-separated list of filters to include or exclude classes from collecting code coverage. For example: +:com.*,+:org.*,-:my.app*.*.", + "visibleRule": "codeCoverageTool != None" + }, + { + "name": "srcDirectories", + "aliases": [ + "codeCoverageSourceDirectories" + ], + "type": "string", + "label": "Source files directories", + "defaultValue": "", + "required": false, + "groupName": "codeCoverage", + "helpMarkDown": "Comma-separated list of relative paths from the Ant build file to source code directories. Code coverage reports will use these to highlight source code. For example: src/java,src/Test.", + "visibleRule": "codeCoverageTool != None" + }, + { + "name": "failIfCoverageEmpty", + "aliases": [ + "codeCoverageFailIfEmpty" + ], + "type": "boolean", + "label": "Fail when code coverage results are missing", + "defaultValue": "false", + "required": false, + "groupName": "codeCoverage", + "helpMarkDown": "Fail the build if code coverage did not produce any results to publish.", + "visibleRule": "codeCoverageTool != None" + }, + { + "name": "antHomeUserInputPath", + "aliases": [ + "antHomeDirectory" + ], + "type": "string", + "label": "Set ANT_HOME path", + "required": false, + "groupName": "advanced", + "defaultValue": "", + "helpMarkDown": "If set, overrides any existing ANT_HOME environment variable with the given path." + }, + { + "name": "javaHomeSelection", + "aliases": [ + "javaHomeOption" + ], + "type": "radio", + "label": "Set JAVA_HOME by", + "required": true, + "groupName": "advanced", + "defaultValue": "JDKVersion", + "helpMarkDown": "Sets JAVA_HOME either by selecting a JDK version that will be discovered during builds or by manually entering a JDK path.", + "options": { + "JDKVersion": "JDK Version", + "Path": "Path" + } + }, + { + "name": "jdkVersion", + "aliases": [ + "jdkVersionOption" + ], + "type": "pickList", + "label": "JDK version", + "required": false, + "groupName": "advanced", + "defaultValue": "default", + "helpMarkDown": "Will attempt to discover the path to the selected JDK version and set JAVA_HOME accordingly.", + "visibleRule": "javaHomeSelection = JDKVersion", + "options": { + "default": "default", + "1.11": "JDK 11", + "1.10": "JDK 10 (out of support)", + "1.9": "JDK 9 (out of support)", + "1.8": "JDK 8", + "1.7": "JDK 7", + "1.6": "JDK 6 (out of support)" + } + }, + { + "name": "jdkUserInputPath", + "aliases": [ + "jdkUserInputDirectory" + ], + "type": "string", + "label": "JDK path", + "required": true, + "groupName": "advanced", + "defaultValue": "", + "helpMarkDown": "Sets JAVA_HOME to the given path.", + "visibleRule": "javaHomeSelection = Path" + }, + { + "name": "jdkArchitecture", + "aliases": [ + "jdkArchitectureOption" + ], + "type": "pickList", + "label": "JDK architecture", + "defaultValue": "x64", + "required": false, + "helpMarkDown": "Optionally supply the architecture (x86, x64) of the JDK.", + "visibleRule": "jdkVersion != default", + "groupName": "advanced", + "options": { + "x86": "x86", + "x64": "x64" + } + } + ], + "execution": { + "Node10": { + "target": "anttask.js", + "argumentFormat": "" + }, + "Node16": { + "target": "anttask.js", + "argumentFormat": "" + }, + "Node20": { + "target": "anttask.js", + "argumentFormat": "" + } + }, + "messages": { + "LocateJVMBasedOnVersionAndArch": "Locate JAVA_HOME for Java %s %s", + "UnsupportedJdkWarning": "JDK 9 and JDK 10 are out of support. Please switch to a later version in your project and pipeline. Attempting to build with JDK 11...", + "FailedToLocateSpecifiedJVM": "Failed to find the specified JDK version. Please ensure the specified JDK version is installed on the agent and the environment variable '%s' exists and is set to the location of a corresponding JDK or use the [Java Tool Installer](https://go.microsoft.com/fwlink/?linkid=875287) task to install the desired JDK.", + "DiscontinueAntCodeCoverage": "We are discontinuing the support of automated code coverage report generation for Ant projects. Please refer to https://go.microsoft.com/fwlink/?linkid=875306 for more details.", + "NoCodeCoverage": "No code coverage results were found to publish.", + "NoTestResults": "No test result files matching %s were found, so publishing JUnit test results is being skipped." + }, + "_buildConfigMapping": { + "Default": "1.229.0", + "Node20-225": "1.229.1" + } +} \ No newline at end of file diff --git a/_generated/ANTV1_Node20/task.loc.json b/_generated/ANTV1_Node20/task.loc.json new file mode 100644 index 000000000000..396fa4b7a362 --- /dev/null +++ b/_generated/ANTV1_Node20/task.loc.json @@ -0,0 +1,278 @@ +{ + "id": "3A6A2D63-F2B2-4E93-BCF9-0CBE22F5DC26", + "name": "Ant", + "friendlyName": "ms-resource:loc.friendlyName", + "description": "ms-resource:loc.description", + "helpUrl": "https://docs.microsoft.com/azure/devops/pipelines/tasks/build/ant", + "helpMarkDown": "ms-resource:loc.helpMarkDown", + "category": "Build", + "visibility": [ + "Build", + "Release" + ], + "runsOn": [ + "Agent", + "DeploymentGroup" + ], + "author": "Microsoft Corporation", + "version": { + "Major": 1, + "Minor": 229, + "Patch": 1 + }, + "demands": [ + "ant" + ], + "minimumAgentVersion": "1.89.0", + "groups": [ + { + "name": "junitTestResults", + "displayName": "ms-resource:loc.group.displayName.junitTestResults", + "isExpanded": true + }, + { + "name": "codeCoverage", + "displayName": "ms-resource:loc.group.displayName.codeCoverage", + "isExpanded": true + }, + { + "name": "advanced", + "displayName": "ms-resource:loc.group.displayName.advanced", + "isExpanded": false + } + ], + "instanceNameFormat": "ms-resource:loc.instanceNameFormat", + "inputs": [ + { + "name": "antBuildFile", + "aliases": [ + "buildFile" + ], + "type": "filePath", + "label": "ms-resource:loc.input.label.antBuildFile", + "defaultValue": "build.xml", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.antBuildFile" + }, + { + "name": "options", + "type": "string", + "label": "ms-resource:loc.input.label.options", + "defaultValue": "", + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.options" + }, + { + "name": "targets", + "type": "string", + "label": "ms-resource:loc.input.label.targets", + "defaultValue": "", + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.targets" + }, + { + "name": "publishJUnitResults", + "type": "boolean", + "label": "ms-resource:loc.input.label.publishJUnitResults", + "required": true, + "defaultValue": "true", + "groupName": "junitTestResults", + "helpMarkDown": "ms-resource:loc.input.help.publishJUnitResults" + }, + { + "name": "testResultsFiles", + "type": "filePath", + "label": "ms-resource:loc.input.label.testResultsFiles", + "defaultValue": "**/TEST-*.xml", + "required": true, + "groupName": "junitTestResults", + "helpMarkDown": "ms-resource:loc.input.help.testResultsFiles", + "visibleRule": "publishJUnitResults = true" + }, + { + "name": "testRunTitle", + "type": "string", + "label": "ms-resource:loc.input.label.testRunTitle", + "defaultValue": "", + "required": false, + "groupName": "junitTestResults", + "helpMarkDown": "ms-resource:loc.input.help.testRunTitle", + "visibleRule": "publishJUnitResults = true" + }, + { + "name": "codeCoverageTool", + "aliases": [ + "codeCoverageToolOptions" + ], + "type": "pickList", + "label": "ms-resource:loc.input.label.codeCoverageTool", + "required": false, + "groupName": "codeCoverage", + "defaultValue": "None", + "helpMarkDown": "ms-resource:loc.input.help.codeCoverageTool", + "options": { + "None": "None", + "Cobertura": "Cobertura", + "JaCoCo": "JaCoCo" + } + }, + { + "name": "classFilesDirectories", + "aliases": [ + "codeCoverageClassFilesDirectories" + ], + "type": "string", + "label": "ms-resource:loc.input.label.classFilesDirectories", + "defaultValue": ".", + "required": true, + "groupName": "codeCoverage", + "helpMarkDown": "ms-resource:loc.input.help.classFilesDirectories", + "visibleRule": "codeCoverageTool != None" + }, + { + "name": "classFilter", + "aliases": [ + "codeCoverageClassFilter" + ], + "type": "string", + "label": "ms-resource:loc.input.label.classFilter", + "defaultValue": "", + "required": false, + "groupName": "codeCoverage", + "helpMarkDown": "ms-resource:loc.input.help.classFilter", + "visibleRule": "codeCoverageTool != None" + }, + { + "name": "srcDirectories", + "aliases": [ + "codeCoverageSourceDirectories" + ], + "type": "string", + "label": "ms-resource:loc.input.label.srcDirectories", + "defaultValue": "", + "required": false, + "groupName": "codeCoverage", + "helpMarkDown": "ms-resource:loc.input.help.srcDirectories", + "visibleRule": "codeCoverageTool != None" + }, + { + "name": "failIfCoverageEmpty", + "aliases": [ + "codeCoverageFailIfEmpty" + ], + "type": "boolean", + "label": "ms-resource:loc.input.label.failIfCoverageEmpty", + "defaultValue": "false", + "required": false, + "groupName": "codeCoverage", + "helpMarkDown": "ms-resource:loc.input.help.failIfCoverageEmpty", + "visibleRule": "codeCoverageTool != None" + }, + { + "name": "antHomeUserInputPath", + "aliases": [ + "antHomeDirectory" + ], + "type": "string", + "label": "ms-resource:loc.input.label.antHomeUserInputPath", + "required": false, + "groupName": "advanced", + "defaultValue": "", + "helpMarkDown": "ms-resource:loc.input.help.antHomeUserInputPath" + }, + { + "name": "javaHomeSelection", + "aliases": [ + "javaHomeOption" + ], + "type": "radio", + "label": "ms-resource:loc.input.label.javaHomeSelection", + "required": true, + "groupName": "advanced", + "defaultValue": "JDKVersion", + "helpMarkDown": "ms-resource:loc.input.help.javaHomeSelection", + "options": { + "JDKVersion": "JDK Version", + "Path": "Path" + } + }, + { + "name": "jdkVersion", + "aliases": [ + "jdkVersionOption" + ], + "type": "pickList", + "label": "ms-resource:loc.input.label.jdkVersion", + "required": false, + "groupName": "advanced", + "defaultValue": "default", + "helpMarkDown": "ms-resource:loc.input.help.jdkVersion", + "visibleRule": "javaHomeSelection = JDKVersion", + "options": { + "default": "default", + "1.11": "JDK 11", + "1.10": "JDK 10 (out of support)", + "1.9": "JDK 9 (out of support)", + "1.8": "JDK 8", + "1.7": "JDK 7", + "1.6": "JDK 6 (out of support)" + } + }, + { + "name": "jdkUserInputPath", + "aliases": [ + "jdkUserInputDirectory" + ], + "type": "string", + "label": "ms-resource:loc.input.label.jdkUserInputPath", + "required": true, + "groupName": "advanced", + "defaultValue": "", + "helpMarkDown": "ms-resource:loc.input.help.jdkUserInputPath", + "visibleRule": "javaHomeSelection = Path" + }, + { + "name": "jdkArchitecture", + "aliases": [ + "jdkArchitectureOption" + ], + "type": "pickList", + "label": "ms-resource:loc.input.label.jdkArchitecture", + "defaultValue": "x64", + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.jdkArchitecture", + "visibleRule": "jdkVersion != default", + "groupName": "advanced", + "options": { + "x86": "x86", + "x64": "x64" + } + } + ], + "execution": { + "Node10": { + "target": "anttask.js", + "argumentFormat": "" + }, + "Node16": { + "target": "anttask.js", + "argumentFormat": "" + }, + "Node20": { + "target": "anttask.js", + "argumentFormat": "" + } + }, + "messages": { + "LocateJVMBasedOnVersionAndArch": "ms-resource:loc.messages.LocateJVMBasedOnVersionAndArch", + "UnsupportedJdkWarning": "ms-resource:loc.messages.UnsupportedJdkWarning", + "FailedToLocateSpecifiedJVM": "ms-resource:loc.messages.FailedToLocateSpecifiedJVM", + "DiscontinueAntCodeCoverage": "ms-resource:loc.messages.DiscontinueAntCodeCoverage", + "NoCodeCoverage": "ms-resource:loc.messages.NoCodeCoverage", + "NoTestResults": "ms-resource:loc.messages.NoTestResults" + }, + "_buildConfigMapping": { + "Default": "1.229.0", + "Node20-225": "1.229.1" + } +} \ No newline at end of file diff --git a/_generated/ANTV1_Node20/tsconfig.json b/_generated/ANTV1_Node20/tsconfig.json new file mode 100644 index 000000000000..79a868c8d1e3 --- /dev/null +++ b/_generated/ANTV1_Node20/tsconfig.json @@ -0,0 +1,9 @@ +{ + "compilerOptions": { + "target": "ES6", + "module": "commonjs" + }, + "exclude": [ + "node_modules" + ] +} \ No newline at end of file diff --git a/_generated/AndroidSigningV2.versionmap.txt b/_generated/AndroidSigningV2.versionmap.txt new file mode 100644 index 000000000000..22bfac82ab29 --- /dev/null +++ b/_generated/AndroidSigningV2.versionmap.txt @@ -0,0 +1,2 @@ +Default|2.229.0 +Node20-225|2.229.1 diff --git a/_generated/AndroidSigningV2/Strings/resources.resjson/de-DE/resources.resjson b/_generated/AndroidSigningV2/Strings/resources.resjson/de-DE/resources.resjson new file mode 100644 index 000000000000..754857e067df --- /dev/null +++ b/_generated/AndroidSigningV2/Strings/resources.resjson/de-DE/resources.resjson @@ -0,0 +1,32 @@ +{ + "loc.friendlyName": "Android-Signatur", + "loc.helpMarkDown": "[Weitere Informationen zu dieser Aufgabe](https://go.microsoft.com/fwlink/?LinkID=613717)", + "loc.description": "Android-APK-Dateien signieren und ausrichten", + "loc.instanceNameFormat": "APK-Dateien $(files) werden signiert und ausgerichtet", + "loc.group.displayName.jarsignerOptions": "Signaturoptionen", + "loc.group.displayName.zipalignOptions": "Zipalign-Optionen", + "loc.input.label.files": "APK-Dateien", + "loc.input.help.files": "Der relative Pfad vom Repositorystamm zur APK-Datei bzw. den APK-Dateien, die Sie signieren möchten. Sie können Platzhalter verwenden, um mehrere Dateien anzugeben ([weitere Informationen](https://go.microsoft.com/fwlink/?linkid=856077)). Beispiel: \"**/bin/*.apk\" für alle APK-Dateien im Unterordner \"bin\".", + "loc.input.label.jarsign": "APK signieren", + "loc.input.help.jarsign": "Wählen Sie diese Option aus, wenn Sie die APK-Datei mit einer bereitgestellten KeyStore-Datei signieren möchten. Unsignierte APKs können nur in einem Emulator ausgeführt werden. APKs müssen signiert werden, um auf einem Gerät ausgeführt zu werden. ", + "loc.input.label.keystoreFile": "Keystore-Datei", + "loc.input.help.keystoreFile": "Wählen Sie die Keystore-Datei aus, die zum Signieren des APK in \"Sichere Dateien\" hochgeladen wurde.", + "loc.input.label.keystorePass": "Keystore-Kennwort", + "loc.input.help.keystorePass": "Geben Sie das Kennwort die KeyStore-Datei an. Verwenden Sie eine neue Variable, deren Sperre auf der Registerkarte \"Variablen\" aktiviert ist, um den Wert zu verschlüsseln.", + "loc.input.label.keystoreAlias": "Alias", + "loc.input.help.keystoreAlias": "Geben Sie den Alias an, der das öffentliche/private Schlüsselpaar identifiziert, das in der KeyStore-Datei verwendet werden soll.", + "loc.input.label.keyPass": "Schlüsselkennwort", + "loc.input.help.keyPass": "Geben Sie das Schlüsselkennwort für den Alias und die KeyStore-Datei an. Verwenden Sie eine neue Variable, deren Sperre auf der Registerkarte \"Variablen\" aktiviert ist, um den Wert zu verschlüsseln.", + "loc.input.label.jarsignerArguments": "Jarsigner-Argumente", + "loc.input.help.jarsignerArguments": "Geben Sie alle Optionen an, die an die Jarsigner-Befehlszeile übergeben werden sollen. Die Standardoptionen lauten: -verbose -sigalg MD5withRSA -digestalg SHA1", + "loc.input.label.zipalign": "Zipalign", + "loc.input.help.zipalign": "Geben Sie an, ob Ihr Paket mit Zipalign verarbeitet werden soll. Dadurch wird der von einer App benötigte Arbeitsspeicherplatz reduziert.", + "loc.input.label.zipalignLocation": "Zipalign-Speicherort", + "loc.input.help.zipalignLocation": "Geben Sie optional den Pfad zu der beim Signieren verwendeten ausführbaren Zipalign-Datei an. Standardmäßig handelt es sich hierbei um die Zipalign-Datei, die sich in dem für Ihren Anwendungsbuild verwendeten Android SDK-Versionsordner befindet.", + "loc.messages.AndroidHomeNotSet": "Die ANDROID_HOME-Umgebungsvariable ist für den ausführenden Benutzer nicht festgelegt.", + "loc.messages.CouldNotFindZipalign": "Das Zipalign-Tool wurde nicht gefunden.", + "loc.messages.CouldNotFindZipalignInAndroidHome": "Das Zipalign-Tool wurde nicht gefunden in ANDROID_HOME: %s.", + "loc.messages.JavaHomeNotSet": "Die JAVA_HOME-Umgebungsvariable ist für den ausführenden Benutzer nicht festgelegt.", + "loc.messages.NoMatchingFiles": "Keine mit dem Suchmuster übereinstimmenden Dateien wurden gefunden: %s", + "loc.messages.DeleteKeystoreFileFailed": "Fehler beim Löschen der Keystore-Datei, die vom Server heruntergeladen wurde: %s" +} \ No newline at end of file diff --git a/_generated/AndroidSigningV2/Strings/resources.resjson/en-US/resources.resjson b/_generated/AndroidSigningV2/Strings/resources.resjson/en-US/resources.resjson new file mode 100644 index 000000000000..f476a8866b97 --- /dev/null +++ b/_generated/AndroidSigningV2/Strings/resources.resjson/en-US/resources.resjson @@ -0,0 +1,32 @@ +{ + "loc.friendlyName": "Android signing", + "loc.helpMarkDown": "[Learn more about this task](https://go.microsoft.com/fwlink/?LinkID=613717)", + "loc.description": "Sign and align Android APK files", + "loc.instanceNameFormat": "Signing and aligning APK file(s) $(files)", + "loc.group.displayName.jarsignerOptions": "Signing Options", + "loc.group.displayName.zipalignOptions": "Zipalign Options", + "loc.input.label.files": "APK files", + "loc.input.help.files": "Relative path from the repo root to the APK(s) you want to sign. You can use wildcards to specify multiple files ([more information](https://go.microsoft.com/fwlink/?linkid=856077)). For example, `**/bin/*.apk` for all .APK files in the 'bin' subfolder", + "loc.input.label.jarsign": "Sign the APK", + "loc.input.help.jarsign": "Select this option to sign the APK with a provided keystore file. Unsigned APKs can only run in an emulator. APKs must be signed to run on a device.", + "loc.input.label.keystoreFile": "Keystore file", + "loc.input.help.keystoreFile": "Select the keystore file that was uploaded to `Secure Files` to be used to sign the APK.", + "loc.input.label.keystorePass": "Keystore password", + "loc.input.help.keystorePass": "Enter the password for the provided keystore file. Use a new variable with its lock enabled on the Variables tab to encrypt this value.", + "loc.input.label.keystoreAlias": "Alias", + "loc.input.help.keystoreAlias": "Enter the alias that identifies the public/private key pair to be used in the keystore file.", + "loc.input.label.keyPass": "Key password", + "loc.input.help.keyPass": "Enter the key password for the alias and keystore file. Use a new variable with its lock enabled on the Variables tab to encrypt this value.", + "loc.input.label.jarsignerArguments": "Jarsigner arguments", + "loc.input.help.jarsignerArguments": "Provide any options to pass to the jarsigner command line. Default is: -verbose -sigalg MD5withRSA -digestalg SHA1", + "loc.input.label.zipalign": "Zipalign", + "loc.input.help.zipalign": "Select if you want to zipalign your package. This reduces the amount of RAM consumed by an app.", + "loc.input.label.zipalignLocation": "Zipalign location", + "loc.input.help.zipalignLocation": "Optionally specify the location of the zipalign executable used during signing. This defaults to the zipalign found in the Android SDK version folder that your application builds against.", + "loc.messages.AndroidHomeNotSet": "The ANDROID_HOME environment variable is not set for the running user.", + "loc.messages.CouldNotFindZipalign": "Could not find the zipalign tool.", + "loc.messages.CouldNotFindZipalignInAndroidHome": "Could not find the zipalign tool inside ANDROID_HOME: %s", + "loc.messages.JavaHomeNotSet": "The JAVA_HOME environment variable is not set for the running user.", + "loc.messages.NoMatchingFiles": "No matching files were found with search pattern: %s", + "loc.messages.DeleteKeystoreFileFailed": "Failed to delete keystore file downloaded from the server: %s" +} \ No newline at end of file diff --git a/_generated/AndroidSigningV2/Strings/resources.resjson/es-ES/resources.resjson b/_generated/AndroidSigningV2/Strings/resources.resjson/es-ES/resources.resjson new file mode 100644 index 000000000000..d35f8701d6cd --- /dev/null +++ b/_generated/AndroidSigningV2/Strings/resources.resjson/es-ES/resources.resjson @@ -0,0 +1,32 @@ +{ + "loc.friendlyName": "Firma de Android", + "loc.helpMarkDown": "[Obtener más información acerca de esta tarea](https://go.microsoft.com/fwlink/?LinkID=613717)", + "loc.description": "Firmar y alinear archivos APK de Android", + "loc.instanceNameFormat": "Firma y alineación de archivos APK $(files)", + "loc.group.displayName.jarsignerOptions": "Opciones de firma", + "loc.group.displayName.zipalignOptions": "Opciones de Zipalign", + "loc.input.label.files": "Archivos APK", + "loc.input.help.files": "Ruta de acceso relativa de la raíz del repositorio a los APK que desea firmar. Puede usar caracteres comodín para especificar varios archivos ([más información](https://go.microsoft.com/fwlink/?linkid=856077)). Por ejemplo, \"**/bin/*.apk\" para todos los archivos .APK en la subcarpeta \"bin\"", + "loc.input.label.jarsign": "Firmar el APK", + "loc.input.help.jarsign": "Seleccione esta opción para firmar el APK con un archivo de almacén de claves proporcionado. Los APK sin firma solo se pueden ejecutar en un emulador. Deben estar firmados para poder ejecutarlos en un dispositivo.", + "loc.input.label.keystoreFile": "Archivo del almacén de claves", + "loc.input.help.keystoreFile": "Seleccione el archivo de almacén de claves que se cargó en \"Archivos seguros\" a fin de usarlo para firmar el APK.", + "loc.input.label.keystorePass": "Contraseña del almacén de claves", + "loc.input.help.keystorePass": "Escriba la contraseña del archivo de almacén de claves proporcionado. Utilice una variable nueva con el bloqueo habilitado en la ficha Variables para cifrar este valor.", + "loc.input.label.keystoreAlias": "Alias", + "loc.input.help.keystoreAlias": "Escriba el alias que identifica el par de claves pública/privada que debe usarse en el archivo de almacén de claves.", + "loc.input.label.keyPass": "Contraseña de clave", + "loc.input.help.keyPass": "Escriba la contraseña de clave del alias y el archivo de almacén de claves. Utilice una variable nueva con el bloqueo habilitado en la ficha Variables para cifrar este valor.", + "loc.input.label.jarsignerArguments": "Argumentos de Jarsigner", + "loc.input.help.jarsignerArguments": "Proporcione cualquier opción para pasar a la línea de comandos de Jarsigner. El valor predeterminado es: -verbose -sigalg MD5withRSA -digestalg SHA1", + "loc.input.label.zipalign": "Zipalign", + "loc.input.help.zipalign": "Seleccione si desea optimizar el paquete con zipalign. Esta acción disminuye la cantidad de RAM que consume una aplicación.", + "loc.input.label.zipalignLocation": "Ubicación de Zipalign", + "loc.input.help.zipalignLocation": "Especifique opcionalmente la ubicación del ejecutable zipalign usado durante la firma. Se establece como valor predeterminado el ejecutable zipalign que se encuentra en la carpeta de la versión de Android SDK en que se compila la aplicación.", + "loc.messages.AndroidHomeNotSet": "La variable de entorno ANDROID_HOME no está definida para el usuario actual.", + "loc.messages.CouldNotFindZipalign": "No se encuentra la herramiena zipalign.", + "loc.messages.CouldNotFindZipalignInAndroidHome": "No se encuentra la herramienta zipalign en ANDROID_HOME: %s", + "loc.messages.JavaHomeNotSet": "La variable de entorno JAVA_HOME no está definida para el usuario actual.", + "loc.messages.NoMatchingFiles": "No se encontraron archivos coincidentes con el patrón de búsqueda: %s", + "loc.messages.DeleteKeystoreFileFailed": "No se pudo eliminar el archivo de almacén de claves descargado del servidor: %s" +} \ No newline at end of file diff --git a/_generated/AndroidSigningV2/Strings/resources.resjson/fr-FR/resources.resjson b/_generated/AndroidSigningV2/Strings/resources.resjson/fr-FR/resources.resjson new file mode 100644 index 000000000000..8f39a15703a7 --- /dev/null +++ b/_generated/AndroidSigningV2/Strings/resources.resjson/fr-FR/resources.resjson @@ -0,0 +1,32 @@ +{ + "loc.friendlyName": "Signature Android", + "loc.helpMarkDown": "[En savoir plus sur cette tâche](https://go.microsoft.com/fwlink/?LinkID=613717)", + "loc.description": "Signer et aligner les fichiers APK Android", + "loc.instanceNameFormat": "Signature et alignement de fichiers APK $(files)", + "loc.group.displayName.jarsignerOptions": "Options de signature", + "loc.group.displayName.zipalignOptions": "Options Zipalign", + "loc.input.label.files": "Fichiers APK", + "loc.input.help.files": "Chemin relatif entre la racine du dépôt et le ou les fichiers APK à signer. Vous pouvez utiliser des caractères génériques pour spécifier plusieurs fichiers ([Plus d'informations](https://go.microsoft.com/fwlink/?linkid=856077)). Par exemple, '**/bin/*.apk' pour tous les fichiers .APK du sous-dossier 'bin'", + "loc.input.label.jarsign": "Signer le fichier APK", + "loc.input.help.jarsign": "Sélectionnez cette option pour signer le fichier APK avec le fichier de magasin de clés fourni. Les fichiers APK non signés peuvent uniquement s'exécuter dans un émulateur. Les fichiers APK doivent être signés pour pouvoir s'exécuter sur un appareil.", + "loc.input.label.keystoreFile": "Fichier du magasin de clés", + "loc.input.help.keystoreFile": "Sélectionnez le fichier de magasin de clés chargé dans 'Fichiers sécurisés' à utiliser pour signer le fichier APK.", + "loc.input.label.keystorePass": "Mot de passe du magasin de clés", + "loc.input.help.keystorePass": "Entrez le mot de passe du fichier de magasin de clés fourni. Pour chiffrer cette valeur, utilisez une nouvelle variable en activant son verrou sous l'onglet Variables.", + "loc.input.label.keystoreAlias": "Alias", + "loc.input.help.keystoreAlias": "Entrez l'alias qui identifie la paire de clés publiques/privées à utiliser dans le fichier de magasin de clés.", + "loc.input.label.keyPass": "Mot de passe de la clé", + "loc.input.help.keyPass": "Entrez le mot de passe de clé pour l'alias et le fichier de magasin de clés. Pour chiffrer cette valeur, utilisez une nouvelle variable en activant son verrou sous l'onglet Variables.", + "loc.input.label.jarsignerArguments": "Arguments Jarsigner", + "loc.input.help.jarsignerArguments": "Indiquez les éventuelles options pour passer à la ligne de commande jarsigner. Valeur par défaut : -verbose -sigalg MD5withRSA -digestalg SHA1", + "loc.input.label.zipalign": "Zipalign", + "loc.input.help.zipalign": "Sélectionnez cette option si vous voulez compresser votre package dans un fichier zipalign. Cela réduit la quantité de RAM consommée par une application.", + "loc.input.label.zipalignLocation": "Emplacement de Zipalign", + "loc.input.help.zipalignLocation": "Indiquez éventuellement l'emplacement de l'exécutable zipalign utilisé lors de la signature. Il s'agit par défaut du fichier zipalign disponible dans le dossier de la version Android SDK sur laquelle repose votre application.", + "loc.messages.AndroidHomeNotSet": "La variable d'environnement ANDROID_HOME n'est pas définie pour l'utilisateur actuel.", + "loc.messages.CouldNotFindZipalign": "L'outil zipalign est introuvable.", + "loc.messages.CouldNotFindZipalignInAndroidHome": "L'outil zipalign est introuvable dans ANDROID_HOME : %s", + "loc.messages.JavaHomeNotSet": "La variable d'environnement JAVA_HOME n'est pas définie pour l'utilisateur actuel.", + "loc.messages.NoMatchingFiles": "Il n'existe aucun fichier correspondant au modèle de recherche : %s", + "loc.messages.DeleteKeystoreFileFailed": "Échec de la suppression du fichier de magasin de clés téléchargé à partir du serveur : %s" +} \ No newline at end of file diff --git a/_generated/AndroidSigningV2/Strings/resources.resjson/it-IT/resources.resjson b/_generated/AndroidSigningV2/Strings/resources.resjson/it-IT/resources.resjson new file mode 100644 index 000000000000..ba51ec6c21ba --- /dev/null +++ b/_generated/AndroidSigningV2/Strings/resources.resjson/it-IT/resources.resjson @@ -0,0 +1,32 @@ +{ + "loc.friendlyName": "Firma per Android", + "loc.helpMarkDown": "[Altre informazioni su questa attività](https://go.microsoft.com/fwlink/?LinkID=613717)", + "loc.description": "Consente di firmare e allineare i file APK di Android", + "loc.instanceNameFormat": "Firma e allineamento dei file APK $(files)", + "loc.group.displayName.jarsignerOptions": "Opzioni di firma", + "loc.group.displayName.zipalignOptions": "Opzioni Zipalign", + "loc.input.label.files": "File APK", + "loc.input.help.files": "Percorso relativo dalla radice del repository ai file APK da firmare. Per specificare più file, è possibile usare i caratteri jolly, ad esempio `**/bin/*.apk` per tutti i file APK presenti nella sottocartella 'bin'. [Altre informazioni](https://go.microsoft.com/fwlink/?linkid=856077)", + "loc.input.label.jarsign": "Firma APK", + "loc.input.help.jarsign": "Selezionare questa opzione per firmare l'APK con un file dell'archivio chiavi fornito. Per essere eseguiti in un dispositivo, gli APK devono essere firmati. Gli APK senza firma possono essere eseguiti sono in un emulatore.", + "loc.input.label.keystoreFile": "File dell'archivio chiavi", + "loc.input.help.keystoreFile": "Consente di selezionare il file dell'archivio chiavi caricato in `File protetti` da usare per firmare l'APK.", + "loc.input.label.keystorePass": "Password dell'archivio chiavi", + "loc.input.help.keystorePass": "Immettere la password per il file dell'archivio chiavi fornito. Per crittografare questo valore, usare una nuova variabile con il blocco abilitato nella scheda Variabili.", + "loc.input.label.keystoreAlias": "Alias", + "loc.input.help.keystoreAlias": "Immettere l'alias che identifica la coppia di chiavi pubblica/privata da usare nel file dell'archivio chiavi.", + "loc.input.label.keyPass": "Password della chiave", + "loc.input.help.keyPass": "Immettere la password chiave per il file dell'archivio chiavi e l'alias. Per crittografare questo valore, usare una nuova variabile con il blocco abilitato nella scheda Variabili.", + "loc.input.label.jarsignerArguments": "Argomenti di Jarsigner", + "loc.input.help.jarsignerArguments": "Consente di specificare le eventuali opzioni da passare alla riga di comando di Jarsigner. Impostazione predefinita: -verbose -sigalg MD5withRSA -digestalg SHA1", + "loc.input.label.zipalign": "Zipalign", + "loc.input.help.zipalign": "Consente di scegliere se eseguire zipalign per il pacchetto, in modo da ridurre la quantità di RAM utilizzata da un'app.", + "loc.input.label.zipalignLocation": "Percorso di Zipalign", + "loc.input.help.zipalignLocation": "Consente facoltativamente di specificare il percorso dell'eseguibile di zipalign usato durante la firma. Per impostazione predefinita viene usato l'eseguibile di zipalign trovato nella cartella della versione di Android SDK usata per la compilazione dell'applicazione.", + "loc.messages.AndroidHomeNotSet": "La variabile di ambiente ANDROID_HOME non è impostata per l'utente in esecuzione.", + "loc.messages.CouldNotFindZipalign": "Non è stato possibile trovare lo strumento zipalign.", + "loc.messages.CouldNotFindZipalignInAndroidHome": "Non è stato possibile trovare lo strumento zipalign in ANDROID_HOME: %s", + "loc.messages.JavaHomeNotSet": "La variabile di ambiente JAVA_HOME non è impostata per l'utente in esecuzione.", + "loc.messages.NoMatchingFiles": "Non sono stati trovati file corrispondenti con il criterio di ricerca: %s", + "loc.messages.DeleteKeystoreFileFailed": "Non è stato possibile eliminare il file dell'archivio chiavi scaricato dal server: %s" +} \ No newline at end of file diff --git a/_generated/AndroidSigningV2/Strings/resources.resjson/ja-JP/resources.resjson b/_generated/AndroidSigningV2/Strings/resources.resjson/ja-JP/resources.resjson new file mode 100644 index 000000000000..8ccf6902f93a --- /dev/null +++ b/_generated/AndroidSigningV2/Strings/resources.resjson/ja-JP/resources.resjson @@ -0,0 +1,32 @@ +{ + "loc.friendlyName": "Android の署名", + "loc.helpMarkDown": "[このタスクの詳細を表示](https://go.microsoft.com/fwlink/?LinkID=613717)", + "loc.description": "署名し、Android APK ファイルを配置します", + "loc.instanceNameFormat": "APK ファイル $(files) の署名と配置", + "loc.group.displayName.jarsignerOptions": "署名オプション", + "loc.group.displayName.zipalignOptions": "Zipalign オプション", + "loc.input.label.files": "APK ファイル", + "loc.input.help.files": "リポジトリのルートから署名する APK への相対パス。ワイルドカードを使用して複数のファイルを指定できます ([詳細](https://go.microsoft.com/fwlink/?linkid=856077))。たとえば、'bin' サブフォルダーにあるすべての .APK ファイルの場合は `**/bin/*.apk` です。", + "loc.input.label.jarsign": "APK の署名", + "loc.input.help.jarsign": "指定したキーストア ファイルで APK に署名する場合に、このオプションを選択します。署名がない APK はエミュレーターだけでしか実行できません。デバイスで実行するには、APK に署名する必要があります。", + "loc.input.label.keystoreFile": "Keystore ファイル", + "loc.input.help.keystoreFile": "APK の署名に使うために [セキュア ファイル] にアップロードされたキーストア ファイルを選択します。", + "loc.input.label.keystorePass": "Keystore パスワード", + "loc.input.help.keystorePass": "提供されているキーストア ファイルに関するパスワードを入力します。この値を暗号化するには、[変数] タブで、ロックを有効にして新しい変数をご使用ください。", + "loc.input.label.keystoreAlias": "エイリアス", + "loc.input.help.keystoreAlias": "キーストア ファイルで使用される公開キー/秘密キーのペアを識別するエイリアスを入力します。", + "loc.input.label.keyPass": "キー パスワード", + "loc.input.help.keyPass": "エイリアスとキーストア ファイルのキー パスワードを入力します。この値を暗号化するには、[変数] タブで新しい変数のロックを有効にします。", + "loc.input.label.jarsignerArguments": "Jarsigner の引数", + "loc.input.help.jarsignerArguments": "Jarsigner コマンド ラインに渡すオプションを指定します。既定値: -verbose -sigalg MD5withRSA -digestalg SHA1", + "loc.input.label.zipalign": "Zipalign", + "loc.input.help.zipalign": "パッケージに Zipalign を実行する場合に選択します。アプリに使用される RAM の量を減らすことができます。", + "loc.input.label.zipalignLocation": "Zipalign の場所", + "loc.input.help.zipalignLocation": "(省略可能) 署名中に使用される Zipalign 実行可能ファイルの場所を指定します。既定値は、アプリケーションがビルドした Android SDK バージョン フォルダー内にある Zipalign になります。", + "loc.messages.AndroidHomeNotSet": "実行中のユーザーに ANDROID_HOME 環境変数が設定されていません。", + "loc.messages.CouldNotFindZipalign": "Zipalign ツールが見つかりませんでした。", + "loc.messages.CouldNotFindZipalignInAndroidHome": "ANDROID_HOME 内に Zipalign ツールが見つかりませんでした: %s", + "loc.messages.JavaHomeNotSet": "実行中のユーザーに JAVA_HOME 環境変数が設定されていません。", + "loc.messages.NoMatchingFiles": "次の検索パターンと一致するファイルが見つかりませんでした: %s", + "loc.messages.DeleteKeystoreFileFailed": "サーバーからダウンロードされたキーストア ファイルを削除することができませんでした: %s" +} \ No newline at end of file diff --git a/_generated/AndroidSigningV2/Strings/resources.resjson/ko-KR/resources.resjson b/_generated/AndroidSigningV2/Strings/resources.resjson/ko-KR/resources.resjson new file mode 100644 index 000000000000..0d4ab586dead --- /dev/null +++ b/_generated/AndroidSigningV2/Strings/resources.resjson/ko-KR/resources.resjson @@ -0,0 +1,32 @@ +{ + "loc.friendlyName": "Android 서명", + "loc.helpMarkDown": "[이 작업에 대한 자세한 정보](https://go.microsoft.com/fwlink/?LinkID=613717)", + "loc.description": "Android APK 파일 서명 및 정렬", + "loc.instanceNameFormat": "APK 파일 $(files) 서명 및 정렬", + "loc.group.displayName.jarsignerOptions": "서명 옵션", + "loc.group.displayName.zipalignOptions": "Zipalign 옵션", + "loc.input.label.files": "APK 파일", + "loc.input.help.files": "서명할 APK에 대한 리포 루트의 상대 경로입니다. 와일드카드를 사용하여 여러 파일을 지정할 수 있습니다([자세한 정보](https://go.microsoft.com/fwlink/?linkid=856077)). 예를 들어, 'bin' 하위 폴더에 있는 모든 APK 파일을 표시하기 위해 '**/bin/*.apk'를 사용할 수 있습니다.", + "loc.input.label.jarsign": "APK 서명", + "loc.input.help.jarsign": "제공된 키 저장소 파일을 사용하여 APK에 서명하려면 이 옵션을 선택합니다. 서명되지 않은 APK는 에뮬레이터에서만 실행할 수 있습니다. 장치에서 실행하려면 APK가 서명되어야 합니다.", + "loc.input.label.keystoreFile": "키 저장소 파일", + "loc.input.help.keystoreFile": "APK 서명에 사용하기 위해 '보안 파일'에 업로드한 키 저장소 파일을 선택합니다.", + "loc.input.label.keystorePass": "키 저장소 암호", + "loc.input.help.keystorePass": "제공된 키 저장소 파일에 대한 암호를 입력합니다. 이 값을 암호화하려면 [변수] 탭에서 잠금이 사용 설정된 새 변수를 사용하세요.", + "loc.input.label.keystoreAlias": "별칭", + "loc.input.help.keystoreAlias": "공용/개인 키 쌍을 식별하여 키 저장소 파일에 사용할 별칭을 입력합니다.", + "loc.input.label.keyPass": "키 암호", + "loc.input.help.keyPass": "별칭 및 키 저장소 파일에 대한 키 암호를 입력합니다. 이 값을 암호화하려면 [변수] 탭에서 잠금이 사용 설정된 새 변수를 사용하세요.", + "loc.input.label.jarsignerArguments": "Jarsigner 인수", + "loc.input.help.jarsignerArguments": "Jarsigner 명령줄에 전달할 옵션을 지정합니다. 기본값: -verbose -sigalg MD5withRSA -digestalg SHA1", + "loc.input.label.zipalign": "Zipalign", + "loc.input.help.zipalign": "패키지를 zipalign하려면 선택합니다. 이렇게 하면 앱에 사용되는 RAM 양이 줄어듭니다.", + "loc.input.label.zipalignLocation": "Zipalign 위치", + "loc.input.help.zipalignLocation": "원하는 경우 서명할 때 사용되는 zipalign 실행 파일의 위치를 지정합니다. 기본적으로 응용 프로그램이 빌드되는 Android SDK 버전 폴더에 있는 zipalign을 사용합니다.", + "loc.messages.AndroidHomeNotSet": "실행 중인 사용자에 대해 ANDROID_HOME 환경 변수가 설정되어 있지 않습니다.", + "loc.messages.CouldNotFindZipalign": "Zipalign 도구를 찾을 수 없습니다.", + "loc.messages.CouldNotFindZipalignInAndroidHome": "ANDROID_HOME 내에서 Zipalign 도구를 찾을 수 없습니다. %s", + "loc.messages.JavaHomeNotSet": "실행 중인 사용자에 대해 JAVA_HOME 환경 변수가 설정되어 있지 않습니다.", + "loc.messages.NoMatchingFiles": "다음 검색 패턴과 일치하는 파일을 찾을 수 없습니다. %s", + "loc.messages.DeleteKeystoreFileFailed": "서버에서 다운로드된 키 저장소 파일을 삭제하지 못함: %s" +} \ No newline at end of file diff --git a/_generated/AndroidSigningV2/Strings/resources.resjson/ru-RU/resources.resjson b/_generated/AndroidSigningV2/Strings/resources.resjson/ru-RU/resources.resjson new file mode 100644 index 000000000000..a7846271abc1 --- /dev/null +++ b/_generated/AndroidSigningV2/Strings/resources.resjson/ru-RU/resources.resjson @@ -0,0 +1,32 @@ +{ + "loc.friendlyName": "Подписывание Android", + "loc.helpMarkDown": "[См. дополнительные сведения об этой задаче](https://go.microsoft.com/fwlink/?LinkID=613717)", + "loc.description": "Подписывание и назначение APK-файлов Android", + "loc.instanceNameFormat": "Подписание и выравнивание файлов APK $(files)", + "loc.group.displayName.jarsignerOptions": "Параметры подписи", + "loc.group.displayName.zipalignOptions": "Параметры Zipalign", + "loc.input.label.files": "APK-файлы", + "loc.input.help.files": "Относительный путь от корня репозитория к подписываемым APK-файлам. Можно использовать подстановочные знаки для указания нескольких файлов ([дополнительные сведения](https://go.microsoft.com/fwlink/?linkid=856077)). Пример: \"**/bin/*.apk\" для всех APK-файлов во вложенной папке bin", + "loc.input.label.jarsign": "Подписать APK", + "loc.input.help.jarsign": "Выберите этот параметр, чтобы подписать APK с помощью предоставленного файла хранилища ключей. Неподписанные APK можно выполнять только в эмуляторе. Для запуска на устройстве APK должны быть подписаны.", + "loc.input.label.keystoreFile": "Файл хранилища ключей", + "loc.input.help.keystoreFile": "Выберите файл хранилища ключей, отправленный в разделе \"Безопасные файлы\" для подписывания APK.", + "loc.input.label.keystorePass": "Пароль хранилища ключей", + "loc.input.help.keystorePass": "Введите пароль для предоставленного файла хранилища ключей. Чтобы зашифровать это значение, используйте новую переменную сборки с включенной блокировкой на вкладке \"Переменные\".", + "loc.input.label.keystoreAlias": "Псевдоним", + "loc.input.help.keystoreAlias": "Введите псевдоним, который определяет пару открытого и закрытого ключей для использования в файле хранилища ключей.", + "loc.input.label.keyPass": "Пароль ключа", + "loc.input.help.keyPass": "Введите пароль ключа для псевдонима и файла хранилища ключей. Чтобы зашифровать это значение, используйте новую переменную сборки с включенной блокировкой на вкладке \"Переменные\".", + "loc.input.label.jarsignerArguments": "Аргументы Jarsigner", + "loc.input.help.jarsignerArguments": "Укажите параметры для передачи в командную строку jarsigner. По умолчанию: -verbose -sigalg MD5withRSA -digestalg SHA1.", + "loc.input.label.zipalign": "Zipalign", + "loc.input.help.zipalign": "Укажите, следует ли использовать для пакета zipalign. Это позволяет снизить объем оперативной памяти, используемой приложением.", + "loc.input.label.zipalignLocation": "Расположение Zipalign", + "loc.input.help.zipalignLocation": "При необходимости укажите путь к исполняемому файлу zipalign, используемому при подписывании. По умолчанию применяется zipalign, найденный в папке той версии Android SDK, с которой собрано ваше приложение.", + "loc.messages.AndroidHomeNotSet": "Переменная среды ANDROID_HOME не задана для текущего пользователя.", + "loc.messages.CouldNotFindZipalign": "Не удалось найти средство zipalign.", + "loc.messages.CouldNotFindZipalignInAndroidHome": "Не удалось найти средство zipalign в ANDROID_HOME: %s", + "loc.messages.JavaHomeNotSet": "Переменная среды JAVA_HOME не задана для текущего пользователя.", + "loc.messages.NoMatchingFiles": "Не найдены файлы, соответствующие шаблону поиска: %s.", + "loc.messages.DeleteKeystoreFileFailed": "Не удалось удалить скачанный с сервера файл хранилища ключей: %s" +} \ No newline at end of file diff --git a/_generated/AndroidSigningV2/Strings/resources.resjson/zh-CN/resources.resjson b/_generated/AndroidSigningV2/Strings/resources.resjson/zh-CN/resources.resjson new file mode 100644 index 000000000000..5c249ca7186c --- /dev/null +++ b/_generated/AndroidSigningV2/Strings/resources.resjson/zh-CN/resources.resjson @@ -0,0 +1,32 @@ +{ + "loc.friendlyName": "Android 签名", + "loc.helpMarkDown": "[详细了解此任务](https://go.microsoft.com/fwlink/?LinkID=613717)", + "loc.description": "签名并排列 Android APK 文件", + "loc.instanceNameFormat": "签名并排列 APK 文件 $(files)", + "loc.group.displayName.jarsignerOptions": "签名选项", + "loc.group.displayName.zipalignOptions": "Zipalign 选项", + "loc.input.label.files": "APK 文件", + "loc.input.help.files": "从存储库根路径到要签名的 APK 之间的相对路径。可以使用通配符指定多个文件([详细信息](https://go.microsoft.com/fwlink/?linkid=856077))。例如,使用 \"**/bin/*.apk\" 指定 \"bin\" 子文件夹中的所有 .APK 文件", + "loc.input.label.jarsign": "为 APK 签名", + "loc.input.help.jarsign": "若要使用提供的密钥存储文件对 APK 签名,请选择此项。未签名的 APK 只能在仿真器中运行。若要在设备上运行,必需对 APK 签名。", + "loc.input.label.keystoreFile": "Keystore 文件", + "loc.input.help.keystoreFile": "选择已上传到“安全文件”用来对 APK 签名的密钥存储文件。", + "loc.input.label.keystorePass": "Keystore 密码", + "loc.input.help.keystorePass": "输入提供的密钥存储文件的密码。对“变量”选项卡使用已启用锁定的新变量来加密该值。", + "loc.input.label.keystoreAlias": "别名", + "loc.input.help.keystoreAlias": "输入别名,以标识在密钥存储文件中使用的公钥/私钥对。", + "loc.input.label.keyPass": "密钥密码", + "loc.input.help.keyPass": "输入别名和密钥存储文件的密钥密码。对“变量”选项卡使用已启用锁定的新变量来加密该值。", + "loc.input.label.jarsignerArguments": "Jarsigner 参数", + "loc.input.help.jarsignerArguments": "提供要传递到 jarsigner 命令行的任何选项。默认值是: -verbose -sigalg MD5withRSA -digestalg SHA1", + "loc.input.label.zipalign": "Zipalign", + "loc.input.help.zipalign": "若要对包进行 zipalign,请选择此项。这会减少应用使用的 RAM 量。", + "loc.input.label.zipalignLocation": "Zipalign 位置", + "loc.input.help.zipalignLocation": "也可以选择指定签名过程中使用的 zipalign 可执行文件的位置。默认情况下,使用应用程序基于其创建的 Android SDK 版本文件夹中的 zipalign。", + "loc.messages.AndroidHomeNotSet": "未为正在运行的用户设置 ANDROID_HOME 环境变量。", + "loc.messages.CouldNotFindZipalign": "找不到 zipalign 工具。", + "loc.messages.CouldNotFindZipalignInAndroidHome": "无法在 ANDROID_HOME 内找到 zipalign 工具: %s", + "loc.messages.JavaHomeNotSet": "未为正在运行的用户设置 JAVA_HOME 环境变量。", + "loc.messages.NoMatchingFiles": "使用搜索模式 %s 未找到匹配的文件", + "loc.messages.DeleteKeystoreFileFailed": "未能删除从服务器下载的密钥存储文件: %s" +} \ No newline at end of file diff --git a/_generated/AndroidSigningV2/Strings/resources.resjson/zh-TW/resources.resjson b/_generated/AndroidSigningV2/Strings/resources.resjson/zh-TW/resources.resjson new file mode 100644 index 000000000000..5d45c5cae7ac --- /dev/null +++ b/_generated/AndroidSigningV2/Strings/resources.resjson/zh-TW/resources.resjson @@ -0,0 +1,32 @@ +{ + "loc.friendlyName": "Android 簽署", + "loc.helpMarkDown": "[深入了解此工作](https://go.microsoft.com/fwlink/?LinkID=613717)", + "loc.description": "簽署並對齊 Android APK 檔案", + "loc.instanceNameFormat": "簽署並對齊 APK 檔 $(files)", + "loc.group.displayName.jarsignerOptions": "簽署選項", + "loc.group.displayName.zipalignOptions": "Zipalign 選項", + "loc.input.label.files": "APK 檔案", + "loc.input.help.files": "所要簽署 APK 相對於存放庫根路徑的路徑。您可以使用萬用字元來指定多個檔案 ([詳細資訊](https://go.microsoft.com/fwlink/?linkid=856077))。例如,`**/bin/*.apk` 表示 'bin' 子資料夾中的所有 .APK 檔案", + "loc.input.label.jarsign": "簽署 APK", + "loc.input.help.jarsign": "若要使用提供的金鑰儲存區檔案簽署 APK,請選取此選項。未經簽署的 APK 只可在模擬器中執行。APK 必須經過簽署,才能在裝置上執行。", + "loc.input.label.keystoreFile": "金鑰儲存區檔案", + "loc.input.help.keystoreFile": "選取上傳至 `Secure Files` 以用於簽署 APK 的金鑰儲存區檔案。", + "loc.input.label.keystorePass": "金鑰儲存區密碼", + "loc.input.help.keystorePass": "請輸入所提供之金鑰儲存區檔案的密碼。請使用新的變數,並在 [變數] 索引標籤上啟用其鎖定,以加密此變數。", + "loc.input.label.keystoreAlias": "別名", + "loc.input.help.keystoreAlias": "請輸入可以識別要在金鑰儲存區檔案中使用之公用/私密金鑰組的別名。", + "loc.input.label.keyPass": "金鑰密碼", + "loc.input.help.keyPass": "請輸入別名與金鑰儲存區檔案的金鑰密碼。請使用新的變數,並在 [變數] 索引標籤上啟用其鎖定,以加密此變數。", + "loc.input.label.jarsignerArguments": "Jarsigner 引數", + "loc.input.help.jarsignerArguments": "提供任何選項以傳遞至 jarsigner 命令列。預設為: -verbose -sigalg MD5withRSA -digestalg SHA1", + "loc.input.label.zipalign": "Zipalign", + "loc.input.help.zipalign": "若想要為套件進行 zipalign 則加以選取。如此可減少應用程式所使用的 RAM 量。", + "loc.input.label.zipalignLocation": "Zipalign 位置", + "loc.input.help.zipalignLocation": "選擇性地指定登入期間所使用之 zipalign 可執行檔的位置。預設為您應用程式建置目標的 Android SDK 版本資料夾中所找到的 zipalign。", + "loc.messages.AndroidHomeNotSet": "未對正在執行中的使用者設定 ANDROID_HOME 環境變數。", + "loc.messages.CouldNotFindZipalign": "找不到 zipalign 工具。", + "loc.messages.CouldNotFindZipalignInAndroidHome": "在 ANDROID_HOME 中找不到 zipalign 工具: %s", + "loc.messages.JavaHomeNotSet": "未對正在執行中的使用者設定 JAVA_HOME 環境變數。", + "loc.messages.NoMatchingFiles": "使用下列搜尋模式找不到任何相符的檔案: %s", + "loc.messages.DeleteKeystoreFileFailed": "無法刪除從伺服器 %s 下載的金鑰儲存區檔案" +} \ No newline at end of file diff --git a/_generated/AndroidSigningV2/Tests/L0.ts b/_generated/AndroidSigningV2/Tests/L0.ts new file mode 100644 index 000000000000..add12417c21f --- /dev/null +++ b/_generated/AndroidSigningV2/Tests/L0.ts @@ -0,0 +1,142 @@ +import fs = require('fs'); +import assert = require('assert'); +import path = require('path'); +import * as ttm from 'azure-pipelines-task-lib/mock-test'; + +describe('AndroidSigning Suite', function () { + this.timeout(parseInt(process.env.TASK_TEST_TIMEOUT) || 20000); + before(() => { + }); + + after(() => { + }); + + it('Do not sign or zipalign if nothing is selected', (done: Mocha.Done) => { + let tp: string = path.join(__dirname, 'L0AndroidSkipSignAlign.js'); + let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.invokedToolCount === 0, 'should not run anything'); + assert(tr.stderr.length === 0, 'should not have written to stderr'); + assert(tr.succeeded, 'task should have succeeded'); + + done(); + }); + + it('Do not align or sign if input single file does not exist', (done: Mocha.Done) => { + let tp: string = path.join(__dirname, 'L0AndroidSignAlignNoFileInput.js'); + let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.invokedToolCount === 0, 'should not run anything'); + assert(tr.errorIssues.length || tr.stderr.length > 0, 'should have written to stderr'); + assert(tr.failed, 'task should have failed'); + + done(); + }); + + it('Do not align or sign if input pattern does not match any files', (done: Mocha.Done) => { + let tp: string = path.join(__dirname, 'L0AndroidSignAlignNoMatchingFileInput.js'); + let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.invokedToolCount === 0, 'should not run anything'); + assert(tr.errorIssues.length > 0 || tr.stderr.length > 0, 'should have written to stderr'); + assert(tr.failed, 'task should have failed'); + + done(); + }); + + it('Use jarsigner from PATH before searching in JAVA_HOME', (done: Mocha.Done) => { + let tp: string = path.join(__dirname, 'L0AndroidSignAlignJarsignerFromPath.js'); + let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.invokedToolCount == 1, 'should have run jarsigner'); + assert(tr.stderr.length == 0, 'should have jarsigned file'); + assert(tr.succeeded, 'task should have succeeded'); + + done(); + }); + + it('Fail if jarsigner is not on PATH and JAVA_HOME is not set', (done: Mocha.Done) => { + let tp: string = path.join(__dirname, 'L0AndroidSignAlignFailJarsignerNotFound.js'); + let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.invokedToolCount == 0, 'should not run anything'); + assert(tr.errorIssues.length > 0 || tr.stderr.length > 0, 'should have failed to locate jarsigner'); + assert(tr.failed, 'task should have failed'); + + done(); + }); + + it('Fail if ANDROID_HOME is not set', (done: Mocha.Done) => { + let tp: string = path.join(__dirname, 'L0AndroidSignAlignAndroidHomeNotSet.js'); + let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.invokedToolCount == 0, 'should not run anything'); + assert(tr.errorIssues.length > 0 || tr.stderr.length > 0, 'should have jarsigned file'); + assert(tr.failed, 'task should have failed'); + + done(); + }); + + it('Signing a single file', (done: Mocha.Done) => { + let tp: string = path.join(__dirname, 'L0AndroidSignSingleFile.js'); + let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.invokedToolCount === 1, 'should run jarsigner'); + assert(tr.errorIssues.length === 0 && tr.stderr.length === 0, 'should not have written to stderr'); + assert(tr.succeeded, 'task should have succeeded'); + + done(); + }); + + it('zipalign a single file', (done: Mocha.Done) => { + let tp: string = path.join(__dirname, 'L0AndroidZipalignSingleFile.js'); + let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.invokedToolCount === 1, 'should run zipalign'); + assert(tr.stderr.length === 0 || tr.errorIssues.length === 0, 'should not have written to stderr'); + assert(tr.succeeded, 'task should have succeeded'); + + done(); + }); + + it('Signing and aligning multiple files', (done: Mocha.Done) => { + let tp: string = path.join(__dirname, 'L0AndroidSignAlignMultipleFiles.js'); + let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.invokedToolCount === 4, 'should have run jarsigner and zipalign twice each'); + assert(tr.stderr.length === 0 || tr.errorIssues.length === 0, 'should not have written to stderr'); + assert(tr.succeeded, 'task should have succeeded'); + + done(); + }); + + it('Download keystore file from SecureFile', (done: Mocha.Done) => { + let tp: string = path.join(__dirname, 'L0DownloadKeystoreFile.js'); + let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.stderr.length === 0, 'should not have written to stderr'); + assert(tr.succeeded, 'task should have succeeded'); + + done(); + }); +}); diff --git a/_generated/AndroidSigningV2/Tests/L0AndroidSignAlignAndroidHomeNotSet.ts b/_generated/AndroidSigningV2/Tests/L0AndroidSignAlignAndroidHomeNotSet.ts new file mode 100644 index 000000000000..cc484e459646 --- /dev/null +++ b/_generated/AndroidSigningV2/Tests/L0AndroidSignAlignAndroidHomeNotSet.ts @@ -0,0 +1,31 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'androidsigning.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('files', '/some/path/a.apk'); +tr.setInput('jarsign', 'false'); +tr.setInput('zipalign', 'true'); + +process.env['VSTS_TASKVARIABLE_KEYSTORE_FILE_PATH'] = '/some/store'; +process.env['ANDROID_HOME'] = ''; + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "findMatch": { + "/some/path/a.apk": [ + "/some/path/a.apk" + ] + }, + "checkPath": { + "/some/path/a.apk": true + }, + "which": { + + } +}; +tr.setAnswers(a); + +tr.run(); diff --git a/_generated/AndroidSigningV2/Tests/L0AndroidSignAlignFailJarsignerNotFound.ts b/_generated/AndroidSigningV2/Tests/L0AndroidSignAlignFailJarsignerNotFound.ts new file mode 100644 index 000000000000..8c4909b61ed8 --- /dev/null +++ b/_generated/AndroidSigningV2/Tests/L0AndroidSignAlignFailJarsignerNotFound.ts @@ -0,0 +1,31 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'androidsigning.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('files', '/some/path/a.apk'); +tr.setInput('jarsign', 'true'); +tr.setInput('zipalign', 'true'); + +process.env['VSTS_TASKVARIABLE_KEYSTORE_FILE_PATH'] = '/some/store'; +process.env['JAVA_HOME'] = ''; + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "findMatch": { + "/some/path/a.apk": [ + "/some/path/a.apk" + ] + }, + "checkPath": { + "/some/path/a.apk": true + }, + "which": { + + } +}; +tr.setAnswers(a); + +tr.run(); diff --git a/_generated/AndroidSigningV2/Tests/L0AndroidSignAlignJarsignerFromPath.ts b/_generated/AndroidSigningV2/Tests/L0AndroidSignAlignJarsignerFromPath.ts new file mode 100644 index 000000000000..3e1080aae743 --- /dev/null +++ b/_generated/AndroidSigningV2/Tests/L0AndroidSignAlignJarsignerFromPath.ts @@ -0,0 +1,40 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'androidsigning.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('files', '/some/path/a.apk'); +tr.setInput('jarsign', 'true'); +tr.setInput('keystoreFile', 'keystoreFileId'); +tr.setInput('keystorePass', 'pass1'); +tr.setInput('keystoreAlias', 'somealias'); +tr.setInput('keyPass', 'pass2'); +tr.setInput('zipalign', 'false'); + +process.env['VSTS_TASKVARIABLE_KEYSTORE_FILE_PATH'] = '/some/store'; + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "findMatch": { + "/some/path/a.apk": [ + "/some/path/a.apk" + ] + }, + "checkPath": { + "/some/path/a.apk": true + }, + "which": { + "jarsigner": "/usr/bin/jarsigner" + }, + "exec": { + "/usr/bin/jarsigner -keystore /some/store -storepass pass1 -keypass pass2 -signedjar /some/path/a.apk /some/path/a.apk.unsigned somealias": { + "code": 0, + "stdout": "jarsigner output here" + } + } +}; +tr.setAnswers(a); + +tr.run(); diff --git a/_generated/AndroidSigningV2/Tests/L0AndroidSignAlignMultipleFiles.ts b/_generated/AndroidSigningV2/Tests/L0AndroidSignAlignMultipleFiles.ts new file mode 100644 index 000000000000..aa6de73f3d5d --- /dev/null +++ b/_generated/AndroidSigningV2/Tests/L0AndroidSignAlignMultipleFiles.ts @@ -0,0 +1,63 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'androidsigning.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('files', '/some/path/*.apk'); +tr.setInput('jarsign', 'true'); +tr.setInput('keystoreFile', '/some/store'); +tr.setInput('keystorePass', 'pass1'); +tr.setInput('keystoreAlias', 'somealias'); +tr.setInput('keyPass', 'pass2'); +tr.setInput('zipalign', 'true'); + +process.env['VSTS_TASKVARIABLE_KEYSTORE_FILE_PATH'] = '/some/store'; +process.env['JAVA_HOME'] = '/fake/java/home'; +process.env['ANDROID_HOME'] = '/fake/android/home'; + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "exec": { + "/fake/java/home/bin/jarsigner -keystore /some/store -storepass pass1 -keypass pass2 -signedjar /some/path/a.apk /some/path/a.apk.unsigned somealias": { + "code": 0, + "stdout": "jarsigner output here" + }, + "/fake/java/home/bin/jarsigner -keystore /some/store -storepass pass1 -keypass pass2 -signedjar /some/path/b.apk /some/path/b.apk.unsigned somealias": { + "code": 0, + "stdout": "jarsigner output here" + }, + "/fake/android/home/sdk1/zipalign -v 4 /some/path/a.apk.unaligned /some/path/a.apk": { + "code": 0, + "stdout": "zipalign output here" + }, + "/fake/android/home/sdk1/zipalign -v 4 /some/path/b.apk.unaligned /some/path/b.apk": { + "code": 0, + "stdout": "zipalign output here" + } + }, + "checkPath": { + "/some/path/a.apk": true, + "/some/path/b.apk": true + }, + "findMatch": { + "/some/path/*.apk": [ + "/some/path/a.apk", + "/some/path/b.apk" + ], + "/fake/android/home": [ + "/fake/android/home/sdk1", + "/fake/android/home/sdk2" + ], + "zipalign*": [ + "/fake/android/home/sdk1/zipalign", + "/fake/android/home/sdk2/zipalign" + ] + } +} + +tr.setAnswers(a); + +tr.run(); + diff --git a/_generated/AndroidSigningV2/Tests/L0AndroidSignAlignNoFileInput.ts b/_generated/AndroidSigningV2/Tests/L0AndroidSignAlignNoFileInput.ts new file mode 100644 index 000000000000..150f80e3fe2c --- /dev/null +++ b/_generated/AndroidSigningV2/Tests/L0AndroidSignAlignNoFileInput.ts @@ -0,0 +1,31 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'androidsigning.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('files', '/some/path/nonexistent.apk'); +tr.setInput('jarsign', 'true'); +tr.setInput('zipalign', 'true'); + +process.env['AGENT_VERSION'] = '2.116.0'; +process.env['VSTS_TASKVARIABLE_KEYSTORE_FILE_PATH'] = '/usr/lib/login.keystore'; +process.env['HOME'] = '/users/test'; +process.env['JAVA_HOME'] = '/fake/java/home'; +process.env['ANDROID_HOME'] = '/fake/android/home'; + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "findMatch": { + "/some/path/nonexistent.apk": [ + ] + } +}; +tr.setAnswers(a); + +tr.run(); + + + + diff --git a/_generated/AndroidSigningV2/Tests/L0AndroidSignAlignNoMatchingFileInput.ts b/_generated/AndroidSigningV2/Tests/L0AndroidSignAlignNoMatchingFileInput.ts new file mode 100644 index 000000000000..888d5305de41 --- /dev/null +++ b/_generated/AndroidSigningV2/Tests/L0AndroidSignAlignNoMatchingFileInput.ts @@ -0,0 +1,31 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'androidsigning.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('files', '/some/nonexistent/path/*.apk'); +tr.setInput('jarsign', 'true'); +tr.setInput('zipalign', 'true'); + +process.env['AGENT_VERSION'] = '2.116.0'; +process.env['VSTS_TASKVARIABLE_KEYSTORE_FILE_PATH'] = '/usr/lib/login.keystore'; +process.env['HOME'] = '/users/test'; +process.env['JAVA_HOME'] = '/fake/java/home'; +process.env['ANDROID_HOME'] = '/fake/android/home'; + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "findMatch": { + "/some/nonexistent/path/*.apk": [ + ] + } +}; +tr.setAnswers(a); + +tr.run(); + + + + diff --git a/_generated/AndroidSigningV2/Tests/L0AndroidSignSingleFile.ts b/_generated/AndroidSigningV2/Tests/L0AndroidSignSingleFile.ts new file mode 100644 index 000000000000..b1d7deab5de9 --- /dev/null +++ b/_generated/AndroidSigningV2/Tests/L0AndroidSignSingleFile.ts @@ -0,0 +1,53 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'androidsigning.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('files', '/some/fake.apk'); +tr.setInput('jarsign', 'true'); +tr.setInput('keystoreFile', '/some/store'); +tr.setInput('keystorePass', 'pass1'); +tr.setInput('keystoreAlias', 'somealias'); +tr.setInput('keyPass', 'pass2'); +tr.setInput('zipalign', 'false'); + +process.env['AGENT_VERSION'] = '2.116.0'; +process.env['VSTS_TASKVARIABLE_KEYSTORE_FILE_PATH'] = '/some/store'; +process.env['HOME'] = '/users/test'; +process.env['JAVA_HOME'] = '/fake/java/home'; +process.env['ANDROID_HOME'] = '/fake/android/home'; + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "checkPath": { + "/some/fake.apk": true + }, + "findMatch": { + "/some/fake.apk": [ + "/some/fake.apk" + ], + "/fake/android/home": [ + "/fake/android/home/sdk1", + "/fake/android/home/sdk2" + ], + "zipalign*": [ + "/fake/android/home/sdk1/zipalign", + "/fake/android/home/sdk2/zipalign" + ] + }, + "exec": { + "/fake/java/home/bin/jarsigner -keystore /some/store -storepass pass1 -keypass pass2 -signedjar /some/fake.apk /some/fake.apk.unsigned somealias": { + "code": 0, + "stdout": "jarsigner output here" + }, + "/fake/android/home/sdk1/zipalign -v 4 /some/fake.apk.unaligned /some/fake.apk": { + "code": 0, + "stdout": "zipalign output here" + } + } +}; +tr.setAnswers(a); + +tr.run(); \ No newline at end of file diff --git a/_generated/AndroidSigningV2/Tests/L0AndroidSkipSignAlign.ts b/_generated/AndroidSigningV2/Tests/L0AndroidSkipSignAlign.ts new file mode 100644 index 000000000000..dc718b754bba --- /dev/null +++ b/_generated/AndroidSigningV2/Tests/L0AndroidSkipSignAlign.ts @@ -0,0 +1,49 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'androidsigning.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('files', '/some/fake.apk'); +tr.setInput('jarsign', 'false'); +tr.setInput('zipalign', 'false'); + +process.env['AGENT_VERSION'] = '2.116.0'; +process.env['VSTS_TASKVARIABLE_KEYSTORE_FILE_PATH'] = '/usr/lib/login.keystore'; +process.env['HOME'] = '/users/test'; +process.env['JAVA_HOME'] = '/fake/java/home'; +process.env['ANDROID_HOME'] = '/fake/android/home'; + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "checkPath": { + "/some/fake.apk": true + }, + "findMatch": { + "/some/fake.apk": [ + "/some/fake.apk" + ], + "/fake/android/home": [ + "/fake/android/home/sdk1", + "/fake/android/home/sdk2" + ], + "zipalign*": [ + "/fake/android/home/sdk1/zipalign", + "/fake/android/home/sdk2/zipalign" + ] + }, + "exec": { + "/fake/java/home/bin/jarsigner -keystore /some/store -storepass pass1 -keypass pass2 -signedjar /some/fake.apk /some/fake.apk.unsigned somealias": { + "code": 0, + "stdout": "jarsigner output here" + }, + "/fake/android/home/sdk1/zipalign -v 4 /some/fake.apk.unaligned /some/fake.apk": { + "code": 0, + "stdout": "zipalign output here" + } + } +}; +tr.setAnswers(a); + +tr.run(); \ No newline at end of file diff --git a/_generated/AndroidSigningV2/Tests/L0AndroidZipalignSingleFile.ts b/_generated/AndroidSigningV2/Tests/L0AndroidZipalignSingleFile.ts new file mode 100644 index 000000000000..b887a09e7385 --- /dev/null +++ b/_generated/AndroidSigningV2/Tests/L0AndroidZipalignSingleFile.ts @@ -0,0 +1,53 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'androidsigning.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('files', '/some/fake.apk'); +tr.setInput('jarsign', 'true'); +tr.setInput('keystoreFile', '/some/store'); +tr.setInput('keystorePass', 'pass1'); +tr.setInput('keystoreAlias', 'somealias'); +tr.setInput('jarsign', 'false'); +tr.setInput('zipalign', 'true'); + +process.env['AGENT_VERSION'] = '2.116.0'; +process.env['VSTS_TASKVARIABLE_KEYSTORE_FILE_PATH'] = '/some/store'; +process.env['HOME'] = '/users/test'; +process.env['JAVA_HOME'] = '/fake/java/home'; +process.env['ANDROID_HOME'] = '/fake/android/home'; + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "checkPath": { + "/some/fake.apk": true + }, + "findMatch": { + "/some/fake.apk": [ + "/some/fake.apk" + ], + "/fake/android/home": [ + "/fake/android/home/sdk1", + "/fake/android/home/sdk2" + ], + "zipalign*": [ + "/fake/android/home/sdk1/zipalign", + "/fake/android/home/sdk2/zipalign" + ] + }, + "exec": { + "/fake/java/home/bin/jarsigner -keystore /some/store -storepass pass1 -keypass pass2 -signedjar /some/fake.apk /some/fake.apk.unsigned somealias": { + "code": 0, + "stdout": "jarsigner output here" + }, + "/fake/android/home/sdk1/zipalign -v 4 /some/fake.apk.unaligned /some/fake.apk": { + "code": 0, + "stdout": "zipalign output here" + } + } +}; +tr.setAnswers(a); + +tr.run(); \ No newline at end of file diff --git a/_generated/AndroidSigningV2/Tests/L0DownloadKeystoreFile.ts b/_generated/AndroidSigningV2/Tests/L0DownloadKeystoreFile.ts new file mode 100644 index 000000000000..638c08cc7256 --- /dev/null +++ b/_generated/AndroidSigningV2/Tests/L0DownloadKeystoreFile.ts @@ -0,0 +1,22 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'preandroidsigning.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('jarsign', 'true'); +tr.setInput('keystoreFile', 'mySecureFileId'); + +process.env['AGENT_VERSION'] = '2.116.0'; + +let secureFileHelperMock = require('azure-pipelines-tasks-securefiles-common/securefiles-common-mock'); +tr.registerMock('azure-pipelines-tasks-securefiles-common/securefiles-common', secureFileHelperMock); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { +}; +tr.setAnswers(a); + +tr.run(); + diff --git a/_generated/AndroidSigningV2/Tests/package-lock.json b/_generated/AndroidSigningV2/Tests/package-lock.json new file mode 100644 index 000000000000..332d9f2a0649 --- /dev/null +++ b/_generated/AndroidSigningV2/Tests/package-lock.json @@ -0,0 +1,24 @@ +{ + "name": "vsts-tasks-androidsigningv2-tests", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/mocha": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", + "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==" + }, + "@types/node": { + "version": "10.17.44", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.44.tgz", + "integrity": "sha512-vHPAyBX1ffLcy4fQHmDyIUMUb42gHZjPHU66nhvbMzAWJqHnySGZ6STwN3rwrnSd1FHB0DI/RWgGELgKSYRDmw==" + }, + "typescript": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.2.tgz", + "integrity": "sha512-e4ERvRV2wb+rRZ/IQeb3jm2VxBsirQLpQhdxplZ2MEzGvDkkMmPglecnNDfSUBivMjP93vRbngYYDQqQ/78bcQ==", + "dev": true + } + } +} diff --git a/_generated/AndroidSigningV2/Tests/package.json b/_generated/AndroidSigningV2/Tests/package.json new file mode 100644 index 000000000000..5e7f1db091dc --- /dev/null +++ b/_generated/AndroidSigningV2/Tests/package.json @@ -0,0 +1,26 @@ +{ + "name": "vsts-tasks-androidsigningv2-tests", + "version": "1.0.0", + "description": "Azure Pipelines Android Signing V2 Task Tests", + "main": "L0.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/Microsoft/azure-pipelines-tasks.git" + }, + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Microsoft/azure-pipelines-tasks/issues" + }, + "homepage": "https://github.com/Microsoft/azure-pipelines-tasks#readme", + "dependencies": { + "@types/node": "^10.17.0", + "@types/mocha": "^5.2.7" + }, + "devDependencies": { + "typescript": "4.0.2" + } +} diff --git a/_generated/AndroidSigningV2/androidsigning.ts b/_generated/AndroidSigningV2/androidsigning.ts new file mode 100644 index 000000000000..442f297e206e --- /dev/null +++ b/_generated/AndroidSigningV2/androidsigning.ts @@ -0,0 +1,137 @@ +import path = require('path'); +import * as tl from 'azure-pipelines-task-lib/task'; + +/* +Signing the specified file. Move the current file to fn.unsigned, and +place the signed file at the same location fn +*/ +var jarsigning = (fn: string) => { + // file must exist + tl.checkPath(fn, 'file to sign'); + + var jarsigner = tl.which("jarsigner", false); + if (!jarsigner) { + var java_home = tl.getVariable('JAVA_HOME'); + if (!java_home) { + throw tl.loc('JavaHomeNotSet'); + } + + jarsigner = tl.resolve(java_home, 'bin', 'jarsigner'); + } + + var jarsignerRunner = tl.tool(jarsigner); + + // Get keystore file path for signing + var keystoreFile = tl.getTaskVariable('KEYSTORE_FILE_PATH'); + + // Get keystore alias + var keystoreAlias = tl.getInput('keystoreAlias', true); + + var keystorePass = tl.getInput('keystorePass', false); + + var keyPass = tl.getInput('keyPass', false); + + var jarsignerArguments = tl.getInput('jarsignerArguments', false); + + jarsignerRunner.arg(['-keystore', keystoreFile]); + + if (keystorePass) { + jarsignerRunner.arg(['-storepass', keystorePass]); + } + + if (keyPass) { + jarsignerRunner.arg(['-keypass', keyPass]); + } + + if (jarsignerArguments) { + jarsignerRunner.line(jarsignerArguments); + } + + var unsignedFn = fn + ".unsigned"; + var success = tl.mv(fn, unsignedFn, '-f', false); + + jarsignerRunner.arg(['-signedjar', fn, unsignedFn, keystoreAlias]); + + return jarsignerRunner.exec(null); +} + +/* +Zipaligning apk +*/ +var zipaligning = (fn: string) => { + // file must exist + tl.checkPath(fn, 'file to zipalign'); + + var zipaligner = tl.getInput('zipalignLocation', false); + + // if the tool path is not set, let's find one (anyone) from the SDK folder + if (!zipaligner) { + + var android_home = tl.getVariable('ANDROID_HOME'); + if (!android_home) { + throw tl.loc('AndroidHomeNotSet'); + } + + var zipalignToolsList = tl.findMatch(tl.resolve(android_home, 'build-tools'), "zipalign*", null, { matchBase: true }); + + if (!zipalignToolsList || zipalignToolsList.length === 0) { + throw tl.loc('CouldNotFindZipalignInAndroidHome', android_home); + } + + zipaligner = zipalignToolsList[0]; + } + + if (!zipaligner) { + throw tl.loc('CouldNotFindZipalign'); + } + + var zipalignRunner = tl.tool(zipaligner); + + // alignment must be 4 or play store will reject, hard code this to avoid user errors + zipalignRunner.arg(["-v", "4"]); + + var unalignedFn = fn + ".unaligned"; + var success = tl.mv(fn, unalignedFn, '-f', false); + + zipalignRunner.arg([unalignedFn, fn]); + return zipalignRunner.exec(null); +} + +async function run() { + try { + // Configure localization + tl.setResourcePath(path.join(__dirname, 'task.json')); + + // Get files to be signed + let filesPattern: string = tl.getInput('files', true); + + // Signing the APK? + let jarsign: boolean = tl.getBoolInput('jarsign'); + + // Zipaligning the APK? + let zipalign: boolean = tl.getBoolInput('zipalign'); + + // Resolve files for the specified value or pattern + let filesToSign: string[] = tl.findMatch(null, filesPattern); + + // Fail if no matching files were found + if (!filesToSign || filesToSign.length === 0) { + throw tl.loc('NoMatchingFiles', filesPattern); + } + + for (let file of filesToSign) { + if (jarsign) { + await jarsigning(file); + } + + if (zipalign) { + await zipaligning(file); + } + } + } catch (err) { + tl.setResult(tl.TaskResult.Failed, err); + } +} + +run(); + diff --git a/_generated/AndroidSigningV2/icon.png b/_generated/AndroidSigningV2/icon.png new file mode 100644 index 000000000000..502c38f46dd4 Binary files /dev/null and b/_generated/AndroidSigningV2/icon.png differ diff --git a/_generated/AndroidSigningV2/icon.svg b/_generated/AndroidSigningV2/icon.svg new file mode 100644 index 000000000000..38816323fb96 --- /dev/null +++ b/_generated/AndroidSigningV2/icon.svg @@ -0,0 +1,4 @@ + + + + diff --git a/_generated/AndroidSigningV2/make.json b/_generated/AndroidSigningV2/make.json new file mode 100644 index 000000000000..d5ad78d951ae --- /dev/null +++ b/_generated/AndroidSigningV2/make.json @@ -0,0 +1,12 @@ +{ + "rm": [ + { + "items": [ + "node_modules/azure-pipelines-tasks-securefiles-common/node_modules/vsts-task-lib", + "node_modules/azure-pipelines-tasks-securefiles-common/node_modules/azure-pipelines-task-lib", + "node_modules/mockery" + ], + "options": "-Rf" + } + ] +} \ No newline at end of file diff --git a/_generated/AndroidSigningV2/package-lock.json b/_generated/AndroidSigningV2/package-lock.json new file mode 100644 index 000000000000..4aebc031290e --- /dev/null +++ b/_generated/AndroidSigningV2/package-lock.json @@ -0,0 +1,548 @@ +{ + "name": "vsts-androidsigning-task", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/concat-stream": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz", + "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==", + "requires": { + "@types/node": "*" + } + }, + "@types/form-data": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", + "integrity": "sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==", + "requires": { + "@types/node": "*" + } + }, + "@types/mocha": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", + "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==" + }, + "@types/node": { + "version": "16.18.36", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.36.tgz", + "integrity": "sha512-8egDX8dE50XyXWH6C6PRCNkTP106DuUrvdrednFouDSmCi7IOvrqr0frznfZaHifHH/3aq/7a7v9N4wdXMqhBQ==" + }, + "@types/q": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.5.tgz", + "integrity": "sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ==" + }, + "@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "azure-devops-node-api": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/azure-devops-node-api/-/azure-devops-node-api-10.2.2.tgz", + "integrity": "sha512-4TVv2X7oNStT0vLaEfExmy3J4/CzfuXolEcQl/BRUmvGySqKStTG2O55/hUQ0kM7UJlZBLgniM0SBq4d/WkKow==", + "requires": { + "tunnel": "0.0.6", + "typed-rest-client": "^1.8.4" + } + }, + "azure-pipelines-task-lib": { + "version": "5.0.0-preview.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-5.0.0-preview.0.tgz", + "integrity": "sha512-uQJEv+q3/7RD7kgphFd33uXijaPwA1ePYoNkAgZpUhbZUtc2u4JL4ujTT/JJfgXBNW/QQNAiDQ2OC7vOQG/0tg==", + "requires": { + "minimatch": "3.0.5", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "sync-request": "6.1.0", + "uuid": "^3.0.1" + } + }, + "azure-pipelines-tasks-securefiles-common": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-tasks-securefiles-common/-/azure-pipelines-tasks-securefiles-common-2.1.0.tgz", + "integrity": "sha512-oE7VscWFZD+Ku0WM6e2b5Y0eDom4DTZvER/mSh3m/z9V0yN9JUahNR0Dye9NIj0BSIyfgcaxxNWBCzqJMsirIQ==", + "requires": { + "@types/node": "^10.17.0", + "@types/q": "^1.5.4", + "azure-devops-node-api": "10.2.2", + "azure-pipelines-task-lib": "^3.1.0" + }, + "dependencies": { + "@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + }, + "azure-pipelines-task-lib": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-3.4.0.tgz", + "integrity": "sha512-3eC4OTFw+7xD7A2aUhxR/j+jRlTI+vVfS0CGxt1pCLs4c/KmY0tQWgbqjD3157kmiucWxELBvgZHaD2gCBe9fg==", + "requires": { + "minimatch": "3.0.5", + "mockery": "^2.1.0", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "sync-request": "6.1.0", + "uuid": "^3.0.1" + } + } + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, + "form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-intrinsic": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", + "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + } + }, + "get-port": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", + "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==" + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "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" + }, + "dependencies": { + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "http-basic": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", + "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", + "requires": { + "caseless": "^0.12.0", + "concat-stream": "^1.6.2", + "http-response-object": "^3.0.1", + "parse-cache-control": "^1.0.1" + } + }, + "http-response-object": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", + "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", + "requires": { + "@types/node": "^10.0.3" + }, + "dependencies": { + "@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + } + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" + }, + "is-core-module": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", + "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", + "requires": { + "has": "^1.0.3" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "mockery": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mockery/-/mockery-2.1.0.tgz", + "integrity": "sha512-9VkOmxKlWXoDO/h1jDZaS4lH33aWfRiJiNT/tKj+8OGzrcFDLo8d0syGdbsc3Bc4GvRXPb+NMMvojotmuGJTvA==" + }, + "object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, + "parse-cache-control": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", + "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "promise": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", + "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", + "requires": { + "asap": "~2.0.6" + } + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==" + }, + "qs": { + "version": "6.11.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.1.tgz", + "integrity": "sha512-0wsrzgTz/kAVIeuxSjnpGC56rzYtr6JT/2BwEvMaPhFIoYa1aGO8LbzuU1R0uUYQkLpWBTOj0l/CLAJB64J6nQ==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "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" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "requires": { + "resolve": "^1.1.6" + } + }, + "resolve": { + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "requires": { + "is-core-module": "^2.11.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, + "sync-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", + "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==", + "requires": { + "http-response-object": "^3.0.1", + "sync-rpc": "^1.2.1", + "then-request": "^6.0.0" + } + }, + "sync-rpc": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz", + "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==", + "requires": { + "get-port": "^3.1.0" + } + }, + "then-request": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", + "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", + "requires": { + "@types/concat-stream": "^1.6.0", + "@types/form-data": "0.0.33", + "@types/node": "^8.0.0", + "@types/qs": "^6.2.31", + "caseless": "~0.12.0", + "concat-stream": "^1.6.0", + "form-data": "^2.2.0", + "http-basic": "^8.1.1", + "http-response-object": "^3.0.1", + "promise": "^8.0.0", + "qs": "^6.4.0" + }, + "dependencies": { + "@types/node": { + "version": "8.10.66", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", + "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==" + } + } + }, + "tunnel": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", + "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==" + }, + "typed-rest-client": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.8.5.tgz", + "integrity": "sha512-952/Aegu3lTqUAI1anbDLbewojnF/gh8at9iy1CIrfS1h/+MtNjB1Y9z6ZF5n2kZd+97em56lZ9uu7Zz3y/pwg==", + "requires": { + "qs": "^6.9.1", + "tunnel": "0.0.6", + "underscore": "^1.12.1" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, + "typescript": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.2.tgz", + "integrity": "sha512-e4ERvRV2wb+rRZ/IQeb3jm2VxBsirQLpQhdxplZ2MEzGvDkkMmPglecnNDfSUBivMjP93vRbngYYDQqQ/78bcQ==", + "dev": true + }, + "underscore": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.1.tgz", + "integrity": "sha512-hzSoAVtJF+3ZtiFX0VgfFPHEDRm7Y/QPjGyNo4TVdnDTdft3tr8hEkD25a1jC+TjTuE7tkHGKkhwCgs9dgBB2g==" + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + } + } +} diff --git a/_generated/AndroidSigningV2/package.json b/_generated/AndroidSigningV2/package.json new file mode 100644 index 000000000000..b81a215f7d48 --- /dev/null +++ b/_generated/AndroidSigningV2/package.json @@ -0,0 +1,28 @@ +{ + "name": "vsts-androidsigning-task", + "version": "1.0.0", + "description": "Azure Pipelines Android Signing Task", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/Microsoft/azure-pipelines-tasks.git" + }, + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Microsoft/azure-pipelines-tasks/issues" + }, + "homepage": "https://github.com/Microsoft/azure-pipelines-tasks#readme", + "dependencies": { + "@types/node": "^16.11.39", + "@types/mocha": "^5.2.7", + "azure-pipelines-task-lib": "^5.0.0-preview.0", + "azure-pipelines-tasks-securefiles-common": "2.1.0" + }, + "devDependencies": { + "typescript": "4.0.2" + } +} diff --git a/_generated/AndroidSigningV2/postandroidsigning.ts b/_generated/AndroidSigningV2/postandroidsigning.ts new file mode 100644 index 000000000000..a27fb48f8555 --- /dev/null +++ b/_generated/AndroidSigningV2/postandroidsigning.ts @@ -0,0 +1,21 @@ +import fs = require('fs'); +import path = require('path'); +import secureFilesCommon = require('azure-pipelines-tasks-securefiles-common/securefiles-common'); +import tl = require('azure-pipelines-task-lib/task'); + +async function run() { + let secureFileHelpers: secureFilesCommon.SecureFileHelpers; + + try { + tl.setResourcePath(path.join(__dirname, 'task.json')); + let keystoreFile: string = tl.getTaskVariable('KEYSTORE_FILE_PATH'); + if (keystoreFile && tl.exist(keystoreFile)) { + fs.unlinkSync(keystoreFile); + tl.debug('Deleted keystore file downloaded from the server: ' + keystoreFile); + } + } catch (err) { + tl.warning(tl.loc('DeleteKeystoreFileFailed', err)); + } +} + +run(); diff --git a/_generated/AndroidSigningV2/preandroidsigning.ts b/_generated/AndroidSigningV2/preandroidsigning.ts new file mode 100644 index 000000000000..578c7bfaea0f --- /dev/null +++ b/_generated/AndroidSigningV2/preandroidsigning.ts @@ -0,0 +1,25 @@ +import path = require('path'); +import secureFilesCommon = require('azure-pipelines-tasks-securefiles-common/securefiles-common'); +import tl = require('azure-pipelines-task-lib/task'); + +async function run() { + let keystoreFileId: string; + let secureFileHelpers: secureFilesCommon.SecureFileHelpers; + + try { + tl.setResourcePath(path.join(__dirname, 'task.json')); + + let jarsign: boolean = tl.getBoolInput('jarsign'); + if (jarsign) { + // download keystore file + keystoreFileId = tl.getInput('keystoreFile', true); + secureFileHelpers = new secureFilesCommon.SecureFileHelpers(); + let keystoreFilePath: string = await secureFileHelpers.downloadSecureFile(keystoreFileId); + tl.setTaskVariable('KEYSTORE_FILE_PATH', keystoreFilePath); + } + } catch (err) { + tl.setResult(tl.TaskResult.Failed, err); + } +} + +run(); diff --git a/_generated/AndroidSigningV2/task.json b/_generated/AndroidSigningV2/task.json new file mode 100644 index 000000000000..f1888ab8757c --- /dev/null +++ b/_generated/AndroidSigningV2/task.json @@ -0,0 +1,191 @@ +{ + "id": "80F3F6A0-82A6-4A22-BA7A-E5B8C541B9B9", + "name": "AndroidSigning", + "friendlyName": "Android signing", + "description": "Sign and align Android APK files", + "helpUrl": "https://docs.microsoft.com/azure/devops/pipelines/tasks/build/android-signing", + "helpMarkDown": "[Learn more about this task](https://go.microsoft.com/fwlink/?LinkID=613717)", + "category": "Build", + "visibility": [ + "Build" + ], + "author": "Microsoft Corporation", + "version": { + "Major": 2, + "Minor": 229, + "Patch": 0 + }, + "demands": [ + "JDK" + ], + "minimumAgentVersion": "2.182.1", + "groups": [ + { + "name": "jarsignerOptions", + "displayName": "Signing Options", + "isExpanded": true + }, + { + "name": "zipalignOptions", + "displayName": "Zipalign Options", + "isExpanded": true + } + ], + "inputs": [ + { + "name": "files", + "aliases": [ + "apkFiles" + ], + "type": "filePath", + "label": "APK files", + "defaultValue": "**/*.apk", + "required": true, + "helpMarkDown": "Relative path from the repo root to the APK(s) you want to sign. You can use wildcards to specify multiple files ([more information](https://go.microsoft.com/fwlink/?linkid=856077)). For example, `**/bin/*.apk` for all .APK files in the 'bin' subfolder" + }, + { + "name": "jarsign", + "type": "boolean", + "label": "Sign the APK", + "defaultValue": "true", + "required": false, + "groupName": "jarsignerOptions", + "helpMarkDown": "Select this option to sign the APK with a provided keystore file. Unsigned APKs can only run in an emulator. APKs must be signed to run on a device." + }, + { + "name": "keystoreFile", + "aliases": [ + "jarsignerKeystoreFile" + ], + "type": "secureFile", + "label": "Keystore file", + "defaultValue": "", + "required": true, + "visibleRule": "jarsign = true", + "groupName": "jarsignerOptions", + "helpMarkDown": "Select the keystore file that was uploaded to `Secure Files` to be used to sign the APK." + }, + { + "name": "keystorePass", + "aliases": [ + "jarsignerKeystorePassword" + ], + "type": "string", + "label": "Keystore password", + "defaultValue": "", + "required": false, + "visibleRule": "jarsign = true", + "groupName": "jarsignerOptions", + "helpMarkDown": "Enter the password for the provided keystore file. Use a new variable with its lock enabled on the Variables tab to encrypt this value." + }, + { + "name": "keystoreAlias", + "aliases": [ + "jarsignerKeystoreAlias" + ], + "type": "string", + "label": "Alias", + "defaultValue": "", + "required": false, + "visibleRule": "jarsign = true", + "groupName": "jarsignerOptions", + "helpMarkDown": "Enter the alias that identifies the public/private key pair to be used in the keystore file." + }, + { + "name": "keyPass", + "aliases": [ + "jarsignerKeyPassword" + ], + "type": "string", + "label": "Key password", + "defaultValue": "", + "required": false, + "visibleRule": "jarsign = true", + "groupName": "jarsignerOptions", + "helpMarkDown": "Enter the key password for the alias and keystore file. Use a new variable with its lock enabled on the Variables tab to encrypt this value." + }, + { + "name": "jarsignerArguments", + "type": "string", + "label": "Jarsigner arguments", + "defaultValue": "-verbose -sigalg MD5withRSA -digestalg SHA1", + "required": false, + "visibleRule": "jarsign = true", + "groupName": "jarsignerOptions", + "helpMarkDown": "Provide any options to pass to the jarsigner command line. Default is: -verbose -sigalg MD5withRSA -digestalg SHA1" + }, + { + "name": "zipalign", + "type": "boolean", + "label": "Zipalign", + "defaultValue": "true", + "required": false, + "groupName": "zipalignOptions", + "helpMarkDown": "Select if you want to zipalign your package. This reduces the amount of RAM consumed by an app." + }, + { + "name": "zipalignLocation", + "aliases": [ + "zipalignFile" + ], + "type": "string", + "label": "Zipalign location", + "defaultValue": "", + "required": false, + "visibleRule": "zipalign = true", + "groupName": "zipalignOptions", + "helpMarkDown": "Optionally specify the location of the zipalign executable used during signing. This defaults to the zipalign found in the Android SDK version folder that your application builds against." + } + ], + "instanceNameFormat": "Signing and aligning APK file(s) $(files)", + "prejobexecution": { + "Node10": { + "target": "preandroidsigning.js", + "argumentFormat": "" + }, + "Node16": { + "target": "preandroidsigning.js", + "argumentFormat": "" + } + }, + "execution": { + "Node10": { + "target": "androidsigning.js", + "argumentFormat": "" + }, + "Node16": { + "target": "androidsigning.js", + "argumentFormat": "" + } + }, + "postjobexecution": { + "Node10": { + "target": "postandroidsigning.js", + "argumentFormat": "" + }, + "Node16": { + "target": "postandroidsigning.js", + "argumentFormat": "" + } + }, + "messages": { + "AndroidHomeNotSet": "The ANDROID_HOME environment variable is not set for the running user.", + "CouldNotFindZipalign": "Could not find the zipalign tool.", + "CouldNotFindZipalignInAndroidHome": "Could not find the zipalign tool inside ANDROID_HOME: %s", + "JavaHomeNotSet": "The JAVA_HOME environment variable is not set for the running user.", + "NoMatchingFiles": "No matching files were found with search pattern: %s", + "DeleteKeystoreFileFailed": "Failed to delete keystore file downloaded from the server: %s" + }, + "restrictions": { + "commands": { + "mode": "restricted" + }, + "settableVariables": { + "allowed": [] + } + }, + "_buildConfigMapping": { + "Default": "2.229.0", + "Node20-225": "2.229.1" + } +} \ No newline at end of file diff --git a/_generated/AndroidSigningV2/task.loc.json b/_generated/AndroidSigningV2/task.loc.json new file mode 100644 index 000000000000..cf24d92bdb8e --- /dev/null +++ b/_generated/AndroidSigningV2/task.loc.json @@ -0,0 +1,191 @@ +{ + "id": "80F3F6A0-82A6-4A22-BA7A-E5B8C541B9B9", + "name": "AndroidSigning", + "friendlyName": "ms-resource:loc.friendlyName", + "description": "ms-resource:loc.description", + "helpUrl": "https://docs.microsoft.com/azure/devops/pipelines/tasks/build/android-signing", + "helpMarkDown": "ms-resource:loc.helpMarkDown", + "category": "Build", + "visibility": [ + "Build" + ], + "author": "Microsoft Corporation", + "version": { + "Major": 2, + "Minor": 229, + "Patch": 0 + }, + "demands": [ + "JDK" + ], + "minimumAgentVersion": "2.182.1", + "groups": [ + { + "name": "jarsignerOptions", + "displayName": "ms-resource:loc.group.displayName.jarsignerOptions", + "isExpanded": true + }, + { + "name": "zipalignOptions", + "displayName": "ms-resource:loc.group.displayName.zipalignOptions", + "isExpanded": true + } + ], + "inputs": [ + { + "name": "files", + "aliases": [ + "apkFiles" + ], + "type": "filePath", + "label": "ms-resource:loc.input.label.files", + "defaultValue": "**/*.apk", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.files" + }, + { + "name": "jarsign", + "type": "boolean", + "label": "ms-resource:loc.input.label.jarsign", + "defaultValue": "true", + "required": false, + "groupName": "jarsignerOptions", + "helpMarkDown": "ms-resource:loc.input.help.jarsign" + }, + { + "name": "keystoreFile", + "aliases": [ + "jarsignerKeystoreFile" + ], + "type": "secureFile", + "label": "ms-resource:loc.input.label.keystoreFile", + "defaultValue": "", + "required": true, + "visibleRule": "jarsign = true", + "groupName": "jarsignerOptions", + "helpMarkDown": "ms-resource:loc.input.help.keystoreFile" + }, + { + "name": "keystorePass", + "aliases": [ + "jarsignerKeystorePassword" + ], + "type": "string", + "label": "ms-resource:loc.input.label.keystorePass", + "defaultValue": "", + "required": false, + "visibleRule": "jarsign = true", + "groupName": "jarsignerOptions", + "helpMarkDown": "ms-resource:loc.input.help.keystorePass" + }, + { + "name": "keystoreAlias", + "aliases": [ + "jarsignerKeystoreAlias" + ], + "type": "string", + "label": "ms-resource:loc.input.label.keystoreAlias", + "defaultValue": "", + "required": false, + "visibleRule": "jarsign = true", + "groupName": "jarsignerOptions", + "helpMarkDown": "ms-resource:loc.input.help.keystoreAlias" + }, + { + "name": "keyPass", + "aliases": [ + "jarsignerKeyPassword" + ], + "type": "string", + "label": "ms-resource:loc.input.label.keyPass", + "defaultValue": "", + "required": false, + "visibleRule": "jarsign = true", + "groupName": "jarsignerOptions", + "helpMarkDown": "ms-resource:loc.input.help.keyPass" + }, + { + "name": "jarsignerArguments", + "type": "string", + "label": "ms-resource:loc.input.label.jarsignerArguments", + "defaultValue": "-verbose -sigalg MD5withRSA -digestalg SHA1", + "required": false, + "visibleRule": "jarsign = true", + "groupName": "jarsignerOptions", + "helpMarkDown": "ms-resource:loc.input.help.jarsignerArguments" + }, + { + "name": "zipalign", + "type": "boolean", + "label": "ms-resource:loc.input.label.zipalign", + "defaultValue": "true", + "required": false, + "groupName": "zipalignOptions", + "helpMarkDown": "ms-resource:loc.input.help.zipalign" + }, + { + "name": "zipalignLocation", + "aliases": [ + "zipalignFile" + ], + "type": "string", + "label": "ms-resource:loc.input.label.zipalignLocation", + "defaultValue": "", + "required": false, + "visibleRule": "zipalign = true", + "groupName": "zipalignOptions", + "helpMarkDown": "ms-resource:loc.input.help.zipalignLocation" + } + ], + "instanceNameFormat": "ms-resource:loc.instanceNameFormat", + "prejobexecution": { + "Node10": { + "target": "preandroidsigning.js", + "argumentFormat": "" + }, + "Node16": { + "target": "preandroidsigning.js", + "argumentFormat": "" + } + }, + "execution": { + "Node10": { + "target": "androidsigning.js", + "argumentFormat": "" + }, + "Node16": { + "target": "androidsigning.js", + "argumentFormat": "" + } + }, + "postjobexecution": { + "Node10": { + "target": "postandroidsigning.js", + "argumentFormat": "" + }, + "Node16": { + "target": "postandroidsigning.js", + "argumentFormat": "" + } + }, + "messages": { + "AndroidHomeNotSet": "ms-resource:loc.messages.AndroidHomeNotSet", + "CouldNotFindZipalign": "ms-resource:loc.messages.CouldNotFindZipalign", + "CouldNotFindZipalignInAndroidHome": "ms-resource:loc.messages.CouldNotFindZipalignInAndroidHome", + "JavaHomeNotSet": "ms-resource:loc.messages.JavaHomeNotSet", + "NoMatchingFiles": "ms-resource:loc.messages.NoMatchingFiles", + "DeleteKeystoreFileFailed": "ms-resource:loc.messages.DeleteKeystoreFileFailed" + }, + "restrictions": { + "commands": { + "mode": "restricted" + }, + "settableVariables": { + "allowed": [] + } + }, + "_buildConfigMapping": { + "Default": "2.229.0", + "Node20-225": "2.229.1" + } +} \ No newline at end of file diff --git a/_generated/AndroidSigningV2/tsconfig.json b/_generated/AndroidSigningV2/tsconfig.json new file mode 100644 index 000000000000..0438b79f69ac --- /dev/null +++ b/_generated/AndroidSigningV2/tsconfig.json @@ -0,0 +1,6 @@ +{ + "compilerOptions": { + "target": "ES6", + "module": "commonjs" + } +} \ No newline at end of file diff --git a/_generated/AndroidSigningV2/typings.json b/_generated/AndroidSigningV2/typings.json new file mode 100644 index 000000000000..6560c46c749d --- /dev/null +++ b/_generated/AndroidSigningV2/typings.json @@ -0,0 +1,8 @@ +{ + "name": "vsts-androidsigning-task", + "dependencies": {}, + "globalDependencies": { + "node": "registry:dt/node#6.0.0+20160921192128", + "q": "registry:dt/q#0.0.0+20160613154756" + } +} diff --git a/_generated/AndroidSigningV2_Node20/.npmrc b/_generated/AndroidSigningV2_Node20/.npmrc new file mode 100644 index 000000000000..5fca0d518be7 --- /dev/null +++ b/_generated/AndroidSigningV2_Node20/.npmrc @@ -0,0 +1 @@ +scripts-prepend-node-path=true diff --git a/_generated/AndroidSigningV2_Node20/Strings/resources.resjson/de-DE/resources.resjson b/_generated/AndroidSigningV2_Node20/Strings/resources.resjson/de-DE/resources.resjson new file mode 100644 index 000000000000..754857e067df --- /dev/null +++ b/_generated/AndroidSigningV2_Node20/Strings/resources.resjson/de-DE/resources.resjson @@ -0,0 +1,32 @@ +{ + "loc.friendlyName": "Android-Signatur", + "loc.helpMarkDown": "[Weitere Informationen zu dieser Aufgabe](https://go.microsoft.com/fwlink/?LinkID=613717)", + "loc.description": "Android-APK-Dateien signieren und ausrichten", + "loc.instanceNameFormat": "APK-Dateien $(files) werden signiert und ausgerichtet", + "loc.group.displayName.jarsignerOptions": "Signaturoptionen", + "loc.group.displayName.zipalignOptions": "Zipalign-Optionen", + "loc.input.label.files": "APK-Dateien", + "loc.input.help.files": "Der relative Pfad vom Repositorystamm zur APK-Datei bzw. den APK-Dateien, die Sie signieren möchten. Sie können Platzhalter verwenden, um mehrere Dateien anzugeben ([weitere Informationen](https://go.microsoft.com/fwlink/?linkid=856077)). Beispiel: \"**/bin/*.apk\" für alle APK-Dateien im Unterordner \"bin\".", + "loc.input.label.jarsign": "APK signieren", + "loc.input.help.jarsign": "Wählen Sie diese Option aus, wenn Sie die APK-Datei mit einer bereitgestellten KeyStore-Datei signieren möchten. Unsignierte APKs können nur in einem Emulator ausgeführt werden. APKs müssen signiert werden, um auf einem Gerät ausgeführt zu werden. ", + "loc.input.label.keystoreFile": "Keystore-Datei", + "loc.input.help.keystoreFile": "Wählen Sie die Keystore-Datei aus, die zum Signieren des APK in \"Sichere Dateien\" hochgeladen wurde.", + "loc.input.label.keystorePass": "Keystore-Kennwort", + "loc.input.help.keystorePass": "Geben Sie das Kennwort die KeyStore-Datei an. Verwenden Sie eine neue Variable, deren Sperre auf der Registerkarte \"Variablen\" aktiviert ist, um den Wert zu verschlüsseln.", + "loc.input.label.keystoreAlias": "Alias", + "loc.input.help.keystoreAlias": "Geben Sie den Alias an, der das öffentliche/private Schlüsselpaar identifiziert, das in der KeyStore-Datei verwendet werden soll.", + "loc.input.label.keyPass": "Schlüsselkennwort", + "loc.input.help.keyPass": "Geben Sie das Schlüsselkennwort für den Alias und die KeyStore-Datei an. Verwenden Sie eine neue Variable, deren Sperre auf der Registerkarte \"Variablen\" aktiviert ist, um den Wert zu verschlüsseln.", + "loc.input.label.jarsignerArguments": "Jarsigner-Argumente", + "loc.input.help.jarsignerArguments": "Geben Sie alle Optionen an, die an die Jarsigner-Befehlszeile übergeben werden sollen. Die Standardoptionen lauten: -verbose -sigalg MD5withRSA -digestalg SHA1", + "loc.input.label.zipalign": "Zipalign", + "loc.input.help.zipalign": "Geben Sie an, ob Ihr Paket mit Zipalign verarbeitet werden soll. Dadurch wird der von einer App benötigte Arbeitsspeicherplatz reduziert.", + "loc.input.label.zipalignLocation": "Zipalign-Speicherort", + "loc.input.help.zipalignLocation": "Geben Sie optional den Pfad zu der beim Signieren verwendeten ausführbaren Zipalign-Datei an. Standardmäßig handelt es sich hierbei um die Zipalign-Datei, die sich in dem für Ihren Anwendungsbuild verwendeten Android SDK-Versionsordner befindet.", + "loc.messages.AndroidHomeNotSet": "Die ANDROID_HOME-Umgebungsvariable ist für den ausführenden Benutzer nicht festgelegt.", + "loc.messages.CouldNotFindZipalign": "Das Zipalign-Tool wurde nicht gefunden.", + "loc.messages.CouldNotFindZipalignInAndroidHome": "Das Zipalign-Tool wurde nicht gefunden in ANDROID_HOME: %s.", + "loc.messages.JavaHomeNotSet": "Die JAVA_HOME-Umgebungsvariable ist für den ausführenden Benutzer nicht festgelegt.", + "loc.messages.NoMatchingFiles": "Keine mit dem Suchmuster übereinstimmenden Dateien wurden gefunden: %s", + "loc.messages.DeleteKeystoreFileFailed": "Fehler beim Löschen der Keystore-Datei, die vom Server heruntergeladen wurde: %s" +} \ No newline at end of file diff --git a/_generated/AndroidSigningV2_Node20/Strings/resources.resjson/en-US/resources.resjson b/_generated/AndroidSigningV2_Node20/Strings/resources.resjson/en-US/resources.resjson new file mode 100644 index 000000000000..f476a8866b97 --- /dev/null +++ b/_generated/AndroidSigningV2_Node20/Strings/resources.resjson/en-US/resources.resjson @@ -0,0 +1,32 @@ +{ + "loc.friendlyName": "Android signing", + "loc.helpMarkDown": "[Learn more about this task](https://go.microsoft.com/fwlink/?LinkID=613717)", + "loc.description": "Sign and align Android APK files", + "loc.instanceNameFormat": "Signing and aligning APK file(s) $(files)", + "loc.group.displayName.jarsignerOptions": "Signing Options", + "loc.group.displayName.zipalignOptions": "Zipalign Options", + "loc.input.label.files": "APK files", + "loc.input.help.files": "Relative path from the repo root to the APK(s) you want to sign. You can use wildcards to specify multiple files ([more information](https://go.microsoft.com/fwlink/?linkid=856077)). For example, `**/bin/*.apk` for all .APK files in the 'bin' subfolder", + "loc.input.label.jarsign": "Sign the APK", + "loc.input.help.jarsign": "Select this option to sign the APK with a provided keystore file. Unsigned APKs can only run in an emulator. APKs must be signed to run on a device.", + "loc.input.label.keystoreFile": "Keystore file", + "loc.input.help.keystoreFile": "Select the keystore file that was uploaded to `Secure Files` to be used to sign the APK.", + "loc.input.label.keystorePass": "Keystore password", + "loc.input.help.keystorePass": "Enter the password for the provided keystore file. Use a new variable with its lock enabled on the Variables tab to encrypt this value.", + "loc.input.label.keystoreAlias": "Alias", + "loc.input.help.keystoreAlias": "Enter the alias that identifies the public/private key pair to be used in the keystore file.", + "loc.input.label.keyPass": "Key password", + "loc.input.help.keyPass": "Enter the key password for the alias and keystore file. Use a new variable with its lock enabled on the Variables tab to encrypt this value.", + "loc.input.label.jarsignerArguments": "Jarsigner arguments", + "loc.input.help.jarsignerArguments": "Provide any options to pass to the jarsigner command line. Default is: -verbose -sigalg MD5withRSA -digestalg SHA1", + "loc.input.label.zipalign": "Zipalign", + "loc.input.help.zipalign": "Select if you want to zipalign your package. This reduces the amount of RAM consumed by an app.", + "loc.input.label.zipalignLocation": "Zipalign location", + "loc.input.help.zipalignLocation": "Optionally specify the location of the zipalign executable used during signing. This defaults to the zipalign found in the Android SDK version folder that your application builds against.", + "loc.messages.AndroidHomeNotSet": "The ANDROID_HOME environment variable is not set for the running user.", + "loc.messages.CouldNotFindZipalign": "Could not find the zipalign tool.", + "loc.messages.CouldNotFindZipalignInAndroidHome": "Could not find the zipalign tool inside ANDROID_HOME: %s", + "loc.messages.JavaHomeNotSet": "The JAVA_HOME environment variable is not set for the running user.", + "loc.messages.NoMatchingFiles": "No matching files were found with search pattern: %s", + "loc.messages.DeleteKeystoreFileFailed": "Failed to delete keystore file downloaded from the server: %s" +} \ No newline at end of file diff --git a/_generated/AndroidSigningV2_Node20/Strings/resources.resjson/es-ES/resources.resjson b/_generated/AndroidSigningV2_Node20/Strings/resources.resjson/es-ES/resources.resjson new file mode 100644 index 000000000000..d35f8701d6cd --- /dev/null +++ b/_generated/AndroidSigningV2_Node20/Strings/resources.resjson/es-ES/resources.resjson @@ -0,0 +1,32 @@ +{ + "loc.friendlyName": "Firma de Android", + "loc.helpMarkDown": "[Obtener más información acerca de esta tarea](https://go.microsoft.com/fwlink/?LinkID=613717)", + "loc.description": "Firmar y alinear archivos APK de Android", + "loc.instanceNameFormat": "Firma y alineación de archivos APK $(files)", + "loc.group.displayName.jarsignerOptions": "Opciones de firma", + "loc.group.displayName.zipalignOptions": "Opciones de Zipalign", + "loc.input.label.files": "Archivos APK", + "loc.input.help.files": "Ruta de acceso relativa de la raíz del repositorio a los APK que desea firmar. Puede usar caracteres comodín para especificar varios archivos ([más información](https://go.microsoft.com/fwlink/?linkid=856077)). Por ejemplo, \"**/bin/*.apk\" para todos los archivos .APK en la subcarpeta \"bin\"", + "loc.input.label.jarsign": "Firmar el APK", + "loc.input.help.jarsign": "Seleccione esta opción para firmar el APK con un archivo de almacén de claves proporcionado. Los APK sin firma solo se pueden ejecutar en un emulador. Deben estar firmados para poder ejecutarlos en un dispositivo.", + "loc.input.label.keystoreFile": "Archivo del almacén de claves", + "loc.input.help.keystoreFile": "Seleccione el archivo de almacén de claves que se cargó en \"Archivos seguros\" a fin de usarlo para firmar el APK.", + "loc.input.label.keystorePass": "Contraseña del almacén de claves", + "loc.input.help.keystorePass": "Escriba la contraseña del archivo de almacén de claves proporcionado. Utilice una variable nueva con el bloqueo habilitado en la ficha Variables para cifrar este valor.", + "loc.input.label.keystoreAlias": "Alias", + "loc.input.help.keystoreAlias": "Escriba el alias que identifica el par de claves pública/privada que debe usarse en el archivo de almacén de claves.", + "loc.input.label.keyPass": "Contraseña de clave", + "loc.input.help.keyPass": "Escriba la contraseña de clave del alias y el archivo de almacén de claves. Utilice una variable nueva con el bloqueo habilitado en la ficha Variables para cifrar este valor.", + "loc.input.label.jarsignerArguments": "Argumentos de Jarsigner", + "loc.input.help.jarsignerArguments": "Proporcione cualquier opción para pasar a la línea de comandos de Jarsigner. El valor predeterminado es: -verbose -sigalg MD5withRSA -digestalg SHA1", + "loc.input.label.zipalign": "Zipalign", + "loc.input.help.zipalign": "Seleccione si desea optimizar el paquete con zipalign. Esta acción disminuye la cantidad de RAM que consume una aplicación.", + "loc.input.label.zipalignLocation": "Ubicación de Zipalign", + "loc.input.help.zipalignLocation": "Especifique opcionalmente la ubicación del ejecutable zipalign usado durante la firma. Se establece como valor predeterminado el ejecutable zipalign que se encuentra en la carpeta de la versión de Android SDK en que se compila la aplicación.", + "loc.messages.AndroidHomeNotSet": "La variable de entorno ANDROID_HOME no está definida para el usuario actual.", + "loc.messages.CouldNotFindZipalign": "No se encuentra la herramiena zipalign.", + "loc.messages.CouldNotFindZipalignInAndroidHome": "No se encuentra la herramienta zipalign en ANDROID_HOME: %s", + "loc.messages.JavaHomeNotSet": "La variable de entorno JAVA_HOME no está definida para el usuario actual.", + "loc.messages.NoMatchingFiles": "No se encontraron archivos coincidentes con el patrón de búsqueda: %s", + "loc.messages.DeleteKeystoreFileFailed": "No se pudo eliminar el archivo de almacén de claves descargado del servidor: %s" +} \ No newline at end of file diff --git a/_generated/AndroidSigningV2_Node20/Strings/resources.resjson/fr-FR/resources.resjson b/_generated/AndroidSigningV2_Node20/Strings/resources.resjson/fr-FR/resources.resjson new file mode 100644 index 000000000000..8f39a15703a7 --- /dev/null +++ b/_generated/AndroidSigningV2_Node20/Strings/resources.resjson/fr-FR/resources.resjson @@ -0,0 +1,32 @@ +{ + "loc.friendlyName": "Signature Android", + "loc.helpMarkDown": "[En savoir plus sur cette tâche](https://go.microsoft.com/fwlink/?LinkID=613717)", + "loc.description": "Signer et aligner les fichiers APK Android", + "loc.instanceNameFormat": "Signature et alignement de fichiers APK $(files)", + "loc.group.displayName.jarsignerOptions": "Options de signature", + "loc.group.displayName.zipalignOptions": "Options Zipalign", + "loc.input.label.files": "Fichiers APK", + "loc.input.help.files": "Chemin relatif entre la racine du dépôt et le ou les fichiers APK à signer. Vous pouvez utiliser des caractères génériques pour spécifier plusieurs fichiers ([Plus d'informations](https://go.microsoft.com/fwlink/?linkid=856077)). Par exemple, '**/bin/*.apk' pour tous les fichiers .APK du sous-dossier 'bin'", + "loc.input.label.jarsign": "Signer le fichier APK", + "loc.input.help.jarsign": "Sélectionnez cette option pour signer le fichier APK avec le fichier de magasin de clés fourni. Les fichiers APK non signés peuvent uniquement s'exécuter dans un émulateur. Les fichiers APK doivent être signés pour pouvoir s'exécuter sur un appareil.", + "loc.input.label.keystoreFile": "Fichier du magasin de clés", + "loc.input.help.keystoreFile": "Sélectionnez le fichier de magasin de clés chargé dans 'Fichiers sécurisés' à utiliser pour signer le fichier APK.", + "loc.input.label.keystorePass": "Mot de passe du magasin de clés", + "loc.input.help.keystorePass": "Entrez le mot de passe du fichier de magasin de clés fourni. Pour chiffrer cette valeur, utilisez une nouvelle variable en activant son verrou sous l'onglet Variables.", + "loc.input.label.keystoreAlias": "Alias", + "loc.input.help.keystoreAlias": "Entrez l'alias qui identifie la paire de clés publiques/privées à utiliser dans le fichier de magasin de clés.", + "loc.input.label.keyPass": "Mot de passe de la clé", + "loc.input.help.keyPass": "Entrez le mot de passe de clé pour l'alias et le fichier de magasin de clés. Pour chiffrer cette valeur, utilisez une nouvelle variable en activant son verrou sous l'onglet Variables.", + "loc.input.label.jarsignerArguments": "Arguments Jarsigner", + "loc.input.help.jarsignerArguments": "Indiquez les éventuelles options pour passer à la ligne de commande jarsigner. Valeur par défaut : -verbose -sigalg MD5withRSA -digestalg SHA1", + "loc.input.label.zipalign": "Zipalign", + "loc.input.help.zipalign": "Sélectionnez cette option si vous voulez compresser votre package dans un fichier zipalign. Cela réduit la quantité de RAM consommée par une application.", + "loc.input.label.zipalignLocation": "Emplacement de Zipalign", + "loc.input.help.zipalignLocation": "Indiquez éventuellement l'emplacement de l'exécutable zipalign utilisé lors de la signature. Il s'agit par défaut du fichier zipalign disponible dans le dossier de la version Android SDK sur laquelle repose votre application.", + "loc.messages.AndroidHomeNotSet": "La variable d'environnement ANDROID_HOME n'est pas définie pour l'utilisateur actuel.", + "loc.messages.CouldNotFindZipalign": "L'outil zipalign est introuvable.", + "loc.messages.CouldNotFindZipalignInAndroidHome": "L'outil zipalign est introuvable dans ANDROID_HOME : %s", + "loc.messages.JavaHomeNotSet": "La variable d'environnement JAVA_HOME n'est pas définie pour l'utilisateur actuel.", + "loc.messages.NoMatchingFiles": "Il n'existe aucun fichier correspondant au modèle de recherche : %s", + "loc.messages.DeleteKeystoreFileFailed": "Échec de la suppression du fichier de magasin de clés téléchargé à partir du serveur : %s" +} \ No newline at end of file diff --git a/_generated/AndroidSigningV2_Node20/Strings/resources.resjson/it-IT/resources.resjson b/_generated/AndroidSigningV2_Node20/Strings/resources.resjson/it-IT/resources.resjson new file mode 100644 index 000000000000..ba51ec6c21ba --- /dev/null +++ b/_generated/AndroidSigningV2_Node20/Strings/resources.resjson/it-IT/resources.resjson @@ -0,0 +1,32 @@ +{ + "loc.friendlyName": "Firma per Android", + "loc.helpMarkDown": "[Altre informazioni su questa attività](https://go.microsoft.com/fwlink/?LinkID=613717)", + "loc.description": "Consente di firmare e allineare i file APK di Android", + "loc.instanceNameFormat": "Firma e allineamento dei file APK $(files)", + "loc.group.displayName.jarsignerOptions": "Opzioni di firma", + "loc.group.displayName.zipalignOptions": "Opzioni Zipalign", + "loc.input.label.files": "File APK", + "loc.input.help.files": "Percorso relativo dalla radice del repository ai file APK da firmare. Per specificare più file, è possibile usare i caratteri jolly, ad esempio `**/bin/*.apk` per tutti i file APK presenti nella sottocartella 'bin'. [Altre informazioni](https://go.microsoft.com/fwlink/?linkid=856077)", + "loc.input.label.jarsign": "Firma APK", + "loc.input.help.jarsign": "Selezionare questa opzione per firmare l'APK con un file dell'archivio chiavi fornito. Per essere eseguiti in un dispositivo, gli APK devono essere firmati. Gli APK senza firma possono essere eseguiti sono in un emulatore.", + "loc.input.label.keystoreFile": "File dell'archivio chiavi", + "loc.input.help.keystoreFile": "Consente di selezionare il file dell'archivio chiavi caricato in `File protetti` da usare per firmare l'APK.", + "loc.input.label.keystorePass": "Password dell'archivio chiavi", + "loc.input.help.keystorePass": "Immettere la password per il file dell'archivio chiavi fornito. Per crittografare questo valore, usare una nuova variabile con il blocco abilitato nella scheda Variabili.", + "loc.input.label.keystoreAlias": "Alias", + "loc.input.help.keystoreAlias": "Immettere l'alias che identifica la coppia di chiavi pubblica/privata da usare nel file dell'archivio chiavi.", + "loc.input.label.keyPass": "Password della chiave", + "loc.input.help.keyPass": "Immettere la password chiave per il file dell'archivio chiavi e l'alias. Per crittografare questo valore, usare una nuova variabile con il blocco abilitato nella scheda Variabili.", + "loc.input.label.jarsignerArguments": "Argomenti di Jarsigner", + "loc.input.help.jarsignerArguments": "Consente di specificare le eventuali opzioni da passare alla riga di comando di Jarsigner. Impostazione predefinita: -verbose -sigalg MD5withRSA -digestalg SHA1", + "loc.input.label.zipalign": "Zipalign", + "loc.input.help.zipalign": "Consente di scegliere se eseguire zipalign per il pacchetto, in modo da ridurre la quantità di RAM utilizzata da un'app.", + "loc.input.label.zipalignLocation": "Percorso di Zipalign", + "loc.input.help.zipalignLocation": "Consente facoltativamente di specificare il percorso dell'eseguibile di zipalign usato durante la firma. Per impostazione predefinita viene usato l'eseguibile di zipalign trovato nella cartella della versione di Android SDK usata per la compilazione dell'applicazione.", + "loc.messages.AndroidHomeNotSet": "La variabile di ambiente ANDROID_HOME non è impostata per l'utente in esecuzione.", + "loc.messages.CouldNotFindZipalign": "Non è stato possibile trovare lo strumento zipalign.", + "loc.messages.CouldNotFindZipalignInAndroidHome": "Non è stato possibile trovare lo strumento zipalign in ANDROID_HOME: %s", + "loc.messages.JavaHomeNotSet": "La variabile di ambiente JAVA_HOME non è impostata per l'utente in esecuzione.", + "loc.messages.NoMatchingFiles": "Non sono stati trovati file corrispondenti con il criterio di ricerca: %s", + "loc.messages.DeleteKeystoreFileFailed": "Non è stato possibile eliminare il file dell'archivio chiavi scaricato dal server: %s" +} \ No newline at end of file diff --git a/_generated/AndroidSigningV2_Node20/Strings/resources.resjson/ja-JP/resources.resjson b/_generated/AndroidSigningV2_Node20/Strings/resources.resjson/ja-JP/resources.resjson new file mode 100644 index 000000000000..8ccf6902f93a --- /dev/null +++ b/_generated/AndroidSigningV2_Node20/Strings/resources.resjson/ja-JP/resources.resjson @@ -0,0 +1,32 @@ +{ + "loc.friendlyName": "Android の署名", + "loc.helpMarkDown": "[このタスクの詳細を表示](https://go.microsoft.com/fwlink/?LinkID=613717)", + "loc.description": "署名し、Android APK ファイルを配置します", + "loc.instanceNameFormat": "APK ファイル $(files) の署名と配置", + "loc.group.displayName.jarsignerOptions": "署名オプション", + "loc.group.displayName.zipalignOptions": "Zipalign オプション", + "loc.input.label.files": "APK ファイル", + "loc.input.help.files": "リポジトリのルートから署名する APK への相対パス。ワイルドカードを使用して複数のファイルを指定できます ([詳細](https://go.microsoft.com/fwlink/?linkid=856077))。たとえば、'bin' サブフォルダーにあるすべての .APK ファイルの場合は `**/bin/*.apk` です。", + "loc.input.label.jarsign": "APK の署名", + "loc.input.help.jarsign": "指定したキーストア ファイルで APK に署名する場合に、このオプションを選択します。署名がない APK はエミュレーターだけでしか実行できません。デバイスで実行するには、APK に署名する必要があります。", + "loc.input.label.keystoreFile": "Keystore ファイル", + "loc.input.help.keystoreFile": "APK の署名に使うために [セキュア ファイル] にアップロードされたキーストア ファイルを選択します。", + "loc.input.label.keystorePass": "Keystore パスワード", + "loc.input.help.keystorePass": "提供されているキーストア ファイルに関するパスワードを入力します。この値を暗号化するには、[変数] タブで、ロックを有効にして新しい変数をご使用ください。", + "loc.input.label.keystoreAlias": "エイリアス", + "loc.input.help.keystoreAlias": "キーストア ファイルで使用される公開キー/秘密キーのペアを識別するエイリアスを入力します。", + "loc.input.label.keyPass": "キー パスワード", + "loc.input.help.keyPass": "エイリアスとキーストア ファイルのキー パスワードを入力します。この値を暗号化するには、[変数] タブで新しい変数のロックを有効にします。", + "loc.input.label.jarsignerArguments": "Jarsigner の引数", + "loc.input.help.jarsignerArguments": "Jarsigner コマンド ラインに渡すオプションを指定します。既定値: -verbose -sigalg MD5withRSA -digestalg SHA1", + "loc.input.label.zipalign": "Zipalign", + "loc.input.help.zipalign": "パッケージに Zipalign を実行する場合に選択します。アプリに使用される RAM の量を減らすことができます。", + "loc.input.label.zipalignLocation": "Zipalign の場所", + "loc.input.help.zipalignLocation": "(省略可能) 署名中に使用される Zipalign 実行可能ファイルの場所を指定します。既定値は、アプリケーションがビルドした Android SDK バージョン フォルダー内にある Zipalign になります。", + "loc.messages.AndroidHomeNotSet": "実行中のユーザーに ANDROID_HOME 環境変数が設定されていません。", + "loc.messages.CouldNotFindZipalign": "Zipalign ツールが見つかりませんでした。", + "loc.messages.CouldNotFindZipalignInAndroidHome": "ANDROID_HOME 内に Zipalign ツールが見つかりませんでした: %s", + "loc.messages.JavaHomeNotSet": "実行中のユーザーに JAVA_HOME 環境変数が設定されていません。", + "loc.messages.NoMatchingFiles": "次の検索パターンと一致するファイルが見つかりませんでした: %s", + "loc.messages.DeleteKeystoreFileFailed": "サーバーからダウンロードされたキーストア ファイルを削除することができませんでした: %s" +} \ No newline at end of file diff --git a/_generated/AndroidSigningV2_Node20/Strings/resources.resjson/ko-KR/resources.resjson b/_generated/AndroidSigningV2_Node20/Strings/resources.resjson/ko-KR/resources.resjson new file mode 100644 index 000000000000..0d4ab586dead --- /dev/null +++ b/_generated/AndroidSigningV2_Node20/Strings/resources.resjson/ko-KR/resources.resjson @@ -0,0 +1,32 @@ +{ + "loc.friendlyName": "Android 서명", + "loc.helpMarkDown": "[이 작업에 대한 자세한 정보](https://go.microsoft.com/fwlink/?LinkID=613717)", + "loc.description": "Android APK 파일 서명 및 정렬", + "loc.instanceNameFormat": "APK 파일 $(files) 서명 및 정렬", + "loc.group.displayName.jarsignerOptions": "서명 옵션", + "loc.group.displayName.zipalignOptions": "Zipalign 옵션", + "loc.input.label.files": "APK 파일", + "loc.input.help.files": "서명할 APK에 대한 리포 루트의 상대 경로입니다. 와일드카드를 사용하여 여러 파일을 지정할 수 있습니다([자세한 정보](https://go.microsoft.com/fwlink/?linkid=856077)). 예를 들어, 'bin' 하위 폴더에 있는 모든 APK 파일을 표시하기 위해 '**/bin/*.apk'를 사용할 수 있습니다.", + "loc.input.label.jarsign": "APK 서명", + "loc.input.help.jarsign": "제공된 키 저장소 파일을 사용하여 APK에 서명하려면 이 옵션을 선택합니다. 서명되지 않은 APK는 에뮬레이터에서만 실행할 수 있습니다. 장치에서 실행하려면 APK가 서명되어야 합니다.", + "loc.input.label.keystoreFile": "키 저장소 파일", + "loc.input.help.keystoreFile": "APK 서명에 사용하기 위해 '보안 파일'에 업로드한 키 저장소 파일을 선택합니다.", + "loc.input.label.keystorePass": "키 저장소 암호", + "loc.input.help.keystorePass": "제공된 키 저장소 파일에 대한 암호를 입력합니다. 이 값을 암호화하려면 [변수] 탭에서 잠금이 사용 설정된 새 변수를 사용하세요.", + "loc.input.label.keystoreAlias": "별칭", + "loc.input.help.keystoreAlias": "공용/개인 키 쌍을 식별하여 키 저장소 파일에 사용할 별칭을 입력합니다.", + "loc.input.label.keyPass": "키 암호", + "loc.input.help.keyPass": "별칭 및 키 저장소 파일에 대한 키 암호를 입력합니다. 이 값을 암호화하려면 [변수] 탭에서 잠금이 사용 설정된 새 변수를 사용하세요.", + "loc.input.label.jarsignerArguments": "Jarsigner 인수", + "loc.input.help.jarsignerArguments": "Jarsigner 명령줄에 전달할 옵션을 지정합니다. 기본값: -verbose -sigalg MD5withRSA -digestalg SHA1", + "loc.input.label.zipalign": "Zipalign", + "loc.input.help.zipalign": "패키지를 zipalign하려면 선택합니다. 이렇게 하면 앱에 사용되는 RAM 양이 줄어듭니다.", + "loc.input.label.zipalignLocation": "Zipalign 위치", + "loc.input.help.zipalignLocation": "원하는 경우 서명할 때 사용되는 zipalign 실행 파일의 위치를 지정합니다. 기본적으로 응용 프로그램이 빌드되는 Android SDK 버전 폴더에 있는 zipalign을 사용합니다.", + "loc.messages.AndroidHomeNotSet": "실행 중인 사용자에 대해 ANDROID_HOME 환경 변수가 설정되어 있지 않습니다.", + "loc.messages.CouldNotFindZipalign": "Zipalign 도구를 찾을 수 없습니다.", + "loc.messages.CouldNotFindZipalignInAndroidHome": "ANDROID_HOME 내에서 Zipalign 도구를 찾을 수 없습니다. %s", + "loc.messages.JavaHomeNotSet": "실행 중인 사용자에 대해 JAVA_HOME 환경 변수가 설정되어 있지 않습니다.", + "loc.messages.NoMatchingFiles": "다음 검색 패턴과 일치하는 파일을 찾을 수 없습니다. %s", + "loc.messages.DeleteKeystoreFileFailed": "서버에서 다운로드된 키 저장소 파일을 삭제하지 못함: %s" +} \ No newline at end of file diff --git a/_generated/AndroidSigningV2_Node20/Strings/resources.resjson/ru-RU/resources.resjson b/_generated/AndroidSigningV2_Node20/Strings/resources.resjson/ru-RU/resources.resjson new file mode 100644 index 000000000000..a7846271abc1 --- /dev/null +++ b/_generated/AndroidSigningV2_Node20/Strings/resources.resjson/ru-RU/resources.resjson @@ -0,0 +1,32 @@ +{ + "loc.friendlyName": "Подписывание Android", + "loc.helpMarkDown": "[См. дополнительные сведения об этой задаче](https://go.microsoft.com/fwlink/?LinkID=613717)", + "loc.description": "Подписывание и назначение APK-файлов Android", + "loc.instanceNameFormat": "Подписание и выравнивание файлов APK $(files)", + "loc.group.displayName.jarsignerOptions": "Параметры подписи", + "loc.group.displayName.zipalignOptions": "Параметры Zipalign", + "loc.input.label.files": "APK-файлы", + "loc.input.help.files": "Относительный путь от корня репозитория к подписываемым APK-файлам. Можно использовать подстановочные знаки для указания нескольких файлов ([дополнительные сведения](https://go.microsoft.com/fwlink/?linkid=856077)). Пример: \"**/bin/*.apk\" для всех APK-файлов во вложенной папке bin", + "loc.input.label.jarsign": "Подписать APK", + "loc.input.help.jarsign": "Выберите этот параметр, чтобы подписать APK с помощью предоставленного файла хранилища ключей. Неподписанные APK можно выполнять только в эмуляторе. Для запуска на устройстве APK должны быть подписаны.", + "loc.input.label.keystoreFile": "Файл хранилища ключей", + "loc.input.help.keystoreFile": "Выберите файл хранилища ключей, отправленный в разделе \"Безопасные файлы\" для подписывания APK.", + "loc.input.label.keystorePass": "Пароль хранилища ключей", + "loc.input.help.keystorePass": "Введите пароль для предоставленного файла хранилища ключей. Чтобы зашифровать это значение, используйте новую переменную сборки с включенной блокировкой на вкладке \"Переменные\".", + "loc.input.label.keystoreAlias": "Псевдоним", + "loc.input.help.keystoreAlias": "Введите псевдоним, который определяет пару открытого и закрытого ключей для использования в файле хранилища ключей.", + "loc.input.label.keyPass": "Пароль ключа", + "loc.input.help.keyPass": "Введите пароль ключа для псевдонима и файла хранилища ключей. Чтобы зашифровать это значение, используйте новую переменную сборки с включенной блокировкой на вкладке \"Переменные\".", + "loc.input.label.jarsignerArguments": "Аргументы Jarsigner", + "loc.input.help.jarsignerArguments": "Укажите параметры для передачи в командную строку jarsigner. По умолчанию: -verbose -sigalg MD5withRSA -digestalg SHA1.", + "loc.input.label.zipalign": "Zipalign", + "loc.input.help.zipalign": "Укажите, следует ли использовать для пакета zipalign. Это позволяет снизить объем оперативной памяти, используемой приложением.", + "loc.input.label.zipalignLocation": "Расположение Zipalign", + "loc.input.help.zipalignLocation": "При необходимости укажите путь к исполняемому файлу zipalign, используемому при подписывании. По умолчанию применяется zipalign, найденный в папке той версии Android SDK, с которой собрано ваше приложение.", + "loc.messages.AndroidHomeNotSet": "Переменная среды ANDROID_HOME не задана для текущего пользователя.", + "loc.messages.CouldNotFindZipalign": "Не удалось найти средство zipalign.", + "loc.messages.CouldNotFindZipalignInAndroidHome": "Не удалось найти средство zipalign в ANDROID_HOME: %s", + "loc.messages.JavaHomeNotSet": "Переменная среды JAVA_HOME не задана для текущего пользователя.", + "loc.messages.NoMatchingFiles": "Не найдены файлы, соответствующие шаблону поиска: %s.", + "loc.messages.DeleteKeystoreFileFailed": "Не удалось удалить скачанный с сервера файл хранилища ключей: %s" +} \ No newline at end of file diff --git a/_generated/AndroidSigningV2_Node20/Strings/resources.resjson/zh-CN/resources.resjson b/_generated/AndroidSigningV2_Node20/Strings/resources.resjson/zh-CN/resources.resjson new file mode 100644 index 000000000000..5c249ca7186c --- /dev/null +++ b/_generated/AndroidSigningV2_Node20/Strings/resources.resjson/zh-CN/resources.resjson @@ -0,0 +1,32 @@ +{ + "loc.friendlyName": "Android 签名", + "loc.helpMarkDown": "[详细了解此任务](https://go.microsoft.com/fwlink/?LinkID=613717)", + "loc.description": "签名并排列 Android APK 文件", + "loc.instanceNameFormat": "签名并排列 APK 文件 $(files)", + "loc.group.displayName.jarsignerOptions": "签名选项", + "loc.group.displayName.zipalignOptions": "Zipalign 选项", + "loc.input.label.files": "APK 文件", + "loc.input.help.files": "从存储库根路径到要签名的 APK 之间的相对路径。可以使用通配符指定多个文件([详细信息](https://go.microsoft.com/fwlink/?linkid=856077))。例如,使用 \"**/bin/*.apk\" 指定 \"bin\" 子文件夹中的所有 .APK 文件", + "loc.input.label.jarsign": "为 APK 签名", + "loc.input.help.jarsign": "若要使用提供的密钥存储文件对 APK 签名,请选择此项。未签名的 APK 只能在仿真器中运行。若要在设备上运行,必需对 APK 签名。", + "loc.input.label.keystoreFile": "Keystore 文件", + "loc.input.help.keystoreFile": "选择已上传到“安全文件”用来对 APK 签名的密钥存储文件。", + "loc.input.label.keystorePass": "Keystore 密码", + "loc.input.help.keystorePass": "输入提供的密钥存储文件的密码。对“变量”选项卡使用已启用锁定的新变量来加密该值。", + "loc.input.label.keystoreAlias": "别名", + "loc.input.help.keystoreAlias": "输入别名,以标识在密钥存储文件中使用的公钥/私钥对。", + "loc.input.label.keyPass": "密钥密码", + "loc.input.help.keyPass": "输入别名和密钥存储文件的密钥密码。对“变量”选项卡使用已启用锁定的新变量来加密该值。", + "loc.input.label.jarsignerArguments": "Jarsigner 参数", + "loc.input.help.jarsignerArguments": "提供要传递到 jarsigner 命令行的任何选项。默认值是: -verbose -sigalg MD5withRSA -digestalg SHA1", + "loc.input.label.zipalign": "Zipalign", + "loc.input.help.zipalign": "若要对包进行 zipalign,请选择此项。这会减少应用使用的 RAM 量。", + "loc.input.label.zipalignLocation": "Zipalign 位置", + "loc.input.help.zipalignLocation": "也可以选择指定签名过程中使用的 zipalign 可执行文件的位置。默认情况下,使用应用程序基于其创建的 Android SDK 版本文件夹中的 zipalign。", + "loc.messages.AndroidHomeNotSet": "未为正在运行的用户设置 ANDROID_HOME 环境变量。", + "loc.messages.CouldNotFindZipalign": "找不到 zipalign 工具。", + "loc.messages.CouldNotFindZipalignInAndroidHome": "无法在 ANDROID_HOME 内找到 zipalign 工具: %s", + "loc.messages.JavaHomeNotSet": "未为正在运行的用户设置 JAVA_HOME 环境变量。", + "loc.messages.NoMatchingFiles": "使用搜索模式 %s 未找到匹配的文件", + "loc.messages.DeleteKeystoreFileFailed": "未能删除从服务器下载的密钥存储文件: %s" +} \ No newline at end of file diff --git a/_generated/AndroidSigningV2_Node20/Strings/resources.resjson/zh-TW/resources.resjson b/_generated/AndroidSigningV2_Node20/Strings/resources.resjson/zh-TW/resources.resjson new file mode 100644 index 000000000000..5d45c5cae7ac --- /dev/null +++ b/_generated/AndroidSigningV2_Node20/Strings/resources.resjson/zh-TW/resources.resjson @@ -0,0 +1,32 @@ +{ + "loc.friendlyName": "Android 簽署", + "loc.helpMarkDown": "[深入了解此工作](https://go.microsoft.com/fwlink/?LinkID=613717)", + "loc.description": "簽署並對齊 Android APK 檔案", + "loc.instanceNameFormat": "簽署並對齊 APK 檔 $(files)", + "loc.group.displayName.jarsignerOptions": "簽署選項", + "loc.group.displayName.zipalignOptions": "Zipalign 選項", + "loc.input.label.files": "APK 檔案", + "loc.input.help.files": "所要簽署 APK 相對於存放庫根路徑的路徑。您可以使用萬用字元來指定多個檔案 ([詳細資訊](https://go.microsoft.com/fwlink/?linkid=856077))。例如,`**/bin/*.apk` 表示 'bin' 子資料夾中的所有 .APK 檔案", + "loc.input.label.jarsign": "簽署 APK", + "loc.input.help.jarsign": "若要使用提供的金鑰儲存區檔案簽署 APK,請選取此選項。未經簽署的 APK 只可在模擬器中執行。APK 必須經過簽署,才能在裝置上執行。", + "loc.input.label.keystoreFile": "金鑰儲存區檔案", + "loc.input.help.keystoreFile": "選取上傳至 `Secure Files` 以用於簽署 APK 的金鑰儲存區檔案。", + "loc.input.label.keystorePass": "金鑰儲存區密碼", + "loc.input.help.keystorePass": "請輸入所提供之金鑰儲存區檔案的密碼。請使用新的變數,並在 [變數] 索引標籤上啟用其鎖定,以加密此變數。", + "loc.input.label.keystoreAlias": "別名", + "loc.input.help.keystoreAlias": "請輸入可以識別要在金鑰儲存區檔案中使用之公用/私密金鑰組的別名。", + "loc.input.label.keyPass": "金鑰密碼", + "loc.input.help.keyPass": "請輸入別名與金鑰儲存區檔案的金鑰密碼。請使用新的變數,並在 [變數] 索引標籤上啟用其鎖定,以加密此變數。", + "loc.input.label.jarsignerArguments": "Jarsigner 引數", + "loc.input.help.jarsignerArguments": "提供任何選項以傳遞至 jarsigner 命令列。預設為: -verbose -sigalg MD5withRSA -digestalg SHA1", + "loc.input.label.zipalign": "Zipalign", + "loc.input.help.zipalign": "若想要為套件進行 zipalign 則加以選取。如此可減少應用程式所使用的 RAM 量。", + "loc.input.label.zipalignLocation": "Zipalign 位置", + "loc.input.help.zipalignLocation": "選擇性地指定登入期間所使用之 zipalign 可執行檔的位置。預設為您應用程式建置目標的 Android SDK 版本資料夾中所找到的 zipalign。", + "loc.messages.AndroidHomeNotSet": "未對正在執行中的使用者設定 ANDROID_HOME 環境變數。", + "loc.messages.CouldNotFindZipalign": "找不到 zipalign 工具。", + "loc.messages.CouldNotFindZipalignInAndroidHome": "在 ANDROID_HOME 中找不到 zipalign 工具: %s", + "loc.messages.JavaHomeNotSet": "未對正在執行中的使用者設定 JAVA_HOME 環境變數。", + "loc.messages.NoMatchingFiles": "使用下列搜尋模式找不到任何相符的檔案: %s", + "loc.messages.DeleteKeystoreFileFailed": "無法刪除從伺服器 %s 下載的金鑰儲存區檔案" +} \ No newline at end of file diff --git a/_generated/AndroidSigningV2_Node20/Tests/L0.ts b/_generated/AndroidSigningV2_Node20/Tests/L0.ts new file mode 100644 index 000000000000..add12417c21f --- /dev/null +++ b/_generated/AndroidSigningV2_Node20/Tests/L0.ts @@ -0,0 +1,142 @@ +import fs = require('fs'); +import assert = require('assert'); +import path = require('path'); +import * as ttm from 'azure-pipelines-task-lib/mock-test'; + +describe('AndroidSigning Suite', function () { + this.timeout(parseInt(process.env.TASK_TEST_TIMEOUT) || 20000); + before(() => { + }); + + after(() => { + }); + + it('Do not sign or zipalign if nothing is selected', (done: Mocha.Done) => { + let tp: string = path.join(__dirname, 'L0AndroidSkipSignAlign.js'); + let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.invokedToolCount === 0, 'should not run anything'); + assert(tr.stderr.length === 0, 'should not have written to stderr'); + assert(tr.succeeded, 'task should have succeeded'); + + done(); + }); + + it('Do not align or sign if input single file does not exist', (done: Mocha.Done) => { + let tp: string = path.join(__dirname, 'L0AndroidSignAlignNoFileInput.js'); + let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.invokedToolCount === 0, 'should not run anything'); + assert(tr.errorIssues.length || tr.stderr.length > 0, 'should have written to stderr'); + assert(tr.failed, 'task should have failed'); + + done(); + }); + + it('Do not align or sign if input pattern does not match any files', (done: Mocha.Done) => { + let tp: string = path.join(__dirname, 'L0AndroidSignAlignNoMatchingFileInput.js'); + let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.invokedToolCount === 0, 'should not run anything'); + assert(tr.errorIssues.length > 0 || tr.stderr.length > 0, 'should have written to stderr'); + assert(tr.failed, 'task should have failed'); + + done(); + }); + + it('Use jarsigner from PATH before searching in JAVA_HOME', (done: Mocha.Done) => { + let tp: string = path.join(__dirname, 'L0AndroidSignAlignJarsignerFromPath.js'); + let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.invokedToolCount == 1, 'should have run jarsigner'); + assert(tr.stderr.length == 0, 'should have jarsigned file'); + assert(tr.succeeded, 'task should have succeeded'); + + done(); + }); + + it('Fail if jarsigner is not on PATH and JAVA_HOME is not set', (done: Mocha.Done) => { + let tp: string = path.join(__dirname, 'L0AndroidSignAlignFailJarsignerNotFound.js'); + let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.invokedToolCount == 0, 'should not run anything'); + assert(tr.errorIssues.length > 0 || tr.stderr.length > 0, 'should have failed to locate jarsigner'); + assert(tr.failed, 'task should have failed'); + + done(); + }); + + it('Fail if ANDROID_HOME is not set', (done: Mocha.Done) => { + let tp: string = path.join(__dirname, 'L0AndroidSignAlignAndroidHomeNotSet.js'); + let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.invokedToolCount == 0, 'should not run anything'); + assert(tr.errorIssues.length > 0 || tr.stderr.length > 0, 'should have jarsigned file'); + assert(tr.failed, 'task should have failed'); + + done(); + }); + + it('Signing a single file', (done: Mocha.Done) => { + let tp: string = path.join(__dirname, 'L0AndroidSignSingleFile.js'); + let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.invokedToolCount === 1, 'should run jarsigner'); + assert(tr.errorIssues.length === 0 && tr.stderr.length === 0, 'should not have written to stderr'); + assert(tr.succeeded, 'task should have succeeded'); + + done(); + }); + + it('zipalign a single file', (done: Mocha.Done) => { + let tp: string = path.join(__dirname, 'L0AndroidZipalignSingleFile.js'); + let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.invokedToolCount === 1, 'should run zipalign'); + assert(tr.stderr.length === 0 || tr.errorIssues.length === 0, 'should not have written to stderr'); + assert(tr.succeeded, 'task should have succeeded'); + + done(); + }); + + it('Signing and aligning multiple files', (done: Mocha.Done) => { + let tp: string = path.join(__dirname, 'L0AndroidSignAlignMultipleFiles.js'); + let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.invokedToolCount === 4, 'should have run jarsigner and zipalign twice each'); + assert(tr.stderr.length === 0 || tr.errorIssues.length === 0, 'should not have written to stderr'); + assert(tr.succeeded, 'task should have succeeded'); + + done(); + }); + + it('Download keystore file from SecureFile', (done: Mocha.Done) => { + let tp: string = path.join(__dirname, 'L0DownloadKeystoreFile.js'); + let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.stderr.length === 0, 'should not have written to stderr'); + assert(tr.succeeded, 'task should have succeeded'); + + done(); + }); +}); diff --git a/_generated/AndroidSigningV2_Node20/Tests/L0AndroidSignAlignAndroidHomeNotSet.ts b/_generated/AndroidSigningV2_Node20/Tests/L0AndroidSignAlignAndroidHomeNotSet.ts new file mode 100644 index 000000000000..cc484e459646 --- /dev/null +++ b/_generated/AndroidSigningV2_Node20/Tests/L0AndroidSignAlignAndroidHomeNotSet.ts @@ -0,0 +1,31 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'androidsigning.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('files', '/some/path/a.apk'); +tr.setInput('jarsign', 'false'); +tr.setInput('zipalign', 'true'); + +process.env['VSTS_TASKVARIABLE_KEYSTORE_FILE_PATH'] = '/some/store'; +process.env['ANDROID_HOME'] = ''; + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "findMatch": { + "/some/path/a.apk": [ + "/some/path/a.apk" + ] + }, + "checkPath": { + "/some/path/a.apk": true + }, + "which": { + + } +}; +tr.setAnswers(a); + +tr.run(); diff --git a/_generated/AndroidSigningV2_Node20/Tests/L0AndroidSignAlignFailJarsignerNotFound.ts b/_generated/AndroidSigningV2_Node20/Tests/L0AndroidSignAlignFailJarsignerNotFound.ts new file mode 100644 index 000000000000..8c4909b61ed8 --- /dev/null +++ b/_generated/AndroidSigningV2_Node20/Tests/L0AndroidSignAlignFailJarsignerNotFound.ts @@ -0,0 +1,31 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'androidsigning.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('files', '/some/path/a.apk'); +tr.setInput('jarsign', 'true'); +tr.setInput('zipalign', 'true'); + +process.env['VSTS_TASKVARIABLE_KEYSTORE_FILE_PATH'] = '/some/store'; +process.env['JAVA_HOME'] = ''; + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "findMatch": { + "/some/path/a.apk": [ + "/some/path/a.apk" + ] + }, + "checkPath": { + "/some/path/a.apk": true + }, + "which": { + + } +}; +tr.setAnswers(a); + +tr.run(); diff --git a/_generated/AndroidSigningV2_Node20/Tests/L0AndroidSignAlignJarsignerFromPath.ts b/_generated/AndroidSigningV2_Node20/Tests/L0AndroidSignAlignJarsignerFromPath.ts new file mode 100644 index 000000000000..3e1080aae743 --- /dev/null +++ b/_generated/AndroidSigningV2_Node20/Tests/L0AndroidSignAlignJarsignerFromPath.ts @@ -0,0 +1,40 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'androidsigning.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('files', '/some/path/a.apk'); +tr.setInput('jarsign', 'true'); +tr.setInput('keystoreFile', 'keystoreFileId'); +tr.setInput('keystorePass', 'pass1'); +tr.setInput('keystoreAlias', 'somealias'); +tr.setInput('keyPass', 'pass2'); +tr.setInput('zipalign', 'false'); + +process.env['VSTS_TASKVARIABLE_KEYSTORE_FILE_PATH'] = '/some/store'; + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "findMatch": { + "/some/path/a.apk": [ + "/some/path/a.apk" + ] + }, + "checkPath": { + "/some/path/a.apk": true + }, + "which": { + "jarsigner": "/usr/bin/jarsigner" + }, + "exec": { + "/usr/bin/jarsigner -keystore /some/store -storepass pass1 -keypass pass2 -signedjar /some/path/a.apk /some/path/a.apk.unsigned somealias": { + "code": 0, + "stdout": "jarsigner output here" + } + } +}; +tr.setAnswers(a); + +tr.run(); diff --git a/_generated/AndroidSigningV2_Node20/Tests/L0AndroidSignAlignMultipleFiles.ts b/_generated/AndroidSigningV2_Node20/Tests/L0AndroidSignAlignMultipleFiles.ts new file mode 100644 index 000000000000..aa6de73f3d5d --- /dev/null +++ b/_generated/AndroidSigningV2_Node20/Tests/L0AndroidSignAlignMultipleFiles.ts @@ -0,0 +1,63 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'androidsigning.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('files', '/some/path/*.apk'); +tr.setInput('jarsign', 'true'); +tr.setInput('keystoreFile', '/some/store'); +tr.setInput('keystorePass', 'pass1'); +tr.setInput('keystoreAlias', 'somealias'); +tr.setInput('keyPass', 'pass2'); +tr.setInput('zipalign', 'true'); + +process.env['VSTS_TASKVARIABLE_KEYSTORE_FILE_PATH'] = '/some/store'; +process.env['JAVA_HOME'] = '/fake/java/home'; +process.env['ANDROID_HOME'] = '/fake/android/home'; + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "exec": { + "/fake/java/home/bin/jarsigner -keystore /some/store -storepass pass1 -keypass pass2 -signedjar /some/path/a.apk /some/path/a.apk.unsigned somealias": { + "code": 0, + "stdout": "jarsigner output here" + }, + "/fake/java/home/bin/jarsigner -keystore /some/store -storepass pass1 -keypass pass2 -signedjar /some/path/b.apk /some/path/b.apk.unsigned somealias": { + "code": 0, + "stdout": "jarsigner output here" + }, + "/fake/android/home/sdk1/zipalign -v 4 /some/path/a.apk.unaligned /some/path/a.apk": { + "code": 0, + "stdout": "zipalign output here" + }, + "/fake/android/home/sdk1/zipalign -v 4 /some/path/b.apk.unaligned /some/path/b.apk": { + "code": 0, + "stdout": "zipalign output here" + } + }, + "checkPath": { + "/some/path/a.apk": true, + "/some/path/b.apk": true + }, + "findMatch": { + "/some/path/*.apk": [ + "/some/path/a.apk", + "/some/path/b.apk" + ], + "/fake/android/home": [ + "/fake/android/home/sdk1", + "/fake/android/home/sdk2" + ], + "zipalign*": [ + "/fake/android/home/sdk1/zipalign", + "/fake/android/home/sdk2/zipalign" + ] + } +} + +tr.setAnswers(a); + +tr.run(); + diff --git a/_generated/AndroidSigningV2_Node20/Tests/L0AndroidSignAlignNoFileInput.ts b/_generated/AndroidSigningV2_Node20/Tests/L0AndroidSignAlignNoFileInput.ts new file mode 100644 index 000000000000..150f80e3fe2c --- /dev/null +++ b/_generated/AndroidSigningV2_Node20/Tests/L0AndroidSignAlignNoFileInput.ts @@ -0,0 +1,31 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'androidsigning.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('files', '/some/path/nonexistent.apk'); +tr.setInput('jarsign', 'true'); +tr.setInput('zipalign', 'true'); + +process.env['AGENT_VERSION'] = '2.116.0'; +process.env['VSTS_TASKVARIABLE_KEYSTORE_FILE_PATH'] = '/usr/lib/login.keystore'; +process.env['HOME'] = '/users/test'; +process.env['JAVA_HOME'] = '/fake/java/home'; +process.env['ANDROID_HOME'] = '/fake/android/home'; + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "findMatch": { + "/some/path/nonexistent.apk": [ + ] + } +}; +tr.setAnswers(a); + +tr.run(); + + + + diff --git a/_generated/AndroidSigningV2_Node20/Tests/L0AndroidSignAlignNoMatchingFileInput.ts b/_generated/AndroidSigningV2_Node20/Tests/L0AndroidSignAlignNoMatchingFileInput.ts new file mode 100644 index 000000000000..888d5305de41 --- /dev/null +++ b/_generated/AndroidSigningV2_Node20/Tests/L0AndroidSignAlignNoMatchingFileInput.ts @@ -0,0 +1,31 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'androidsigning.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('files', '/some/nonexistent/path/*.apk'); +tr.setInput('jarsign', 'true'); +tr.setInput('zipalign', 'true'); + +process.env['AGENT_VERSION'] = '2.116.0'; +process.env['VSTS_TASKVARIABLE_KEYSTORE_FILE_PATH'] = '/usr/lib/login.keystore'; +process.env['HOME'] = '/users/test'; +process.env['JAVA_HOME'] = '/fake/java/home'; +process.env['ANDROID_HOME'] = '/fake/android/home'; + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "findMatch": { + "/some/nonexistent/path/*.apk": [ + ] + } +}; +tr.setAnswers(a); + +tr.run(); + + + + diff --git a/_generated/AndroidSigningV2_Node20/Tests/L0AndroidSignSingleFile.ts b/_generated/AndroidSigningV2_Node20/Tests/L0AndroidSignSingleFile.ts new file mode 100644 index 000000000000..b1d7deab5de9 --- /dev/null +++ b/_generated/AndroidSigningV2_Node20/Tests/L0AndroidSignSingleFile.ts @@ -0,0 +1,53 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'androidsigning.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('files', '/some/fake.apk'); +tr.setInput('jarsign', 'true'); +tr.setInput('keystoreFile', '/some/store'); +tr.setInput('keystorePass', 'pass1'); +tr.setInput('keystoreAlias', 'somealias'); +tr.setInput('keyPass', 'pass2'); +tr.setInput('zipalign', 'false'); + +process.env['AGENT_VERSION'] = '2.116.0'; +process.env['VSTS_TASKVARIABLE_KEYSTORE_FILE_PATH'] = '/some/store'; +process.env['HOME'] = '/users/test'; +process.env['JAVA_HOME'] = '/fake/java/home'; +process.env['ANDROID_HOME'] = '/fake/android/home'; + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "checkPath": { + "/some/fake.apk": true + }, + "findMatch": { + "/some/fake.apk": [ + "/some/fake.apk" + ], + "/fake/android/home": [ + "/fake/android/home/sdk1", + "/fake/android/home/sdk2" + ], + "zipalign*": [ + "/fake/android/home/sdk1/zipalign", + "/fake/android/home/sdk2/zipalign" + ] + }, + "exec": { + "/fake/java/home/bin/jarsigner -keystore /some/store -storepass pass1 -keypass pass2 -signedjar /some/fake.apk /some/fake.apk.unsigned somealias": { + "code": 0, + "stdout": "jarsigner output here" + }, + "/fake/android/home/sdk1/zipalign -v 4 /some/fake.apk.unaligned /some/fake.apk": { + "code": 0, + "stdout": "zipalign output here" + } + } +}; +tr.setAnswers(a); + +tr.run(); \ No newline at end of file diff --git a/_generated/AndroidSigningV2_Node20/Tests/L0AndroidSkipSignAlign.ts b/_generated/AndroidSigningV2_Node20/Tests/L0AndroidSkipSignAlign.ts new file mode 100644 index 000000000000..dc718b754bba --- /dev/null +++ b/_generated/AndroidSigningV2_Node20/Tests/L0AndroidSkipSignAlign.ts @@ -0,0 +1,49 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'androidsigning.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('files', '/some/fake.apk'); +tr.setInput('jarsign', 'false'); +tr.setInput('zipalign', 'false'); + +process.env['AGENT_VERSION'] = '2.116.0'; +process.env['VSTS_TASKVARIABLE_KEYSTORE_FILE_PATH'] = '/usr/lib/login.keystore'; +process.env['HOME'] = '/users/test'; +process.env['JAVA_HOME'] = '/fake/java/home'; +process.env['ANDROID_HOME'] = '/fake/android/home'; + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "checkPath": { + "/some/fake.apk": true + }, + "findMatch": { + "/some/fake.apk": [ + "/some/fake.apk" + ], + "/fake/android/home": [ + "/fake/android/home/sdk1", + "/fake/android/home/sdk2" + ], + "zipalign*": [ + "/fake/android/home/sdk1/zipalign", + "/fake/android/home/sdk2/zipalign" + ] + }, + "exec": { + "/fake/java/home/bin/jarsigner -keystore /some/store -storepass pass1 -keypass pass2 -signedjar /some/fake.apk /some/fake.apk.unsigned somealias": { + "code": 0, + "stdout": "jarsigner output here" + }, + "/fake/android/home/sdk1/zipalign -v 4 /some/fake.apk.unaligned /some/fake.apk": { + "code": 0, + "stdout": "zipalign output here" + } + } +}; +tr.setAnswers(a); + +tr.run(); \ No newline at end of file diff --git a/_generated/AndroidSigningV2_Node20/Tests/L0AndroidZipalignSingleFile.ts b/_generated/AndroidSigningV2_Node20/Tests/L0AndroidZipalignSingleFile.ts new file mode 100644 index 000000000000..b887a09e7385 --- /dev/null +++ b/_generated/AndroidSigningV2_Node20/Tests/L0AndroidZipalignSingleFile.ts @@ -0,0 +1,53 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'androidsigning.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('files', '/some/fake.apk'); +tr.setInput('jarsign', 'true'); +tr.setInput('keystoreFile', '/some/store'); +tr.setInput('keystorePass', 'pass1'); +tr.setInput('keystoreAlias', 'somealias'); +tr.setInput('jarsign', 'false'); +tr.setInput('zipalign', 'true'); + +process.env['AGENT_VERSION'] = '2.116.0'; +process.env['VSTS_TASKVARIABLE_KEYSTORE_FILE_PATH'] = '/some/store'; +process.env['HOME'] = '/users/test'; +process.env['JAVA_HOME'] = '/fake/java/home'; +process.env['ANDROID_HOME'] = '/fake/android/home'; + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "checkPath": { + "/some/fake.apk": true + }, + "findMatch": { + "/some/fake.apk": [ + "/some/fake.apk" + ], + "/fake/android/home": [ + "/fake/android/home/sdk1", + "/fake/android/home/sdk2" + ], + "zipalign*": [ + "/fake/android/home/sdk1/zipalign", + "/fake/android/home/sdk2/zipalign" + ] + }, + "exec": { + "/fake/java/home/bin/jarsigner -keystore /some/store -storepass pass1 -keypass pass2 -signedjar /some/fake.apk /some/fake.apk.unsigned somealias": { + "code": 0, + "stdout": "jarsigner output here" + }, + "/fake/android/home/sdk1/zipalign -v 4 /some/fake.apk.unaligned /some/fake.apk": { + "code": 0, + "stdout": "zipalign output here" + } + } +}; +tr.setAnswers(a); + +tr.run(); \ No newline at end of file diff --git a/_generated/AndroidSigningV2_Node20/Tests/L0DownloadKeystoreFile.ts b/_generated/AndroidSigningV2_Node20/Tests/L0DownloadKeystoreFile.ts new file mode 100644 index 000000000000..638c08cc7256 --- /dev/null +++ b/_generated/AndroidSigningV2_Node20/Tests/L0DownloadKeystoreFile.ts @@ -0,0 +1,22 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'preandroidsigning.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('jarsign', 'true'); +tr.setInput('keystoreFile', 'mySecureFileId'); + +process.env['AGENT_VERSION'] = '2.116.0'; + +let secureFileHelperMock = require('azure-pipelines-tasks-securefiles-common/securefiles-common-mock'); +tr.registerMock('azure-pipelines-tasks-securefiles-common/securefiles-common', secureFileHelperMock); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { +}; +tr.setAnswers(a); + +tr.run(); + diff --git a/_generated/AndroidSigningV2_Node20/Tests/package-lock.json b/_generated/AndroidSigningV2_Node20/Tests/package-lock.json new file mode 100644 index 000000000000..332d9f2a0649 --- /dev/null +++ b/_generated/AndroidSigningV2_Node20/Tests/package-lock.json @@ -0,0 +1,24 @@ +{ + "name": "vsts-tasks-androidsigningv2-tests", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/mocha": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", + "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==" + }, + "@types/node": { + "version": "10.17.44", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.44.tgz", + "integrity": "sha512-vHPAyBX1ffLcy4fQHmDyIUMUb42gHZjPHU66nhvbMzAWJqHnySGZ6STwN3rwrnSd1FHB0DI/RWgGELgKSYRDmw==" + }, + "typescript": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.2.tgz", + "integrity": "sha512-e4ERvRV2wb+rRZ/IQeb3jm2VxBsirQLpQhdxplZ2MEzGvDkkMmPglecnNDfSUBivMjP93vRbngYYDQqQ/78bcQ==", + "dev": true + } + } +} diff --git a/_generated/AndroidSigningV2_Node20/Tests/package.json b/_generated/AndroidSigningV2_Node20/Tests/package.json new file mode 100644 index 000000000000..5e7f1db091dc --- /dev/null +++ b/_generated/AndroidSigningV2_Node20/Tests/package.json @@ -0,0 +1,26 @@ +{ + "name": "vsts-tasks-androidsigningv2-tests", + "version": "1.0.0", + "description": "Azure Pipelines Android Signing V2 Task Tests", + "main": "L0.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/Microsoft/azure-pipelines-tasks.git" + }, + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Microsoft/azure-pipelines-tasks/issues" + }, + "homepage": "https://github.com/Microsoft/azure-pipelines-tasks#readme", + "dependencies": { + "@types/node": "^10.17.0", + "@types/mocha": "^5.2.7" + }, + "devDependencies": { + "typescript": "4.0.2" + } +} diff --git a/_generated/AndroidSigningV2_Node20/androidsigning.ts b/_generated/AndroidSigningV2_Node20/androidsigning.ts new file mode 100644 index 000000000000..442f297e206e --- /dev/null +++ b/_generated/AndroidSigningV2_Node20/androidsigning.ts @@ -0,0 +1,137 @@ +import path = require('path'); +import * as tl from 'azure-pipelines-task-lib/task'; + +/* +Signing the specified file. Move the current file to fn.unsigned, and +place the signed file at the same location fn +*/ +var jarsigning = (fn: string) => { + // file must exist + tl.checkPath(fn, 'file to sign'); + + var jarsigner = tl.which("jarsigner", false); + if (!jarsigner) { + var java_home = tl.getVariable('JAVA_HOME'); + if (!java_home) { + throw tl.loc('JavaHomeNotSet'); + } + + jarsigner = tl.resolve(java_home, 'bin', 'jarsigner'); + } + + var jarsignerRunner = tl.tool(jarsigner); + + // Get keystore file path for signing + var keystoreFile = tl.getTaskVariable('KEYSTORE_FILE_PATH'); + + // Get keystore alias + var keystoreAlias = tl.getInput('keystoreAlias', true); + + var keystorePass = tl.getInput('keystorePass', false); + + var keyPass = tl.getInput('keyPass', false); + + var jarsignerArguments = tl.getInput('jarsignerArguments', false); + + jarsignerRunner.arg(['-keystore', keystoreFile]); + + if (keystorePass) { + jarsignerRunner.arg(['-storepass', keystorePass]); + } + + if (keyPass) { + jarsignerRunner.arg(['-keypass', keyPass]); + } + + if (jarsignerArguments) { + jarsignerRunner.line(jarsignerArguments); + } + + var unsignedFn = fn + ".unsigned"; + var success = tl.mv(fn, unsignedFn, '-f', false); + + jarsignerRunner.arg(['-signedjar', fn, unsignedFn, keystoreAlias]); + + return jarsignerRunner.exec(null); +} + +/* +Zipaligning apk +*/ +var zipaligning = (fn: string) => { + // file must exist + tl.checkPath(fn, 'file to zipalign'); + + var zipaligner = tl.getInput('zipalignLocation', false); + + // if the tool path is not set, let's find one (anyone) from the SDK folder + if (!zipaligner) { + + var android_home = tl.getVariable('ANDROID_HOME'); + if (!android_home) { + throw tl.loc('AndroidHomeNotSet'); + } + + var zipalignToolsList = tl.findMatch(tl.resolve(android_home, 'build-tools'), "zipalign*", null, { matchBase: true }); + + if (!zipalignToolsList || zipalignToolsList.length === 0) { + throw tl.loc('CouldNotFindZipalignInAndroidHome', android_home); + } + + zipaligner = zipalignToolsList[0]; + } + + if (!zipaligner) { + throw tl.loc('CouldNotFindZipalign'); + } + + var zipalignRunner = tl.tool(zipaligner); + + // alignment must be 4 or play store will reject, hard code this to avoid user errors + zipalignRunner.arg(["-v", "4"]); + + var unalignedFn = fn + ".unaligned"; + var success = tl.mv(fn, unalignedFn, '-f', false); + + zipalignRunner.arg([unalignedFn, fn]); + return zipalignRunner.exec(null); +} + +async function run() { + try { + // Configure localization + tl.setResourcePath(path.join(__dirname, 'task.json')); + + // Get files to be signed + let filesPattern: string = tl.getInput('files', true); + + // Signing the APK? + let jarsign: boolean = tl.getBoolInput('jarsign'); + + // Zipaligning the APK? + let zipalign: boolean = tl.getBoolInput('zipalign'); + + // Resolve files for the specified value or pattern + let filesToSign: string[] = tl.findMatch(null, filesPattern); + + // Fail if no matching files were found + if (!filesToSign || filesToSign.length === 0) { + throw tl.loc('NoMatchingFiles', filesPattern); + } + + for (let file of filesToSign) { + if (jarsign) { + await jarsigning(file); + } + + if (zipalign) { + await zipaligning(file); + } + } + } catch (err) { + tl.setResult(tl.TaskResult.Failed, err); + } +} + +run(); + diff --git a/_generated/AndroidSigningV2_Node20/icon.png b/_generated/AndroidSigningV2_Node20/icon.png new file mode 100644 index 000000000000..502c38f46dd4 Binary files /dev/null and b/_generated/AndroidSigningV2_Node20/icon.png differ diff --git a/_generated/AndroidSigningV2_Node20/icon.svg b/_generated/AndroidSigningV2_Node20/icon.svg new file mode 100644 index 000000000000..38816323fb96 --- /dev/null +++ b/_generated/AndroidSigningV2_Node20/icon.svg @@ -0,0 +1,4 @@ + + + + diff --git a/_generated/AndroidSigningV2_Node20/make.json b/_generated/AndroidSigningV2_Node20/make.json new file mode 100644 index 000000000000..d5ad78d951ae --- /dev/null +++ b/_generated/AndroidSigningV2_Node20/make.json @@ -0,0 +1,12 @@ +{ + "rm": [ + { + "items": [ + "node_modules/azure-pipelines-tasks-securefiles-common/node_modules/vsts-task-lib", + "node_modules/azure-pipelines-tasks-securefiles-common/node_modules/azure-pipelines-task-lib", + "node_modules/mockery" + ], + "options": "-Rf" + } + ] +} \ No newline at end of file diff --git a/_generated/AndroidSigningV2_Node20/package-lock.json b/_generated/AndroidSigningV2_Node20/package-lock.json new file mode 100644 index 000000000000..f5b107f51089 --- /dev/null +++ b/_generated/AndroidSigningV2_Node20/package-lock.json @@ -0,0 +1,548 @@ +{ + "name": "vsts-androidsigning-task", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/concat-stream": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz", + "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==", + "requires": { + "@types/node": "*" + } + }, + "@types/form-data": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", + "integrity": "sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==", + "requires": { + "@types/node": "*" + } + }, + "@types/mocha": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", + "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==" + }, + "@types/node": { + "version": "20.7.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.7.0.tgz", + "integrity": "sha512-zI22/pJW2wUZOVyguFaUL1HABdmSVxpXrzIqkjsHmyUjNhPoWM1CKfvVuXfetHhIok4RY573cqS0mZ1SJEnoTg==" + }, + "@types/q": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.5.tgz", + "integrity": "sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ==" + }, + "@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "azure-devops-node-api": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/azure-devops-node-api/-/azure-devops-node-api-10.2.2.tgz", + "integrity": "sha512-4TVv2X7oNStT0vLaEfExmy3J4/CzfuXolEcQl/BRUmvGySqKStTG2O55/hUQ0kM7UJlZBLgniM0SBq4d/WkKow==", + "requires": { + "tunnel": "0.0.6", + "typed-rest-client": "^1.8.4" + } + }, + "azure-pipelines-task-lib": { + "version": "5.0.0-preview.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-5.0.0-preview.0.tgz", + "integrity": "sha512-uQJEv+q3/7RD7kgphFd33uXijaPwA1ePYoNkAgZpUhbZUtc2u4JL4ujTT/JJfgXBNW/QQNAiDQ2OC7vOQG/0tg==", + "requires": { + "minimatch": "3.0.5", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "sync-request": "6.1.0", + "uuid": "^3.0.1" + } + }, + "azure-pipelines-tasks-securefiles-common": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-tasks-securefiles-common/-/azure-pipelines-tasks-securefiles-common-2.1.0.tgz", + "integrity": "sha512-oE7VscWFZD+Ku0WM6e2b5Y0eDom4DTZvER/mSh3m/z9V0yN9JUahNR0Dye9NIj0BSIyfgcaxxNWBCzqJMsirIQ==", + "requires": { + "@types/node": "^10.17.0", + "@types/q": "^1.5.4", + "azure-devops-node-api": "10.2.2", + "azure-pipelines-task-lib": "^3.1.0" + }, + "dependencies": { + "@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + }, + "azure-pipelines-task-lib": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-3.4.0.tgz", + "integrity": "sha512-3eC4OTFw+7xD7A2aUhxR/j+jRlTI+vVfS0CGxt1pCLs4c/KmY0tQWgbqjD3157kmiucWxELBvgZHaD2gCBe9fg==", + "requires": { + "minimatch": "3.0.5", + "mockery": "^2.1.0", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "sync-request": "6.1.0", + "uuid": "^3.0.1" + } + } + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, + "form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-intrinsic": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", + "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + } + }, + "get-port": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", + "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==" + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "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" + }, + "dependencies": { + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "http-basic": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", + "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", + "requires": { + "caseless": "^0.12.0", + "concat-stream": "^1.6.2", + "http-response-object": "^3.0.1", + "parse-cache-control": "^1.0.1" + } + }, + "http-response-object": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", + "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", + "requires": { + "@types/node": "^10.0.3" + }, + "dependencies": { + "@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + } + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" + }, + "is-core-module": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", + "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", + "requires": { + "has": "^1.0.3" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "mockery": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mockery/-/mockery-2.1.0.tgz", + "integrity": "sha512-9VkOmxKlWXoDO/h1jDZaS4lH33aWfRiJiNT/tKj+8OGzrcFDLo8d0syGdbsc3Bc4GvRXPb+NMMvojotmuGJTvA==" + }, + "object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, + "parse-cache-control": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", + "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "promise": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", + "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", + "requires": { + "asap": "~2.0.6" + } + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==" + }, + "qs": { + "version": "6.11.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.1.tgz", + "integrity": "sha512-0wsrzgTz/kAVIeuxSjnpGC56rzYtr6JT/2BwEvMaPhFIoYa1aGO8LbzuU1R0uUYQkLpWBTOj0l/CLAJB64J6nQ==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "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" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "requires": { + "resolve": "^1.1.6" + } + }, + "resolve": { + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "requires": { + "is-core-module": "^2.11.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, + "sync-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", + "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==", + "requires": { + "http-response-object": "^3.0.1", + "sync-rpc": "^1.2.1", + "then-request": "^6.0.0" + } + }, + "sync-rpc": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz", + "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==", + "requires": { + "get-port": "^3.1.0" + } + }, + "then-request": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", + "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", + "requires": { + "@types/concat-stream": "^1.6.0", + "@types/form-data": "0.0.33", + "@types/node": "^8.0.0", + "@types/qs": "^6.2.31", + "caseless": "~0.12.0", + "concat-stream": "^1.6.0", + "form-data": "^2.2.0", + "http-basic": "^8.1.1", + "http-response-object": "^3.0.1", + "promise": "^8.0.0", + "qs": "^6.4.0" + }, + "dependencies": { + "@types/node": { + "version": "8.10.66", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", + "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==" + } + } + }, + "tunnel": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", + "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==" + }, + "typed-rest-client": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.8.5.tgz", + "integrity": "sha512-952/Aegu3lTqUAI1anbDLbewojnF/gh8at9iy1CIrfS1h/+MtNjB1Y9z6ZF5n2kZd+97em56lZ9uu7Zz3y/pwg==", + "requires": { + "qs": "^6.9.1", + "tunnel": "0.0.6", + "underscore": "^1.12.1" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, + "typescript": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "dev": true + }, + "underscore": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.1.tgz", + "integrity": "sha512-hzSoAVtJF+3ZtiFX0VgfFPHEDRm7Y/QPjGyNo4TVdnDTdft3tr8hEkD25a1jC+TjTuE7tkHGKkhwCgs9dgBB2g==" + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + } + } +} diff --git a/_generated/AndroidSigningV2_Node20/package.json b/_generated/AndroidSigningV2_Node20/package.json new file mode 100644 index 000000000000..d669be5308d4 --- /dev/null +++ b/_generated/AndroidSigningV2_Node20/package.json @@ -0,0 +1,28 @@ +{ + "name": "vsts-androidsigning-task", + "version": "1.0.0", + "description": "Azure Pipelines Android Signing Task", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/Microsoft/azure-pipelines-tasks.git" + }, + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Microsoft/azure-pipelines-tasks/issues" + }, + "homepage": "https://github.com/Microsoft/azure-pipelines-tasks#readme", + "dependencies": { + "@types/node": "^20.3.1", + "@types/mocha": "^5.2.7", + "azure-pipelines-task-lib": "^5.0.0-preview.0", + "azure-pipelines-tasks-securefiles-common": "2.1.0" + }, + "devDependencies": { + "typescript": "5.1.6" + } +} diff --git a/_generated/AndroidSigningV2_Node20/postandroidsigning.ts b/_generated/AndroidSigningV2_Node20/postandroidsigning.ts new file mode 100644 index 000000000000..a27fb48f8555 --- /dev/null +++ b/_generated/AndroidSigningV2_Node20/postandroidsigning.ts @@ -0,0 +1,21 @@ +import fs = require('fs'); +import path = require('path'); +import secureFilesCommon = require('azure-pipelines-tasks-securefiles-common/securefiles-common'); +import tl = require('azure-pipelines-task-lib/task'); + +async function run() { + let secureFileHelpers: secureFilesCommon.SecureFileHelpers; + + try { + tl.setResourcePath(path.join(__dirname, 'task.json')); + let keystoreFile: string = tl.getTaskVariable('KEYSTORE_FILE_PATH'); + if (keystoreFile && tl.exist(keystoreFile)) { + fs.unlinkSync(keystoreFile); + tl.debug('Deleted keystore file downloaded from the server: ' + keystoreFile); + } + } catch (err) { + tl.warning(tl.loc('DeleteKeystoreFileFailed', err)); + } +} + +run(); diff --git a/_generated/AndroidSigningV2_Node20/preandroidsigning.ts b/_generated/AndroidSigningV2_Node20/preandroidsigning.ts new file mode 100644 index 000000000000..578c7bfaea0f --- /dev/null +++ b/_generated/AndroidSigningV2_Node20/preandroidsigning.ts @@ -0,0 +1,25 @@ +import path = require('path'); +import secureFilesCommon = require('azure-pipelines-tasks-securefiles-common/securefiles-common'); +import tl = require('azure-pipelines-task-lib/task'); + +async function run() { + let keystoreFileId: string; + let secureFileHelpers: secureFilesCommon.SecureFileHelpers; + + try { + tl.setResourcePath(path.join(__dirname, 'task.json')); + + let jarsign: boolean = tl.getBoolInput('jarsign'); + if (jarsign) { + // download keystore file + keystoreFileId = tl.getInput('keystoreFile', true); + secureFileHelpers = new secureFilesCommon.SecureFileHelpers(); + let keystoreFilePath: string = await secureFileHelpers.downloadSecureFile(keystoreFileId); + tl.setTaskVariable('KEYSTORE_FILE_PATH', keystoreFilePath); + } + } catch (err) { + tl.setResult(tl.TaskResult.Failed, err); + } +} + +run(); diff --git a/_generated/AndroidSigningV2_Node20/task.json b/_generated/AndroidSigningV2_Node20/task.json new file mode 100644 index 000000000000..335470acec02 --- /dev/null +++ b/_generated/AndroidSigningV2_Node20/task.json @@ -0,0 +1,203 @@ +{ + "id": "80F3F6A0-82A6-4A22-BA7A-E5B8C541B9B9", + "name": "AndroidSigning", + "friendlyName": "Android signing", + "description": "Sign and align Android APK files", + "helpUrl": "https://docs.microsoft.com/azure/devops/pipelines/tasks/build/android-signing", + "helpMarkDown": "[Learn more about this task](https://go.microsoft.com/fwlink/?LinkID=613717)", + "category": "Build", + "visibility": [ + "Build" + ], + "author": "Microsoft Corporation", + "version": { + "Major": 2, + "Minor": 229, + "Patch": 1 + }, + "demands": [ + "JDK" + ], + "minimumAgentVersion": "2.182.1", + "groups": [ + { + "name": "jarsignerOptions", + "displayName": "Signing Options", + "isExpanded": true + }, + { + "name": "zipalignOptions", + "displayName": "Zipalign Options", + "isExpanded": true + } + ], + "inputs": [ + { + "name": "files", + "aliases": [ + "apkFiles" + ], + "type": "filePath", + "label": "APK files", + "defaultValue": "**/*.apk", + "required": true, + "helpMarkDown": "Relative path from the repo root to the APK(s) you want to sign. You can use wildcards to specify multiple files ([more information](https://go.microsoft.com/fwlink/?linkid=856077)). For example, `**/bin/*.apk` for all .APK files in the 'bin' subfolder" + }, + { + "name": "jarsign", + "type": "boolean", + "label": "Sign the APK", + "defaultValue": "true", + "required": false, + "groupName": "jarsignerOptions", + "helpMarkDown": "Select this option to sign the APK with a provided keystore file. Unsigned APKs can only run in an emulator. APKs must be signed to run on a device." + }, + { + "name": "keystoreFile", + "aliases": [ + "jarsignerKeystoreFile" + ], + "type": "secureFile", + "label": "Keystore file", + "defaultValue": "", + "required": true, + "visibleRule": "jarsign = true", + "groupName": "jarsignerOptions", + "helpMarkDown": "Select the keystore file that was uploaded to `Secure Files` to be used to sign the APK." + }, + { + "name": "keystorePass", + "aliases": [ + "jarsignerKeystorePassword" + ], + "type": "string", + "label": "Keystore password", + "defaultValue": "", + "required": false, + "visibleRule": "jarsign = true", + "groupName": "jarsignerOptions", + "helpMarkDown": "Enter the password for the provided keystore file. Use a new variable with its lock enabled on the Variables tab to encrypt this value." + }, + { + "name": "keystoreAlias", + "aliases": [ + "jarsignerKeystoreAlias" + ], + "type": "string", + "label": "Alias", + "defaultValue": "", + "required": false, + "visibleRule": "jarsign = true", + "groupName": "jarsignerOptions", + "helpMarkDown": "Enter the alias that identifies the public/private key pair to be used in the keystore file." + }, + { + "name": "keyPass", + "aliases": [ + "jarsignerKeyPassword" + ], + "type": "string", + "label": "Key password", + "defaultValue": "", + "required": false, + "visibleRule": "jarsign = true", + "groupName": "jarsignerOptions", + "helpMarkDown": "Enter the key password for the alias and keystore file. Use a new variable with its lock enabled on the Variables tab to encrypt this value." + }, + { + "name": "jarsignerArguments", + "type": "string", + "label": "Jarsigner arguments", + "defaultValue": "-verbose -sigalg MD5withRSA -digestalg SHA1", + "required": false, + "visibleRule": "jarsign = true", + "groupName": "jarsignerOptions", + "helpMarkDown": "Provide any options to pass to the jarsigner command line. Default is: -verbose -sigalg MD5withRSA -digestalg SHA1" + }, + { + "name": "zipalign", + "type": "boolean", + "label": "Zipalign", + "defaultValue": "true", + "required": false, + "groupName": "zipalignOptions", + "helpMarkDown": "Select if you want to zipalign your package. This reduces the amount of RAM consumed by an app." + }, + { + "name": "zipalignLocation", + "aliases": [ + "zipalignFile" + ], + "type": "string", + "label": "Zipalign location", + "defaultValue": "", + "required": false, + "visibleRule": "zipalign = true", + "groupName": "zipalignOptions", + "helpMarkDown": "Optionally specify the location of the zipalign executable used during signing. This defaults to the zipalign found in the Android SDK version folder that your application builds against." + } + ], + "instanceNameFormat": "Signing and aligning APK file(s) $(files)", + "prejobexecution": { + "Node10": { + "target": "preandroidsigning.js", + "argumentFormat": "" + }, + "Node16": { + "target": "preandroidsigning.js", + "argumentFormat": "" + }, + "Node20": { + "target": "preandroidsigning.js", + "argumentFormat": "" + } + }, + "execution": { + "Node10": { + "target": "androidsigning.js", + "argumentFormat": "" + }, + "Node16": { + "target": "androidsigning.js", + "argumentFormat": "" + }, + "Node20": { + "target": "androidsigning.js", + "argumentFormat": "" + } + }, + "postjobexecution": { + "Node10": { + "target": "postandroidsigning.js", + "argumentFormat": "" + }, + "Node16": { + "target": "postandroidsigning.js", + "argumentFormat": "" + }, + "Node20": { + "target": "postandroidsigning.js", + "argumentFormat": "" + } + }, + "messages": { + "AndroidHomeNotSet": "The ANDROID_HOME environment variable is not set for the running user.", + "CouldNotFindZipalign": "Could not find the zipalign tool.", + "CouldNotFindZipalignInAndroidHome": "Could not find the zipalign tool inside ANDROID_HOME: %s", + "JavaHomeNotSet": "The JAVA_HOME environment variable is not set for the running user.", + "NoMatchingFiles": "No matching files were found with search pattern: %s", + "DeleteKeystoreFileFailed": "Failed to delete keystore file downloaded from the server: %s" + }, + "restrictions": { + "commands": { + "mode": "restricted" + }, + "settableVariables": { + "allowed": [] + } + }, + "_buildConfigMapping": { + "Default": "2.229.0", + "Node20-225": "2.229.1" + } +} \ No newline at end of file diff --git a/_generated/AndroidSigningV2_Node20/task.loc.json b/_generated/AndroidSigningV2_Node20/task.loc.json new file mode 100644 index 000000000000..e1258c821b34 --- /dev/null +++ b/_generated/AndroidSigningV2_Node20/task.loc.json @@ -0,0 +1,203 @@ +{ + "id": "80F3F6A0-82A6-4A22-BA7A-E5B8C541B9B9", + "name": "AndroidSigning", + "friendlyName": "ms-resource:loc.friendlyName", + "description": "ms-resource:loc.description", + "helpUrl": "https://docs.microsoft.com/azure/devops/pipelines/tasks/build/android-signing", + "helpMarkDown": "ms-resource:loc.helpMarkDown", + "category": "Build", + "visibility": [ + "Build" + ], + "author": "Microsoft Corporation", + "version": { + "Major": 2, + "Minor": 229, + "Patch": 1 + }, + "demands": [ + "JDK" + ], + "minimumAgentVersion": "2.182.1", + "groups": [ + { + "name": "jarsignerOptions", + "displayName": "ms-resource:loc.group.displayName.jarsignerOptions", + "isExpanded": true + }, + { + "name": "zipalignOptions", + "displayName": "ms-resource:loc.group.displayName.zipalignOptions", + "isExpanded": true + } + ], + "inputs": [ + { + "name": "files", + "aliases": [ + "apkFiles" + ], + "type": "filePath", + "label": "ms-resource:loc.input.label.files", + "defaultValue": "**/*.apk", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.files" + }, + { + "name": "jarsign", + "type": "boolean", + "label": "ms-resource:loc.input.label.jarsign", + "defaultValue": "true", + "required": false, + "groupName": "jarsignerOptions", + "helpMarkDown": "ms-resource:loc.input.help.jarsign" + }, + { + "name": "keystoreFile", + "aliases": [ + "jarsignerKeystoreFile" + ], + "type": "secureFile", + "label": "ms-resource:loc.input.label.keystoreFile", + "defaultValue": "", + "required": true, + "visibleRule": "jarsign = true", + "groupName": "jarsignerOptions", + "helpMarkDown": "ms-resource:loc.input.help.keystoreFile" + }, + { + "name": "keystorePass", + "aliases": [ + "jarsignerKeystorePassword" + ], + "type": "string", + "label": "ms-resource:loc.input.label.keystorePass", + "defaultValue": "", + "required": false, + "visibleRule": "jarsign = true", + "groupName": "jarsignerOptions", + "helpMarkDown": "ms-resource:loc.input.help.keystorePass" + }, + { + "name": "keystoreAlias", + "aliases": [ + "jarsignerKeystoreAlias" + ], + "type": "string", + "label": "ms-resource:loc.input.label.keystoreAlias", + "defaultValue": "", + "required": false, + "visibleRule": "jarsign = true", + "groupName": "jarsignerOptions", + "helpMarkDown": "ms-resource:loc.input.help.keystoreAlias" + }, + { + "name": "keyPass", + "aliases": [ + "jarsignerKeyPassword" + ], + "type": "string", + "label": "ms-resource:loc.input.label.keyPass", + "defaultValue": "", + "required": false, + "visibleRule": "jarsign = true", + "groupName": "jarsignerOptions", + "helpMarkDown": "ms-resource:loc.input.help.keyPass" + }, + { + "name": "jarsignerArguments", + "type": "string", + "label": "ms-resource:loc.input.label.jarsignerArguments", + "defaultValue": "-verbose -sigalg MD5withRSA -digestalg SHA1", + "required": false, + "visibleRule": "jarsign = true", + "groupName": "jarsignerOptions", + "helpMarkDown": "ms-resource:loc.input.help.jarsignerArguments" + }, + { + "name": "zipalign", + "type": "boolean", + "label": "ms-resource:loc.input.label.zipalign", + "defaultValue": "true", + "required": false, + "groupName": "zipalignOptions", + "helpMarkDown": "ms-resource:loc.input.help.zipalign" + }, + { + "name": "zipalignLocation", + "aliases": [ + "zipalignFile" + ], + "type": "string", + "label": "ms-resource:loc.input.label.zipalignLocation", + "defaultValue": "", + "required": false, + "visibleRule": "zipalign = true", + "groupName": "zipalignOptions", + "helpMarkDown": "ms-resource:loc.input.help.zipalignLocation" + } + ], + "instanceNameFormat": "ms-resource:loc.instanceNameFormat", + "prejobexecution": { + "Node10": { + "target": "preandroidsigning.js", + "argumentFormat": "" + }, + "Node16": { + "target": "preandroidsigning.js", + "argumentFormat": "" + }, + "Node20": { + "target": "preandroidsigning.js", + "argumentFormat": "" + } + }, + "execution": { + "Node10": { + "target": "androidsigning.js", + "argumentFormat": "" + }, + "Node16": { + "target": "androidsigning.js", + "argumentFormat": "" + }, + "Node20": { + "target": "androidsigning.js", + "argumentFormat": "" + } + }, + "postjobexecution": { + "Node10": { + "target": "postandroidsigning.js", + "argumentFormat": "" + }, + "Node16": { + "target": "postandroidsigning.js", + "argumentFormat": "" + }, + "Node20": { + "target": "postandroidsigning.js", + "argumentFormat": "" + } + }, + "messages": { + "AndroidHomeNotSet": "ms-resource:loc.messages.AndroidHomeNotSet", + "CouldNotFindZipalign": "ms-resource:loc.messages.CouldNotFindZipalign", + "CouldNotFindZipalignInAndroidHome": "ms-resource:loc.messages.CouldNotFindZipalignInAndroidHome", + "JavaHomeNotSet": "ms-resource:loc.messages.JavaHomeNotSet", + "NoMatchingFiles": "ms-resource:loc.messages.NoMatchingFiles", + "DeleteKeystoreFileFailed": "ms-resource:loc.messages.DeleteKeystoreFileFailed" + }, + "restrictions": { + "commands": { + "mode": "restricted" + }, + "settableVariables": { + "allowed": [] + } + }, + "_buildConfigMapping": { + "Default": "2.229.0", + "Node20-225": "2.229.1" + } +} \ No newline at end of file diff --git a/_generated/AndroidSigningV2_Node20/tsconfig.json b/_generated/AndroidSigningV2_Node20/tsconfig.json new file mode 100644 index 000000000000..0438b79f69ac --- /dev/null +++ b/_generated/AndroidSigningV2_Node20/tsconfig.json @@ -0,0 +1,6 @@ +{ + "compilerOptions": { + "target": "ES6", + "module": "commonjs" + } +} \ No newline at end of file diff --git a/_generated/AndroidSigningV2_Node20/typings.json b/_generated/AndroidSigningV2_Node20/typings.json new file mode 100644 index 000000000000..6560c46c749d --- /dev/null +++ b/_generated/AndroidSigningV2_Node20/typings.json @@ -0,0 +1,8 @@ +{ + "name": "vsts-androidsigning-task", + "dependencies": {}, + "globalDependencies": { + "node": "registry:dt/node#6.0.0+20160921192128", + "q": "registry:dt/q#0.0.0+20160613154756" + } +} diff --git a/_generated/AndroidSigningV3.versionmap.txt b/_generated/AndroidSigningV3.versionmap.txt new file mode 100644 index 000000000000..17ff42b0c908 --- /dev/null +++ b/_generated/AndroidSigningV3.versionmap.txt @@ -0,0 +1,2 @@ +Default|3.229.0 +Node20-225|3.229.1 diff --git a/_generated/AndroidSigningV3/Strings/resources.resjson/de-DE/resources.resjson b/_generated/AndroidSigningV3/Strings/resources.resjson/de-DE/resources.resjson new file mode 100644 index 000000000000..cdbbec4f1664 --- /dev/null +++ b/_generated/AndroidSigningV3/Strings/resources.resjson/de-DE/resources.resjson @@ -0,0 +1,40 @@ +{ + "loc.friendlyName": "Android-Signatur", + "loc.helpMarkDown": "[Weitere Informationen zu dieser Aufgabe](https://go.microsoft.com/fwlink/?LinkID=613717)", + "loc.description": "Android-APK-Dateien signieren und ausrichten", + "loc.instanceNameFormat": "APK-Dateien $(files) werden signiert und ausgerichtet", + "loc.releaseNotes": "Diese Version der Aufgabe verwendet apksigner anstelle von jarsigner zum Signieren von APKs.", + "loc.group.displayName.apksignerOptions": "Signaturoptionen", + "loc.group.displayName.zipalignOptions": "Zipalign-Optionen", + "loc.input.label.files": "APK-Dateien", + "loc.input.help.files": "Der relative Pfad vom Repositorystamm zur APK-Datei bzw. den APK-Dateien, die Sie signieren möchten. Sie können Platzhalter verwenden, um mehrere Dateien anzugeben ([weitere Informationen](https://go.microsoft.com/fwlink/?linkid=856077)). Beispiel: \"**/bin/*.apk\" für alle APK-Dateien im Unterordner \"bin\".", + "loc.input.label.apksign": "APK signieren", + "loc.input.help.apksign": "Wählen Sie diese Option aus, wenn Sie die APK-Datei mit einer bereitgestellten KeyStore-Datei signieren möchten. Unsignierte APKs können nur in einem Emulator ausgeführt werden. APKs müssen signiert werden, um auf einem Gerät ausgeführt zu werden. ", + "loc.input.label.keystoreFile": "Keystore-Datei", + "loc.input.help.keystoreFile": "Wählen Sie die Keystore-Datei aus, die zum Signieren des APK in \"Sichere Dateien\" hochgeladen wurde.", + "loc.input.label.keystorePass": "Keystore-Kennwort", + "loc.input.help.keystorePass": "Geben Sie das Kennwort die KeyStore-Datei an. Verwenden Sie eine neue Variable, deren Sperre auf der Registerkarte \"Variablen\" aktiviert ist, um den Wert zu verschlüsseln.", + "loc.input.label.keystoreAlias": "Alias", + "loc.input.help.keystoreAlias": "Geben Sie den Alias an, der das öffentliche/private Schlüsselpaar identifiziert, das in der KeyStore-Datei verwendet werden soll.", + "loc.input.label.keyPass": "Schlüsselkennwort", + "loc.input.help.keyPass": "Geben Sie das Schlüsselkennwort für den Alias und die KeyStore-Datei an. Verwenden Sie eine neue Variable, deren Sperre auf der Registerkarte \"Variablen\" aktiviert ist, um den Wert zu verschlüsseln.", + "loc.input.label.apksignerVersion": "apksigner-Version", + "loc.input.help.apksignerVersion": "Geben Sie die Version von Android SDK-Buildtools ein, über die die ausführbare apksigner-Datei gesucht werden soll.", + "loc.input.label.apksignerArguments": "apksigner-Argumente", + "loc.input.help.apksignerArguments": "Geben Sie Optionen an, die an die apksigner-Befehlszeile übergeben werden sollen. Standardwert: --verbose", + "loc.input.label.apksignerLocation": "apksigner-Speicherort", + "loc.input.help.apksignerLocation": "Geben Sie optional den Pfad zu der beim Signieren verwendeten ausführbaren apksigner-Datei an. Standardmäßig handelt es sich hierbei um die apksigner-Datei, die sich in dem für Ihren Anwendungsbuild verwendeten Android SDK-Versionsordner befindet.", + "loc.input.label.zipalign": "Zipalign", + "loc.input.help.zipalign": "Geben Sie an, ob Ihr Paket mit Zipalign verarbeitet werden soll. Dadurch wird der von einer App benötigte Arbeitsspeicherplatz reduziert.", + "loc.input.label.zipalignVersion": "Zipalign-Version", + "loc.input.help.zipalignVersion": "Geben Sie die Version von Android SDK-Buildtools ein, über die die ausführbare zipalign-Datei gesucht werden soll.", + "loc.input.label.zipalignLocation": "Zipalign-Speicherort", + "loc.input.help.zipalignLocation": "Geben Sie optional den Pfad zu der beim Signieren verwendeten ausführbaren Zipalign-Datei an. Standardmäßig handelt es sich hierbei um die Zipalign-Datei, die sich in dem für Ihren Anwendungsbuild verwendeten Android SDK-Versionsordner befindet.", + "loc.messages.AndroidHomeNotSet": "Die ANDROID_HOME-Umgebungsvariable ist für den ausführenden Benutzer nicht festgelegt.", + "loc.messages.CouldNotFindToolInAndroidHome": "Das Tool \"%s\" wurde nicht gefunden in ANDROID_HOME: %s.", + "loc.messages.NoMatchingFiles": "Keine mit dem Suchmuster übereinstimmenden Dateien wurden gefunden: %s", + "loc.messages.DeleteKeystoreFileFailed": "Fehler beim Löschen der Keystore-Datei, die vom Server heruntergeladen wurde: %s", + "loc.messages.CouldNotFindVersionOfToolInAndroidHome": "Version %s von %s wurde in ANDROID_HOME nicht gefunden: %s", + "loc.messages.GetLatestToolVersion": "Es wird versucht, die neueste installierte Version des Tools abzurufen: %s", + "loc.messages.GetSpecifiedToolVersion": "Es wird versucht, Version %s von %s abzurufen." +} \ No newline at end of file diff --git a/_generated/AndroidSigningV3/Strings/resources.resjson/en-US/resources.resjson b/_generated/AndroidSigningV3/Strings/resources.resjson/en-US/resources.resjson new file mode 100644 index 000000000000..b3405df013b3 --- /dev/null +++ b/_generated/AndroidSigningV3/Strings/resources.resjson/en-US/resources.resjson @@ -0,0 +1,40 @@ +{ + "loc.friendlyName": "Android signing", + "loc.helpMarkDown": "[Learn more about this task](https://go.microsoft.com/fwlink/?LinkID=613717)", + "loc.description": "Sign and align Android APK files", + "loc.instanceNameFormat": "Signing and aligning APK file(s) $(files)", + "loc.releaseNotes": "This version of the task uses apksigner instead of jarsigner to sign APKs.", + "loc.group.displayName.apksignerOptions": "Signing Options", + "loc.group.displayName.zipalignOptions": "Zipalign Options", + "loc.input.label.files": "APK files", + "loc.input.help.files": "Relative path from the repo root to the APK(s) you want to sign. You can use wildcards to specify multiple files ([more information](https://go.microsoft.com/fwlink/?linkid=856077)). For example, `**/bin/*.apk` for all .APK files in the 'bin' subfolder", + "loc.input.label.apksign": "Sign the APK", + "loc.input.help.apksign": "Select this option to sign the APK with a provided keystore file. Unsigned APKs can only run in an emulator. APKs must be signed to run on a device.", + "loc.input.label.keystoreFile": "Keystore file", + "loc.input.help.keystoreFile": "Select the keystore file that was uploaded to `Secure Files` to be used to sign the APK.", + "loc.input.label.keystorePass": "Keystore password", + "loc.input.help.keystorePass": "Enter the password for the provided keystore file. Use a new variable with its lock enabled on the Variables tab to encrypt this value.", + "loc.input.label.keystoreAlias": "Alias", + "loc.input.help.keystoreAlias": "Enter the alias that identifies the public/private key pair to be used in the keystore file.", + "loc.input.label.keyPass": "Key password", + "loc.input.help.keyPass": "Enter the key password for the alias and keystore file. Use a new variable with its lock enabled on the Variables tab to encrypt this value.", + "loc.input.label.apksignerVersion": "apksigner version", + "loc.input.help.apksignerVersion": "Enter Android SDK build-tools version to look apksigner executable from.", + "loc.input.label.apksignerArguments": "apksigner arguments", + "loc.input.help.apksignerArguments": "Provide any options to pass to the apksigner command line. Default is: --verbose", + "loc.input.label.apksignerLocation": "apksigner location", + "loc.input.help.apksignerLocation": "Optionally specify the location of the apksigner executable used during signing. This defaults to the apksigner found in the Android SDK version folder that your application builds against.", + "loc.input.label.zipalign": "Zipalign", + "loc.input.help.zipalign": "Select if you want to zipalign your package. This reduces the amount of RAM consumed by an app.", + "loc.input.label.zipalignVersion": "Zipalign version", + "loc.input.help.zipalignVersion": "Enter Android SDK build-tools version to look zipalign executable from.", + "loc.input.label.zipalignLocation": "Zipalign location", + "loc.input.help.zipalignLocation": "Optionally specify the location of the zipalign executable used during signing. This defaults to the zipalign found in the Android SDK version folder that your application builds against.", + "loc.messages.AndroidHomeNotSet": "The ANDROID_HOME environment variable is not set for the running user.", + "loc.messages.CouldNotFindToolInAndroidHome": "Could not find tool: %s inside ANDROID_HOME: %s", + "loc.messages.NoMatchingFiles": "No matching files were found with search pattern: %s", + "loc.messages.DeleteKeystoreFileFailed": "Failed to delete keystore file downloaded from the server: %s", + "loc.messages.CouldNotFindVersionOfToolInAndroidHome": "Could not find %s version of %s inside ANDROID_HOME: %s", + "loc.messages.GetLatestToolVersion": "Trying to get the latest installed version of tool: %s", + "loc.messages.GetSpecifiedToolVersion": "Trying to get version %s of %s" +} \ No newline at end of file diff --git a/_generated/AndroidSigningV3/Strings/resources.resjson/es-ES/resources.resjson b/_generated/AndroidSigningV3/Strings/resources.resjson/es-ES/resources.resjson new file mode 100644 index 000000000000..31990bc1db5d --- /dev/null +++ b/_generated/AndroidSigningV3/Strings/resources.resjson/es-ES/resources.resjson @@ -0,0 +1,40 @@ +{ + "loc.friendlyName": "Firma de Android", + "loc.helpMarkDown": "[Obtener más información acerca de esta tarea](https://go.microsoft.com/fwlink/?LinkID=613717)", + "loc.description": "Firmar y alinear archivos APK de Android", + "loc.instanceNameFormat": "Firma y alineación de archivos APK $(files)", + "loc.releaseNotes": "Esta versión de la tarea utiliza apksigner en lugar de jarsigner para firmar APK.", + "loc.group.displayName.apksignerOptions": "Opciones de firma", + "loc.group.displayName.zipalignOptions": "Opciones de Zipalign", + "loc.input.label.files": "Archivos APK", + "loc.input.help.files": "Ruta de acceso relativa de la raíz del repositorio a los APK que desea firmar. Puede usar caracteres comodín para especificar varios archivos ([más información](https://go.microsoft.com/fwlink/?linkid=856077)). Por ejemplo, \"**/bin/*.apk\" para todos los archivos .APK en la subcarpeta \"bin\"", + "loc.input.label.apksign": "Firmar el APK", + "loc.input.help.apksign": "Seleccione esta opción para firmar el APK con un archivo de almacén de claves proporcionado. Los APK sin firma solo se pueden ejecutar en un emulador. Deben estar firmados para poder ejecutarlos en un dispositivo.", + "loc.input.label.keystoreFile": "Archivo del almacén de claves", + "loc.input.help.keystoreFile": "Seleccione el archivo de almacén de claves que se cargó en \"Archivos seguros\" a fin de usarlo para firmar el APK.", + "loc.input.label.keystorePass": "Contraseña del almacén de claves", + "loc.input.help.keystorePass": "Escriba la contraseña del archivo de almacén de claves proporcionado. Utilice una variable nueva con el bloqueo habilitado en la ficha Variables para cifrar este valor.", + "loc.input.label.keystoreAlias": "Alias", + "loc.input.help.keystoreAlias": "Escriba el alias que identifica el par de claves pública/privada que debe usarse en el archivo de almacén de claves.", + "loc.input.label.keyPass": "Contraseña de clave", + "loc.input.help.keyPass": "Escriba la contraseña de clave del alias y el archivo de almacén de claves. Utilice una variable nueva con el bloqueo habilitado en la ficha Variables para cifrar este valor.", + "loc.input.label.apksignerVersion": "Versión de apksigner", + "loc.input.help.apksignerVersion": "Escriba la versión de las herramientas de compilación de Android SDK desde la que buscar el ejecutable de apksigner.", + "loc.input.label.apksignerArguments": "argumentos de apksigner", + "loc.input.help.apksignerArguments": "Proporcione cualquier opción para pasar a la línea de comandos de apksigner. El valor predeterminado es: --verbose", + "loc.input.label.apksignerLocation": "ubicación de apksigner", + "loc.input.help.apksignerLocation": "Especifique opcionalmente la ubicación del ejecutable apksigner usado durante la firma. Se establece como valor predeterminado el ejecutable apksigner que se encuentra en la carpeta de la versión de Android SDK en que se compila la aplicación.", + "loc.input.label.zipalign": "Zipalign", + "loc.input.help.zipalign": "Seleccione si desea optimizar el paquete con zipalign. Esta acción disminuye la cantidad de RAM que consume una aplicación.", + "loc.input.label.zipalignVersion": "Versión de Zipalign", + "loc.input.help.zipalignVersion": "Escriba la versión de las herramientas de compilación de Android SDK desde la que buscar el ejecutable de zipalign.", + "loc.input.label.zipalignLocation": "Ubicación de Zipalign", + "loc.input.help.zipalignLocation": "Especifique opcionalmente la ubicación del ejecutable zipalign usado durante la firma. Se establece como valor predeterminado el ejecutable zipalign que se encuentra en la carpeta de la versión de Android SDK en que se compila la aplicación.", + "loc.messages.AndroidHomeNotSet": "La variable de entorno ANDROID_HOME no está definida para el usuario actual.", + "loc.messages.CouldNotFindToolInAndroidHome": "No se encontró la herramienta %s en ANDROID_HOME: %s", + "loc.messages.NoMatchingFiles": "No se encontraron archivos coincidentes con el patrón de búsqueda: %s", + "loc.messages.DeleteKeystoreFileFailed": "No se pudo eliminar el archivo de almacén de claves descargado del servidor: %s", + "loc.messages.CouldNotFindVersionOfToolInAndroidHome": "No se encontró la versión %s de %s en ANDROID_HOME: %s", + "loc.messages.GetLatestToolVersion": "Intentando obtener la última versión instalada de la herramienta: %s", + "loc.messages.GetSpecifiedToolVersion": "Intentando obtener la versión %s de %s" +} \ No newline at end of file diff --git a/_generated/AndroidSigningV3/Strings/resources.resjson/fr-FR/resources.resjson b/_generated/AndroidSigningV3/Strings/resources.resjson/fr-FR/resources.resjson new file mode 100644 index 000000000000..1a2939d54a4b --- /dev/null +++ b/_generated/AndroidSigningV3/Strings/resources.resjson/fr-FR/resources.resjson @@ -0,0 +1,40 @@ +{ + "loc.friendlyName": "Signature Android", + "loc.helpMarkDown": "[En savoir plus sur cette tâche](https://go.microsoft.com/fwlink/?LinkID=613717)", + "loc.description": "Signer et aligner les fichiers APK Android", + "loc.instanceNameFormat": "Signature et alignement de fichiers APK $(files)", + "loc.releaseNotes": "Cette version de la tâche utilise apksigner au lieu de jarsigner pour signer les fichiers APK.", + "loc.group.displayName.apksignerOptions": "Options de signature", + "loc.group.displayName.zipalignOptions": "Options Zipalign", + "loc.input.label.files": "Fichiers APK", + "loc.input.help.files": "Chemin relatif entre la racine du dépôt et le ou les fichiers APK à signer. Vous pouvez utiliser des caractères génériques pour spécifier plusieurs fichiers ([Plus d'informations](https://go.microsoft.com/fwlink/?linkid=856077)). Par exemple, '**/bin/*.apk' pour tous les fichiers .APK du sous-dossier 'bin'", + "loc.input.label.apksign": "Signer le fichier APK", + "loc.input.help.apksign": "Sélectionnez cette option pour signer le fichier APK avec le fichier de magasin de clés fourni. Les fichiers APK non signés peuvent uniquement s'exécuter dans un émulateur. Les fichiers APK doivent être signés pour pouvoir s'exécuter sur un appareil.", + "loc.input.label.keystoreFile": "Fichier du magasin de clés", + "loc.input.help.keystoreFile": "Sélectionnez le fichier de magasin de clés chargé dans 'Fichiers sécurisés' à utiliser pour signer le fichier APK.", + "loc.input.label.keystorePass": "Mot de passe du magasin de clés", + "loc.input.help.keystorePass": "Entrez le mot de passe du fichier de magasin de clés fourni. Pour chiffrer cette valeur, utilisez une nouvelle variable en activant son verrou sous l'onglet Variables.", + "loc.input.label.keystoreAlias": "Alias", + "loc.input.help.keystoreAlias": "Entrez l'alias qui identifie la paire de clés publiques/privées à utiliser dans le fichier de magasin de clés.", + "loc.input.label.keyPass": "Mot de passe de la clé", + "loc.input.help.keyPass": "Entrez le mot de passe de clé pour l'alias et le fichier de magasin de clés. Pour chiffrer cette valeur, utilisez une nouvelle variable en activant son verrou sous l'onglet Variables.", + "loc.input.label.apksignerVersion": "Version d'apksigner", + "loc.input.help.apksignerVersion": "Entrez la version des outils de build du kit Android SDK pour y rechercher l'exécutable apksigner.", + "loc.input.label.apksignerArguments": "arguments d'apksigner", + "loc.input.help.apksignerArguments": "Indiquez les options à passer à la ligne de commande apksigner. La valeur par défaut est --verbose", + "loc.input.label.apksignerLocation": "emplacement d'apksigner", + "loc.input.help.apksignerLocation": "Spécifiez éventuellement l'emplacement de l'exécutable apksigner utilisé durant la signature. Par défaut, il s'agit du fichier apksigner situé dans le dossier de version du kit Android SDK à partir duquel votre application est générée.", + "loc.input.label.zipalign": "Zipalign", + "loc.input.help.zipalign": "Sélectionnez cette option si vous voulez compresser votre package dans un fichier zipalign. Cela réduit la quantité de RAM consommée par une application.", + "loc.input.label.zipalignVersion": "Version de zipalign", + "loc.input.help.zipalignVersion": "Entrez la version des outils de build du kit Android SDK pour y rechercher l'exécutable zipalign.", + "loc.input.label.zipalignLocation": "Emplacement de Zipalign", + "loc.input.help.zipalignLocation": "Indiquez éventuellement l'emplacement de l'exécutable zipalign utilisé lors de la signature. Il s'agit par défaut du fichier zipalign disponible dans le dossier de la version Android SDK sur laquelle repose votre application.", + "loc.messages.AndroidHomeNotSet": "La variable d'environnement ANDROID_HOME n'est pas définie pour l'utilisateur actuel.", + "loc.messages.CouldNotFindToolInAndroidHome": "Outil %s introuvable dans ANDROID_HOME : %s", + "loc.messages.NoMatchingFiles": "Il n'existe aucun fichier correspondant au modèle de recherche : %s", + "loc.messages.DeleteKeystoreFileFailed": "Échec de la suppression du fichier de magasin de clés téléchargé à partir du serveur : %s", + "loc.messages.CouldNotFindVersionOfToolInAndroidHome": "La version %s de %s est introuvable dans ANDROID_HOME : %s", + "loc.messages.GetLatestToolVersion": "Tentative d'obtention de la dernière version installée de l'outil : %s", + "loc.messages.GetSpecifiedToolVersion": "Tentative d'obtention de la version %s de %s" +} \ No newline at end of file diff --git a/_generated/AndroidSigningV3/Strings/resources.resjson/it-IT/resources.resjson b/_generated/AndroidSigningV3/Strings/resources.resjson/it-IT/resources.resjson new file mode 100644 index 000000000000..4c3877ece00e --- /dev/null +++ b/_generated/AndroidSigningV3/Strings/resources.resjson/it-IT/resources.resjson @@ -0,0 +1,40 @@ +{ + "loc.friendlyName": "Firma per Android", + "loc.helpMarkDown": "[Altre informazioni su questa attività](https://go.microsoft.com/fwlink/?LinkID=613717)", + "loc.description": "Consente di firmare e allineare i file APK di Android", + "loc.instanceNameFormat": "Firma e allineamento dei file APK $(files)", + "loc.releaseNotes": "Questa versione dell'attività usa apksigner invece di jarsigner per firmare gli APK.", + "loc.group.displayName.apksignerOptions": "Opzioni di firma", + "loc.group.displayName.zipalignOptions": "Opzioni Zipalign", + "loc.input.label.files": "File APK", + "loc.input.help.files": "Percorso relativo dalla radice del repository ai file APK da firmare. Per specificare più file, è possibile usare i caratteri jolly, ad esempio `**/bin/*.apk` per tutti i file APK presenti nella sottocartella 'bin'. [Altre informazioni](https://go.microsoft.com/fwlink/?linkid=856077)", + "loc.input.label.apksign": "Firma l'APK", + "loc.input.help.apksign": "Selezionare questa opzione per firmare l'APK con un file dell'archivio chiavi fornito. Per essere eseguiti in un dispositivo, gli APK devono essere firmati. Gli APK senza firma possono essere eseguiti sono in un emulatore.", + "loc.input.label.keystoreFile": "File dell'archivio chiavi", + "loc.input.help.keystoreFile": "Consente di selezionare il file dell'archivio chiavi caricato in `File protetti` da usare per firmare l'APK.", + "loc.input.label.keystorePass": "Password dell'archivio chiavi", + "loc.input.help.keystorePass": "Immettere la password per il file dell'archivio chiavi fornito. Per crittografare questo valore, usare una nuova variabile con il blocco abilitato nella scheda Variabili.", + "loc.input.label.keystoreAlias": "Alias", + "loc.input.help.keystoreAlias": "Immettere l'alias che identifica la coppia di chiavi pubblica/privata da usare nel file dell'archivio chiavi.", + "loc.input.label.keyPass": "Password della chiave", + "loc.input.help.keyPass": "Immettere la password chiave per il file dell'archivio chiavi e l'alias. Per crittografare questo valore, usare una nuova variabile con il blocco abilitato nella scheda Variabili.", + "loc.input.label.apksignerVersion": "Versione di apksigner", + "loc.input.help.apksignerVersion": "Consente di immettere la versione degli strumenti di compilazione di Android SDK da cui cercare l'eseguibile di apksigner.", + "loc.input.label.apksignerArguments": "Argomenti di apksigner", + "loc.input.help.apksignerArguments": "Consente di specificare le eventuali opzioni da passare alla riga di comando di apksigner. Impostazione predefinita: --verbose", + "loc.input.label.apksignerLocation": "Percorso di apksigner", + "loc.input.help.apksignerLocation": "Consente facoltativamente di specificare il percorso dell'eseguibile di apksigner usato durante la firma. Per impostazione predefinita viene usato l'eseguibile di apksigner trovato nella cartella della versione di Android SDK usata per la compilazione dell'applicazione.", + "loc.input.label.zipalign": "Zipalign", + "loc.input.help.zipalign": "Consente di scegliere se eseguire zipalign per il pacchetto, in modo da ridurre la quantità di RAM utilizzata da un'app.", + "loc.input.label.zipalignVersion": "Versione di Zipalign", + "loc.input.help.zipalignVersion": "Consente di immettere la versione degli strumenti di compilazione di Android SDK da cui cercare l'eseguibile di Zipalign.", + "loc.input.label.zipalignLocation": "Percorso di Zipalign", + "loc.input.help.zipalignLocation": "Consente facoltativamente di specificare il percorso dell'eseguibile di zipalign usato durante la firma. Per impostazione predefinita viene usato l'eseguibile di zipalign trovato nella cartella della versione di Android SDK usata per la compilazione dell'applicazione.", + "loc.messages.AndroidHomeNotSet": "La variabile di ambiente ANDROID_HOME non è impostata per l'utente in esecuzione.", + "loc.messages.CouldNotFindToolInAndroidHome": "Non è stato possibile trovare lo strumento %s in ANDROID_HOME: %s", + "loc.messages.NoMatchingFiles": "Non sono stati trovati file corrispondenti con il criterio di ricerca: %s", + "loc.messages.DeleteKeystoreFileFailed": "Non è stato possibile eliminare il file dell'archivio chiavi scaricato dal server: %s", + "loc.messages.CouldNotFindVersionOfToolInAndroidHome": "Non è stato possibile trovare la versione %s di %s in ANDROID_HOME: %s", + "loc.messages.GetLatestToolVersion": "Tentativo di ottenere l'ultima versione installata dello strumento: %s", + "loc.messages.GetSpecifiedToolVersion": "Tentativo di ottenere la versione %s di %s" +} \ No newline at end of file diff --git a/_generated/AndroidSigningV3/Strings/resources.resjson/ja-JP/resources.resjson b/_generated/AndroidSigningV3/Strings/resources.resjson/ja-JP/resources.resjson new file mode 100644 index 000000000000..8c62ec3ac644 --- /dev/null +++ b/_generated/AndroidSigningV3/Strings/resources.resjson/ja-JP/resources.resjson @@ -0,0 +1,40 @@ +{ + "loc.friendlyName": "Android の署名", + "loc.helpMarkDown": "[このタスクの詳細を表示](https://go.microsoft.com/fwlink/?LinkID=613717)", + "loc.description": "署名し、Android APK ファイルを配置します", + "loc.instanceNameFormat": "APK ファイル $(files) の署名と配置", + "loc.releaseNotes": "このバージョンのタスクでは、APK の署名に jarsigner ではなく apksigner が使用されます。", + "loc.group.displayName.apksignerOptions": "署名オプション", + "loc.group.displayName.zipalignOptions": "Zipalign オプション", + "loc.input.label.files": "APK ファイル", + "loc.input.help.files": "リポジトリのルートから署名する APK への相対パス。ワイルドカードを使用して複数のファイルを指定できます ([詳細](https://go.microsoft.com/fwlink/?linkid=856077))。たとえば、'bin' サブフォルダーにあるすべての .APK ファイルの場合は `**/bin/*.apk` です。", + "loc.input.label.apksign": "APK の署名", + "loc.input.help.apksign": "指定したキーストア ファイルで APK に署名する場合に、このオプションを選択します。署名がない APK はエミュレーターだけでしか実行できません。デバイスで実行するには、APK に署名する必要があります。", + "loc.input.label.keystoreFile": "Keystore ファイル", + "loc.input.help.keystoreFile": "APK の署名に使うために [セキュア ファイル] にアップロードされたキーストア ファイルを選択します。", + "loc.input.label.keystorePass": "Keystore パスワード", + "loc.input.help.keystorePass": "提供されているキーストア ファイルに関するパスワードを入力します。この値を暗号化するには、[変数] タブで、ロックを有効にして新しい変数をご使用ください。", + "loc.input.label.keystoreAlias": "エイリアス", + "loc.input.help.keystoreAlias": "キーストア ファイルで使用される公開キー/秘密キーのペアを識別するエイリアスを入力します。", + "loc.input.label.keyPass": "キー パスワード", + "loc.input.help.keyPass": "エイリアスとキーストア ファイルのキー パスワードを入力します。この値を暗号化するには、[変数] タブで新しい変数のロックを有効にします。", + "loc.input.label.apksignerVersion": "apksigner のバージョン", + "loc.input.help.apksignerVersion": "apksigner 実行可能ファイルを検索する Android SDK Build-Tools のバージョンを入力します。", + "loc.input.label.apksignerArguments": "apksigner の引数", + "loc.input.help.apksignerArguments": "apksigner コマンド ラインに渡すオプションを指定します。既定値: --verbose", + "loc.input.label.apksignerLocation": "apksigner の場所", + "loc.input.help.apksignerLocation": "必要に応じて、署名中に使用する apksigner 実行可能ファイルの場所を指定します。既定では、アプリケーションのビルドが実行される Android SDK バージョンのフォルダーにある apksigner が使用されます。", + "loc.input.label.zipalign": "Zipalign", + "loc.input.help.zipalign": "パッケージに Zipalign を実行する場合に選択します。アプリに使用される RAM の量を減らすことができます。", + "loc.input.label.zipalignVersion": "zipalign のバージョン", + "loc.input.help.zipalignVersion": "zipalign 実行可能ファイルを検索する Android SDK Build-Tools のバージョンを入力します。", + "loc.input.label.zipalignLocation": "Zipalign の場所", + "loc.input.help.zipalignLocation": "(省略可能) 署名中に使用される Zipalign 実行可能ファイルの場所を指定します。既定値は、アプリケーションがビルドした Android SDK バージョン フォルダー内にある Zipalign になります。", + "loc.messages.AndroidHomeNotSet": "実行中のユーザーに ANDROID_HOME 環境変数が設定されていません。", + "loc.messages.CouldNotFindToolInAndroidHome": "ツール %s が ANDROID_HOME 内に見つかりませんでした: %s", + "loc.messages.NoMatchingFiles": "次の検索パターンと一致するファイルが見つかりませんでした: %s", + "loc.messages.DeleteKeystoreFileFailed": "サーバーからダウンロードされたキーストア ファイルを削除することができませんでした: %s", + "loc.messages.CouldNotFindVersionOfToolInAndroidHome": "ANDROID_HOME 内に %s バージョンの %s が見つかりませんでした: %s", + "loc.messages.GetLatestToolVersion": "インストールされている最新バージョンのツールを取得しようとしています: %s", + "loc.messages.GetSpecifiedToolVersion": "バージョン %s の %s を取得しようとしています" +} \ No newline at end of file diff --git a/_generated/AndroidSigningV3/Strings/resources.resjson/ko-KR/resources.resjson b/_generated/AndroidSigningV3/Strings/resources.resjson/ko-KR/resources.resjson new file mode 100644 index 000000000000..9a868aacfd26 --- /dev/null +++ b/_generated/AndroidSigningV3/Strings/resources.resjson/ko-KR/resources.resjson @@ -0,0 +1,40 @@ +{ + "loc.friendlyName": "Android 서명", + "loc.helpMarkDown": "[이 작업에 대한 자세한 정보](https://go.microsoft.com/fwlink/?LinkID=613717)", + "loc.description": "Android APK 파일 서명 및 정렬", + "loc.instanceNameFormat": "APK 파일 $(files) 서명 및 정렬", + "loc.releaseNotes": "이 버전의 작업은 jarsigner 대신 apksigner를 사용하여 APK에 서명합니다.", + "loc.group.displayName.apksignerOptions": "서명 옵션", + "loc.group.displayName.zipalignOptions": "Zipalign 옵션", + "loc.input.label.files": "APK 파일", + "loc.input.help.files": "서명할 APK에 대한 리포 루트의 상대 경로입니다. 와일드카드를 사용하여 여러 파일을 지정할 수 있습니다([자세한 정보](https://go.microsoft.com/fwlink/?linkid=856077)). 예를 들어, 'bin' 하위 폴더에 있는 모든 APK 파일을 표시하기 위해 '**/bin/*.apk'를 사용할 수 있습니다.", + "loc.input.label.apksign": "APK 서명", + "loc.input.help.apksign": "제공된 키 저장소 파일을 사용하여 APK에 서명하려면 이 옵션을 선택합니다. 서명되지 않은 APK는 에뮬레이터에서만 실행할 수 있습니다. 장치에서 실행하려면 APK가 서명되어야 합니다.", + "loc.input.label.keystoreFile": "키 저장소 파일", + "loc.input.help.keystoreFile": "APK 서명에 사용하기 위해 '보안 파일'에 업로드한 키 저장소 파일을 선택합니다.", + "loc.input.label.keystorePass": "키 저장소 암호", + "loc.input.help.keystorePass": "제공된 키 저장소 파일에 대한 암호를 입력합니다. 이 값을 암호화하려면 [변수] 탭에서 잠금이 사용 설정된 새 변수를 사용하세요.", + "loc.input.label.keystoreAlias": "별칭", + "loc.input.help.keystoreAlias": "공용/개인 키 쌍을 식별하여 키 저장소 파일에 사용할 별칭을 입력합니다.", + "loc.input.label.keyPass": "키 암호", + "loc.input.help.keyPass": "별칭 및 키 저장소 파일에 대한 키 암호를 입력합니다. 이 값을 암호화하려면 [변수] 탭에서 잠금이 사용 설정된 새 변수를 사용하세요.", + "loc.input.label.apksignerVersion": "apksigner 버전", + "loc.input.help.apksignerVersion": "apksigner 실행 파일을 볼 Android SDK 빌드 도구 버전을 입력하세요.", + "loc.input.label.apksignerArguments": "apksigner 인수", + "loc.input.help.apksignerArguments": "apksigner 명령줄에 전달할 옵션을 제공합니다. 기본값: --verbose", + "loc.input.label.apksignerLocation": "apksigner 위치", + "loc.input.help.apksignerLocation": "서명할 때 사용되는 apksigner 실행 파일의 위치를 선택적으로 지정합니다. 기본적으로 애플리케이션이 빌드되는 Android SDK 버전 폴더에 있는 apksigner를 사용합니다.", + "loc.input.label.zipalign": "Zipalign", + "loc.input.help.zipalign": "패키지를 zipalign하려면 선택합니다. 이렇게 하면 앱에 사용되는 RAM 양이 줄어듭니다.", + "loc.input.label.zipalignVersion": "zipalign 버전", + "loc.input.help.zipalignVersion": "zipalign 실행 파일을 볼 Android SDK 빌드 도구 버전을 입력합니다.", + "loc.input.label.zipalignLocation": "Zipalign 위치", + "loc.input.help.zipalignLocation": "원하는 경우 서명할 때 사용되는 zipalign 실행 파일의 위치를 지정합니다. 기본적으로 응용 프로그램이 빌드되는 Android SDK 버전 폴더에 있는 zipalign을 사용합니다.", + "loc.messages.AndroidHomeNotSet": "실행 중인 사용자에 대해 ANDROID_HOME 환경 변수가 설정되어 있지 않습니다.", + "loc.messages.CouldNotFindToolInAndroidHome": "ANDROID_HOME 내에서 %s 도구를 찾을 수 없습니다. %s", + "loc.messages.NoMatchingFiles": "다음 검색 패턴과 일치하는 파일을 찾을 수 없습니다. %s", + "loc.messages.DeleteKeystoreFileFailed": "서버에서 다운로드된 키 저장소 파일을 삭제하지 못함: %s", + "loc.messages.CouldNotFindVersionOfToolInAndroidHome": "ANDROID_HOME 내에서 %s 버전의 %s을(를) 찾을 수 없음: %s", + "loc.messages.GetLatestToolVersion": "설치된 최신 버전의 도구를 가져오는 중: %s", + "loc.messages.GetSpecifiedToolVersion": "%s 버전의 %s을(를) 가져오는 중" +} \ No newline at end of file diff --git a/_generated/AndroidSigningV3/Strings/resources.resjson/ru-RU/resources.resjson b/_generated/AndroidSigningV3/Strings/resources.resjson/ru-RU/resources.resjson new file mode 100644 index 000000000000..1d45c6096432 --- /dev/null +++ b/_generated/AndroidSigningV3/Strings/resources.resjson/ru-RU/resources.resjson @@ -0,0 +1,40 @@ +{ + "loc.friendlyName": "Подписывание Android", + "loc.helpMarkDown": "[См. дополнительные сведения об этой задаче](https://go.microsoft.com/fwlink/?LinkID=613717)", + "loc.description": "Подписывание и назначение APK-файлов Android", + "loc.instanceNameFormat": "Подписание и выравнивание файлов APK $(files)", + "loc.releaseNotes": "Задача этой версии для подписывания файлов APK использует apksigner вместо jarsigner.", + "loc.group.displayName.apksignerOptions": "Параметры подписи", + "loc.group.displayName.zipalignOptions": "Параметры Zipalign", + "loc.input.label.files": "APK-файлы", + "loc.input.help.files": "Относительный путь от корня репозитория к подписываемым APK-файлам. Можно использовать подстановочные знаки для указания нескольких файлов ([дополнительные сведения](https://go.microsoft.com/fwlink/?linkid=856077)). Пример: \"**/bin/*.apk\" для всех APK-файлов во вложенной папке bin", + "loc.input.label.apksign": "Подписать APK", + "loc.input.help.apksign": "Выберите этот параметр, чтобы подписать APK с помощью предоставленного файла хранилища ключей. Неподписанные APK можно выполнять только в эмуляторе. Для запуска на устройстве APK должны быть подписаны.", + "loc.input.label.keystoreFile": "Файл хранилища ключей", + "loc.input.help.keystoreFile": "Выберите файл хранилища ключей, отправленный в разделе \"Безопасные файлы\" для подписывания APK.", + "loc.input.label.keystorePass": "Пароль хранилища ключей", + "loc.input.help.keystorePass": "Введите пароль для предоставленного файла хранилища ключей. Чтобы зашифровать это значение, используйте новую переменную сборки с включенной блокировкой на вкладке \"Переменные\".", + "loc.input.label.keystoreAlias": "Псевдоним", + "loc.input.help.keystoreAlias": "Введите псевдоним, который определяет пару открытого и закрытого ключей для использования в файле хранилища ключей.", + "loc.input.label.keyPass": "Пароль ключа", + "loc.input.help.keyPass": "Введите пароль ключа для псевдонима и файла хранилища ключей. Чтобы зашифровать это значение, используйте новую переменную сборки с включенной блокировкой на вкладке \"Переменные\".", + "loc.input.label.apksignerVersion": "Версия apksigner", + "loc.input.help.apksignerVersion": "Введите версию пакета SDK build-tools для Android, в котором нужно искать исполняемый файл apksigner.", + "loc.input.label.apksignerArguments": "Аргументы apksigner", + "loc.input.help.apksignerArguments": "Укажите параметры для передачи в командную строку apksigner. Параметры по умолчанию: --verbose.", + "loc.input.label.apksignerLocation": "Расположение apksigner", + "loc.input.help.apksignerLocation": "При необходимости укажите путь к исполняемому файлу apksigner, используемому при подписывании. По умолчанию применяется файл apksigner, найденный в папке той версии Android SDK, с которой собрано ваше приложение.", + "loc.input.label.zipalign": "Zipalign", + "loc.input.help.zipalign": "Укажите, следует ли использовать для пакета zipalign. Это позволяет снизить объем оперативной памяти, используемой приложением.", + "loc.input.label.zipalignVersion": "Версия Zipalign", + "loc.input.help.zipalignVersion": "Введите версию пакета SDK build-tools для Android, в котором нужно искать исполняемый файл zipalign.", + "loc.input.label.zipalignLocation": "Расположение Zipalign", + "loc.input.help.zipalignLocation": "При необходимости укажите путь к исполняемому файлу zipalign, используемому при подписывании. По умолчанию применяется zipalign, найденный в папке той версии Android SDK, с которой собрано ваше приложение.", + "loc.messages.AndroidHomeNotSet": "Переменная среды ANDROID_HOME не задана для текущего пользователя.", + "loc.messages.CouldNotFindToolInAndroidHome": "Не удалось найти средство %s в ANDROID_HOME: %s", + "loc.messages.NoMatchingFiles": "Не найдены файлы, соответствующие шаблону поиска: %s.", + "loc.messages.DeleteKeystoreFileFailed": "Не удалось удалить скачанный с сервера файл хранилища ключей: %s", + "loc.messages.CouldNotFindVersionOfToolInAndroidHome": "Не удалось найти версию %s инструмента %s в ANDROID_HOME: %s", + "loc.messages.GetLatestToolVersion": "Попытка получить последнюю установленную версию инструмента: %s", + "loc.messages.GetSpecifiedToolVersion": "Попытка получить версию %s инструмента %s." +} \ No newline at end of file diff --git a/_generated/AndroidSigningV3/Strings/resources.resjson/zh-CN/resources.resjson b/_generated/AndroidSigningV3/Strings/resources.resjson/zh-CN/resources.resjson new file mode 100644 index 000000000000..b3e0f59f0da4 --- /dev/null +++ b/_generated/AndroidSigningV3/Strings/resources.resjson/zh-CN/resources.resjson @@ -0,0 +1,40 @@ +{ + "loc.friendlyName": "Android 签名", + "loc.helpMarkDown": "[详细了解此任务](https://go.microsoft.com/fwlink/?LinkID=613717)", + "loc.description": "签名并排列 Android APK 文件", + "loc.instanceNameFormat": "签名并排列 APK 文件 $(files)", + "loc.releaseNotes": "此版本的任务使用 apksigner 而不是 jarsigner 来签署 APK。", + "loc.group.displayName.apksignerOptions": "签名选项", + "loc.group.displayName.zipalignOptions": "Zipalign 选项", + "loc.input.label.files": "APK 文件", + "loc.input.help.files": "从存储库根路径到要签名的 APK 之间的相对路径。可以使用通配符指定多个文件([详细信息](https://go.microsoft.com/fwlink/?linkid=856077))。例如,使用 \"**/bin/*.apk\" 指定 \"bin\" 子文件夹中的所有 .APK 文件", + "loc.input.label.apksign": "为 APK 签名", + "loc.input.help.apksign": "若要使用提供的密钥存储文件对 APK 签名,请选择此项。未签名的 APK 只能在仿真器中运行。若要在设备上运行,必需对 APK 签名。", + "loc.input.label.keystoreFile": "Keystore 文件", + "loc.input.help.keystoreFile": "选择已上传到“安全文件”用来对 APK 签名的密钥存储文件。", + "loc.input.label.keystorePass": "Keystore 密码", + "loc.input.help.keystorePass": "输入提供的密钥存储文件的密码。对“变量”选项卡使用已启用锁定的新变量来加密该值。", + "loc.input.label.keystoreAlias": "别名", + "loc.input.help.keystoreAlias": "输入别名,以标识在密钥存储文件中使用的公钥/私钥对。", + "loc.input.label.keyPass": "密钥密码", + "loc.input.help.keyPass": "输入别名和密钥存储文件的密钥密码。对“变量”选项卡使用已启用锁定的新变量来加密该值。", + "loc.input.label.apksignerVersion": "apksigner 版本", + "loc.input.help.apksignerVersion": "输入要从中查找 apksigner 可执行文件的 Android SDK 生成工具版本。", + "loc.input.label.apksignerArguments": "apksigner 参数", + "loc.input.help.apksignerArguments": "提供要传递到 apksigner 命令行的任何选项。默认值是: --verbose", + "loc.input.label.apksignerLocation": "apksigner 位置", + "loc.input.help.apksignerLocation": "可以选择指定签名期间使用的 apksigner 可执行文件的位置。默认为应用程序生成所定向的 Android SDK 版本文件夹中的 apksigner。", + "loc.input.label.zipalign": "Zipalign", + "loc.input.help.zipalign": "若要对包进行 zipalign,请选择此项。这会减少应用使用的 RAM 量。", + "loc.input.label.zipalignVersion": "Zipalign 版本", + "loc.input.help.zipalignVersion": "输入要从中查找 zipalign 可执行文件的 Android SDK 生成工具版本。", + "loc.input.label.zipalignLocation": "Zipalign 位置", + "loc.input.help.zipalignLocation": "也可以选择指定签名过程中使用的 zipalign 可执行文件的位置。默认情况下,使用应用程序基于其创建的 Android SDK 版本文件夹中的 zipalign。", + "loc.messages.AndroidHomeNotSet": "未为正在运行的用户设置 ANDROID_HOME 环境变量。", + "loc.messages.CouldNotFindToolInAndroidHome": "无法在 ANDROID_HOME %s 内找到工具: %s", + "loc.messages.NoMatchingFiles": "使用搜索模式 %s 未找到匹配的文件", + "loc.messages.DeleteKeystoreFileFailed": "未能删除从服务器下载的密钥存储文件: %s", + "loc.messages.CouldNotFindVersionOfToolInAndroidHome": "在 ANDROID_HOME 中找不到 %s 版本的 %s: %s", + "loc.messages.GetLatestToolVersion": "正在尝试获取工具的最新安装版本: %s", + "loc.messages.GetSpecifiedToolVersion": "正在尝试获取 %s 版本的 %s" +} \ No newline at end of file diff --git a/_generated/AndroidSigningV3/Strings/resources.resjson/zh-TW/resources.resjson b/_generated/AndroidSigningV3/Strings/resources.resjson/zh-TW/resources.resjson new file mode 100644 index 000000000000..1a4b044d089e --- /dev/null +++ b/_generated/AndroidSigningV3/Strings/resources.resjson/zh-TW/resources.resjson @@ -0,0 +1,40 @@ +{ + "loc.friendlyName": "Android 簽署", + "loc.helpMarkDown": "[深入了解此工作](https://go.microsoft.com/fwlink/?LinkID=613717)", + "loc.description": "簽署並對齊 Android APK 檔案", + "loc.instanceNameFormat": "簽署並對齊 APK 檔 $(files)", + "loc.releaseNotes": "此版本的工作使用 apksigner 而非 jarsigner 來簽署 APK。", + "loc.group.displayName.apksignerOptions": "簽署選項", + "loc.group.displayName.zipalignOptions": "Zipalign 選項", + "loc.input.label.files": "APK 檔案", + "loc.input.help.files": "所要簽署 APK 相對於存放庫根路徑的路徑。您可以使用萬用字元來指定多個檔案 ([詳細資訊](https://go.microsoft.com/fwlink/?linkid=856077))。例如,`**/bin/*.apk` 表示 'bin' 子資料夾中的所有 .APK 檔案", + "loc.input.label.apksign": "簽署 APK", + "loc.input.help.apksign": "若要使用提供的金鑰儲存區檔案簽署 APK,請選取此選項。未經簽署的 APK 只可在模擬器中執行。APK 必須經過簽署,才能在裝置上執行。", + "loc.input.label.keystoreFile": "金鑰儲存區檔案", + "loc.input.help.keystoreFile": "選取上傳至 `Secure Files` 以用於簽署 APK 的金鑰儲存區檔案。", + "loc.input.label.keystorePass": "金鑰儲存區密碼", + "loc.input.help.keystorePass": "請輸入所提供之金鑰儲存區檔案的密碼。請使用新的變數,並在 [變數] 索引標籤上啟用其鎖定,以加密此變數。", + "loc.input.label.keystoreAlias": "別名", + "loc.input.help.keystoreAlias": "請輸入可以識別要在金鑰儲存區檔案中使用之公用/私密金鑰組的別名。", + "loc.input.label.keyPass": "金鑰密碼", + "loc.input.help.keyPass": "請輸入別名與金鑰儲存區檔案的金鑰密碼。請使用新的變數,並在 [變數] 索引標籤上啟用其鎖定,以加密此變數。", + "loc.input.label.apksignerVersion": "apksigner 版本", + "loc.input.help.apksignerVersion": "輸入 Android SDK 的建置工具版本,從中尋找 apksigner 可執行檔。", + "loc.input.label.apksignerArguments": "apksigner 引數", + "loc.input.help.apksignerArguments": "提供要傳遞至 apksigner 命令列的任何選項。預設值為: --verbose", + "loc.input.label.apksignerLocation": "apksigner 位置", + "loc.input.help.apksignerLocation": "選擇性地指定在登入期間所使用的 apksigner 可執行檔位置。這會預設為在您應用程式對其建置的 Android SDK 版本資料夾中找到的 apksigner。", + "loc.input.label.zipalign": "Zipalign", + "loc.input.help.zipalign": "若想要為套件進行 zipalign 則加以選取。如此可減少應用程式所使用的 RAM 量。", + "loc.input.label.zipalignVersion": "Zipalign 版本", + "loc.input.help.zipalignVersion": "輸入 Android SDK 的建置工具版本,從中尋找 zipalign 可執行檔。", + "loc.input.label.zipalignLocation": "Zipalign 位置", + "loc.input.help.zipalignLocation": "選擇性地指定登入期間所使用之 zipalign 可執行檔的位置。預設為您應用程式建置目標的 Android SDK 版本資料夾中所找到的 zipalign。", + "loc.messages.AndroidHomeNotSet": "未對正在執行中的使用者設定 ANDROID_HOME 環境變數。", + "loc.messages.CouldNotFindToolInAndroidHome": "在 ANDROID_HOME %s 內找不到工具 %s", + "loc.messages.NoMatchingFiles": "使用下列搜尋模式找不到任何相符的檔案: %s", + "loc.messages.DeleteKeystoreFileFailed": "無法刪除從伺服器 %s 下載的金鑰儲存區檔案", + "loc.messages.CouldNotFindVersionOfToolInAndroidHome": "找不到 %s 版本 (%s 的版本),尋找位置為 ANDROID_HOME: %s", + "loc.messages.GetLatestToolVersion": "正在嘗試取得最新安裝的工具版本: %s", + "loc.messages.GetSpecifiedToolVersion": "正在嘗試取得版本 %s (%s 的版本)" +} \ No newline at end of file diff --git a/_generated/AndroidSigningV3/Tests/L0.ts b/_generated/AndroidSigningV3/Tests/L0.ts new file mode 100644 index 000000000000..11ea98d6182c --- /dev/null +++ b/_generated/AndroidSigningV3/Tests/L0.ts @@ -0,0 +1,167 @@ +import * as fs from 'fs'; +import * as assert from 'assert'; +import * as path from 'path'; +import * as ttm from 'azure-pipelines-task-lib/mock-test'; + +describe('AndroidSigning Suite v3', function () { + this.timeout(parseInt(process.env.TASK_TEST_TIMEOUT) || 20000); + before(() => { + // empty + }); + + after(() => { + // empty + }); + + it('Do not sign or zipalign if nothing is selected', (done: Mocha.Done) => { + const tp: string = path.join(__dirname, 'L0AndroidSkipSignAlign.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.invokedToolCount === 0, 'should not run anything'); + assert(tr.stderr.length === 0, 'should not have written to stderr'); + assert(tr.succeeded, 'task should have succeeded'); + + done(); + }); + + it('Do not align or sign if input single file does not exist', (done: Mocha.Done) => { + const tp: string = path.join(__dirname, 'L0AndroidSignAlignNoFileInput.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.invokedToolCount === 0, 'should not run anything'); + assert(tr.errorIssues.length || tr.stderr.length > 0, 'should have written to stderr'); + assert(tr.failed, 'task should have failed'); + + done(); + }); + + it('Do not align or sign if input pattern does not match any files', (done: Mocha.Done) => { + const tp: string = path.join(__dirname, 'L0AndroidSignAlignNoMatchingFileInput.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.invokedToolCount === 0, 'should not run anything'); + assert(tr.errorIssues.length > 0 || tr.stderr.length > 0, 'should have written to stderr'); + assert(tr.failed, 'task should have failed'); + + done(); + }); + + it('Fail if ANDROID_HOME is not set', (done: Mocha.Done) => { + const tp: string = path.join(__dirname, 'L0AndroidSignAlignAndroidHomeNotSet.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.invokedToolCount === 0, 'should not run anything'); + assert(tr.errorIssues.length > 0 || tr.stderr.length > 0, 'should have failed locate the tools'); + assert(tr.failed, 'task should have failed'); + + done(); + }); + + it('Use apksigner in ANDROID_HOME to sign single file', (done: Mocha.Done) => { + const tp: string = path.join(__dirname, 'L0AndroidSignAlignApksignerFromAndroidHome.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.invokedToolCount === 1, 'should have run apksigner'); + assert(tr.stderr.length === 0, 'should have signed file'); + assert(tr.succeeded, 'task should have succeeded'); + + done(); + }); + + it('Use specified apksigner to sign a single file', (done: Mocha.Done) => { + const tp: string = path.join(__dirname, 'L0AndroidSignAlignApksignerFromInputSingleFile.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.invokedToolCount === 1, 'should run apksigner'); + assert(tr.errorIssues.length === 0 && tr.stderr.length === 0, 'should not have written to stderr'); + assert(tr.succeeded, 'task should have succeeded'); + + done(); + }); + + it('zipalign a single file', (done: Mocha.Done) => { + const tp: string = path.join(__dirname, 'L0AndroidZipalignSingleFile.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.invokedToolCount === 1, 'should run zipalign'); + assert(tr.stderr.length === 0 || tr.errorIssues.length === 0, 'should not have written to stderr'); + assert(tr.succeeded, 'task should have succeeded'); + + done(); + }); + + it('Signing and aligning multiple files', (done: Mocha.Done) => { + const tp: string = path.join(__dirname, 'L0AndroidSignAlignMultipleFiles.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.invokedToolCount === 4, 'should have run apksigner and zipalign twice each'); + assert(tr.stderr.length === 0 || tr.errorIssues.length === 0, 'should not have written to stderr'); + assert(tr.succeeded, 'task should have succeeded'); + + done(); + }); + + it('Download keystore file from SecureFile', (done: Mocha.Done) => { + const tp: string = path.join(__dirname, 'L0DownloadKeystoreFile.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.stderr.length === 0, 'should not have written to stderr'); + assert(tr.succeeded, 'task should have succeeded'); + + done(); + }); + + it('Should use the latest apksign', function (done: Mocha.Done) { + const tp: string = path.join(__dirname, 'L0UseLatestApksign.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert.strictEqual(tr.stderr.length, 0, 'should not have written to stderr'); + assert(tr.succeeded, 'task should have succeeded'); + + done(); + }); + + it('Should use specified version of apksign', function (done: Mocha.Done) { + const tp: string = path.join(__dirname, 'L0UseSpecifiedApksign.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert.strictEqual(tr.stderr.length, 0, 'should not have written to stderr'); + assert(tr.succeeded, 'task should have succeeded'); + + done(); + }); + + it('Should not find specified version of apksign', function (done: Mocha.Done) { + const tp: string = path.join(__dirname, 'L0CantFindSpecifiedApksign.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.stdOutContained('CouldNotFindVersionOfToolInAndroidHome'), 'Should have written error message'); + assert(tr.failed, 'task should have failed'); + + done(); + }); +}); diff --git a/_generated/AndroidSigningV3/Tests/L0AndroidSignAlignAndroidHomeNotSet.ts b/_generated/AndroidSigningV3/Tests/L0AndroidSignAlignAndroidHomeNotSet.ts new file mode 100644 index 000000000000..44b7dc2b6b1c --- /dev/null +++ b/_generated/AndroidSigningV3/Tests/L0AndroidSignAlignAndroidHomeNotSet.ts @@ -0,0 +1,28 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +const taskPath = path.join(__dirname, '..', 'androidsigning.js'); +const tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('files', '/some/path/a.apk'); +tr.setInput('apksign', 'false'); +tr.setInput('zipalign', 'true'); + +process.env['VSTS_TASKVARIABLE_KEYSTORE_FILE_PATH'] = '/some/store'; +process.env['ANDROID_HOME'] = ''; + +// provide answers for task mock +const a: ma.TaskLibAnswers = { + findMatch: { + '/some/path/a.apk': [ + '/some/path/a.apk' + ] + }, + checkPath: { + '/some/path/a.apk': true + } +}; +tr.setAnswers(a); + +tr.run(); diff --git a/_generated/AndroidSigningV3/Tests/L0AndroidSignAlignApksignerFromAndroidHome.ts b/_generated/AndroidSigningV3/Tests/L0AndroidSignAlignApksignerFromAndroidHome.ts new file mode 100644 index 000000000000..d7a96b618d11 --- /dev/null +++ b/_generated/AndroidSigningV3/Tests/L0AndroidSignAlignApksignerFromAndroidHome.ts @@ -0,0 +1,42 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +const taskPath = path.join(__dirname, '..', 'androidsigning.js'); +const tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('files', '/some/path/a.apk'); +tr.setInput('apksign', 'true'); +tr.setInput('keystoreFile', 'keystoreFileId'); +tr.setInput('keystorePass', 'pass1'); +tr.setInput('keystoreAlias', 'somealias'); +tr.setInput('keyPass', 'pass2'); +tr.setInput('zipalign', 'false'); + +process.env['VSTS_TASKVARIABLE_KEYSTORE_FILE_PATH'] = '/some/store'; +process.env['ANDROID_HOME'] = '/fake/android/home'; + +// provide answers for task mock +const a: ma.TaskLibAnswers = { + findMatch: { + '/some/path/a.apk': [ + '/some/path/a.apk' + ], + 'apksigner*\n!*.jar': [ + '/fake/android/home/sdk1/apksigner', + '/fake/android/home/sdk2/apksigner' + ] + }, + checkPath: { + '/some/path/a.apk': true + }, + exec: { + '/fake/android/home/sdk1/apksigner sign --ks /some/store --ks-pass pass:pass1 --ks-key-alias somealias --key-pass pass:pass2 /some/path/a.apk': { + 'code': 0, + 'stdout': 'apksigner output here' + } + } +}; +tr.setAnswers(a); + +tr.run(); diff --git a/_generated/AndroidSigningV3/Tests/L0AndroidSignAlignApksignerFromInputSingleFile.ts b/_generated/AndroidSigningV3/Tests/L0AndroidSignAlignApksignerFromInputSingleFile.ts new file mode 100644 index 000000000000..7e78d92b2eb8 --- /dev/null +++ b/_generated/AndroidSigningV3/Tests/L0AndroidSignAlignApksignerFromInputSingleFile.ts @@ -0,0 +1,41 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +const taskPath = path.join(__dirname, '..', 'androidsigning.js'); +const tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('files', '/some/path/a.apk'); +tr.setInput('apksignerLocation', '/usr/bin/apksigner'); +tr.setInput('apksign', 'true'); +tr.setInput('keystoreFile', '/some/store'); +tr.setInput('keystorePass', 'pass1'); +tr.setInput('keystoreAlias', 'somealias'); +tr.setInput('keyPass', 'pass2'); +tr.setInput('zipalign', 'false'); + +process.env['AGENT_VERSION'] = '2.116.0'; +process.env['VSTS_TASKVARIABLE_KEYSTORE_FILE_PATH'] = '/some/store'; +process.env['HOME'] = '/users/test'; +process.env['ANDROID_HOME'] = '/fake/android/home'; + +// provide answers for task mock +const a: ma.TaskLibAnswers = { + findMatch: { + '/some/path/a.apk': [ + '/some/path/a.apk' + ] + }, + checkPath: { + '/some/path/a.apk': true + }, + exec: { + '/usr/bin/apksigner sign --ks /some/store --ks-pass pass:pass1 --ks-key-alias somealias --key-pass pass:pass2 /some/path/a.apk': { + 'code': 0, + 'stdout': 'apksigner output here' + } + } +}; +tr.setAnswers(a); + +tr.run(); \ No newline at end of file diff --git a/_generated/AndroidSigningV3/Tests/L0AndroidSignAlignMultipleFiles.ts b/_generated/AndroidSigningV3/Tests/L0AndroidSignAlignMultipleFiles.ts new file mode 100644 index 000000000000..7ec1452cec7a --- /dev/null +++ b/_generated/AndroidSigningV3/Tests/L0AndroidSignAlignMultipleFiles.ts @@ -0,0 +1,60 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +const taskPath = path.join(__dirname, '..', 'androidsigning.js'); +const tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('files', '/some/path/*.apk'); +tr.setInput('apksign', 'true'); +tr.setInput('keystoreFile', '/some/store'); +tr.setInput('keystorePass', 'pass1'); +tr.setInput('keystoreAlias', 'somealias'); +tr.setInput('keyPass', 'pass2'); +tr.setInput('zipalign', 'true'); + +process.env['VSTS_TASKVARIABLE_KEYSTORE_FILE_PATH'] = '/some/store'; +process.env['ANDROID_HOME'] = '/fake/android/home'; + +// provide answers for task mock +const a: ma.TaskLibAnswers = { + exec: { + '/fake/android/home/sdk1/apksigner sign --ks /some/store --ks-pass pass:pass1 --ks-key-alias somealias --key-pass pass:pass2 /some/path/a.apk': { + 'code': 0, + 'stdout': 'jarsigner output here' + }, + '/fake/android/home/sdk1/apksigner sign --ks /some/store --ks-pass pass:pass1 --ks-key-alias somealias --key-pass pass:pass2 /some/path/b.apk': { + 'code': 0, + 'stdout': 'jarsigner output here' + }, + '/fake/android/home/sdk1/zipalign -v 4 /some/path/a.apk.unaligned /some/path/a.apk': { + 'code': 0, + 'stdout': 'zipalign output here' + }, + '/fake/android/home/sdk1/zipalign -v 4 /some/path/b.apk.unaligned /some/path/b.apk': { + 'code': 0, + 'stdout': 'zipalign output here' + } + }, + checkPath: { + '/some/path/a.apk': true, + '/some/path/b.apk': true + }, + findMatch: { + '/some/path/*.apk': [ + '/some/path/a.apk', + '/some/path/b.apk' + ], + 'apksigner*\n!*.jar': [ + '/fake/android/home/sdk1/apksigner', + '/fake/android/home/sdk2/apksigner' + ], + 'zipalign*\n!*.jar': [ + '/fake/android/home/sdk1/zipalign', + '/fake/android/home/sdk2/zipalign' + ] + } +}; +tr.setAnswers(a); + +tr.run(); \ No newline at end of file diff --git a/_generated/AndroidSigningV3/Tests/L0AndroidSignAlignNoFileInput.ts b/_generated/AndroidSigningV3/Tests/L0AndroidSignAlignNoFileInput.ts new file mode 100644 index 000000000000..871a4205621e --- /dev/null +++ b/_generated/AndroidSigningV3/Tests/L0AndroidSignAlignNoFileInput.ts @@ -0,0 +1,26 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +const taskPath = path.join(__dirname, '..', 'androidsigning.js'); +const tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('files', '/some/path/nonexistent.apk'); +tr.setInput('apksign', 'true'); +tr.setInput('zipalign', 'true'); + +process.env['AGENT_VERSION'] = '2.116.0'; +process.env['VSTS_TASKVARIABLE_KEYSTORE_FILE_PATH'] = '/usr/lib/login.keystore'; +process.env['HOME'] = '/users/test'; +process.env['ANDROID_HOME'] = '/fake/android/home'; + +// provide answers for task mock +const a: ma.TaskLibAnswers = { + findMatch: { + "/some/path/nonexistent.apk": [ + ] + } +}; +tr.setAnswers(a); + +tr.run(); \ No newline at end of file diff --git a/_generated/AndroidSigningV3/Tests/L0AndroidSignAlignNoMatchingFileInput.ts b/_generated/AndroidSigningV3/Tests/L0AndroidSignAlignNoMatchingFileInput.ts new file mode 100644 index 000000000000..70e21675c644 --- /dev/null +++ b/_generated/AndroidSigningV3/Tests/L0AndroidSignAlignNoMatchingFileInput.ts @@ -0,0 +1,26 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +const taskPath = path.join(__dirname, '..', 'androidsigning.js'); +const tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('files', '/some/nonexistent/path/*.apk'); +tr.setInput('apksign', 'true'); +tr.setInput('zipalign', 'true'); + +process.env['AGENT_VERSION'] = '2.116.0'; +process.env['VSTS_TASKVARIABLE_KEYSTORE_FILE_PATH'] = '/usr/lib/login.keystore'; +process.env['HOME'] = '/users/test'; +process.env['ANDROID_HOME'] = '/fake/android/home'; + +// provide answers for task mock +const a: ma.TaskLibAnswers = { + findMatch: { + '/some/nonexistent/path/*.apk': [ + ] + } +}; +tr.setAnswers(a); + +tr.run(); \ No newline at end of file diff --git a/_generated/AndroidSigningV3/Tests/L0AndroidSkipSignAlign.ts b/_generated/AndroidSigningV3/Tests/L0AndroidSkipSignAlign.ts new file mode 100644 index 000000000000..2795156795b3 --- /dev/null +++ b/_generated/AndroidSigningV3/Tests/L0AndroidSkipSignAlign.ts @@ -0,0 +1,30 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +const taskPath = path.join(__dirname, '..', 'androidsigning.js'); +const tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('files', '/some/fake.apk'); +tr.setInput('apksign', 'false'); +tr.setInput('zipalign', 'false'); + +process.env['AGENT_VERSION'] = '2.116.0'; +process.env['VSTS_TASKVARIABLE_KEYSTORE_FILE_PATH'] = '/usr/lib/login.keystore'; +process.env['HOME'] = '/users/test'; +process.env['ANDROID_HOME'] = '/fake/android/home'; + +// provide answers for task mock +const a: ma.TaskLibAnswers = { + checkPath: { + '/some/fake.apk': true + }, + findMatch: { + '/some/fake.apk': [ + '/some/fake.apk' + ] + } +}; +tr.setAnswers(a); + +tr.run(); \ No newline at end of file diff --git a/_generated/AndroidSigningV3/Tests/L0AndroidZipalignSingleFile.ts b/_generated/AndroidSigningV3/Tests/L0AndroidZipalignSingleFile.ts new file mode 100644 index 000000000000..4e9eb18e3ee8 --- /dev/null +++ b/_generated/AndroidSigningV3/Tests/L0AndroidZipalignSingleFile.ts @@ -0,0 +1,40 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +const taskPath = path.join(__dirname, '..', 'androidsigning.js'); +const tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('files', '/some/fake.apk'); +tr.setInput('apksign', 'false'); +tr.setInput('zipalign', 'true'); + +process.env['AGENT_VERSION'] = '2.116.0'; +process.env['VSTS_TASKVARIABLE_KEYSTORE_FILE_PATH'] = '/some/store'; +process.env['HOME'] = '/users/test'; +process.env['ANDROID_HOME'] = '/fake/android/home'; + +// provide answers for task mock +const a: ma.TaskLibAnswers = { + 'checkPath': { + '/some/fake.apk': true + }, + 'findMatch': { + '/some/fake.apk': [ + '/some/fake.apk' + ], + 'zipalign*\n!*.jar': [ + '/fake/android/home/sdk1/zipalign', + '/fake/android/home/sdk2/zipalign' + ] + }, + 'exec': { + '/fake/android/home/sdk1/zipalign -v 4 /some/fake.apk.unaligned /some/fake.apk': { + 'code': 0, + 'stdout': 'zipalign output here' + } + } +}; +tr.setAnswers(a); + +tr.run(); \ No newline at end of file diff --git a/_generated/AndroidSigningV3/Tests/L0CantFindSpecifiedApksign.ts b/_generated/AndroidSigningV3/Tests/L0CantFindSpecifiedApksign.ts new file mode 100644 index 000000000000..0f01548ed461 --- /dev/null +++ b/_generated/AndroidSigningV3/Tests/L0CantFindSpecifiedApksign.ts @@ -0,0 +1,51 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +const taskPath = path.join(__dirname, '..', 'androidsigning.js'); +const tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('files', '/some/path/*.apk'); +tr.setInput('apksign', 'true'); +tr.setInput('keystoreFile', '/some/store'); +tr.setInput('keystorePass', 'pass1'); +tr.setInput('keystoreAlias', 'somealias'); +tr.setInput('keyPass', 'pass2'); +tr.setInput('zipalign', 'false'); +tr.setInput('apksignerVersion', '20.1.1'); + +process.env['VSTS_TASKVARIABLE_KEYSTORE_FILE_PATH'] = '/some/store'; +process.env['ANDROID_HOME'] = '/fake/android/home'; + +// provide answers for task mock +const a: ma.TaskLibAnswers = { + exec: { + '/fake/android/home/27.0.1/apksigner sign --ks /some/store --ks-pass pass:pass1 --ks-key-alias somealias --key-pass pass:pass2 /some/path/a.apk': { + 'code': 0, + 'stdout': 'jarsigner output here' + }, + '/fake/android/home/27.0.1/apksigner sign --ks /some/store --ks-pass pass:pass1 --ks-key-alias somealias --key-pass pass:pass2 /some/path/b.apk': { + 'code': 0, + 'stdout': 'jarsigner output here' + } + }, + checkPath: { + '/some/path/a.apk': true, + '/some/path/b.apk': true + }, + findMatch: { + '/some/path/*.apk': [ + '/some/path/a.apk', + '/some/path/b.apk' + ], + 'apksigner*\n!*.jar': [ + '/fake/android/home/26.0.3/apksigner', + '/fake/android/home/27.0.1/apksigner', + '/fake/android/home/29.0.2/apksigner', + '/fake/android/home/28.0.0/apksigner' + ] + } +}; +tr.setAnswers(a); + +tr.run(); \ No newline at end of file diff --git a/_generated/AndroidSigningV3/Tests/L0DownloadKeystoreFile.ts b/_generated/AndroidSigningV3/Tests/L0DownloadKeystoreFile.ts new file mode 100644 index 000000000000..80ae46d5624b --- /dev/null +++ b/_generated/AndroidSigningV3/Tests/L0DownloadKeystoreFile.ts @@ -0,0 +1,21 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +const taskPath = path.join(__dirname, '..', 'preandroidsigning.js'); +const tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('apksign', 'true'); +tr.setInput('keystoreFile', 'mySecureFileId'); + +process.env['AGENT_VERSION'] = '2.116.0'; + +const secureFileHelperMock = require('azure-pipelines-tasks-securefiles-common/securefiles-common-mock'); +tr.registerMock('azure-pipelines-tasks-securefiles-common/securefiles-common', secureFileHelperMock); + +// provide answers for task mock +const a: ma.TaskLibAnswers = { +}; +tr.setAnswers(a); + +tr.run(); \ No newline at end of file diff --git a/_generated/AndroidSigningV3/Tests/L0UseLatestApksign.ts b/_generated/AndroidSigningV3/Tests/L0UseLatestApksign.ts new file mode 100644 index 000000000000..7636d679b7ed --- /dev/null +++ b/_generated/AndroidSigningV3/Tests/L0UseLatestApksign.ts @@ -0,0 +1,50 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +const taskPath = path.join(__dirname, '..', 'androidsigning.js'); +const tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('files', '/some/path/*.apk'); +tr.setInput('apksign', 'true'); +tr.setInput('keystoreFile', '/some/store'); +tr.setInput('keystorePass', 'pass1'); +tr.setInput('keystoreAlias', 'somealias'); +tr.setInput('keyPass', 'pass2'); +tr.setInput('zipalign', 'false'); +tr.setInput('apksignerVersion', 'latest'); + +process.env['VSTS_TASKVARIABLE_KEYSTORE_FILE_PATH'] = '/some/store'; +process.env['ANDROID_HOME'] = '/fake/android/home'; + +// provide answers for task mock +const a: ma.TaskLibAnswers = { + exec: { + '/fake/android/home/29.0.2/apksigner sign --ks /some/store --ks-pass pass:pass1 --ks-key-alias somealias --key-pass pass:pass2 /some/path/a.apk': { + 'code': 0, + 'stdout': 'jarsigner output here' + }, + '/fake/android/home/29.0.2/apksigner sign --ks /some/store --ks-pass pass:pass1 --ks-key-alias somealias --key-pass pass:pass2 /some/path/b.apk': { + 'code': 0, + 'stdout': 'jarsigner output here' + } + }, + checkPath: { + '/some/path/a.apk': true, + '/some/path/b.apk': true + }, + findMatch: { + '/some/path/*.apk': [ + '/some/path/a.apk', + '/some/path/b.apk' + ], + 'apksigner*\n!*.jar': [ + '/fake/android/home/26.0.3/apksigner', + '/fake/android/home/29.0.2/apksigner', + '/fake/android/home/28.0.0/apksigner' + ] + } +}; +tr.setAnswers(a); + +tr.run(); \ No newline at end of file diff --git a/_generated/AndroidSigningV3/Tests/L0UseSpecifiedApksign.ts b/_generated/AndroidSigningV3/Tests/L0UseSpecifiedApksign.ts new file mode 100644 index 000000000000..4a03f7db544f --- /dev/null +++ b/_generated/AndroidSigningV3/Tests/L0UseSpecifiedApksign.ts @@ -0,0 +1,51 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +const taskPath = path.join(__dirname, '..', 'androidsigning.js'); +const tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('files', '/some/path/*.apk'); +tr.setInput('apksign', 'true'); +tr.setInput('keystoreFile', '/some/store'); +tr.setInput('keystorePass', 'pass1'); +tr.setInput('keystoreAlias', 'somealias'); +tr.setInput('keyPass', 'pass2'); +tr.setInput('zipalign', 'false'); +tr.setInput('apksignerVersion', '27'); + +process.env['VSTS_TASKVARIABLE_KEYSTORE_FILE_PATH'] = '/some/store'; +process.env['ANDROID_HOME'] = '/fake/android/home'; + +// provide answers for task mock +const a: ma.TaskLibAnswers = { + exec: { + '/fake/android/home/27.0.1/apksigner sign --ks /some/store --ks-pass pass:pass1 --ks-key-alias somealias --key-pass pass:pass2 /some/path/a.apk': { + 'code': 0, + 'stdout': 'jarsigner output here' + }, + '/fake/android/home/27.0.1/apksigner sign --ks /some/store --ks-pass pass:pass1 --ks-key-alias somealias --key-pass pass:pass2 /some/path/b.apk': { + 'code': 0, + 'stdout': 'jarsigner output here' + } + }, + checkPath: { + '/some/path/a.apk': true, + '/some/path/b.apk': true + }, + findMatch: { + '/some/path/*.apk': [ + '/some/path/a.apk', + '/some/path/b.apk' + ], + 'apksigner*\n!*.jar': [ + '/fake/android/home/26.0.3/apksigner', + '/fake/android/home/27.0.1/apksigner', + '/fake/android/home/29.0.2/apksigner', + '/fake/android/home/28.0.0/apksigner' + ] + } +}; +tr.setAnswers(a); + +tr.run(); \ No newline at end of file diff --git a/_generated/AndroidSigningV3/Tests/package-lock.json b/_generated/AndroidSigningV3/Tests/package-lock.json new file mode 100644 index 000000000000..08d4c49fc636 --- /dev/null +++ b/_generated/AndroidSigningV3/Tests/package-lock.json @@ -0,0 +1,24 @@ +{ + "name": "vsts-tasks-androidsigningv3-tests", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/mocha": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", + "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==" + }, + "@types/node": { + "version": "10.17.44", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.44.tgz", + "integrity": "sha512-vHPAyBX1ffLcy4fQHmDyIUMUb42gHZjPHU66nhvbMzAWJqHnySGZ6STwN3rwrnSd1FHB0DI/RWgGELgKSYRDmw==" + }, + "typescript": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.2.tgz", + "integrity": "sha512-e4ERvRV2wb+rRZ/IQeb3jm2VxBsirQLpQhdxplZ2MEzGvDkkMmPglecnNDfSUBivMjP93vRbngYYDQqQ/78bcQ==", + "dev": true + } + } +} diff --git a/_generated/AndroidSigningV3/Tests/package.json b/_generated/AndroidSigningV3/Tests/package.json new file mode 100644 index 000000000000..2a3b9dbf1026 --- /dev/null +++ b/_generated/AndroidSigningV3/Tests/package.json @@ -0,0 +1,26 @@ +{ + "name": "vsts-tasks-androidsigningv3-tests", + "version": "1.0.0", + "description": "Azure Pipelines Android Signing V3 Task Tests", + "main": "L0.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/Microsoft/azure-pipelines-tasks.git" + }, + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Microsoft/azure-pipelines-tasks/issues" + }, + "homepage": "https://github.com/Microsoft/azure-pipelines-tasks#readme", + "dependencies": { + "@types/node": "^10.17.0", + "@types/mocha": "^5.2.7" + }, + "devDependencies": { + "typescript": "4.0.2" + } +} diff --git a/_generated/AndroidSigningV3/ThirdPartyNotice.txt b/_generated/AndroidSigningV3/ThirdPartyNotice.txt new file mode 100644 index 000000000000..1ac1b59c966f --- /dev/null +++ b/_generated/AndroidSigningV3/ThirdPartyNotice.txt @@ -0,0 +1,459 @@ + +THIRD-PARTY SOFTWARE NOTICES AND INFORMATION +Do Not Translate or Localize + +This Azure DevOps extension (AndroidSigningV3) is based on or incorporates material from the projects listed below (Third Party IP). The original copyright notice and the license under which Microsoft received such Third Party IP, are set forth below. Such licenses and notices are provided for informational purposes only. Microsoft licenses the Third Party IP to you under the licensing terms for the Azure DevOps extension. Microsoft reserves all other rights not expressly granted under this agreement, whether by implication, estoppel or otherwise. + +1. @types/mocha (git+https://github.com/DefinitelyTyped/DefinitelyTyped.git) +2. @types/node (git+https://github.com/DefinitelyTyped/DefinitelyTyped.git) +3. balanced-match (git://github.com/juliangruber/balanced-match.git) +4. brace-expansion (git://github.com/juliangruber/brace-expansion.git) +5. concat-map (git://github.com/substack/node-concat-map.git) +6. minimatch (git://github.com/isaacs/minimatch.git) +7. mockery (git://github.com/mfncooper/mockery.git) +8. q (git://github.com/kriskowal/q.git) +9. semver (git+https://github.com/npm/node-semver.git) +10. shelljs (git://github.com/arturadib/shelljs.git) +11. tunnel (git+https://github.com/koichik/node-tunnel.git) +12. typed-rest-client (git+https://github.com/Microsoft/typed-rest-client.git) +13. underscore (git://github.com/jashkenas/underscore.git) +14. uuid (git+https://github.com/kelektiv/node-uuid.git) +15. vso-node-api (git+https://github.com/Microsoft/vso-node-api.git) +16. vsts-task-lib (git+https://github.com/Microsoft/vsts-task-lib.git) +17. vsts-task-lib (git+https://github.com/Microsoft/vsts-task-lib.git) + + +%% @types/mocha NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +MIT License + + Copyright (c) Microsoft Corporation. All rights reserved. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE +========================================= +END OF @types/mocha NOTICES, INFORMATION, AND LICENSE + +%% @types/node NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +MIT License + + Copyright (c) Microsoft Corporation. All rights reserved. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE +========================================= +END OF @types/node NOTICES, INFORMATION, AND LICENSE + +%% balanced-match NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +(MIT) + +Copyright (c) 2013 Julian Gruber <julian@juliangruber.com> + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +========================================= +END OF balanced-match NOTICES, INFORMATION, AND LICENSE + +%% brace-expansion NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +MIT License + +Copyright (c) 2013 Julian Gruber + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +========================================= +END OF brace-expansion NOTICES, INFORMATION, AND LICENSE + +%% concat-map NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +This software is released under the MIT license: + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF concat-map NOTICES, INFORMATION, AND LICENSE + +%% minimatch NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF minimatch NOTICES, INFORMATION, AND LICENSE + +%% mockery NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyrights for code authored by Yahoo! Inc. is licensed under the following + terms: + + MIT License + + Copyright (c) 2011 Yahoo! Inc. All Rights Reserved. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to + deal in the Software without restriction, including without limitation the + rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. +========================================= +END OF mockery NOTICES, INFORMATION, AND LICENSE + +%% q NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright 2009–2017 Kristopher Michael Kowal. All rights reserved. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. +========================================= +END OF q NOTICES, INFORMATION, AND LICENSE + +%% semver NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF semver NOTICES, INFORMATION, AND LICENSE + +%% shelljs NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) 2012, Artur Adib +All rights reserved. + +You may use this project under the terms of the New BSD license as follows: + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of Artur Adib nor the + names of the contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL ARTUR ADIB BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +========================================= +END OF shelljs NOTICES, INFORMATION, AND LICENSE + +%% tunnel NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) 2012 Koichi Kobayashi + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF tunnel NOTICES, INFORMATION, AND LICENSE + +%% typed-rest-client NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Visual Studio Team Services Client for Node.js + +Copyright (c) Microsoft Corporation + +All rights reserved. + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and +associated documentation files (the "Software"), to deal in the Software without restriction, +including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT +LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF typed-rest-client NOTICES, INFORMATION, AND LICENSE + +%% underscore NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative +Reporters & Editors + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF underscore NOTICES, INFORMATION, AND LICENSE + +%% uuid NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) 2010-2016 Robert Kieffer and other contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +========================================= +END OF uuid NOTICES, INFORMATION, AND LICENSE + +%% vso-node-api NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Visual Studio Team Services Client for Node.js + +Copyright (c) Microsoft Corporation + +All rights reserved. + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and +associated documentation files (the "Software"), to deal in the Software without restriction, +including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT +LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF vso-node-api NOTICES, INFORMATION, AND LICENSE + +%% vsts-task-lib NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) Microsoft Corporation. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +========================================= +END OF vsts-task-lib NOTICES, INFORMATION, AND LICENSE + +%% vsts-task-lib NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) Microsoft Corporation. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +========================================= +END OF vsts-task-lib NOTICES, INFORMATION, AND LICENSE + diff --git a/_generated/AndroidSigningV3/androidsigning.ts b/_generated/AndroidSigningV3/androidsigning.ts new file mode 100644 index 000000000000..1f174b3d51e9 --- /dev/null +++ b/_generated/AndroidSigningV3/androidsigning.ts @@ -0,0 +1,165 @@ +import * as path from 'path'; +import * as tl from 'azure-pipelines-task-lib/task'; +import * as semver from 'semver'; + +const findAndroidTool = (tool: string, version?: string): string => { + const androidHome = tl.getVariable('ANDROID_HOME'); + if (!androidHome) { + throw new Error(tl.loc('AndroidHomeNotSet')); + } + + // add * in search as on Windows the tool may end with ".exe" or ".bat. Exclude .jar files from the list" + const toolsList = tl.findMatch(tl.resolve(androidHome, 'build-tools'), [`${tool}*`, "!*.jar"], null, { matchBase: true }) + + if (!toolsList || toolsList.length === 0) { + throw new Error(tl.loc('CouldNotFindToolInAndroidHome', tool, androidHome)); + } + + // use latest tool version, sort toolsList descending + if(!version || version === 'latest') { + tl.debug(tl.loc('GetLatestToolVersion', tool)); + toolsList.sort((a: string, b: string) => { + const toolBaseDirA = path.basename(path.dirname(a)); + const toolBaseDirB = path.basename(path.dirname(b)); + // if parent folders are valid semantic versions, compare them, otherwise move to the end of the list + if(semver.valid(toolBaseDirA) && semver.valid(toolBaseDirB)) { + return semver.rcompare(toolBaseDirA, toolBaseDirB); + } else if(semver.valid(toolBaseDirA)) { + return -1; + } else { + return toolBaseDirA.localeCompare(toolBaseDirB); + } + }); + return toolsList[0]; + } + // try to find version specified + tl.debug(tl.loc('GetSpecifiedToolVersion', version, tool)); + let versions: string[] = toolsList.map(item => path.basename(path.dirname(item))); + versions = versions.filter(item => !!semver.valid(item) && item.startsWith(version)); + versions = versions.sort(semver.rcompare); + const matchingPath: string = toolsList.find(item => item.includes(versions[0])); + + if (!matchingPath) { + throw new Error(tl.loc('CouldNotFindVersionOfToolInAndroidHome', version, tool, androidHome)); + } + + return matchingPath; +}; + +/* +Signing the specified file with apksigner. Move the current file to fn.unsigned, and +place the signed file at the same location fn +*/ +const apksigning = (fn: string) => { + // file must exist + tl.checkPath(fn, 'file to sign'); + + let apksigner = tl.getInput('apksignerLocation', false); + + // if the tool path is not set, let's find one (anyone) from the SDK folder + if (!apksigner) { + const apksignerVersion: string = tl.getInput('apksignerVersion', false); + apksigner = findAndroidTool('apksigner', apksignerVersion); + } + + const apksignerRunner = tl.tool(apksigner); + + // Get keystore file path for signing + const keystoreFile = tl.getTaskVariable('KEYSTORE_FILE_PATH'); + + // Get keystore alias + const keystoreAlias = tl.getInput('keystoreAlias', true); + + const keystorePass = tl.getInput('keystorePass', false); + + const keyPass = tl.getInput('keyPass', false); + + const apksignerArguments = tl.getInput('apksignerArguments', false); + + apksignerRunner.arg(['sign', '--ks', keystoreFile]); + + if (keystorePass) { + apksignerRunner.arg(['--ks-pass', 'pass:' + keystorePass]); + } + + if (keystoreAlias) { + apksignerRunner.arg(['--ks-key-alias', keystoreAlias]); + } + + if (keyPass) { + apksignerRunner.arg(['--key-pass', 'pass:' + keyPass]); + } + + if (apksignerArguments) { + apksignerRunner.line(apksignerArguments); + } + + apksignerRunner.arg([fn]); + + return apksignerRunner.exec(null); +}; + +/* +Zipaligning apk +*/ +const zipaligning = (fn: string) => { + // file must exist + tl.checkPath(fn, 'file to zipalign'); + + let zipaligner = tl.getInput('zipalignLocation', false); + + // if the tool path is not set, let's find one (anyone) from the SDK folder + if (!zipaligner) { + const zipalignerVersion: string = tl.getInput('zipalignVersion', false); + zipaligner = findAndroidTool('zipalign', zipalignerVersion); + } + + const zipalignRunner = tl.tool(zipaligner); + + // alignment must be 4 or play store will reject, hard code this to avoid user errors + zipalignRunner.arg(['-v', '4']); + + const unalignedFn = fn + '.unaligned'; + const success = tl.mv(fn, unalignedFn, '-f', false); + + zipalignRunner.arg([unalignedFn, fn]); + return zipalignRunner.exec(null); +}; + +async function run() { + try { + // Configure localization + tl.setResourcePath(path.join(__dirname, 'task.json')); + + // Get files to be signed + const filesPattern: string = tl.getInput('files', true); + + // Signing the APK? + const apksign: boolean = tl.getBoolInput('apksign'); + + // Zipaligning the APK? + const zipalign: boolean = tl.getBoolInput('zipalign'); + + // Resolve files for the specified value or pattern + const filesToSign: string[] = tl.findMatch(null, filesPattern); + + // Fail if no matching files were found + if (!filesToSign || filesToSign.length === 0) { + throw new Error(tl.loc('NoMatchingFiles', filesPattern)); + } + + for (const file of filesToSign) { + if (zipalign) { + await zipaligning(file); + } + + if (apksign) { + await apksigning(file); + } + } + } catch (err) { + tl.setResult(tl.TaskResult.Failed, err); + } +} + +run(); \ No newline at end of file diff --git a/_generated/AndroidSigningV3/icon.png b/_generated/AndroidSigningV3/icon.png new file mode 100644 index 000000000000..502c38f46dd4 Binary files /dev/null and b/_generated/AndroidSigningV3/icon.png differ diff --git a/_generated/AndroidSigningV3/icon.svg b/_generated/AndroidSigningV3/icon.svg new file mode 100644 index 000000000000..38816323fb96 --- /dev/null +++ b/_generated/AndroidSigningV3/icon.svg @@ -0,0 +1,4 @@ + + + + diff --git a/_generated/AndroidSigningV3/make.json b/_generated/AndroidSigningV3/make.json new file mode 100644 index 000000000000..d5ad78d951ae --- /dev/null +++ b/_generated/AndroidSigningV3/make.json @@ -0,0 +1,12 @@ +{ + "rm": [ + { + "items": [ + "node_modules/azure-pipelines-tasks-securefiles-common/node_modules/vsts-task-lib", + "node_modules/azure-pipelines-tasks-securefiles-common/node_modules/azure-pipelines-task-lib", + "node_modules/mockery" + ], + "options": "-Rf" + } + ] +} \ No newline at end of file diff --git a/_generated/AndroidSigningV3/package-lock.json b/_generated/AndroidSigningV3/package-lock.json new file mode 100644 index 000000000000..6030f2c9d0b3 --- /dev/null +++ b/_generated/AndroidSigningV3/package-lock.json @@ -0,0 +1,554 @@ +{ + "name": "vsts-androidsigning-task", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/concat-stream": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz", + "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==", + "requires": { + "@types/node": "*" + } + }, + "@types/form-data": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", + "integrity": "sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==", + "requires": { + "@types/node": "*" + } + }, + "@types/mocha": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", + "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==" + }, + "@types/node": { + "version": "16.18.36", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.36.tgz", + "integrity": "sha512-8egDX8dE50XyXWH6C6PRCNkTP106DuUrvdrednFouDSmCi7IOvrqr0frznfZaHifHH/3aq/7a7v9N4wdXMqhBQ==" + }, + "@types/q": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.5.tgz", + "integrity": "sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ==" + }, + "@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "azure-devops-node-api": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/azure-devops-node-api/-/azure-devops-node-api-10.2.2.tgz", + "integrity": "sha512-4TVv2X7oNStT0vLaEfExmy3J4/CzfuXolEcQl/BRUmvGySqKStTG2O55/hUQ0kM7UJlZBLgniM0SBq4d/WkKow==", + "requires": { + "tunnel": "0.0.6", + "typed-rest-client": "^1.8.4" + } + }, + "azure-pipelines-task-lib": { + "version": "5.0.0-preview.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-5.0.0-preview.0.tgz", + "integrity": "sha512-uQJEv+q3/7RD7kgphFd33uXijaPwA1ePYoNkAgZpUhbZUtc2u4JL4ujTT/JJfgXBNW/QQNAiDQ2OC7vOQG/0tg==", + "requires": { + "minimatch": "3.0.5", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "sync-request": "6.1.0", + "uuid": "^3.0.1" + } + }, + "azure-pipelines-tasks-securefiles-common": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-tasks-securefiles-common/-/azure-pipelines-tasks-securefiles-common-2.1.0.tgz", + "integrity": "sha512-oE7VscWFZD+Ku0WM6e2b5Y0eDom4DTZvER/mSh3m/z9V0yN9JUahNR0Dye9NIj0BSIyfgcaxxNWBCzqJMsirIQ==", + "requires": { + "@types/node": "^10.17.0", + "@types/q": "^1.5.4", + "azure-devops-node-api": "10.2.2", + "azure-pipelines-task-lib": "^3.1.0" + }, + "dependencies": { + "@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + }, + "azure-pipelines-task-lib": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-3.4.0.tgz", + "integrity": "sha512-3eC4OTFw+7xD7A2aUhxR/j+jRlTI+vVfS0CGxt1pCLs4c/KmY0tQWgbqjD3157kmiucWxELBvgZHaD2gCBe9fg==", + "requires": { + "minimatch": "3.0.5", + "mockery": "^2.1.0", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "sync-request": "6.1.0", + "uuid": "^3.0.1" + } + } + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, + "form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + } + }, + "get-port": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", + "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==" + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "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" + }, + "dependencies": { + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==" + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "http-basic": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", + "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", + "requires": { + "caseless": "^0.12.0", + "concat-stream": "^1.6.2", + "http-response-object": "^3.0.1", + "parse-cache-control": "^1.0.1" + } + }, + "http-response-object": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", + "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", + "requires": { + "@types/node": "^10.0.3" + }, + "dependencies": { + "@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + } + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" + }, + "is-core-module": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", + "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", + "requires": { + "has": "^1.0.3" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "mockery": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mockery/-/mockery-2.1.0.tgz", + "integrity": "sha512-9VkOmxKlWXoDO/h1jDZaS4lH33aWfRiJiNT/tKj+8OGzrcFDLo8d0syGdbsc3Bc4GvRXPb+NMMvojotmuGJTvA==" + }, + "object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, + "parse-cache-control": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", + "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "promise": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", + "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", + "requires": { + "asap": "~2.0.6" + } + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==" + }, + "qs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "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" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "requires": { + "resolve": "^1.1.6" + } + }, + "resolve": { + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "requires": { + "is-core-module": "^2.11.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, + "sync-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", + "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==", + "requires": { + "http-response-object": "^3.0.1", + "sync-rpc": "^1.2.1", + "then-request": "^6.0.0" + } + }, + "sync-rpc": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz", + "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==", + "requires": { + "get-port": "^3.1.0" + } + }, + "then-request": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", + "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", + "requires": { + "@types/concat-stream": "^1.6.0", + "@types/form-data": "0.0.33", + "@types/node": "^8.0.0", + "@types/qs": "^6.2.31", + "caseless": "~0.12.0", + "concat-stream": "^1.6.0", + "form-data": "^2.2.0", + "http-basic": "^8.1.1", + "http-response-object": "^3.0.1", + "promise": "^8.0.0", + "qs": "^6.4.0" + }, + "dependencies": { + "@types/node": { + "version": "8.10.66", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", + "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==" + } + } + }, + "tunnel": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", + "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==" + }, + "typed-rest-client": { + "version": "1.8.9", + "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.8.9.tgz", + "integrity": "sha512-uSmjE38B80wjL85UFX3sTYEUlvZ1JgCRhsWj/fJ4rZ0FqDUFoIuodtiVeE+cUqiVTOKPdKrp/sdftD15MDek6g==", + "requires": { + "qs": "^6.9.1", + "tunnel": "0.0.6", + "underscore": "^1.12.1" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, + "typescript": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.2.tgz", + "integrity": "sha512-e4ERvRV2wb+rRZ/IQeb3jm2VxBsirQLpQhdxplZ2MEzGvDkkMmPglecnNDfSUBivMjP93vRbngYYDQqQ/78bcQ==", + "dev": true + }, + "underscore": { + "version": "1.13.6", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz", + "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==" + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + } + } +} diff --git a/_generated/AndroidSigningV3/package.json b/_generated/AndroidSigningV3/package.json new file mode 100644 index 000000000000..b81a215f7d48 --- /dev/null +++ b/_generated/AndroidSigningV3/package.json @@ -0,0 +1,28 @@ +{ + "name": "vsts-androidsigning-task", + "version": "1.0.0", + "description": "Azure Pipelines Android Signing Task", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/Microsoft/azure-pipelines-tasks.git" + }, + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Microsoft/azure-pipelines-tasks/issues" + }, + "homepage": "https://github.com/Microsoft/azure-pipelines-tasks#readme", + "dependencies": { + "@types/node": "^16.11.39", + "@types/mocha": "^5.2.7", + "azure-pipelines-task-lib": "^5.0.0-preview.0", + "azure-pipelines-tasks-securefiles-common": "2.1.0" + }, + "devDependencies": { + "typescript": "4.0.2" + } +} diff --git a/_generated/AndroidSigningV3/postandroidsigning.ts b/_generated/AndroidSigningV3/postandroidsigning.ts new file mode 100644 index 000000000000..746f2de6c26a --- /dev/null +++ b/_generated/AndroidSigningV3/postandroidsigning.ts @@ -0,0 +1,18 @@ +import * as fs from 'fs'; +import * as path from 'path'; +import * as tl from 'azure-pipelines-task-lib/task'; + +async function run() { + try { + tl.setResourcePath(path.join(__dirname, 'task.json')); + const keystoreFile: string = tl.getTaskVariable('KEYSTORE_FILE_PATH'); + if (keystoreFile && tl.exist(keystoreFile)) { + fs.unlinkSync(keystoreFile); + tl.debug('Deleted keystore file downloaded from the server: ' + keystoreFile); + } + } catch (err) { + tl.warning(tl.loc('DeleteKeystoreFileFailed', err)); + } +} + +run(); diff --git a/_generated/AndroidSigningV3/preandroidsigning.ts b/_generated/AndroidSigningV3/preandroidsigning.ts new file mode 100644 index 000000000000..440c57c8b0aa --- /dev/null +++ b/_generated/AndroidSigningV3/preandroidsigning.ts @@ -0,0 +1,22 @@ +import * as path from 'path'; +import * as secureFilesCommon from 'azure-pipelines-tasks-securefiles-common/securefiles-common'; +import * as tl from 'azure-pipelines-task-lib/task'; + +async function run() { + try { + tl.setResourcePath(path.join(__dirname, 'task.json')); + + const apksign: boolean = tl.getBoolInput('apksign'); + if (apksign) { + // download keystore file + const keystoreFileId: string = tl.getInput('keystoreFile', true); + const secureFileHelpers: secureFilesCommon.SecureFileHelpers = new secureFilesCommon.SecureFileHelpers(); + const keystoreFilePath: string = await secureFileHelpers.downloadSecureFile(keystoreFileId); + tl.setTaskVariable('KEYSTORE_FILE_PATH', keystoreFilePath); + } + } catch (err) { + tl.setResult(tl.TaskResult.Failed, err); + } +} + +run(); diff --git a/_generated/AndroidSigningV3/task.json b/_generated/AndroidSigningV3/task.json new file mode 100644 index 000000000000..4aa65e5aacfb --- /dev/null +++ b/_generated/AndroidSigningV3/task.json @@ -0,0 +1,226 @@ +{ + "id": "80F3F6A0-82A6-4A22-BA7A-E5B8C541B9B9", + "name": "AndroidSigning", + "friendlyName": "Android signing", + "description": "Sign and align Android APK files", + "helpUrl": "https://docs.microsoft.com/azure/devops/pipelines/tasks/build/android-signing", + "helpMarkDown": "[Learn more about this task](https://go.microsoft.com/fwlink/?LinkID=613717)", + "category": "Build", + "visibility": [ + "Build" + ], + "author": "Microsoft Corporation", + "version": { + "Major": 3, + "Minor": 229, + "Patch": 0 + }, + "releaseNotes": "This version of the task uses apksigner instead of jarsigner to sign APKs.", + "demands": [ + "JDK" + ], + "minimumAgentVersion": "2.182.1", + "groups": [ + { + "name": "apksignerOptions", + "displayName": "Signing Options", + "isExpanded": true + }, + { + "name": "zipalignOptions", + "displayName": "Zipalign Options", + "isExpanded": true + } + ], + "inputs": [ + { + "name": "files", + "aliases": [ + "apkFiles" + ], + "type": "filePath", + "label": "APK files", + "defaultValue": "**/*.apk", + "required": true, + "helpMarkDown": "Relative path from the repo root to the APK(s) you want to sign. You can use wildcards to specify multiple files ([more information](https://go.microsoft.com/fwlink/?linkid=856077)). For example, `**/bin/*.apk` for all .APK files in the 'bin' subfolder" + }, + { + "name": "apksign", + "type": "boolean", + "label": "Sign the APK", + "defaultValue": "true", + "required": false, + "groupName": "apksignerOptions", + "helpMarkDown": "Select this option to sign the APK with a provided keystore file. Unsigned APKs can only run in an emulator. APKs must be signed to run on a device." + }, + { + "name": "keystoreFile", + "aliases": [ + "apksignerKeystoreFile" + ], + "type": "secureFile", + "label": "Keystore file", + "defaultValue": "", + "required": true, + "visibleRule": "apksign = true", + "groupName": "apksignerOptions", + "helpMarkDown": "Select the keystore file that was uploaded to `Secure Files` to be used to sign the APK." + }, + { + "name": "keystorePass", + "aliases": [ + "apksignerKeystorePassword" + ], + "type": "string", + "label": "Keystore password", + "defaultValue": "", + "required": false, + "visibleRule": "apksign = true", + "groupName": "apksignerOptions", + "helpMarkDown": "Enter the password for the provided keystore file. Use a new variable with its lock enabled on the Variables tab to encrypt this value." + }, + { + "name": "keystoreAlias", + "aliases": [ + "apksignerKeystoreAlias" + ], + "type": "string", + "label": "Alias", + "defaultValue": "", + "required": false, + "visibleRule": "apksign = true", + "groupName": "apksignerOptions", + "helpMarkDown": "Enter the alias that identifies the public/private key pair to be used in the keystore file." + }, + { + "name": "keyPass", + "aliases": [ + "apksignerKeyPassword" + ], + "type": "string", + "label": "Key password", + "defaultValue": "", + "required": false, + "visibleRule": "apksign = true", + "groupName": "apksignerOptions", + "helpMarkDown": "Enter the key password for the alias and keystore file. Use a new variable with its lock enabled on the Variables tab to encrypt this value." + }, + { + "name": "apksignerVersion", + "type": "string", + "label": "apksigner version", + "defaultValue": "latest", + "required": false, + "visibleRule": "apksign = true", + "groupName": "apksignerOptions", + "helpMarkDown": "Enter Android SDK build-tools version to look apksigner executable from." + }, + { + "name": "apksignerArguments", + "type": "string", + "label": "apksigner arguments", + "defaultValue": "--verbose", + "required": false, + "visibleRule": "apksign = true", + "groupName": "apksignerOptions", + "helpMarkDown": "Provide any options to pass to the apksigner command line. Default is: --verbose" + }, + { + "name": "apksignerLocation", + "aliases": [ + "apksignerFile" + ], + "type": "string", + "label": "apksigner location", + "defaultValue": "", + "required": false, + "visibleRule": "apksign = true", + "groupName": "apksignerOptions", + "helpMarkDown": "Optionally specify the location of the apksigner executable used during signing. This defaults to the apksigner found in the Android SDK version folder that your application builds against." + }, + { + "name": "zipalign", + "type": "boolean", + "label": "Zipalign", + "defaultValue": "true", + "required": false, + "groupName": "zipalignOptions", + "helpMarkDown": "Select if you want to zipalign your package. This reduces the amount of RAM consumed by an app." + }, + { + "name": "zipalignVersion", + "type": "string", + "label": "Zipalign version", + "defaultValue": "latest", + "required": false, + "visibleRule": "zipalign = true", + "groupName": "zipalignOptions", + "helpMarkDown": "Enter Android SDK build-tools version to look zipalign executable from." + }, + { + "name": "zipalignLocation", + "aliases": [ + "zipalignFile" + ], + "type": "string", + "label": "Zipalign location", + "defaultValue": "", + "required": false, + "visibleRule": "zipalign = true", + "groupName": "zipalignOptions", + "helpMarkDown": "Optionally specify the location of the zipalign executable used during signing. This defaults to the zipalign found in the Android SDK version folder that your application builds against." + } + ], + "instanceNameFormat": "Signing and aligning APK file(s) $(files)", + "prejobexecution": { + "Node10": { + "target": "preandroidsigning.js", + "argumentFormat": "" + }, + "Node16": { + "target": "preandroidsigning.js", + "argumentFormat": "" + } + }, + "execution": { + "Node10": { + "target": "androidsigning.js", + "argumentFormat": "" + }, + "Node16": { + "target": "androidsigning.js", + "argumentFormat": "" + } + }, + "postjobexecution": { + "Node10": { + "target": "postandroidsigning.js", + "argumentFormat": "" + }, + "Node16": { + "target": "postandroidsigning.js", + "argumentFormat": "" + } + }, + "messages": { + "AndroidHomeNotSet": "The ANDROID_HOME environment variable is not set for the running user.", + "CouldNotFindToolInAndroidHome": "Could not find tool: %s inside ANDROID_HOME: %s", + "NoMatchingFiles": "No matching files were found with search pattern: %s", + "DeleteKeystoreFileFailed": "Failed to delete keystore file downloaded from the server: %s", + "CouldNotFindVersionOfToolInAndroidHome": "Could not find %s version of %s inside ANDROID_HOME: %s", + "GetLatestToolVersion": "Trying to get the latest installed version of tool: %s", + "GetSpecifiedToolVersion": "Trying to get version %s of %s" + }, + "restrictions": { + "commands": { + "mode": "restricted" + }, + "settableVariables": { + "allowed": [] + } + }, + "_buildConfigMapping": { + "Default": "3.229.0", + "Node20-225": "3.229.1" + } +} \ No newline at end of file diff --git a/_generated/AndroidSigningV3/task.loc.json b/_generated/AndroidSigningV3/task.loc.json new file mode 100644 index 000000000000..9e34a60cffba --- /dev/null +++ b/_generated/AndroidSigningV3/task.loc.json @@ -0,0 +1,226 @@ +{ + "id": "80F3F6A0-82A6-4A22-BA7A-E5B8C541B9B9", + "name": "AndroidSigning", + "friendlyName": "ms-resource:loc.friendlyName", + "description": "ms-resource:loc.description", + "helpUrl": "https://docs.microsoft.com/azure/devops/pipelines/tasks/build/android-signing", + "helpMarkDown": "ms-resource:loc.helpMarkDown", + "category": "Build", + "visibility": [ + "Build" + ], + "author": "Microsoft Corporation", + "version": { + "Major": 3, + "Minor": 229, + "Patch": 0 + }, + "releaseNotes": "ms-resource:loc.releaseNotes", + "demands": [ + "JDK" + ], + "minimumAgentVersion": "2.182.1", + "groups": [ + { + "name": "apksignerOptions", + "displayName": "ms-resource:loc.group.displayName.apksignerOptions", + "isExpanded": true + }, + { + "name": "zipalignOptions", + "displayName": "ms-resource:loc.group.displayName.zipalignOptions", + "isExpanded": true + } + ], + "inputs": [ + { + "name": "files", + "aliases": [ + "apkFiles" + ], + "type": "filePath", + "label": "ms-resource:loc.input.label.files", + "defaultValue": "**/*.apk", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.files" + }, + { + "name": "apksign", + "type": "boolean", + "label": "ms-resource:loc.input.label.apksign", + "defaultValue": "true", + "required": false, + "groupName": "apksignerOptions", + "helpMarkDown": "ms-resource:loc.input.help.apksign" + }, + { + "name": "keystoreFile", + "aliases": [ + "apksignerKeystoreFile" + ], + "type": "secureFile", + "label": "ms-resource:loc.input.label.keystoreFile", + "defaultValue": "", + "required": true, + "visibleRule": "apksign = true", + "groupName": "apksignerOptions", + "helpMarkDown": "ms-resource:loc.input.help.keystoreFile" + }, + { + "name": "keystorePass", + "aliases": [ + "apksignerKeystorePassword" + ], + "type": "string", + "label": "ms-resource:loc.input.label.keystorePass", + "defaultValue": "", + "required": false, + "visibleRule": "apksign = true", + "groupName": "apksignerOptions", + "helpMarkDown": "ms-resource:loc.input.help.keystorePass" + }, + { + "name": "keystoreAlias", + "aliases": [ + "apksignerKeystoreAlias" + ], + "type": "string", + "label": "ms-resource:loc.input.label.keystoreAlias", + "defaultValue": "", + "required": false, + "visibleRule": "apksign = true", + "groupName": "apksignerOptions", + "helpMarkDown": "ms-resource:loc.input.help.keystoreAlias" + }, + { + "name": "keyPass", + "aliases": [ + "apksignerKeyPassword" + ], + "type": "string", + "label": "ms-resource:loc.input.label.keyPass", + "defaultValue": "", + "required": false, + "visibleRule": "apksign = true", + "groupName": "apksignerOptions", + "helpMarkDown": "ms-resource:loc.input.help.keyPass" + }, + { + "name": "apksignerVersion", + "type": "string", + "label": "ms-resource:loc.input.label.apksignerVersion", + "defaultValue": "latest", + "required": false, + "visibleRule": "apksign = true", + "groupName": "apksignerOptions", + "helpMarkDown": "ms-resource:loc.input.help.apksignerVersion" + }, + { + "name": "apksignerArguments", + "type": "string", + "label": "ms-resource:loc.input.label.apksignerArguments", + "defaultValue": "--verbose", + "required": false, + "visibleRule": "apksign = true", + "groupName": "apksignerOptions", + "helpMarkDown": "ms-resource:loc.input.help.apksignerArguments" + }, + { + "name": "apksignerLocation", + "aliases": [ + "apksignerFile" + ], + "type": "string", + "label": "ms-resource:loc.input.label.apksignerLocation", + "defaultValue": "", + "required": false, + "visibleRule": "apksign = true", + "groupName": "apksignerOptions", + "helpMarkDown": "ms-resource:loc.input.help.apksignerLocation" + }, + { + "name": "zipalign", + "type": "boolean", + "label": "ms-resource:loc.input.label.zipalign", + "defaultValue": "true", + "required": false, + "groupName": "zipalignOptions", + "helpMarkDown": "ms-resource:loc.input.help.zipalign" + }, + { + "name": "zipalignVersion", + "type": "string", + "label": "ms-resource:loc.input.label.zipalignVersion", + "defaultValue": "latest", + "required": false, + "visibleRule": "zipalign = true", + "groupName": "zipalignOptions", + "helpMarkDown": "ms-resource:loc.input.help.zipalignVersion" + }, + { + "name": "zipalignLocation", + "aliases": [ + "zipalignFile" + ], + "type": "string", + "label": "ms-resource:loc.input.label.zipalignLocation", + "defaultValue": "", + "required": false, + "visibleRule": "zipalign = true", + "groupName": "zipalignOptions", + "helpMarkDown": "ms-resource:loc.input.help.zipalignLocation" + } + ], + "instanceNameFormat": "ms-resource:loc.instanceNameFormat", + "prejobexecution": { + "Node10": { + "target": "preandroidsigning.js", + "argumentFormat": "" + }, + "Node16": { + "target": "preandroidsigning.js", + "argumentFormat": "" + } + }, + "execution": { + "Node10": { + "target": "androidsigning.js", + "argumentFormat": "" + }, + "Node16": { + "target": "androidsigning.js", + "argumentFormat": "" + } + }, + "postjobexecution": { + "Node10": { + "target": "postandroidsigning.js", + "argumentFormat": "" + }, + "Node16": { + "target": "postandroidsigning.js", + "argumentFormat": "" + } + }, + "messages": { + "AndroidHomeNotSet": "ms-resource:loc.messages.AndroidHomeNotSet", + "CouldNotFindToolInAndroidHome": "ms-resource:loc.messages.CouldNotFindToolInAndroidHome", + "NoMatchingFiles": "ms-resource:loc.messages.NoMatchingFiles", + "DeleteKeystoreFileFailed": "ms-resource:loc.messages.DeleteKeystoreFileFailed", + "CouldNotFindVersionOfToolInAndroidHome": "ms-resource:loc.messages.CouldNotFindVersionOfToolInAndroidHome", + "GetLatestToolVersion": "ms-resource:loc.messages.GetLatestToolVersion", + "GetSpecifiedToolVersion": "ms-resource:loc.messages.GetSpecifiedToolVersion" + }, + "restrictions": { + "commands": { + "mode": "restricted" + }, + "settableVariables": { + "allowed": [] + } + }, + "_buildConfigMapping": { + "Default": "3.229.0", + "Node20-225": "3.229.1" + } +} \ No newline at end of file diff --git a/_generated/AndroidSigningV3/tsconfig.json b/_generated/AndroidSigningV3/tsconfig.json new file mode 100644 index 000000000000..0438b79f69ac --- /dev/null +++ b/_generated/AndroidSigningV3/tsconfig.json @@ -0,0 +1,6 @@ +{ + "compilerOptions": { + "target": "ES6", + "module": "commonjs" + } +} \ No newline at end of file diff --git a/_generated/AndroidSigningV3/typings.json b/_generated/AndroidSigningV3/typings.json new file mode 100644 index 000000000000..6560c46c749d --- /dev/null +++ b/_generated/AndroidSigningV3/typings.json @@ -0,0 +1,8 @@ +{ + "name": "vsts-androidsigning-task", + "dependencies": {}, + "globalDependencies": { + "node": "registry:dt/node#6.0.0+20160921192128", + "q": "registry:dt/q#0.0.0+20160613154756" + } +} diff --git a/_generated/AndroidSigningV3_Node20/.npmrc b/_generated/AndroidSigningV3_Node20/.npmrc new file mode 100644 index 000000000000..5fca0d518be7 --- /dev/null +++ b/_generated/AndroidSigningV3_Node20/.npmrc @@ -0,0 +1 @@ +scripts-prepend-node-path=true diff --git a/_generated/AndroidSigningV3_Node20/Strings/resources.resjson/de-DE/resources.resjson b/_generated/AndroidSigningV3_Node20/Strings/resources.resjson/de-DE/resources.resjson new file mode 100644 index 000000000000..cdbbec4f1664 --- /dev/null +++ b/_generated/AndroidSigningV3_Node20/Strings/resources.resjson/de-DE/resources.resjson @@ -0,0 +1,40 @@ +{ + "loc.friendlyName": "Android-Signatur", + "loc.helpMarkDown": "[Weitere Informationen zu dieser Aufgabe](https://go.microsoft.com/fwlink/?LinkID=613717)", + "loc.description": "Android-APK-Dateien signieren und ausrichten", + "loc.instanceNameFormat": "APK-Dateien $(files) werden signiert und ausgerichtet", + "loc.releaseNotes": "Diese Version der Aufgabe verwendet apksigner anstelle von jarsigner zum Signieren von APKs.", + "loc.group.displayName.apksignerOptions": "Signaturoptionen", + "loc.group.displayName.zipalignOptions": "Zipalign-Optionen", + "loc.input.label.files": "APK-Dateien", + "loc.input.help.files": "Der relative Pfad vom Repositorystamm zur APK-Datei bzw. den APK-Dateien, die Sie signieren möchten. Sie können Platzhalter verwenden, um mehrere Dateien anzugeben ([weitere Informationen](https://go.microsoft.com/fwlink/?linkid=856077)). Beispiel: \"**/bin/*.apk\" für alle APK-Dateien im Unterordner \"bin\".", + "loc.input.label.apksign": "APK signieren", + "loc.input.help.apksign": "Wählen Sie diese Option aus, wenn Sie die APK-Datei mit einer bereitgestellten KeyStore-Datei signieren möchten. Unsignierte APKs können nur in einem Emulator ausgeführt werden. APKs müssen signiert werden, um auf einem Gerät ausgeführt zu werden. ", + "loc.input.label.keystoreFile": "Keystore-Datei", + "loc.input.help.keystoreFile": "Wählen Sie die Keystore-Datei aus, die zum Signieren des APK in \"Sichere Dateien\" hochgeladen wurde.", + "loc.input.label.keystorePass": "Keystore-Kennwort", + "loc.input.help.keystorePass": "Geben Sie das Kennwort die KeyStore-Datei an. Verwenden Sie eine neue Variable, deren Sperre auf der Registerkarte \"Variablen\" aktiviert ist, um den Wert zu verschlüsseln.", + "loc.input.label.keystoreAlias": "Alias", + "loc.input.help.keystoreAlias": "Geben Sie den Alias an, der das öffentliche/private Schlüsselpaar identifiziert, das in der KeyStore-Datei verwendet werden soll.", + "loc.input.label.keyPass": "Schlüsselkennwort", + "loc.input.help.keyPass": "Geben Sie das Schlüsselkennwort für den Alias und die KeyStore-Datei an. Verwenden Sie eine neue Variable, deren Sperre auf der Registerkarte \"Variablen\" aktiviert ist, um den Wert zu verschlüsseln.", + "loc.input.label.apksignerVersion": "apksigner-Version", + "loc.input.help.apksignerVersion": "Geben Sie die Version von Android SDK-Buildtools ein, über die die ausführbare apksigner-Datei gesucht werden soll.", + "loc.input.label.apksignerArguments": "apksigner-Argumente", + "loc.input.help.apksignerArguments": "Geben Sie Optionen an, die an die apksigner-Befehlszeile übergeben werden sollen. Standardwert: --verbose", + "loc.input.label.apksignerLocation": "apksigner-Speicherort", + "loc.input.help.apksignerLocation": "Geben Sie optional den Pfad zu der beim Signieren verwendeten ausführbaren apksigner-Datei an. Standardmäßig handelt es sich hierbei um die apksigner-Datei, die sich in dem für Ihren Anwendungsbuild verwendeten Android SDK-Versionsordner befindet.", + "loc.input.label.zipalign": "Zipalign", + "loc.input.help.zipalign": "Geben Sie an, ob Ihr Paket mit Zipalign verarbeitet werden soll. Dadurch wird der von einer App benötigte Arbeitsspeicherplatz reduziert.", + "loc.input.label.zipalignVersion": "Zipalign-Version", + "loc.input.help.zipalignVersion": "Geben Sie die Version von Android SDK-Buildtools ein, über die die ausführbare zipalign-Datei gesucht werden soll.", + "loc.input.label.zipalignLocation": "Zipalign-Speicherort", + "loc.input.help.zipalignLocation": "Geben Sie optional den Pfad zu der beim Signieren verwendeten ausführbaren Zipalign-Datei an. Standardmäßig handelt es sich hierbei um die Zipalign-Datei, die sich in dem für Ihren Anwendungsbuild verwendeten Android SDK-Versionsordner befindet.", + "loc.messages.AndroidHomeNotSet": "Die ANDROID_HOME-Umgebungsvariable ist für den ausführenden Benutzer nicht festgelegt.", + "loc.messages.CouldNotFindToolInAndroidHome": "Das Tool \"%s\" wurde nicht gefunden in ANDROID_HOME: %s.", + "loc.messages.NoMatchingFiles": "Keine mit dem Suchmuster übereinstimmenden Dateien wurden gefunden: %s", + "loc.messages.DeleteKeystoreFileFailed": "Fehler beim Löschen der Keystore-Datei, die vom Server heruntergeladen wurde: %s", + "loc.messages.CouldNotFindVersionOfToolInAndroidHome": "Version %s von %s wurde in ANDROID_HOME nicht gefunden: %s", + "loc.messages.GetLatestToolVersion": "Es wird versucht, die neueste installierte Version des Tools abzurufen: %s", + "loc.messages.GetSpecifiedToolVersion": "Es wird versucht, Version %s von %s abzurufen." +} \ No newline at end of file diff --git a/_generated/AndroidSigningV3_Node20/Strings/resources.resjson/en-US/resources.resjson b/_generated/AndroidSigningV3_Node20/Strings/resources.resjson/en-US/resources.resjson new file mode 100644 index 000000000000..b3405df013b3 --- /dev/null +++ b/_generated/AndroidSigningV3_Node20/Strings/resources.resjson/en-US/resources.resjson @@ -0,0 +1,40 @@ +{ + "loc.friendlyName": "Android signing", + "loc.helpMarkDown": "[Learn more about this task](https://go.microsoft.com/fwlink/?LinkID=613717)", + "loc.description": "Sign and align Android APK files", + "loc.instanceNameFormat": "Signing and aligning APK file(s) $(files)", + "loc.releaseNotes": "This version of the task uses apksigner instead of jarsigner to sign APKs.", + "loc.group.displayName.apksignerOptions": "Signing Options", + "loc.group.displayName.zipalignOptions": "Zipalign Options", + "loc.input.label.files": "APK files", + "loc.input.help.files": "Relative path from the repo root to the APK(s) you want to sign. You can use wildcards to specify multiple files ([more information](https://go.microsoft.com/fwlink/?linkid=856077)). For example, `**/bin/*.apk` for all .APK files in the 'bin' subfolder", + "loc.input.label.apksign": "Sign the APK", + "loc.input.help.apksign": "Select this option to sign the APK with a provided keystore file. Unsigned APKs can only run in an emulator. APKs must be signed to run on a device.", + "loc.input.label.keystoreFile": "Keystore file", + "loc.input.help.keystoreFile": "Select the keystore file that was uploaded to `Secure Files` to be used to sign the APK.", + "loc.input.label.keystorePass": "Keystore password", + "loc.input.help.keystorePass": "Enter the password for the provided keystore file. Use a new variable with its lock enabled on the Variables tab to encrypt this value.", + "loc.input.label.keystoreAlias": "Alias", + "loc.input.help.keystoreAlias": "Enter the alias that identifies the public/private key pair to be used in the keystore file.", + "loc.input.label.keyPass": "Key password", + "loc.input.help.keyPass": "Enter the key password for the alias and keystore file. Use a new variable with its lock enabled on the Variables tab to encrypt this value.", + "loc.input.label.apksignerVersion": "apksigner version", + "loc.input.help.apksignerVersion": "Enter Android SDK build-tools version to look apksigner executable from.", + "loc.input.label.apksignerArguments": "apksigner arguments", + "loc.input.help.apksignerArguments": "Provide any options to pass to the apksigner command line. Default is: --verbose", + "loc.input.label.apksignerLocation": "apksigner location", + "loc.input.help.apksignerLocation": "Optionally specify the location of the apksigner executable used during signing. This defaults to the apksigner found in the Android SDK version folder that your application builds against.", + "loc.input.label.zipalign": "Zipalign", + "loc.input.help.zipalign": "Select if you want to zipalign your package. This reduces the amount of RAM consumed by an app.", + "loc.input.label.zipalignVersion": "Zipalign version", + "loc.input.help.zipalignVersion": "Enter Android SDK build-tools version to look zipalign executable from.", + "loc.input.label.zipalignLocation": "Zipalign location", + "loc.input.help.zipalignLocation": "Optionally specify the location of the zipalign executable used during signing. This defaults to the zipalign found in the Android SDK version folder that your application builds against.", + "loc.messages.AndroidHomeNotSet": "The ANDROID_HOME environment variable is not set for the running user.", + "loc.messages.CouldNotFindToolInAndroidHome": "Could not find tool: %s inside ANDROID_HOME: %s", + "loc.messages.NoMatchingFiles": "No matching files were found with search pattern: %s", + "loc.messages.DeleteKeystoreFileFailed": "Failed to delete keystore file downloaded from the server: %s", + "loc.messages.CouldNotFindVersionOfToolInAndroidHome": "Could not find %s version of %s inside ANDROID_HOME: %s", + "loc.messages.GetLatestToolVersion": "Trying to get the latest installed version of tool: %s", + "loc.messages.GetSpecifiedToolVersion": "Trying to get version %s of %s" +} \ No newline at end of file diff --git a/_generated/AndroidSigningV3_Node20/Strings/resources.resjson/es-ES/resources.resjson b/_generated/AndroidSigningV3_Node20/Strings/resources.resjson/es-ES/resources.resjson new file mode 100644 index 000000000000..31990bc1db5d --- /dev/null +++ b/_generated/AndroidSigningV3_Node20/Strings/resources.resjson/es-ES/resources.resjson @@ -0,0 +1,40 @@ +{ + "loc.friendlyName": "Firma de Android", + "loc.helpMarkDown": "[Obtener más información acerca de esta tarea](https://go.microsoft.com/fwlink/?LinkID=613717)", + "loc.description": "Firmar y alinear archivos APK de Android", + "loc.instanceNameFormat": "Firma y alineación de archivos APK $(files)", + "loc.releaseNotes": "Esta versión de la tarea utiliza apksigner en lugar de jarsigner para firmar APK.", + "loc.group.displayName.apksignerOptions": "Opciones de firma", + "loc.group.displayName.zipalignOptions": "Opciones de Zipalign", + "loc.input.label.files": "Archivos APK", + "loc.input.help.files": "Ruta de acceso relativa de la raíz del repositorio a los APK que desea firmar. Puede usar caracteres comodín para especificar varios archivos ([más información](https://go.microsoft.com/fwlink/?linkid=856077)). Por ejemplo, \"**/bin/*.apk\" para todos los archivos .APK en la subcarpeta \"bin\"", + "loc.input.label.apksign": "Firmar el APK", + "loc.input.help.apksign": "Seleccione esta opción para firmar el APK con un archivo de almacén de claves proporcionado. Los APK sin firma solo se pueden ejecutar en un emulador. Deben estar firmados para poder ejecutarlos en un dispositivo.", + "loc.input.label.keystoreFile": "Archivo del almacén de claves", + "loc.input.help.keystoreFile": "Seleccione el archivo de almacén de claves que se cargó en \"Archivos seguros\" a fin de usarlo para firmar el APK.", + "loc.input.label.keystorePass": "Contraseña del almacén de claves", + "loc.input.help.keystorePass": "Escriba la contraseña del archivo de almacén de claves proporcionado. Utilice una variable nueva con el bloqueo habilitado en la ficha Variables para cifrar este valor.", + "loc.input.label.keystoreAlias": "Alias", + "loc.input.help.keystoreAlias": "Escriba el alias que identifica el par de claves pública/privada que debe usarse en el archivo de almacén de claves.", + "loc.input.label.keyPass": "Contraseña de clave", + "loc.input.help.keyPass": "Escriba la contraseña de clave del alias y el archivo de almacén de claves. Utilice una variable nueva con el bloqueo habilitado en la ficha Variables para cifrar este valor.", + "loc.input.label.apksignerVersion": "Versión de apksigner", + "loc.input.help.apksignerVersion": "Escriba la versión de las herramientas de compilación de Android SDK desde la que buscar el ejecutable de apksigner.", + "loc.input.label.apksignerArguments": "argumentos de apksigner", + "loc.input.help.apksignerArguments": "Proporcione cualquier opción para pasar a la línea de comandos de apksigner. El valor predeterminado es: --verbose", + "loc.input.label.apksignerLocation": "ubicación de apksigner", + "loc.input.help.apksignerLocation": "Especifique opcionalmente la ubicación del ejecutable apksigner usado durante la firma. Se establece como valor predeterminado el ejecutable apksigner que se encuentra en la carpeta de la versión de Android SDK en que se compila la aplicación.", + "loc.input.label.zipalign": "Zipalign", + "loc.input.help.zipalign": "Seleccione si desea optimizar el paquete con zipalign. Esta acción disminuye la cantidad de RAM que consume una aplicación.", + "loc.input.label.zipalignVersion": "Versión de Zipalign", + "loc.input.help.zipalignVersion": "Escriba la versión de las herramientas de compilación de Android SDK desde la que buscar el ejecutable de zipalign.", + "loc.input.label.zipalignLocation": "Ubicación de Zipalign", + "loc.input.help.zipalignLocation": "Especifique opcionalmente la ubicación del ejecutable zipalign usado durante la firma. Se establece como valor predeterminado el ejecutable zipalign que se encuentra en la carpeta de la versión de Android SDK en que se compila la aplicación.", + "loc.messages.AndroidHomeNotSet": "La variable de entorno ANDROID_HOME no está definida para el usuario actual.", + "loc.messages.CouldNotFindToolInAndroidHome": "No se encontró la herramienta %s en ANDROID_HOME: %s", + "loc.messages.NoMatchingFiles": "No se encontraron archivos coincidentes con el patrón de búsqueda: %s", + "loc.messages.DeleteKeystoreFileFailed": "No se pudo eliminar el archivo de almacén de claves descargado del servidor: %s", + "loc.messages.CouldNotFindVersionOfToolInAndroidHome": "No se encontró la versión %s de %s en ANDROID_HOME: %s", + "loc.messages.GetLatestToolVersion": "Intentando obtener la última versión instalada de la herramienta: %s", + "loc.messages.GetSpecifiedToolVersion": "Intentando obtener la versión %s de %s" +} \ No newline at end of file diff --git a/_generated/AndroidSigningV3_Node20/Strings/resources.resjson/fr-FR/resources.resjson b/_generated/AndroidSigningV3_Node20/Strings/resources.resjson/fr-FR/resources.resjson new file mode 100644 index 000000000000..1a2939d54a4b --- /dev/null +++ b/_generated/AndroidSigningV3_Node20/Strings/resources.resjson/fr-FR/resources.resjson @@ -0,0 +1,40 @@ +{ + "loc.friendlyName": "Signature Android", + "loc.helpMarkDown": "[En savoir plus sur cette tâche](https://go.microsoft.com/fwlink/?LinkID=613717)", + "loc.description": "Signer et aligner les fichiers APK Android", + "loc.instanceNameFormat": "Signature et alignement de fichiers APK $(files)", + "loc.releaseNotes": "Cette version de la tâche utilise apksigner au lieu de jarsigner pour signer les fichiers APK.", + "loc.group.displayName.apksignerOptions": "Options de signature", + "loc.group.displayName.zipalignOptions": "Options Zipalign", + "loc.input.label.files": "Fichiers APK", + "loc.input.help.files": "Chemin relatif entre la racine du dépôt et le ou les fichiers APK à signer. Vous pouvez utiliser des caractères génériques pour spécifier plusieurs fichiers ([Plus d'informations](https://go.microsoft.com/fwlink/?linkid=856077)). Par exemple, '**/bin/*.apk' pour tous les fichiers .APK du sous-dossier 'bin'", + "loc.input.label.apksign": "Signer le fichier APK", + "loc.input.help.apksign": "Sélectionnez cette option pour signer le fichier APK avec le fichier de magasin de clés fourni. Les fichiers APK non signés peuvent uniquement s'exécuter dans un émulateur. Les fichiers APK doivent être signés pour pouvoir s'exécuter sur un appareil.", + "loc.input.label.keystoreFile": "Fichier du magasin de clés", + "loc.input.help.keystoreFile": "Sélectionnez le fichier de magasin de clés chargé dans 'Fichiers sécurisés' à utiliser pour signer le fichier APK.", + "loc.input.label.keystorePass": "Mot de passe du magasin de clés", + "loc.input.help.keystorePass": "Entrez le mot de passe du fichier de magasin de clés fourni. Pour chiffrer cette valeur, utilisez une nouvelle variable en activant son verrou sous l'onglet Variables.", + "loc.input.label.keystoreAlias": "Alias", + "loc.input.help.keystoreAlias": "Entrez l'alias qui identifie la paire de clés publiques/privées à utiliser dans le fichier de magasin de clés.", + "loc.input.label.keyPass": "Mot de passe de la clé", + "loc.input.help.keyPass": "Entrez le mot de passe de clé pour l'alias et le fichier de magasin de clés. Pour chiffrer cette valeur, utilisez une nouvelle variable en activant son verrou sous l'onglet Variables.", + "loc.input.label.apksignerVersion": "Version d'apksigner", + "loc.input.help.apksignerVersion": "Entrez la version des outils de build du kit Android SDK pour y rechercher l'exécutable apksigner.", + "loc.input.label.apksignerArguments": "arguments d'apksigner", + "loc.input.help.apksignerArguments": "Indiquez les options à passer à la ligne de commande apksigner. La valeur par défaut est --verbose", + "loc.input.label.apksignerLocation": "emplacement d'apksigner", + "loc.input.help.apksignerLocation": "Spécifiez éventuellement l'emplacement de l'exécutable apksigner utilisé durant la signature. Par défaut, il s'agit du fichier apksigner situé dans le dossier de version du kit Android SDK à partir duquel votre application est générée.", + "loc.input.label.zipalign": "Zipalign", + "loc.input.help.zipalign": "Sélectionnez cette option si vous voulez compresser votre package dans un fichier zipalign. Cela réduit la quantité de RAM consommée par une application.", + "loc.input.label.zipalignVersion": "Version de zipalign", + "loc.input.help.zipalignVersion": "Entrez la version des outils de build du kit Android SDK pour y rechercher l'exécutable zipalign.", + "loc.input.label.zipalignLocation": "Emplacement de Zipalign", + "loc.input.help.zipalignLocation": "Indiquez éventuellement l'emplacement de l'exécutable zipalign utilisé lors de la signature. Il s'agit par défaut du fichier zipalign disponible dans le dossier de la version Android SDK sur laquelle repose votre application.", + "loc.messages.AndroidHomeNotSet": "La variable d'environnement ANDROID_HOME n'est pas définie pour l'utilisateur actuel.", + "loc.messages.CouldNotFindToolInAndroidHome": "Outil %s introuvable dans ANDROID_HOME : %s", + "loc.messages.NoMatchingFiles": "Il n'existe aucun fichier correspondant au modèle de recherche : %s", + "loc.messages.DeleteKeystoreFileFailed": "Échec de la suppression du fichier de magasin de clés téléchargé à partir du serveur : %s", + "loc.messages.CouldNotFindVersionOfToolInAndroidHome": "La version %s de %s est introuvable dans ANDROID_HOME : %s", + "loc.messages.GetLatestToolVersion": "Tentative d'obtention de la dernière version installée de l'outil : %s", + "loc.messages.GetSpecifiedToolVersion": "Tentative d'obtention de la version %s de %s" +} \ No newline at end of file diff --git a/_generated/AndroidSigningV3_Node20/Strings/resources.resjson/it-IT/resources.resjson b/_generated/AndroidSigningV3_Node20/Strings/resources.resjson/it-IT/resources.resjson new file mode 100644 index 000000000000..4c3877ece00e --- /dev/null +++ b/_generated/AndroidSigningV3_Node20/Strings/resources.resjson/it-IT/resources.resjson @@ -0,0 +1,40 @@ +{ + "loc.friendlyName": "Firma per Android", + "loc.helpMarkDown": "[Altre informazioni su questa attività](https://go.microsoft.com/fwlink/?LinkID=613717)", + "loc.description": "Consente di firmare e allineare i file APK di Android", + "loc.instanceNameFormat": "Firma e allineamento dei file APK $(files)", + "loc.releaseNotes": "Questa versione dell'attività usa apksigner invece di jarsigner per firmare gli APK.", + "loc.group.displayName.apksignerOptions": "Opzioni di firma", + "loc.group.displayName.zipalignOptions": "Opzioni Zipalign", + "loc.input.label.files": "File APK", + "loc.input.help.files": "Percorso relativo dalla radice del repository ai file APK da firmare. Per specificare più file, è possibile usare i caratteri jolly, ad esempio `**/bin/*.apk` per tutti i file APK presenti nella sottocartella 'bin'. [Altre informazioni](https://go.microsoft.com/fwlink/?linkid=856077)", + "loc.input.label.apksign": "Firma l'APK", + "loc.input.help.apksign": "Selezionare questa opzione per firmare l'APK con un file dell'archivio chiavi fornito. Per essere eseguiti in un dispositivo, gli APK devono essere firmati. Gli APK senza firma possono essere eseguiti sono in un emulatore.", + "loc.input.label.keystoreFile": "File dell'archivio chiavi", + "loc.input.help.keystoreFile": "Consente di selezionare il file dell'archivio chiavi caricato in `File protetti` da usare per firmare l'APK.", + "loc.input.label.keystorePass": "Password dell'archivio chiavi", + "loc.input.help.keystorePass": "Immettere la password per il file dell'archivio chiavi fornito. Per crittografare questo valore, usare una nuova variabile con il blocco abilitato nella scheda Variabili.", + "loc.input.label.keystoreAlias": "Alias", + "loc.input.help.keystoreAlias": "Immettere l'alias che identifica la coppia di chiavi pubblica/privata da usare nel file dell'archivio chiavi.", + "loc.input.label.keyPass": "Password della chiave", + "loc.input.help.keyPass": "Immettere la password chiave per il file dell'archivio chiavi e l'alias. Per crittografare questo valore, usare una nuova variabile con il blocco abilitato nella scheda Variabili.", + "loc.input.label.apksignerVersion": "Versione di apksigner", + "loc.input.help.apksignerVersion": "Consente di immettere la versione degli strumenti di compilazione di Android SDK da cui cercare l'eseguibile di apksigner.", + "loc.input.label.apksignerArguments": "Argomenti di apksigner", + "loc.input.help.apksignerArguments": "Consente di specificare le eventuali opzioni da passare alla riga di comando di apksigner. Impostazione predefinita: --verbose", + "loc.input.label.apksignerLocation": "Percorso di apksigner", + "loc.input.help.apksignerLocation": "Consente facoltativamente di specificare il percorso dell'eseguibile di apksigner usato durante la firma. Per impostazione predefinita viene usato l'eseguibile di apksigner trovato nella cartella della versione di Android SDK usata per la compilazione dell'applicazione.", + "loc.input.label.zipalign": "Zipalign", + "loc.input.help.zipalign": "Consente di scegliere se eseguire zipalign per il pacchetto, in modo da ridurre la quantità di RAM utilizzata da un'app.", + "loc.input.label.zipalignVersion": "Versione di Zipalign", + "loc.input.help.zipalignVersion": "Consente di immettere la versione degli strumenti di compilazione di Android SDK da cui cercare l'eseguibile di Zipalign.", + "loc.input.label.zipalignLocation": "Percorso di Zipalign", + "loc.input.help.zipalignLocation": "Consente facoltativamente di specificare il percorso dell'eseguibile di zipalign usato durante la firma. Per impostazione predefinita viene usato l'eseguibile di zipalign trovato nella cartella della versione di Android SDK usata per la compilazione dell'applicazione.", + "loc.messages.AndroidHomeNotSet": "La variabile di ambiente ANDROID_HOME non è impostata per l'utente in esecuzione.", + "loc.messages.CouldNotFindToolInAndroidHome": "Non è stato possibile trovare lo strumento %s in ANDROID_HOME: %s", + "loc.messages.NoMatchingFiles": "Non sono stati trovati file corrispondenti con il criterio di ricerca: %s", + "loc.messages.DeleteKeystoreFileFailed": "Non è stato possibile eliminare il file dell'archivio chiavi scaricato dal server: %s", + "loc.messages.CouldNotFindVersionOfToolInAndroidHome": "Non è stato possibile trovare la versione %s di %s in ANDROID_HOME: %s", + "loc.messages.GetLatestToolVersion": "Tentativo di ottenere l'ultima versione installata dello strumento: %s", + "loc.messages.GetSpecifiedToolVersion": "Tentativo di ottenere la versione %s di %s" +} \ No newline at end of file diff --git a/_generated/AndroidSigningV3_Node20/Strings/resources.resjson/ja-JP/resources.resjson b/_generated/AndroidSigningV3_Node20/Strings/resources.resjson/ja-JP/resources.resjson new file mode 100644 index 000000000000..8c62ec3ac644 --- /dev/null +++ b/_generated/AndroidSigningV3_Node20/Strings/resources.resjson/ja-JP/resources.resjson @@ -0,0 +1,40 @@ +{ + "loc.friendlyName": "Android の署名", + "loc.helpMarkDown": "[このタスクの詳細を表示](https://go.microsoft.com/fwlink/?LinkID=613717)", + "loc.description": "署名し、Android APK ファイルを配置します", + "loc.instanceNameFormat": "APK ファイル $(files) の署名と配置", + "loc.releaseNotes": "このバージョンのタスクでは、APK の署名に jarsigner ではなく apksigner が使用されます。", + "loc.group.displayName.apksignerOptions": "署名オプション", + "loc.group.displayName.zipalignOptions": "Zipalign オプション", + "loc.input.label.files": "APK ファイル", + "loc.input.help.files": "リポジトリのルートから署名する APK への相対パス。ワイルドカードを使用して複数のファイルを指定できます ([詳細](https://go.microsoft.com/fwlink/?linkid=856077))。たとえば、'bin' サブフォルダーにあるすべての .APK ファイルの場合は `**/bin/*.apk` です。", + "loc.input.label.apksign": "APK の署名", + "loc.input.help.apksign": "指定したキーストア ファイルで APK に署名する場合に、このオプションを選択します。署名がない APK はエミュレーターだけでしか実行できません。デバイスで実行するには、APK に署名する必要があります。", + "loc.input.label.keystoreFile": "Keystore ファイル", + "loc.input.help.keystoreFile": "APK の署名に使うために [セキュア ファイル] にアップロードされたキーストア ファイルを選択します。", + "loc.input.label.keystorePass": "Keystore パスワード", + "loc.input.help.keystorePass": "提供されているキーストア ファイルに関するパスワードを入力します。この値を暗号化するには、[変数] タブで、ロックを有効にして新しい変数をご使用ください。", + "loc.input.label.keystoreAlias": "エイリアス", + "loc.input.help.keystoreAlias": "キーストア ファイルで使用される公開キー/秘密キーのペアを識別するエイリアスを入力します。", + "loc.input.label.keyPass": "キー パスワード", + "loc.input.help.keyPass": "エイリアスとキーストア ファイルのキー パスワードを入力します。この値を暗号化するには、[変数] タブで新しい変数のロックを有効にします。", + "loc.input.label.apksignerVersion": "apksigner のバージョン", + "loc.input.help.apksignerVersion": "apksigner 実行可能ファイルを検索する Android SDK Build-Tools のバージョンを入力します。", + "loc.input.label.apksignerArguments": "apksigner の引数", + "loc.input.help.apksignerArguments": "apksigner コマンド ラインに渡すオプションを指定します。既定値: --verbose", + "loc.input.label.apksignerLocation": "apksigner の場所", + "loc.input.help.apksignerLocation": "必要に応じて、署名中に使用する apksigner 実行可能ファイルの場所を指定します。既定では、アプリケーションのビルドが実行される Android SDK バージョンのフォルダーにある apksigner が使用されます。", + "loc.input.label.zipalign": "Zipalign", + "loc.input.help.zipalign": "パッケージに Zipalign を実行する場合に選択します。アプリに使用される RAM の量を減らすことができます。", + "loc.input.label.zipalignVersion": "zipalign のバージョン", + "loc.input.help.zipalignVersion": "zipalign 実行可能ファイルを検索する Android SDK Build-Tools のバージョンを入力します。", + "loc.input.label.zipalignLocation": "Zipalign の場所", + "loc.input.help.zipalignLocation": "(省略可能) 署名中に使用される Zipalign 実行可能ファイルの場所を指定します。既定値は、アプリケーションがビルドした Android SDK バージョン フォルダー内にある Zipalign になります。", + "loc.messages.AndroidHomeNotSet": "実行中のユーザーに ANDROID_HOME 環境変数が設定されていません。", + "loc.messages.CouldNotFindToolInAndroidHome": "ツール %s が ANDROID_HOME 内に見つかりませんでした: %s", + "loc.messages.NoMatchingFiles": "次の検索パターンと一致するファイルが見つかりませんでした: %s", + "loc.messages.DeleteKeystoreFileFailed": "サーバーからダウンロードされたキーストア ファイルを削除することができませんでした: %s", + "loc.messages.CouldNotFindVersionOfToolInAndroidHome": "ANDROID_HOME 内に %s バージョンの %s が見つかりませんでした: %s", + "loc.messages.GetLatestToolVersion": "インストールされている最新バージョンのツールを取得しようとしています: %s", + "loc.messages.GetSpecifiedToolVersion": "バージョン %s の %s を取得しようとしています" +} \ No newline at end of file diff --git a/_generated/AndroidSigningV3_Node20/Strings/resources.resjson/ko-KR/resources.resjson b/_generated/AndroidSigningV3_Node20/Strings/resources.resjson/ko-KR/resources.resjson new file mode 100644 index 000000000000..9a868aacfd26 --- /dev/null +++ b/_generated/AndroidSigningV3_Node20/Strings/resources.resjson/ko-KR/resources.resjson @@ -0,0 +1,40 @@ +{ + "loc.friendlyName": "Android 서명", + "loc.helpMarkDown": "[이 작업에 대한 자세한 정보](https://go.microsoft.com/fwlink/?LinkID=613717)", + "loc.description": "Android APK 파일 서명 및 정렬", + "loc.instanceNameFormat": "APK 파일 $(files) 서명 및 정렬", + "loc.releaseNotes": "이 버전의 작업은 jarsigner 대신 apksigner를 사용하여 APK에 서명합니다.", + "loc.group.displayName.apksignerOptions": "서명 옵션", + "loc.group.displayName.zipalignOptions": "Zipalign 옵션", + "loc.input.label.files": "APK 파일", + "loc.input.help.files": "서명할 APK에 대한 리포 루트의 상대 경로입니다. 와일드카드를 사용하여 여러 파일을 지정할 수 있습니다([자세한 정보](https://go.microsoft.com/fwlink/?linkid=856077)). 예를 들어, 'bin' 하위 폴더에 있는 모든 APK 파일을 표시하기 위해 '**/bin/*.apk'를 사용할 수 있습니다.", + "loc.input.label.apksign": "APK 서명", + "loc.input.help.apksign": "제공된 키 저장소 파일을 사용하여 APK에 서명하려면 이 옵션을 선택합니다. 서명되지 않은 APK는 에뮬레이터에서만 실행할 수 있습니다. 장치에서 실행하려면 APK가 서명되어야 합니다.", + "loc.input.label.keystoreFile": "키 저장소 파일", + "loc.input.help.keystoreFile": "APK 서명에 사용하기 위해 '보안 파일'에 업로드한 키 저장소 파일을 선택합니다.", + "loc.input.label.keystorePass": "키 저장소 암호", + "loc.input.help.keystorePass": "제공된 키 저장소 파일에 대한 암호를 입력합니다. 이 값을 암호화하려면 [변수] 탭에서 잠금이 사용 설정된 새 변수를 사용하세요.", + "loc.input.label.keystoreAlias": "별칭", + "loc.input.help.keystoreAlias": "공용/개인 키 쌍을 식별하여 키 저장소 파일에 사용할 별칭을 입력합니다.", + "loc.input.label.keyPass": "키 암호", + "loc.input.help.keyPass": "별칭 및 키 저장소 파일에 대한 키 암호를 입력합니다. 이 값을 암호화하려면 [변수] 탭에서 잠금이 사용 설정된 새 변수를 사용하세요.", + "loc.input.label.apksignerVersion": "apksigner 버전", + "loc.input.help.apksignerVersion": "apksigner 실행 파일을 볼 Android SDK 빌드 도구 버전을 입력하세요.", + "loc.input.label.apksignerArguments": "apksigner 인수", + "loc.input.help.apksignerArguments": "apksigner 명령줄에 전달할 옵션을 제공합니다. 기본값: --verbose", + "loc.input.label.apksignerLocation": "apksigner 위치", + "loc.input.help.apksignerLocation": "서명할 때 사용되는 apksigner 실행 파일의 위치를 선택적으로 지정합니다. 기본적으로 애플리케이션이 빌드되는 Android SDK 버전 폴더에 있는 apksigner를 사용합니다.", + "loc.input.label.zipalign": "Zipalign", + "loc.input.help.zipalign": "패키지를 zipalign하려면 선택합니다. 이렇게 하면 앱에 사용되는 RAM 양이 줄어듭니다.", + "loc.input.label.zipalignVersion": "zipalign 버전", + "loc.input.help.zipalignVersion": "zipalign 실행 파일을 볼 Android SDK 빌드 도구 버전을 입력합니다.", + "loc.input.label.zipalignLocation": "Zipalign 위치", + "loc.input.help.zipalignLocation": "원하는 경우 서명할 때 사용되는 zipalign 실행 파일의 위치를 지정합니다. 기본적으로 응용 프로그램이 빌드되는 Android SDK 버전 폴더에 있는 zipalign을 사용합니다.", + "loc.messages.AndroidHomeNotSet": "실행 중인 사용자에 대해 ANDROID_HOME 환경 변수가 설정되어 있지 않습니다.", + "loc.messages.CouldNotFindToolInAndroidHome": "ANDROID_HOME 내에서 %s 도구를 찾을 수 없습니다. %s", + "loc.messages.NoMatchingFiles": "다음 검색 패턴과 일치하는 파일을 찾을 수 없습니다. %s", + "loc.messages.DeleteKeystoreFileFailed": "서버에서 다운로드된 키 저장소 파일을 삭제하지 못함: %s", + "loc.messages.CouldNotFindVersionOfToolInAndroidHome": "ANDROID_HOME 내에서 %s 버전의 %s을(를) 찾을 수 없음: %s", + "loc.messages.GetLatestToolVersion": "설치된 최신 버전의 도구를 가져오는 중: %s", + "loc.messages.GetSpecifiedToolVersion": "%s 버전의 %s을(를) 가져오는 중" +} \ No newline at end of file diff --git a/_generated/AndroidSigningV3_Node20/Strings/resources.resjson/ru-RU/resources.resjson b/_generated/AndroidSigningV3_Node20/Strings/resources.resjson/ru-RU/resources.resjson new file mode 100644 index 000000000000..1d45c6096432 --- /dev/null +++ b/_generated/AndroidSigningV3_Node20/Strings/resources.resjson/ru-RU/resources.resjson @@ -0,0 +1,40 @@ +{ + "loc.friendlyName": "Подписывание Android", + "loc.helpMarkDown": "[См. дополнительные сведения об этой задаче](https://go.microsoft.com/fwlink/?LinkID=613717)", + "loc.description": "Подписывание и назначение APK-файлов Android", + "loc.instanceNameFormat": "Подписание и выравнивание файлов APK $(files)", + "loc.releaseNotes": "Задача этой версии для подписывания файлов APK использует apksigner вместо jarsigner.", + "loc.group.displayName.apksignerOptions": "Параметры подписи", + "loc.group.displayName.zipalignOptions": "Параметры Zipalign", + "loc.input.label.files": "APK-файлы", + "loc.input.help.files": "Относительный путь от корня репозитория к подписываемым APK-файлам. Можно использовать подстановочные знаки для указания нескольких файлов ([дополнительные сведения](https://go.microsoft.com/fwlink/?linkid=856077)). Пример: \"**/bin/*.apk\" для всех APK-файлов во вложенной папке bin", + "loc.input.label.apksign": "Подписать APK", + "loc.input.help.apksign": "Выберите этот параметр, чтобы подписать APK с помощью предоставленного файла хранилища ключей. Неподписанные APK можно выполнять только в эмуляторе. Для запуска на устройстве APK должны быть подписаны.", + "loc.input.label.keystoreFile": "Файл хранилища ключей", + "loc.input.help.keystoreFile": "Выберите файл хранилища ключей, отправленный в разделе \"Безопасные файлы\" для подписывания APK.", + "loc.input.label.keystorePass": "Пароль хранилища ключей", + "loc.input.help.keystorePass": "Введите пароль для предоставленного файла хранилища ключей. Чтобы зашифровать это значение, используйте новую переменную сборки с включенной блокировкой на вкладке \"Переменные\".", + "loc.input.label.keystoreAlias": "Псевдоним", + "loc.input.help.keystoreAlias": "Введите псевдоним, который определяет пару открытого и закрытого ключей для использования в файле хранилища ключей.", + "loc.input.label.keyPass": "Пароль ключа", + "loc.input.help.keyPass": "Введите пароль ключа для псевдонима и файла хранилища ключей. Чтобы зашифровать это значение, используйте новую переменную сборки с включенной блокировкой на вкладке \"Переменные\".", + "loc.input.label.apksignerVersion": "Версия apksigner", + "loc.input.help.apksignerVersion": "Введите версию пакета SDK build-tools для Android, в котором нужно искать исполняемый файл apksigner.", + "loc.input.label.apksignerArguments": "Аргументы apksigner", + "loc.input.help.apksignerArguments": "Укажите параметры для передачи в командную строку apksigner. Параметры по умолчанию: --verbose.", + "loc.input.label.apksignerLocation": "Расположение apksigner", + "loc.input.help.apksignerLocation": "При необходимости укажите путь к исполняемому файлу apksigner, используемому при подписывании. По умолчанию применяется файл apksigner, найденный в папке той версии Android SDK, с которой собрано ваше приложение.", + "loc.input.label.zipalign": "Zipalign", + "loc.input.help.zipalign": "Укажите, следует ли использовать для пакета zipalign. Это позволяет снизить объем оперативной памяти, используемой приложением.", + "loc.input.label.zipalignVersion": "Версия Zipalign", + "loc.input.help.zipalignVersion": "Введите версию пакета SDK build-tools для Android, в котором нужно искать исполняемый файл zipalign.", + "loc.input.label.zipalignLocation": "Расположение Zipalign", + "loc.input.help.zipalignLocation": "При необходимости укажите путь к исполняемому файлу zipalign, используемому при подписывании. По умолчанию применяется zipalign, найденный в папке той версии Android SDK, с которой собрано ваше приложение.", + "loc.messages.AndroidHomeNotSet": "Переменная среды ANDROID_HOME не задана для текущего пользователя.", + "loc.messages.CouldNotFindToolInAndroidHome": "Не удалось найти средство %s в ANDROID_HOME: %s", + "loc.messages.NoMatchingFiles": "Не найдены файлы, соответствующие шаблону поиска: %s.", + "loc.messages.DeleteKeystoreFileFailed": "Не удалось удалить скачанный с сервера файл хранилища ключей: %s", + "loc.messages.CouldNotFindVersionOfToolInAndroidHome": "Не удалось найти версию %s инструмента %s в ANDROID_HOME: %s", + "loc.messages.GetLatestToolVersion": "Попытка получить последнюю установленную версию инструмента: %s", + "loc.messages.GetSpecifiedToolVersion": "Попытка получить версию %s инструмента %s." +} \ No newline at end of file diff --git a/_generated/AndroidSigningV3_Node20/Strings/resources.resjson/zh-CN/resources.resjson b/_generated/AndroidSigningV3_Node20/Strings/resources.resjson/zh-CN/resources.resjson new file mode 100644 index 000000000000..b3e0f59f0da4 --- /dev/null +++ b/_generated/AndroidSigningV3_Node20/Strings/resources.resjson/zh-CN/resources.resjson @@ -0,0 +1,40 @@ +{ + "loc.friendlyName": "Android 签名", + "loc.helpMarkDown": "[详细了解此任务](https://go.microsoft.com/fwlink/?LinkID=613717)", + "loc.description": "签名并排列 Android APK 文件", + "loc.instanceNameFormat": "签名并排列 APK 文件 $(files)", + "loc.releaseNotes": "此版本的任务使用 apksigner 而不是 jarsigner 来签署 APK。", + "loc.group.displayName.apksignerOptions": "签名选项", + "loc.group.displayName.zipalignOptions": "Zipalign 选项", + "loc.input.label.files": "APK 文件", + "loc.input.help.files": "从存储库根路径到要签名的 APK 之间的相对路径。可以使用通配符指定多个文件([详细信息](https://go.microsoft.com/fwlink/?linkid=856077))。例如,使用 \"**/bin/*.apk\" 指定 \"bin\" 子文件夹中的所有 .APK 文件", + "loc.input.label.apksign": "为 APK 签名", + "loc.input.help.apksign": "若要使用提供的密钥存储文件对 APK 签名,请选择此项。未签名的 APK 只能在仿真器中运行。若要在设备上运行,必需对 APK 签名。", + "loc.input.label.keystoreFile": "Keystore 文件", + "loc.input.help.keystoreFile": "选择已上传到“安全文件”用来对 APK 签名的密钥存储文件。", + "loc.input.label.keystorePass": "Keystore 密码", + "loc.input.help.keystorePass": "输入提供的密钥存储文件的密码。对“变量”选项卡使用已启用锁定的新变量来加密该值。", + "loc.input.label.keystoreAlias": "别名", + "loc.input.help.keystoreAlias": "输入别名,以标识在密钥存储文件中使用的公钥/私钥对。", + "loc.input.label.keyPass": "密钥密码", + "loc.input.help.keyPass": "输入别名和密钥存储文件的密钥密码。对“变量”选项卡使用已启用锁定的新变量来加密该值。", + "loc.input.label.apksignerVersion": "apksigner 版本", + "loc.input.help.apksignerVersion": "输入要从中查找 apksigner 可执行文件的 Android SDK 生成工具版本。", + "loc.input.label.apksignerArguments": "apksigner 参数", + "loc.input.help.apksignerArguments": "提供要传递到 apksigner 命令行的任何选项。默认值是: --verbose", + "loc.input.label.apksignerLocation": "apksigner 位置", + "loc.input.help.apksignerLocation": "可以选择指定签名期间使用的 apksigner 可执行文件的位置。默认为应用程序生成所定向的 Android SDK 版本文件夹中的 apksigner。", + "loc.input.label.zipalign": "Zipalign", + "loc.input.help.zipalign": "若要对包进行 zipalign,请选择此项。这会减少应用使用的 RAM 量。", + "loc.input.label.zipalignVersion": "Zipalign 版本", + "loc.input.help.zipalignVersion": "输入要从中查找 zipalign 可执行文件的 Android SDK 生成工具版本。", + "loc.input.label.zipalignLocation": "Zipalign 位置", + "loc.input.help.zipalignLocation": "也可以选择指定签名过程中使用的 zipalign 可执行文件的位置。默认情况下,使用应用程序基于其创建的 Android SDK 版本文件夹中的 zipalign。", + "loc.messages.AndroidHomeNotSet": "未为正在运行的用户设置 ANDROID_HOME 环境变量。", + "loc.messages.CouldNotFindToolInAndroidHome": "无法在 ANDROID_HOME %s 内找到工具: %s", + "loc.messages.NoMatchingFiles": "使用搜索模式 %s 未找到匹配的文件", + "loc.messages.DeleteKeystoreFileFailed": "未能删除从服务器下载的密钥存储文件: %s", + "loc.messages.CouldNotFindVersionOfToolInAndroidHome": "在 ANDROID_HOME 中找不到 %s 版本的 %s: %s", + "loc.messages.GetLatestToolVersion": "正在尝试获取工具的最新安装版本: %s", + "loc.messages.GetSpecifiedToolVersion": "正在尝试获取 %s 版本的 %s" +} \ No newline at end of file diff --git a/_generated/AndroidSigningV3_Node20/Strings/resources.resjson/zh-TW/resources.resjson b/_generated/AndroidSigningV3_Node20/Strings/resources.resjson/zh-TW/resources.resjson new file mode 100644 index 000000000000..1a4b044d089e --- /dev/null +++ b/_generated/AndroidSigningV3_Node20/Strings/resources.resjson/zh-TW/resources.resjson @@ -0,0 +1,40 @@ +{ + "loc.friendlyName": "Android 簽署", + "loc.helpMarkDown": "[深入了解此工作](https://go.microsoft.com/fwlink/?LinkID=613717)", + "loc.description": "簽署並對齊 Android APK 檔案", + "loc.instanceNameFormat": "簽署並對齊 APK 檔 $(files)", + "loc.releaseNotes": "此版本的工作使用 apksigner 而非 jarsigner 來簽署 APK。", + "loc.group.displayName.apksignerOptions": "簽署選項", + "loc.group.displayName.zipalignOptions": "Zipalign 選項", + "loc.input.label.files": "APK 檔案", + "loc.input.help.files": "所要簽署 APK 相對於存放庫根路徑的路徑。您可以使用萬用字元來指定多個檔案 ([詳細資訊](https://go.microsoft.com/fwlink/?linkid=856077))。例如,`**/bin/*.apk` 表示 'bin' 子資料夾中的所有 .APK 檔案", + "loc.input.label.apksign": "簽署 APK", + "loc.input.help.apksign": "若要使用提供的金鑰儲存區檔案簽署 APK,請選取此選項。未經簽署的 APK 只可在模擬器中執行。APK 必須經過簽署,才能在裝置上執行。", + "loc.input.label.keystoreFile": "金鑰儲存區檔案", + "loc.input.help.keystoreFile": "選取上傳至 `Secure Files` 以用於簽署 APK 的金鑰儲存區檔案。", + "loc.input.label.keystorePass": "金鑰儲存區密碼", + "loc.input.help.keystorePass": "請輸入所提供之金鑰儲存區檔案的密碼。請使用新的變數,並在 [變數] 索引標籤上啟用其鎖定,以加密此變數。", + "loc.input.label.keystoreAlias": "別名", + "loc.input.help.keystoreAlias": "請輸入可以識別要在金鑰儲存區檔案中使用之公用/私密金鑰組的別名。", + "loc.input.label.keyPass": "金鑰密碼", + "loc.input.help.keyPass": "請輸入別名與金鑰儲存區檔案的金鑰密碼。請使用新的變數,並在 [變數] 索引標籤上啟用其鎖定,以加密此變數。", + "loc.input.label.apksignerVersion": "apksigner 版本", + "loc.input.help.apksignerVersion": "輸入 Android SDK 的建置工具版本,從中尋找 apksigner 可執行檔。", + "loc.input.label.apksignerArguments": "apksigner 引數", + "loc.input.help.apksignerArguments": "提供要傳遞至 apksigner 命令列的任何選項。預設值為: --verbose", + "loc.input.label.apksignerLocation": "apksigner 位置", + "loc.input.help.apksignerLocation": "選擇性地指定在登入期間所使用的 apksigner 可執行檔位置。這會預設為在您應用程式對其建置的 Android SDK 版本資料夾中找到的 apksigner。", + "loc.input.label.zipalign": "Zipalign", + "loc.input.help.zipalign": "若想要為套件進行 zipalign 則加以選取。如此可減少應用程式所使用的 RAM 量。", + "loc.input.label.zipalignVersion": "Zipalign 版本", + "loc.input.help.zipalignVersion": "輸入 Android SDK 的建置工具版本,從中尋找 zipalign 可執行檔。", + "loc.input.label.zipalignLocation": "Zipalign 位置", + "loc.input.help.zipalignLocation": "選擇性地指定登入期間所使用之 zipalign 可執行檔的位置。預設為您應用程式建置目標的 Android SDK 版本資料夾中所找到的 zipalign。", + "loc.messages.AndroidHomeNotSet": "未對正在執行中的使用者設定 ANDROID_HOME 環境變數。", + "loc.messages.CouldNotFindToolInAndroidHome": "在 ANDROID_HOME %s 內找不到工具 %s", + "loc.messages.NoMatchingFiles": "使用下列搜尋模式找不到任何相符的檔案: %s", + "loc.messages.DeleteKeystoreFileFailed": "無法刪除從伺服器 %s 下載的金鑰儲存區檔案", + "loc.messages.CouldNotFindVersionOfToolInAndroidHome": "找不到 %s 版本 (%s 的版本),尋找位置為 ANDROID_HOME: %s", + "loc.messages.GetLatestToolVersion": "正在嘗試取得最新安裝的工具版本: %s", + "loc.messages.GetSpecifiedToolVersion": "正在嘗試取得版本 %s (%s 的版本)" +} \ No newline at end of file diff --git a/_generated/AndroidSigningV3_Node20/Tests/L0.ts b/_generated/AndroidSigningV3_Node20/Tests/L0.ts new file mode 100644 index 000000000000..11ea98d6182c --- /dev/null +++ b/_generated/AndroidSigningV3_Node20/Tests/L0.ts @@ -0,0 +1,167 @@ +import * as fs from 'fs'; +import * as assert from 'assert'; +import * as path from 'path'; +import * as ttm from 'azure-pipelines-task-lib/mock-test'; + +describe('AndroidSigning Suite v3', function () { + this.timeout(parseInt(process.env.TASK_TEST_TIMEOUT) || 20000); + before(() => { + // empty + }); + + after(() => { + // empty + }); + + it('Do not sign or zipalign if nothing is selected', (done: Mocha.Done) => { + const tp: string = path.join(__dirname, 'L0AndroidSkipSignAlign.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.invokedToolCount === 0, 'should not run anything'); + assert(tr.stderr.length === 0, 'should not have written to stderr'); + assert(tr.succeeded, 'task should have succeeded'); + + done(); + }); + + it('Do not align or sign if input single file does not exist', (done: Mocha.Done) => { + const tp: string = path.join(__dirname, 'L0AndroidSignAlignNoFileInput.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.invokedToolCount === 0, 'should not run anything'); + assert(tr.errorIssues.length || tr.stderr.length > 0, 'should have written to stderr'); + assert(tr.failed, 'task should have failed'); + + done(); + }); + + it('Do not align or sign if input pattern does not match any files', (done: Mocha.Done) => { + const tp: string = path.join(__dirname, 'L0AndroidSignAlignNoMatchingFileInput.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.invokedToolCount === 0, 'should not run anything'); + assert(tr.errorIssues.length > 0 || tr.stderr.length > 0, 'should have written to stderr'); + assert(tr.failed, 'task should have failed'); + + done(); + }); + + it('Fail if ANDROID_HOME is not set', (done: Mocha.Done) => { + const tp: string = path.join(__dirname, 'L0AndroidSignAlignAndroidHomeNotSet.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.invokedToolCount === 0, 'should not run anything'); + assert(tr.errorIssues.length > 0 || tr.stderr.length > 0, 'should have failed locate the tools'); + assert(tr.failed, 'task should have failed'); + + done(); + }); + + it('Use apksigner in ANDROID_HOME to sign single file', (done: Mocha.Done) => { + const tp: string = path.join(__dirname, 'L0AndroidSignAlignApksignerFromAndroidHome.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.invokedToolCount === 1, 'should have run apksigner'); + assert(tr.stderr.length === 0, 'should have signed file'); + assert(tr.succeeded, 'task should have succeeded'); + + done(); + }); + + it('Use specified apksigner to sign a single file', (done: Mocha.Done) => { + const tp: string = path.join(__dirname, 'L0AndroidSignAlignApksignerFromInputSingleFile.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.invokedToolCount === 1, 'should run apksigner'); + assert(tr.errorIssues.length === 0 && tr.stderr.length === 0, 'should not have written to stderr'); + assert(tr.succeeded, 'task should have succeeded'); + + done(); + }); + + it('zipalign a single file', (done: Mocha.Done) => { + const tp: string = path.join(__dirname, 'L0AndroidZipalignSingleFile.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.invokedToolCount === 1, 'should run zipalign'); + assert(tr.stderr.length === 0 || tr.errorIssues.length === 0, 'should not have written to stderr'); + assert(tr.succeeded, 'task should have succeeded'); + + done(); + }); + + it('Signing and aligning multiple files', (done: Mocha.Done) => { + const tp: string = path.join(__dirname, 'L0AndroidSignAlignMultipleFiles.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.invokedToolCount === 4, 'should have run apksigner and zipalign twice each'); + assert(tr.stderr.length === 0 || tr.errorIssues.length === 0, 'should not have written to stderr'); + assert(tr.succeeded, 'task should have succeeded'); + + done(); + }); + + it('Download keystore file from SecureFile', (done: Mocha.Done) => { + const tp: string = path.join(__dirname, 'L0DownloadKeystoreFile.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.stderr.length === 0, 'should not have written to stderr'); + assert(tr.succeeded, 'task should have succeeded'); + + done(); + }); + + it('Should use the latest apksign', function (done: Mocha.Done) { + const tp: string = path.join(__dirname, 'L0UseLatestApksign.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert.strictEqual(tr.stderr.length, 0, 'should not have written to stderr'); + assert(tr.succeeded, 'task should have succeeded'); + + done(); + }); + + it('Should use specified version of apksign', function (done: Mocha.Done) { + const tp: string = path.join(__dirname, 'L0UseSpecifiedApksign.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert.strictEqual(tr.stderr.length, 0, 'should not have written to stderr'); + assert(tr.succeeded, 'task should have succeeded'); + + done(); + }); + + it('Should not find specified version of apksign', function (done: Mocha.Done) { + const tp: string = path.join(__dirname, 'L0CantFindSpecifiedApksign.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.stdOutContained('CouldNotFindVersionOfToolInAndroidHome'), 'Should have written error message'); + assert(tr.failed, 'task should have failed'); + + done(); + }); +}); diff --git a/_generated/AndroidSigningV3_Node20/Tests/L0AndroidSignAlignAndroidHomeNotSet.ts b/_generated/AndroidSigningV3_Node20/Tests/L0AndroidSignAlignAndroidHomeNotSet.ts new file mode 100644 index 000000000000..44b7dc2b6b1c --- /dev/null +++ b/_generated/AndroidSigningV3_Node20/Tests/L0AndroidSignAlignAndroidHomeNotSet.ts @@ -0,0 +1,28 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +const taskPath = path.join(__dirname, '..', 'androidsigning.js'); +const tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('files', '/some/path/a.apk'); +tr.setInput('apksign', 'false'); +tr.setInput('zipalign', 'true'); + +process.env['VSTS_TASKVARIABLE_KEYSTORE_FILE_PATH'] = '/some/store'; +process.env['ANDROID_HOME'] = ''; + +// provide answers for task mock +const a: ma.TaskLibAnswers = { + findMatch: { + '/some/path/a.apk': [ + '/some/path/a.apk' + ] + }, + checkPath: { + '/some/path/a.apk': true + } +}; +tr.setAnswers(a); + +tr.run(); diff --git a/_generated/AndroidSigningV3_Node20/Tests/L0AndroidSignAlignApksignerFromAndroidHome.ts b/_generated/AndroidSigningV3_Node20/Tests/L0AndroidSignAlignApksignerFromAndroidHome.ts new file mode 100644 index 000000000000..d7a96b618d11 --- /dev/null +++ b/_generated/AndroidSigningV3_Node20/Tests/L0AndroidSignAlignApksignerFromAndroidHome.ts @@ -0,0 +1,42 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +const taskPath = path.join(__dirname, '..', 'androidsigning.js'); +const tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('files', '/some/path/a.apk'); +tr.setInput('apksign', 'true'); +tr.setInput('keystoreFile', 'keystoreFileId'); +tr.setInput('keystorePass', 'pass1'); +tr.setInput('keystoreAlias', 'somealias'); +tr.setInput('keyPass', 'pass2'); +tr.setInput('zipalign', 'false'); + +process.env['VSTS_TASKVARIABLE_KEYSTORE_FILE_PATH'] = '/some/store'; +process.env['ANDROID_HOME'] = '/fake/android/home'; + +// provide answers for task mock +const a: ma.TaskLibAnswers = { + findMatch: { + '/some/path/a.apk': [ + '/some/path/a.apk' + ], + 'apksigner*\n!*.jar': [ + '/fake/android/home/sdk1/apksigner', + '/fake/android/home/sdk2/apksigner' + ] + }, + checkPath: { + '/some/path/a.apk': true + }, + exec: { + '/fake/android/home/sdk1/apksigner sign --ks /some/store --ks-pass pass:pass1 --ks-key-alias somealias --key-pass pass:pass2 /some/path/a.apk': { + 'code': 0, + 'stdout': 'apksigner output here' + } + } +}; +tr.setAnswers(a); + +tr.run(); diff --git a/_generated/AndroidSigningV3_Node20/Tests/L0AndroidSignAlignApksignerFromInputSingleFile.ts b/_generated/AndroidSigningV3_Node20/Tests/L0AndroidSignAlignApksignerFromInputSingleFile.ts new file mode 100644 index 000000000000..7e78d92b2eb8 --- /dev/null +++ b/_generated/AndroidSigningV3_Node20/Tests/L0AndroidSignAlignApksignerFromInputSingleFile.ts @@ -0,0 +1,41 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +const taskPath = path.join(__dirname, '..', 'androidsigning.js'); +const tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('files', '/some/path/a.apk'); +tr.setInput('apksignerLocation', '/usr/bin/apksigner'); +tr.setInput('apksign', 'true'); +tr.setInput('keystoreFile', '/some/store'); +tr.setInput('keystorePass', 'pass1'); +tr.setInput('keystoreAlias', 'somealias'); +tr.setInput('keyPass', 'pass2'); +tr.setInput('zipalign', 'false'); + +process.env['AGENT_VERSION'] = '2.116.0'; +process.env['VSTS_TASKVARIABLE_KEYSTORE_FILE_PATH'] = '/some/store'; +process.env['HOME'] = '/users/test'; +process.env['ANDROID_HOME'] = '/fake/android/home'; + +// provide answers for task mock +const a: ma.TaskLibAnswers = { + findMatch: { + '/some/path/a.apk': [ + '/some/path/a.apk' + ] + }, + checkPath: { + '/some/path/a.apk': true + }, + exec: { + '/usr/bin/apksigner sign --ks /some/store --ks-pass pass:pass1 --ks-key-alias somealias --key-pass pass:pass2 /some/path/a.apk': { + 'code': 0, + 'stdout': 'apksigner output here' + } + } +}; +tr.setAnswers(a); + +tr.run(); \ No newline at end of file diff --git a/_generated/AndroidSigningV3_Node20/Tests/L0AndroidSignAlignMultipleFiles.ts b/_generated/AndroidSigningV3_Node20/Tests/L0AndroidSignAlignMultipleFiles.ts new file mode 100644 index 000000000000..7ec1452cec7a --- /dev/null +++ b/_generated/AndroidSigningV3_Node20/Tests/L0AndroidSignAlignMultipleFiles.ts @@ -0,0 +1,60 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +const taskPath = path.join(__dirname, '..', 'androidsigning.js'); +const tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('files', '/some/path/*.apk'); +tr.setInput('apksign', 'true'); +tr.setInput('keystoreFile', '/some/store'); +tr.setInput('keystorePass', 'pass1'); +tr.setInput('keystoreAlias', 'somealias'); +tr.setInput('keyPass', 'pass2'); +tr.setInput('zipalign', 'true'); + +process.env['VSTS_TASKVARIABLE_KEYSTORE_FILE_PATH'] = '/some/store'; +process.env['ANDROID_HOME'] = '/fake/android/home'; + +// provide answers for task mock +const a: ma.TaskLibAnswers = { + exec: { + '/fake/android/home/sdk1/apksigner sign --ks /some/store --ks-pass pass:pass1 --ks-key-alias somealias --key-pass pass:pass2 /some/path/a.apk': { + 'code': 0, + 'stdout': 'jarsigner output here' + }, + '/fake/android/home/sdk1/apksigner sign --ks /some/store --ks-pass pass:pass1 --ks-key-alias somealias --key-pass pass:pass2 /some/path/b.apk': { + 'code': 0, + 'stdout': 'jarsigner output here' + }, + '/fake/android/home/sdk1/zipalign -v 4 /some/path/a.apk.unaligned /some/path/a.apk': { + 'code': 0, + 'stdout': 'zipalign output here' + }, + '/fake/android/home/sdk1/zipalign -v 4 /some/path/b.apk.unaligned /some/path/b.apk': { + 'code': 0, + 'stdout': 'zipalign output here' + } + }, + checkPath: { + '/some/path/a.apk': true, + '/some/path/b.apk': true + }, + findMatch: { + '/some/path/*.apk': [ + '/some/path/a.apk', + '/some/path/b.apk' + ], + 'apksigner*\n!*.jar': [ + '/fake/android/home/sdk1/apksigner', + '/fake/android/home/sdk2/apksigner' + ], + 'zipalign*\n!*.jar': [ + '/fake/android/home/sdk1/zipalign', + '/fake/android/home/sdk2/zipalign' + ] + } +}; +tr.setAnswers(a); + +tr.run(); \ No newline at end of file diff --git a/_generated/AndroidSigningV3_Node20/Tests/L0AndroidSignAlignNoFileInput.ts b/_generated/AndroidSigningV3_Node20/Tests/L0AndroidSignAlignNoFileInput.ts new file mode 100644 index 000000000000..871a4205621e --- /dev/null +++ b/_generated/AndroidSigningV3_Node20/Tests/L0AndroidSignAlignNoFileInput.ts @@ -0,0 +1,26 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +const taskPath = path.join(__dirname, '..', 'androidsigning.js'); +const tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('files', '/some/path/nonexistent.apk'); +tr.setInput('apksign', 'true'); +tr.setInput('zipalign', 'true'); + +process.env['AGENT_VERSION'] = '2.116.0'; +process.env['VSTS_TASKVARIABLE_KEYSTORE_FILE_PATH'] = '/usr/lib/login.keystore'; +process.env['HOME'] = '/users/test'; +process.env['ANDROID_HOME'] = '/fake/android/home'; + +// provide answers for task mock +const a: ma.TaskLibAnswers = { + findMatch: { + "/some/path/nonexistent.apk": [ + ] + } +}; +tr.setAnswers(a); + +tr.run(); \ No newline at end of file diff --git a/_generated/AndroidSigningV3_Node20/Tests/L0AndroidSignAlignNoMatchingFileInput.ts b/_generated/AndroidSigningV3_Node20/Tests/L0AndroidSignAlignNoMatchingFileInput.ts new file mode 100644 index 000000000000..70e21675c644 --- /dev/null +++ b/_generated/AndroidSigningV3_Node20/Tests/L0AndroidSignAlignNoMatchingFileInput.ts @@ -0,0 +1,26 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +const taskPath = path.join(__dirname, '..', 'androidsigning.js'); +const tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('files', '/some/nonexistent/path/*.apk'); +tr.setInput('apksign', 'true'); +tr.setInput('zipalign', 'true'); + +process.env['AGENT_VERSION'] = '2.116.0'; +process.env['VSTS_TASKVARIABLE_KEYSTORE_FILE_PATH'] = '/usr/lib/login.keystore'; +process.env['HOME'] = '/users/test'; +process.env['ANDROID_HOME'] = '/fake/android/home'; + +// provide answers for task mock +const a: ma.TaskLibAnswers = { + findMatch: { + '/some/nonexistent/path/*.apk': [ + ] + } +}; +tr.setAnswers(a); + +tr.run(); \ No newline at end of file diff --git a/_generated/AndroidSigningV3_Node20/Tests/L0AndroidSkipSignAlign.ts b/_generated/AndroidSigningV3_Node20/Tests/L0AndroidSkipSignAlign.ts new file mode 100644 index 000000000000..2795156795b3 --- /dev/null +++ b/_generated/AndroidSigningV3_Node20/Tests/L0AndroidSkipSignAlign.ts @@ -0,0 +1,30 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +const taskPath = path.join(__dirname, '..', 'androidsigning.js'); +const tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('files', '/some/fake.apk'); +tr.setInput('apksign', 'false'); +tr.setInput('zipalign', 'false'); + +process.env['AGENT_VERSION'] = '2.116.0'; +process.env['VSTS_TASKVARIABLE_KEYSTORE_FILE_PATH'] = '/usr/lib/login.keystore'; +process.env['HOME'] = '/users/test'; +process.env['ANDROID_HOME'] = '/fake/android/home'; + +// provide answers for task mock +const a: ma.TaskLibAnswers = { + checkPath: { + '/some/fake.apk': true + }, + findMatch: { + '/some/fake.apk': [ + '/some/fake.apk' + ] + } +}; +tr.setAnswers(a); + +tr.run(); \ No newline at end of file diff --git a/_generated/AndroidSigningV3_Node20/Tests/L0AndroidZipalignSingleFile.ts b/_generated/AndroidSigningV3_Node20/Tests/L0AndroidZipalignSingleFile.ts new file mode 100644 index 000000000000..4e9eb18e3ee8 --- /dev/null +++ b/_generated/AndroidSigningV3_Node20/Tests/L0AndroidZipalignSingleFile.ts @@ -0,0 +1,40 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +const taskPath = path.join(__dirname, '..', 'androidsigning.js'); +const tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('files', '/some/fake.apk'); +tr.setInput('apksign', 'false'); +tr.setInput('zipalign', 'true'); + +process.env['AGENT_VERSION'] = '2.116.0'; +process.env['VSTS_TASKVARIABLE_KEYSTORE_FILE_PATH'] = '/some/store'; +process.env['HOME'] = '/users/test'; +process.env['ANDROID_HOME'] = '/fake/android/home'; + +// provide answers for task mock +const a: ma.TaskLibAnswers = { + 'checkPath': { + '/some/fake.apk': true + }, + 'findMatch': { + '/some/fake.apk': [ + '/some/fake.apk' + ], + 'zipalign*\n!*.jar': [ + '/fake/android/home/sdk1/zipalign', + '/fake/android/home/sdk2/zipalign' + ] + }, + 'exec': { + '/fake/android/home/sdk1/zipalign -v 4 /some/fake.apk.unaligned /some/fake.apk': { + 'code': 0, + 'stdout': 'zipalign output here' + } + } +}; +tr.setAnswers(a); + +tr.run(); \ No newline at end of file diff --git a/_generated/AndroidSigningV3_Node20/Tests/L0CantFindSpecifiedApksign.ts b/_generated/AndroidSigningV3_Node20/Tests/L0CantFindSpecifiedApksign.ts new file mode 100644 index 000000000000..0f01548ed461 --- /dev/null +++ b/_generated/AndroidSigningV3_Node20/Tests/L0CantFindSpecifiedApksign.ts @@ -0,0 +1,51 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +const taskPath = path.join(__dirname, '..', 'androidsigning.js'); +const tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('files', '/some/path/*.apk'); +tr.setInput('apksign', 'true'); +tr.setInput('keystoreFile', '/some/store'); +tr.setInput('keystorePass', 'pass1'); +tr.setInput('keystoreAlias', 'somealias'); +tr.setInput('keyPass', 'pass2'); +tr.setInput('zipalign', 'false'); +tr.setInput('apksignerVersion', '20.1.1'); + +process.env['VSTS_TASKVARIABLE_KEYSTORE_FILE_PATH'] = '/some/store'; +process.env['ANDROID_HOME'] = '/fake/android/home'; + +// provide answers for task mock +const a: ma.TaskLibAnswers = { + exec: { + '/fake/android/home/27.0.1/apksigner sign --ks /some/store --ks-pass pass:pass1 --ks-key-alias somealias --key-pass pass:pass2 /some/path/a.apk': { + 'code': 0, + 'stdout': 'jarsigner output here' + }, + '/fake/android/home/27.0.1/apksigner sign --ks /some/store --ks-pass pass:pass1 --ks-key-alias somealias --key-pass pass:pass2 /some/path/b.apk': { + 'code': 0, + 'stdout': 'jarsigner output here' + } + }, + checkPath: { + '/some/path/a.apk': true, + '/some/path/b.apk': true + }, + findMatch: { + '/some/path/*.apk': [ + '/some/path/a.apk', + '/some/path/b.apk' + ], + 'apksigner*\n!*.jar': [ + '/fake/android/home/26.0.3/apksigner', + '/fake/android/home/27.0.1/apksigner', + '/fake/android/home/29.0.2/apksigner', + '/fake/android/home/28.0.0/apksigner' + ] + } +}; +tr.setAnswers(a); + +tr.run(); \ No newline at end of file diff --git a/_generated/AndroidSigningV3_Node20/Tests/L0DownloadKeystoreFile.ts b/_generated/AndroidSigningV3_Node20/Tests/L0DownloadKeystoreFile.ts new file mode 100644 index 000000000000..80ae46d5624b --- /dev/null +++ b/_generated/AndroidSigningV3_Node20/Tests/L0DownloadKeystoreFile.ts @@ -0,0 +1,21 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +const taskPath = path.join(__dirname, '..', 'preandroidsigning.js'); +const tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('apksign', 'true'); +tr.setInput('keystoreFile', 'mySecureFileId'); + +process.env['AGENT_VERSION'] = '2.116.0'; + +const secureFileHelperMock = require('azure-pipelines-tasks-securefiles-common/securefiles-common-mock'); +tr.registerMock('azure-pipelines-tasks-securefiles-common/securefiles-common', secureFileHelperMock); + +// provide answers for task mock +const a: ma.TaskLibAnswers = { +}; +tr.setAnswers(a); + +tr.run(); \ No newline at end of file diff --git a/_generated/AndroidSigningV3_Node20/Tests/L0UseLatestApksign.ts b/_generated/AndroidSigningV3_Node20/Tests/L0UseLatestApksign.ts new file mode 100644 index 000000000000..7636d679b7ed --- /dev/null +++ b/_generated/AndroidSigningV3_Node20/Tests/L0UseLatestApksign.ts @@ -0,0 +1,50 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +const taskPath = path.join(__dirname, '..', 'androidsigning.js'); +const tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('files', '/some/path/*.apk'); +tr.setInput('apksign', 'true'); +tr.setInput('keystoreFile', '/some/store'); +tr.setInput('keystorePass', 'pass1'); +tr.setInput('keystoreAlias', 'somealias'); +tr.setInput('keyPass', 'pass2'); +tr.setInput('zipalign', 'false'); +tr.setInput('apksignerVersion', 'latest'); + +process.env['VSTS_TASKVARIABLE_KEYSTORE_FILE_PATH'] = '/some/store'; +process.env['ANDROID_HOME'] = '/fake/android/home'; + +// provide answers for task mock +const a: ma.TaskLibAnswers = { + exec: { + '/fake/android/home/29.0.2/apksigner sign --ks /some/store --ks-pass pass:pass1 --ks-key-alias somealias --key-pass pass:pass2 /some/path/a.apk': { + 'code': 0, + 'stdout': 'jarsigner output here' + }, + '/fake/android/home/29.0.2/apksigner sign --ks /some/store --ks-pass pass:pass1 --ks-key-alias somealias --key-pass pass:pass2 /some/path/b.apk': { + 'code': 0, + 'stdout': 'jarsigner output here' + } + }, + checkPath: { + '/some/path/a.apk': true, + '/some/path/b.apk': true + }, + findMatch: { + '/some/path/*.apk': [ + '/some/path/a.apk', + '/some/path/b.apk' + ], + 'apksigner*\n!*.jar': [ + '/fake/android/home/26.0.3/apksigner', + '/fake/android/home/29.0.2/apksigner', + '/fake/android/home/28.0.0/apksigner' + ] + } +}; +tr.setAnswers(a); + +tr.run(); \ No newline at end of file diff --git a/_generated/AndroidSigningV3_Node20/Tests/L0UseSpecifiedApksign.ts b/_generated/AndroidSigningV3_Node20/Tests/L0UseSpecifiedApksign.ts new file mode 100644 index 000000000000..4a03f7db544f --- /dev/null +++ b/_generated/AndroidSigningV3_Node20/Tests/L0UseSpecifiedApksign.ts @@ -0,0 +1,51 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +const taskPath = path.join(__dirname, '..', 'androidsigning.js'); +const tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('files', '/some/path/*.apk'); +tr.setInput('apksign', 'true'); +tr.setInput('keystoreFile', '/some/store'); +tr.setInput('keystorePass', 'pass1'); +tr.setInput('keystoreAlias', 'somealias'); +tr.setInput('keyPass', 'pass2'); +tr.setInput('zipalign', 'false'); +tr.setInput('apksignerVersion', '27'); + +process.env['VSTS_TASKVARIABLE_KEYSTORE_FILE_PATH'] = '/some/store'; +process.env['ANDROID_HOME'] = '/fake/android/home'; + +// provide answers for task mock +const a: ma.TaskLibAnswers = { + exec: { + '/fake/android/home/27.0.1/apksigner sign --ks /some/store --ks-pass pass:pass1 --ks-key-alias somealias --key-pass pass:pass2 /some/path/a.apk': { + 'code': 0, + 'stdout': 'jarsigner output here' + }, + '/fake/android/home/27.0.1/apksigner sign --ks /some/store --ks-pass pass:pass1 --ks-key-alias somealias --key-pass pass:pass2 /some/path/b.apk': { + 'code': 0, + 'stdout': 'jarsigner output here' + } + }, + checkPath: { + '/some/path/a.apk': true, + '/some/path/b.apk': true + }, + findMatch: { + '/some/path/*.apk': [ + '/some/path/a.apk', + '/some/path/b.apk' + ], + 'apksigner*\n!*.jar': [ + '/fake/android/home/26.0.3/apksigner', + '/fake/android/home/27.0.1/apksigner', + '/fake/android/home/29.0.2/apksigner', + '/fake/android/home/28.0.0/apksigner' + ] + } +}; +tr.setAnswers(a); + +tr.run(); \ No newline at end of file diff --git a/_generated/AndroidSigningV3_Node20/Tests/package-lock.json b/_generated/AndroidSigningV3_Node20/Tests/package-lock.json new file mode 100644 index 000000000000..08d4c49fc636 --- /dev/null +++ b/_generated/AndroidSigningV3_Node20/Tests/package-lock.json @@ -0,0 +1,24 @@ +{ + "name": "vsts-tasks-androidsigningv3-tests", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/mocha": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", + "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==" + }, + "@types/node": { + "version": "10.17.44", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.44.tgz", + "integrity": "sha512-vHPAyBX1ffLcy4fQHmDyIUMUb42gHZjPHU66nhvbMzAWJqHnySGZ6STwN3rwrnSd1FHB0DI/RWgGELgKSYRDmw==" + }, + "typescript": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.2.tgz", + "integrity": "sha512-e4ERvRV2wb+rRZ/IQeb3jm2VxBsirQLpQhdxplZ2MEzGvDkkMmPglecnNDfSUBivMjP93vRbngYYDQqQ/78bcQ==", + "dev": true + } + } +} diff --git a/_generated/AndroidSigningV3_Node20/Tests/package.json b/_generated/AndroidSigningV3_Node20/Tests/package.json new file mode 100644 index 000000000000..2a3b9dbf1026 --- /dev/null +++ b/_generated/AndroidSigningV3_Node20/Tests/package.json @@ -0,0 +1,26 @@ +{ + "name": "vsts-tasks-androidsigningv3-tests", + "version": "1.0.0", + "description": "Azure Pipelines Android Signing V3 Task Tests", + "main": "L0.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/Microsoft/azure-pipelines-tasks.git" + }, + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Microsoft/azure-pipelines-tasks/issues" + }, + "homepage": "https://github.com/Microsoft/azure-pipelines-tasks#readme", + "dependencies": { + "@types/node": "^10.17.0", + "@types/mocha": "^5.2.7" + }, + "devDependencies": { + "typescript": "4.0.2" + } +} diff --git a/_generated/AndroidSigningV3_Node20/ThirdPartyNotice.txt b/_generated/AndroidSigningV3_Node20/ThirdPartyNotice.txt new file mode 100644 index 000000000000..1ac1b59c966f --- /dev/null +++ b/_generated/AndroidSigningV3_Node20/ThirdPartyNotice.txt @@ -0,0 +1,459 @@ + +THIRD-PARTY SOFTWARE NOTICES AND INFORMATION +Do Not Translate or Localize + +This Azure DevOps extension (AndroidSigningV3) is based on or incorporates material from the projects listed below (Third Party IP). The original copyright notice and the license under which Microsoft received such Third Party IP, are set forth below. Such licenses and notices are provided for informational purposes only. Microsoft licenses the Third Party IP to you under the licensing terms for the Azure DevOps extension. Microsoft reserves all other rights not expressly granted under this agreement, whether by implication, estoppel or otherwise. + +1. @types/mocha (git+https://github.com/DefinitelyTyped/DefinitelyTyped.git) +2. @types/node (git+https://github.com/DefinitelyTyped/DefinitelyTyped.git) +3. balanced-match (git://github.com/juliangruber/balanced-match.git) +4. brace-expansion (git://github.com/juliangruber/brace-expansion.git) +5. concat-map (git://github.com/substack/node-concat-map.git) +6. minimatch (git://github.com/isaacs/minimatch.git) +7. mockery (git://github.com/mfncooper/mockery.git) +8. q (git://github.com/kriskowal/q.git) +9. semver (git+https://github.com/npm/node-semver.git) +10. shelljs (git://github.com/arturadib/shelljs.git) +11. tunnel (git+https://github.com/koichik/node-tunnel.git) +12. typed-rest-client (git+https://github.com/Microsoft/typed-rest-client.git) +13. underscore (git://github.com/jashkenas/underscore.git) +14. uuid (git+https://github.com/kelektiv/node-uuid.git) +15. vso-node-api (git+https://github.com/Microsoft/vso-node-api.git) +16. vsts-task-lib (git+https://github.com/Microsoft/vsts-task-lib.git) +17. vsts-task-lib (git+https://github.com/Microsoft/vsts-task-lib.git) + + +%% @types/mocha NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +MIT License + + Copyright (c) Microsoft Corporation. All rights reserved. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE +========================================= +END OF @types/mocha NOTICES, INFORMATION, AND LICENSE + +%% @types/node NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +MIT License + + Copyright (c) Microsoft Corporation. All rights reserved. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE +========================================= +END OF @types/node NOTICES, INFORMATION, AND LICENSE + +%% balanced-match NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +(MIT) + +Copyright (c) 2013 Julian Gruber <julian@juliangruber.com> + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +========================================= +END OF balanced-match NOTICES, INFORMATION, AND LICENSE + +%% brace-expansion NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +MIT License + +Copyright (c) 2013 Julian Gruber + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +========================================= +END OF brace-expansion NOTICES, INFORMATION, AND LICENSE + +%% concat-map NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +This software is released under the MIT license: + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF concat-map NOTICES, INFORMATION, AND LICENSE + +%% minimatch NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF minimatch NOTICES, INFORMATION, AND LICENSE + +%% mockery NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyrights for code authored by Yahoo! Inc. is licensed under the following + terms: + + MIT License + + Copyright (c) 2011 Yahoo! Inc. All Rights Reserved. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to + deal in the Software without restriction, including without limitation the + rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. +========================================= +END OF mockery NOTICES, INFORMATION, AND LICENSE + +%% q NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright 2009–2017 Kristopher Michael Kowal. All rights reserved. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. +========================================= +END OF q NOTICES, INFORMATION, AND LICENSE + +%% semver NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF semver NOTICES, INFORMATION, AND LICENSE + +%% shelljs NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) 2012, Artur Adib +All rights reserved. + +You may use this project under the terms of the New BSD license as follows: + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of Artur Adib nor the + names of the contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL ARTUR ADIB BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +========================================= +END OF shelljs NOTICES, INFORMATION, AND LICENSE + +%% tunnel NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) 2012 Koichi Kobayashi + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF tunnel NOTICES, INFORMATION, AND LICENSE + +%% typed-rest-client NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Visual Studio Team Services Client for Node.js + +Copyright (c) Microsoft Corporation + +All rights reserved. + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and +associated documentation files (the "Software"), to deal in the Software without restriction, +including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT +LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF typed-rest-client NOTICES, INFORMATION, AND LICENSE + +%% underscore NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative +Reporters & Editors + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF underscore NOTICES, INFORMATION, AND LICENSE + +%% uuid NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) 2010-2016 Robert Kieffer and other contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +========================================= +END OF uuid NOTICES, INFORMATION, AND LICENSE + +%% vso-node-api NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Visual Studio Team Services Client for Node.js + +Copyright (c) Microsoft Corporation + +All rights reserved. + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and +associated documentation files (the "Software"), to deal in the Software without restriction, +including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT +LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF vso-node-api NOTICES, INFORMATION, AND LICENSE + +%% vsts-task-lib NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) Microsoft Corporation. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +========================================= +END OF vsts-task-lib NOTICES, INFORMATION, AND LICENSE + +%% vsts-task-lib NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) Microsoft Corporation. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +========================================= +END OF vsts-task-lib NOTICES, INFORMATION, AND LICENSE + diff --git a/_generated/AndroidSigningV3_Node20/androidsigning.ts b/_generated/AndroidSigningV3_Node20/androidsigning.ts new file mode 100644 index 000000000000..1f174b3d51e9 --- /dev/null +++ b/_generated/AndroidSigningV3_Node20/androidsigning.ts @@ -0,0 +1,165 @@ +import * as path from 'path'; +import * as tl from 'azure-pipelines-task-lib/task'; +import * as semver from 'semver'; + +const findAndroidTool = (tool: string, version?: string): string => { + const androidHome = tl.getVariable('ANDROID_HOME'); + if (!androidHome) { + throw new Error(tl.loc('AndroidHomeNotSet')); + } + + // add * in search as on Windows the tool may end with ".exe" or ".bat. Exclude .jar files from the list" + const toolsList = tl.findMatch(tl.resolve(androidHome, 'build-tools'), [`${tool}*`, "!*.jar"], null, { matchBase: true }) + + if (!toolsList || toolsList.length === 0) { + throw new Error(tl.loc('CouldNotFindToolInAndroidHome', tool, androidHome)); + } + + // use latest tool version, sort toolsList descending + if(!version || version === 'latest') { + tl.debug(tl.loc('GetLatestToolVersion', tool)); + toolsList.sort((a: string, b: string) => { + const toolBaseDirA = path.basename(path.dirname(a)); + const toolBaseDirB = path.basename(path.dirname(b)); + // if parent folders are valid semantic versions, compare them, otherwise move to the end of the list + if(semver.valid(toolBaseDirA) && semver.valid(toolBaseDirB)) { + return semver.rcompare(toolBaseDirA, toolBaseDirB); + } else if(semver.valid(toolBaseDirA)) { + return -1; + } else { + return toolBaseDirA.localeCompare(toolBaseDirB); + } + }); + return toolsList[0]; + } + // try to find version specified + tl.debug(tl.loc('GetSpecifiedToolVersion', version, tool)); + let versions: string[] = toolsList.map(item => path.basename(path.dirname(item))); + versions = versions.filter(item => !!semver.valid(item) && item.startsWith(version)); + versions = versions.sort(semver.rcompare); + const matchingPath: string = toolsList.find(item => item.includes(versions[0])); + + if (!matchingPath) { + throw new Error(tl.loc('CouldNotFindVersionOfToolInAndroidHome', version, tool, androidHome)); + } + + return matchingPath; +}; + +/* +Signing the specified file with apksigner. Move the current file to fn.unsigned, and +place the signed file at the same location fn +*/ +const apksigning = (fn: string) => { + // file must exist + tl.checkPath(fn, 'file to sign'); + + let apksigner = tl.getInput('apksignerLocation', false); + + // if the tool path is not set, let's find one (anyone) from the SDK folder + if (!apksigner) { + const apksignerVersion: string = tl.getInput('apksignerVersion', false); + apksigner = findAndroidTool('apksigner', apksignerVersion); + } + + const apksignerRunner = tl.tool(apksigner); + + // Get keystore file path for signing + const keystoreFile = tl.getTaskVariable('KEYSTORE_FILE_PATH'); + + // Get keystore alias + const keystoreAlias = tl.getInput('keystoreAlias', true); + + const keystorePass = tl.getInput('keystorePass', false); + + const keyPass = tl.getInput('keyPass', false); + + const apksignerArguments = tl.getInput('apksignerArguments', false); + + apksignerRunner.arg(['sign', '--ks', keystoreFile]); + + if (keystorePass) { + apksignerRunner.arg(['--ks-pass', 'pass:' + keystorePass]); + } + + if (keystoreAlias) { + apksignerRunner.arg(['--ks-key-alias', keystoreAlias]); + } + + if (keyPass) { + apksignerRunner.arg(['--key-pass', 'pass:' + keyPass]); + } + + if (apksignerArguments) { + apksignerRunner.line(apksignerArguments); + } + + apksignerRunner.arg([fn]); + + return apksignerRunner.exec(null); +}; + +/* +Zipaligning apk +*/ +const zipaligning = (fn: string) => { + // file must exist + tl.checkPath(fn, 'file to zipalign'); + + let zipaligner = tl.getInput('zipalignLocation', false); + + // if the tool path is not set, let's find one (anyone) from the SDK folder + if (!zipaligner) { + const zipalignerVersion: string = tl.getInput('zipalignVersion', false); + zipaligner = findAndroidTool('zipalign', zipalignerVersion); + } + + const zipalignRunner = tl.tool(zipaligner); + + // alignment must be 4 or play store will reject, hard code this to avoid user errors + zipalignRunner.arg(['-v', '4']); + + const unalignedFn = fn + '.unaligned'; + const success = tl.mv(fn, unalignedFn, '-f', false); + + zipalignRunner.arg([unalignedFn, fn]); + return zipalignRunner.exec(null); +}; + +async function run() { + try { + // Configure localization + tl.setResourcePath(path.join(__dirname, 'task.json')); + + // Get files to be signed + const filesPattern: string = tl.getInput('files', true); + + // Signing the APK? + const apksign: boolean = tl.getBoolInput('apksign'); + + // Zipaligning the APK? + const zipalign: boolean = tl.getBoolInput('zipalign'); + + // Resolve files for the specified value or pattern + const filesToSign: string[] = tl.findMatch(null, filesPattern); + + // Fail if no matching files were found + if (!filesToSign || filesToSign.length === 0) { + throw new Error(tl.loc('NoMatchingFiles', filesPattern)); + } + + for (const file of filesToSign) { + if (zipalign) { + await zipaligning(file); + } + + if (apksign) { + await apksigning(file); + } + } + } catch (err) { + tl.setResult(tl.TaskResult.Failed, err); + } +} + +run(); \ No newline at end of file diff --git a/_generated/AndroidSigningV3_Node20/icon.png b/_generated/AndroidSigningV3_Node20/icon.png new file mode 100644 index 000000000000..502c38f46dd4 Binary files /dev/null and b/_generated/AndroidSigningV3_Node20/icon.png differ diff --git a/_generated/AndroidSigningV3_Node20/icon.svg b/_generated/AndroidSigningV3_Node20/icon.svg new file mode 100644 index 000000000000..38816323fb96 --- /dev/null +++ b/_generated/AndroidSigningV3_Node20/icon.svg @@ -0,0 +1,4 @@ + + + + diff --git a/_generated/AndroidSigningV3_Node20/make.json b/_generated/AndroidSigningV3_Node20/make.json new file mode 100644 index 000000000000..d5ad78d951ae --- /dev/null +++ b/_generated/AndroidSigningV3_Node20/make.json @@ -0,0 +1,12 @@ +{ + "rm": [ + { + "items": [ + "node_modules/azure-pipelines-tasks-securefiles-common/node_modules/vsts-task-lib", + "node_modules/azure-pipelines-tasks-securefiles-common/node_modules/azure-pipelines-task-lib", + "node_modules/mockery" + ], + "options": "-Rf" + } + ] +} \ No newline at end of file diff --git a/_generated/AndroidSigningV3_Node20/package-lock.json b/_generated/AndroidSigningV3_Node20/package-lock.json new file mode 100644 index 000000000000..f17b2dd4d900 --- /dev/null +++ b/_generated/AndroidSigningV3_Node20/package-lock.json @@ -0,0 +1,554 @@ +{ + "name": "vsts-androidsigning-task", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/concat-stream": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz", + "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==", + "requires": { + "@types/node": "*" + } + }, + "@types/form-data": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", + "integrity": "sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==", + "requires": { + "@types/node": "*" + } + }, + "@types/mocha": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", + "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==" + }, + "@types/node": { + "version": "20.7.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.7.0.tgz", + "integrity": "sha512-zI22/pJW2wUZOVyguFaUL1HABdmSVxpXrzIqkjsHmyUjNhPoWM1CKfvVuXfetHhIok4RY573cqS0mZ1SJEnoTg==" + }, + "@types/q": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.5.tgz", + "integrity": "sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ==" + }, + "@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "azure-devops-node-api": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/azure-devops-node-api/-/azure-devops-node-api-10.2.2.tgz", + "integrity": "sha512-4TVv2X7oNStT0vLaEfExmy3J4/CzfuXolEcQl/BRUmvGySqKStTG2O55/hUQ0kM7UJlZBLgniM0SBq4d/WkKow==", + "requires": { + "tunnel": "0.0.6", + "typed-rest-client": "^1.8.4" + } + }, + "azure-pipelines-task-lib": { + "version": "5.0.0-preview.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-5.0.0-preview.0.tgz", + "integrity": "sha512-uQJEv+q3/7RD7kgphFd33uXijaPwA1ePYoNkAgZpUhbZUtc2u4JL4ujTT/JJfgXBNW/QQNAiDQ2OC7vOQG/0tg==", + "requires": { + "minimatch": "3.0.5", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "sync-request": "6.1.0", + "uuid": "^3.0.1" + } + }, + "azure-pipelines-tasks-securefiles-common": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-tasks-securefiles-common/-/azure-pipelines-tasks-securefiles-common-2.1.0.tgz", + "integrity": "sha512-oE7VscWFZD+Ku0WM6e2b5Y0eDom4DTZvER/mSh3m/z9V0yN9JUahNR0Dye9NIj0BSIyfgcaxxNWBCzqJMsirIQ==", + "requires": { + "@types/node": "^10.17.0", + "@types/q": "^1.5.4", + "azure-devops-node-api": "10.2.2", + "azure-pipelines-task-lib": "^3.1.0" + }, + "dependencies": { + "@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + }, + "azure-pipelines-task-lib": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-3.4.0.tgz", + "integrity": "sha512-3eC4OTFw+7xD7A2aUhxR/j+jRlTI+vVfS0CGxt1pCLs4c/KmY0tQWgbqjD3157kmiucWxELBvgZHaD2gCBe9fg==", + "requires": { + "minimatch": "3.0.5", + "mockery": "^2.1.0", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "sync-request": "6.1.0", + "uuid": "^3.0.1" + } + } + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, + "form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + } + }, + "get-port": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", + "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==" + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "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" + }, + "dependencies": { + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==" + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "http-basic": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", + "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", + "requires": { + "caseless": "^0.12.0", + "concat-stream": "^1.6.2", + "http-response-object": "^3.0.1", + "parse-cache-control": "^1.0.1" + } + }, + "http-response-object": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", + "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", + "requires": { + "@types/node": "^10.0.3" + }, + "dependencies": { + "@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + } + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" + }, + "is-core-module": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", + "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", + "requires": { + "has": "^1.0.3" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "mockery": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mockery/-/mockery-2.1.0.tgz", + "integrity": "sha512-9VkOmxKlWXoDO/h1jDZaS4lH33aWfRiJiNT/tKj+8OGzrcFDLo8d0syGdbsc3Bc4GvRXPb+NMMvojotmuGJTvA==" + }, + "object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, + "parse-cache-control": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", + "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "promise": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", + "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", + "requires": { + "asap": "~2.0.6" + } + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==" + }, + "qs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "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" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "requires": { + "resolve": "^1.1.6" + } + }, + "resolve": { + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "requires": { + "is-core-module": "^2.11.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, + "sync-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", + "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==", + "requires": { + "http-response-object": "^3.0.1", + "sync-rpc": "^1.2.1", + "then-request": "^6.0.0" + } + }, + "sync-rpc": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz", + "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==", + "requires": { + "get-port": "^3.1.0" + } + }, + "then-request": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", + "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", + "requires": { + "@types/concat-stream": "^1.6.0", + "@types/form-data": "0.0.33", + "@types/node": "^8.0.0", + "@types/qs": "^6.2.31", + "caseless": "~0.12.0", + "concat-stream": "^1.6.0", + "form-data": "^2.2.0", + "http-basic": "^8.1.1", + "http-response-object": "^3.0.1", + "promise": "^8.0.0", + "qs": "^6.4.0" + }, + "dependencies": { + "@types/node": { + "version": "8.10.66", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", + "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==" + } + } + }, + "tunnel": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", + "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==" + }, + "typed-rest-client": { + "version": "1.8.9", + "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.8.9.tgz", + "integrity": "sha512-uSmjE38B80wjL85UFX3sTYEUlvZ1JgCRhsWj/fJ4rZ0FqDUFoIuodtiVeE+cUqiVTOKPdKrp/sdftD15MDek6g==", + "requires": { + "qs": "^6.9.1", + "tunnel": "0.0.6", + "underscore": "^1.12.1" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, + "typescript": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "dev": true + }, + "underscore": { + "version": "1.13.6", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz", + "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==" + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + } + } +} diff --git a/_generated/AndroidSigningV3_Node20/package.json b/_generated/AndroidSigningV3_Node20/package.json new file mode 100644 index 000000000000..d669be5308d4 --- /dev/null +++ b/_generated/AndroidSigningV3_Node20/package.json @@ -0,0 +1,28 @@ +{ + "name": "vsts-androidsigning-task", + "version": "1.0.0", + "description": "Azure Pipelines Android Signing Task", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/Microsoft/azure-pipelines-tasks.git" + }, + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Microsoft/azure-pipelines-tasks/issues" + }, + "homepage": "https://github.com/Microsoft/azure-pipelines-tasks#readme", + "dependencies": { + "@types/node": "^20.3.1", + "@types/mocha": "^5.2.7", + "azure-pipelines-task-lib": "^5.0.0-preview.0", + "azure-pipelines-tasks-securefiles-common": "2.1.0" + }, + "devDependencies": { + "typescript": "5.1.6" + } +} diff --git a/_generated/AndroidSigningV3_Node20/postandroidsigning.ts b/_generated/AndroidSigningV3_Node20/postandroidsigning.ts new file mode 100644 index 000000000000..746f2de6c26a --- /dev/null +++ b/_generated/AndroidSigningV3_Node20/postandroidsigning.ts @@ -0,0 +1,18 @@ +import * as fs from 'fs'; +import * as path from 'path'; +import * as tl from 'azure-pipelines-task-lib/task'; + +async function run() { + try { + tl.setResourcePath(path.join(__dirname, 'task.json')); + const keystoreFile: string = tl.getTaskVariable('KEYSTORE_FILE_PATH'); + if (keystoreFile && tl.exist(keystoreFile)) { + fs.unlinkSync(keystoreFile); + tl.debug('Deleted keystore file downloaded from the server: ' + keystoreFile); + } + } catch (err) { + tl.warning(tl.loc('DeleteKeystoreFileFailed', err)); + } +} + +run(); diff --git a/_generated/AndroidSigningV3_Node20/preandroidsigning.ts b/_generated/AndroidSigningV3_Node20/preandroidsigning.ts new file mode 100644 index 000000000000..440c57c8b0aa --- /dev/null +++ b/_generated/AndroidSigningV3_Node20/preandroidsigning.ts @@ -0,0 +1,22 @@ +import * as path from 'path'; +import * as secureFilesCommon from 'azure-pipelines-tasks-securefiles-common/securefiles-common'; +import * as tl from 'azure-pipelines-task-lib/task'; + +async function run() { + try { + tl.setResourcePath(path.join(__dirname, 'task.json')); + + const apksign: boolean = tl.getBoolInput('apksign'); + if (apksign) { + // download keystore file + const keystoreFileId: string = tl.getInput('keystoreFile', true); + const secureFileHelpers: secureFilesCommon.SecureFileHelpers = new secureFilesCommon.SecureFileHelpers(); + const keystoreFilePath: string = await secureFileHelpers.downloadSecureFile(keystoreFileId); + tl.setTaskVariable('KEYSTORE_FILE_PATH', keystoreFilePath); + } + } catch (err) { + tl.setResult(tl.TaskResult.Failed, err); + } +} + +run(); diff --git a/_generated/AndroidSigningV3_Node20/task.json b/_generated/AndroidSigningV3_Node20/task.json new file mode 100644 index 000000000000..91405904d280 --- /dev/null +++ b/_generated/AndroidSigningV3_Node20/task.json @@ -0,0 +1,238 @@ +{ + "id": "80F3F6A0-82A6-4A22-BA7A-E5B8C541B9B9", + "name": "AndroidSigning", + "friendlyName": "Android signing", + "description": "Sign and align Android APK files", + "helpUrl": "https://docs.microsoft.com/azure/devops/pipelines/tasks/build/android-signing", + "helpMarkDown": "[Learn more about this task](https://go.microsoft.com/fwlink/?LinkID=613717)", + "category": "Build", + "visibility": [ + "Build" + ], + "author": "Microsoft Corporation", + "version": { + "Major": 3, + "Minor": 229, + "Patch": 1 + }, + "releaseNotes": "This version of the task uses apksigner instead of jarsigner to sign APKs.", + "demands": [ + "JDK" + ], + "minimumAgentVersion": "2.182.1", + "groups": [ + { + "name": "apksignerOptions", + "displayName": "Signing Options", + "isExpanded": true + }, + { + "name": "zipalignOptions", + "displayName": "Zipalign Options", + "isExpanded": true + } + ], + "inputs": [ + { + "name": "files", + "aliases": [ + "apkFiles" + ], + "type": "filePath", + "label": "APK files", + "defaultValue": "**/*.apk", + "required": true, + "helpMarkDown": "Relative path from the repo root to the APK(s) you want to sign. You can use wildcards to specify multiple files ([more information](https://go.microsoft.com/fwlink/?linkid=856077)). For example, `**/bin/*.apk` for all .APK files in the 'bin' subfolder" + }, + { + "name": "apksign", + "type": "boolean", + "label": "Sign the APK", + "defaultValue": "true", + "required": false, + "groupName": "apksignerOptions", + "helpMarkDown": "Select this option to sign the APK with a provided keystore file. Unsigned APKs can only run in an emulator. APKs must be signed to run on a device." + }, + { + "name": "keystoreFile", + "aliases": [ + "apksignerKeystoreFile" + ], + "type": "secureFile", + "label": "Keystore file", + "defaultValue": "", + "required": true, + "visibleRule": "apksign = true", + "groupName": "apksignerOptions", + "helpMarkDown": "Select the keystore file that was uploaded to `Secure Files` to be used to sign the APK." + }, + { + "name": "keystorePass", + "aliases": [ + "apksignerKeystorePassword" + ], + "type": "string", + "label": "Keystore password", + "defaultValue": "", + "required": false, + "visibleRule": "apksign = true", + "groupName": "apksignerOptions", + "helpMarkDown": "Enter the password for the provided keystore file. Use a new variable with its lock enabled on the Variables tab to encrypt this value." + }, + { + "name": "keystoreAlias", + "aliases": [ + "apksignerKeystoreAlias" + ], + "type": "string", + "label": "Alias", + "defaultValue": "", + "required": false, + "visibleRule": "apksign = true", + "groupName": "apksignerOptions", + "helpMarkDown": "Enter the alias that identifies the public/private key pair to be used in the keystore file." + }, + { + "name": "keyPass", + "aliases": [ + "apksignerKeyPassword" + ], + "type": "string", + "label": "Key password", + "defaultValue": "", + "required": false, + "visibleRule": "apksign = true", + "groupName": "apksignerOptions", + "helpMarkDown": "Enter the key password for the alias and keystore file. Use a new variable with its lock enabled on the Variables tab to encrypt this value." + }, + { + "name": "apksignerVersion", + "type": "string", + "label": "apksigner version", + "defaultValue": "latest", + "required": false, + "visibleRule": "apksign = true", + "groupName": "apksignerOptions", + "helpMarkDown": "Enter Android SDK build-tools version to look apksigner executable from." + }, + { + "name": "apksignerArguments", + "type": "string", + "label": "apksigner arguments", + "defaultValue": "--verbose", + "required": false, + "visibleRule": "apksign = true", + "groupName": "apksignerOptions", + "helpMarkDown": "Provide any options to pass to the apksigner command line. Default is: --verbose" + }, + { + "name": "apksignerLocation", + "aliases": [ + "apksignerFile" + ], + "type": "string", + "label": "apksigner location", + "defaultValue": "", + "required": false, + "visibleRule": "apksign = true", + "groupName": "apksignerOptions", + "helpMarkDown": "Optionally specify the location of the apksigner executable used during signing. This defaults to the apksigner found in the Android SDK version folder that your application builds against." + }, + { + "name": "zipalign", + "type": "boolean", + "label": "Zipalign", + "defaultValue": "true", + "required": false, + "groupName": "zipalignOptions", + "helpMarkDown": "Select if you want to zipalign your package. This reduces the amount of RAM consumed by an app." + }, + { + "name": "zipalignVersion", + "type": "string", + "label": "Zipalign version", + "defaultValue": "latest", + "required": false, + "visibleRule": "zipalign = true", + "groupName": "zipalignOptions", + "helpMarkDown": "Enter Android SDK build-tools version to look zipalign executable from." + }, + { + "name": "zipalignLocation", + "aliases": [ + "zipalignFile" + ], + "type": "string", + "label": "Zipalign location", + "defaultValue": "", + "required": false, + "visibleRule": "zipalign = true", + "groupName": "zipalignOptions", + "helpMarkDown": "Optionally specify the location of the zipalign executable used during signing. This defaults to the zipalign found in the Android SDK version folder that your application builds against." + } + ], + "instanceNameFormat": "Signing and aligning APK file(s) $(files)", + "prejobexecution": { + "Node10": { + "target": "preandroidsigning.js", + "argumentFormat": "" + }, + "Node16": { + "target": "preandroidsigning.js", + "argumentFormat": "" + }, + "Node20": { + "target": "preandroidsigning.js", + "argumentFormat": "" + } + }, + "execution": { + "Node10": { + "target": "androidsigning.js", + "argumentFormat": "" + }, + "Node16": { + "target": "androidsigning.js", + "argumentFormat": "" + }, + "Node20": { + "target": "androidsigning.js", + "argumentFormat": "" + } + }, + "postjobexecution": { + "Node10": { + "target": "postandroidsigning.js", + "argumentFormat": "" + }, + "Node16": { + "target": "postandroidsigning.js", + "argumentFormat": "" + }, + "Node20": { + "target": "postandroidsigning.js", + "argumentFormat": "" + } + }, + "messages": { + "AndroidHomeNotSet": "The ANDROID_HOME environment variable is not set for the running user.", + "CouldNotFindToolInAndroidHome": "Could not find tool: %s inside ANDROID_HOME: %s", + "NoMatchingFiles": "No matching files were found with search pattern: %s", + "DeleteKeystoreFileFailed": "Failed to delete keystore file downloaded from the server: %s", + "CouldNotFindVersionOfToolInAndroidHome": "Could not find %s version of %s inside ANDROID_HOME: %s", + "GetLatestToolVersion": "Trying to get the latest installed version of tool: %s", + "GetSpecifiedToolVersion": "Trying to get version %s of %s" + }, + "restrictions": { + "commands": { + "mode": "restricted" + }, + "settableVariables": { + "allowed": [] + } + }, + "_buildConfigMapping": { + "Default": "3.229.0", + "Node20-225": "3.229.1" + } +} \ No newline at end of file diff --git a/_generated/AndroidSigningV3_Node20/task.loc.json b/_generated/AndroidSigningV3_Node20/task.loc.json new file mode 100644 index 000000000000..c8ceaf1b605c --- /dev/null +++ b/_generated/AndroidSigningV3_Node20/task.loc.json @@ -0,0 +1,238 @@ +{ + "id": "80F3F6A0-82A6-4A22-BA7A-E5B8C541B9B9", + "name": "AndroidSigning", + "friendlyName": "ms-resource:loc.friendlyName", + "description": "ms-resource:loc.description", + "helpUrl": "https://docs.microsoft.com/azure/devops/pipelines/tasks/build/android-signing", + "helpMarkDown": "ms-resource:loc.helpMarkDown", + "category": "Build", + "visibility": [ + "Build" + ], + "author": "Microsoft Corporation", + "version": { + "Major": 3, + "Minor": 229, + "Patch": 1 + }, + "releaseNotes": "ms-resource:loc.releaseNotes", + "demands": [ + "JDK" + ], + "minimumAgentVersion": "2.182.1", + "groups": [ + { + "name": "apksignerOptions", + "displayName": "ms-resource:loc.group.displayName.apksignerOptions", + "isExpanded": true + }, + { + "name": "zipalignOptions", + "displayName": "ms-resource:loc.group.displayName.zipalignOptions", + "isExpanded": true + } + ], + "inputs": [ + { + "name": "files", + "aliases": [ + "apkFiles" + ], + "type": "filePath", + "label": "ms-resource:loc.input.label.files", + "defaultValue": "**/*.apk", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.files" + }, + { + "name": "apksign", + "type": "boolean", + "label": "ms-resource:loc.input.label.apksign", + "defaultValue": "true", + "required": false, + "groupName": "apksignerOptions", + "helpMarkDown": "ms-resource:loc.input.help.apksign" + }, + { + "name": "keystoreFile", + "aliases": [ + "apksignerKeystoreFile" + ], + "type": "secureFile", + "label": "ms-resource:loc.input.label.keystoreFile", + "defaultValue": "", + "required": true, + "visibleRule": "apksign = true", + "groupName": "apksignerOptions", + "helpMarkDown": "ms-resource:loc.input.help.keystoreFile" + }, + { + "name": "keystorePass", + "aliases": [ + "apksignerKeystorePassword" + ], + "type": "string", + "label": "ms-resource:loc.input.label.keystorePass", + "defaultValue": "", + "required": false, + "visibleRule": "apksign = true", + "groupName": "apksignerOptions", + "helpMarkDown": "ms-resource:loc.input.help.keystorePass" + }, + { + "name": "keystoreAlias", + "aliases": [ + "apksignerKeystoreAlias" + ], + "type": "string", + "label": "ms-resource:loc.input.label.keystoreAlias", + "defaultValue": "", + "required": false, + "visibleRule": "apksign = true", + "groupName": "apksignerOptions", + "helpMarkDown": "ms-resource:loc.input.help.keystoreAlias" + }, + { + "name": "keyPass", + "aliases": [ + "apksignerKeyPassword" + ], + "type": "string", + "label": "ms-resource:loc.input.label.keyPass", + "defaultValue": "", + "required": false, + "visibleRule": "apksign = true", + "groupName": "apksignerOptions", + "helpMarkDown": "ms-resource:loc.input.help.keyPass" + }, + { + "name": "apksignerVersion", + "type": "string", + "label": "ms-resource:loc.input.label.apksignerVersion", + "defaultValue": "latest", + "required": false, + "visibleRule": "apksign = true", + "groupName": "apksignerOptions", + "helpMarkDown": "ms-resource:loc.input.help.apksignerVersion" + }, + { + "name": "apksignerArguments", + "type": "string", + "label": "ms-resource:loc.input.label.apksignerArguments", + "defaultValue": "--verbose", + "required": false, + "visibleRule": "apksign = true", + "groupName": "apksignerOptions", + "helpMarkDown": "ms-resource:loc.input.help.apksignerArguments" + }, + { + "name": "apksignerLocation", + "aliases": [ + "apksignerFile" + ], + "type": "string", + "label": "ms-resource:loc.input.label.apksignerLocation", + "defaultValue": "", + "required": false, + "visibleRule": "apksign = true", + "groupName": "apksignerOptions", + "helpMarkDown": "ms-resource:loc.input.help.apksignerLocation" + }, + { + "name": "zipalign", + "type": "boolean", + "label": "ms-resource:loc.input.label.zipalign", + "defaultValue": "true", + "required": false, + "groupName": "zipalignOptions", + "helpMarkDown": "ms-resource:loc.input.help.zipalign" + }, + { + "name": "zipalignVersion", + "type": "string", + "label": "ms-resource:loc.input.label.zipalignVersion", + "defaultValue": "latest", + "required": false, + "visibleRule": "zipalign = true", + "groupName": "zipalignOptions", + "helpMarkDown": "ms-resource:loc.input.help.zipalignVersion" + }, + { + "name": "zipalignLocation", + "aliases": [ + "zipalignFile" + ], + "type": "string", + "label": "ms-resource:loc.input.label.zipalignLocation", + "defaultValue": "", + "required": false, + "visibleRule": "zipalign = true", + "groupName": "zipalignOptions", + "helpMarkDown": "ms-resource:loc.input.help.zipalignLocation" + } + ], + "instanceNameFormat": "ms-resource:loc.instanceNameFormat", + "prejobexecution": { + "Node10": { + "target": "preandroidsigning.js", + "argumentFormat": "" + }, + "Node16": { + "target": "preandroidsigning.js", + "argumentFormat": "" + }, + "Node20": { + "target": "preandroidsigning.js", + "argumentFormat": "" + } + }, + "execution": { + "Node10": { + "target": "androidsigning.js", + "argumentFormat": "" + }, + "Node16": { + "target": "androidsigning.js", + "argumentFormat": "" + }, + "Node20": { + "target": "androidsigning.js", + "argumentFormat": "" + } + }, + "postjobexecution": { + "Node10": { + "target": "postandroidsigning.js", + "argumentFormat": "" + }, + "Node16": { + "target": "postandroidsigning.js", + "argumentFormat": "" + }, + "Node20": { + "target": "postandroidsigning.js", + "argumentFormat": "" + } + }, + "messages": { + "AndroidHomeNotSet": "ms-resource:loc.messages.AndroidHomeNotSet", + "CouldNotFindToolInAndroidHome": "ms-resource:loc.messages.CouldNotFindToolInAndroidHome", + "NoMatchingFiles": "ms-resource:loc.messages.NoMatchingFiles", + "DeleteKeystoreFileFailed": "ms-resource:loc.messages.DeleteKeystoreFileFailed", + "CouldNotFindVersionOfToolInAndroidHome": "ms-resource:loc.messages.CouldNotFindVersionOfToolInAndroidHome", + "GetLatestToolVersion": "ms-resource:loc.messages.GetLatestToolVersion", + "GetSpecifiedToolVersion": "ms-resource:loc.messages.GetSpecifiedToolVersion" + }, + "restrictions": { + "commands": { + "mode": "restricted" + }, + "settableVariables": { + "allowed": [] + } + }, + "_buildConfigMapping": { + "Default": "3.229.0", + "Node20-225": "3.229.1" + } +} \ No newline at end of file diff --git a/_generated/AndroidSigningV3_Node20/tsconfig.json b/_generated/AndroidSigningV3_Node20/tsconfig.json new file mode 100644 index 000000000000..0438b79f69ac --- /dev/null +++ b/_generated/AndroidSigningV3_Node20/tsconfig.json @@ -0,0 +1,6 @@ +{ + "compilerOptions": { + "target": "ES6", + "module": "commonjs" + } +} \ No newline at end of file diff --git a/_generated/AndroidSigningV3_Node20/typings.json b/_generated/AndroidSigningV3_Node20/typings.json new file mode 100644 index 000000000000..6560c46c749d --- /dev/null +++ b/_generated/AndroidSigningV3_Node20/typings.json @@ -0,0 +1,8 @@ +{ + "name": "vsts-androidsigning-task", + "dependencies": {}, + "globalDependencies": { + "node": "registry:dt/node#6.0.0+20160921192128", + "q": "registry:dt/q#0.0.0+20160613154756" + } +} diff --git a/_generated/ArchiveFilesV2.versionmap.txt b/_generated/ArchiveFilesV2.versionmap.txt new file mode 100644 index 000000000000..22bfac82ab29 --- /dev/null +++ b/_generated/ArchiveFilesV2.versionmap.txt @@ -0,0 +1,2 @@ +Default|2.229.0 +Node20-225|2.229.1 diff --git a/_generated/ArchiveFilesV2/Strings/resources.resjson/de-DE/resources.resjson b/_generated/ArchiveFilesV2/Strings/resources.resjson/de-DE/resources.resjson new file mode 100644 index 000000000000..0c1afabefe8b --- /dev/null +++ b/_generated/ArchiveFilesV2/Strings/resources.resjson/de-DE/resources.resjson @@ -0,0 +1,35 @@ +{ + "loc.friendlyName": "Dateien archivieren", + "loc.helpMarkDown": "[Weitere Informationen zu dieser Aufgabe](http://go.microsoft.com/fwlink/?LinkId=809083)", + "loc.description": "Dateien in 7z, TAR, TAR.GZ oder ZIP komprimieren", + "loc.instanceNameFormat": "Archive $(rootFolderOrFile)", + "loc.group.displayName.archive": "Archiv", + "loc.input.label.rootFolderOrFile": "Stammordner oder Datei für Archivierung", + "loc.input.help.rootFolderOrFile": "Geben Sie den Stammordner oder den Dateipfad an, der dem Archiv hinzugefügt werden soll. Wenn es sich um einen Ordner handelt, werden alle im Ordner enthaltenen Elemente dem resultierenden Archiv hinzugefügt.", + "loc.input.label.includeRootFolder": "Archivpfaden den Stammordnernamen voranstellen", + "loc.input.help.includeRootFolder": "Bei Auswahl dieser Option wird dem Namen des Stammordners ein Präfix zu Dateipfaden im Archiv vorangestellt. Andernfalls beginnen alle Dateipfade eine Ebene niedriger.

Angenommen, der ausgewählte Stammordner lautet \"/home/user/output/classes/\" und enthält \"com/acme/Main.class\".

  • Wenn diese Option ausgewählt wird, enthält das sich ergebende Archiv \"classes/com/acme/Main.class\".
  • Andernfalls enthält das Archiv \"com/acme/Main.class\".
", + "loc.input.label.archiveType": "Archivtyp", + "loc.input.help.archiveType": "Geben Sie das verwendete Komprimierungsschema an. Wenn Sie z. B. \"foo.jar\" erstellen möchten, wählen Sie \"zip\" als Komprimierungsoption aus und geben \"foo.jar\" als zu erstellende Archivdatei an. Wählen Sie \"tar\" für alle TAR-Dateien (einschließlich komprimierter Dateien) aus.", + "loc.input.label.sevenZipCompression": "7z-Komprimierung", + "loc.input.help.sevenZipCompression": "Wählen Sie optional eine Komprimierungsebene aus, oder geben Sie Keine an, um eine nicht komprimierte 7z-Datei zu erstellen.", + "loc.input.label.tarCompression": "TAR-Komprimierung", + "loc.input.help.tarCompression": "Wählen Sie optional ein Komprimierungsschema aus, oder wählen Sie \"Ohne\" aus, um eine nicht komprimierte TAR-Datei zu erstellen.", + "loc.input.label.archiveFile": "Zu erstellende Archivdatei", + "loc.input.help.archiveFile": "Geben Sie den Namen der zu erstellenden Archivdatei an. Wenn Sie z. B. \"foo.tgz\" erstellen möchten, wählen Sie den Archivtyp \"tar\" sowie \"gz\" für TAR-Komprimierung aus.", + "loc.input.label.replaceExistingArchive": "Vorhandenes Archiv ersetzen", + "loc.input.help.replaceExistingArchive": "Wenn bereits ein Archiv vorhanden ist, geben Sie an, ob es überschrieben werden soll. Andernfalls werden ihm Dateien hinzugefügt.", + "loc.input.label.verbose": "Ausführliche Ausgabe erzwingen", + "loc.input.help.verbose": "Bei Festlegung auf TRUE wird der ausführliche Ausgabemodus für Tools erzwungen. Diese Einstellung setzt \"quiet\" außer Kraft.", + "loc.input.label.quiet": "Stille Ausgabe erzwingen", + "loc.input.help.quiet": "Bei Festlegung auf TRUE wird der stille Ausgabemodus für Tools erzwungen. Diese Einstellung kann mit \"verbose\" außer Kraft gesetzt werden.", + "loc.messages.Filename": "files=%s", + "loc.messages.TarExists": "Die temporäre TAR-Datei \"%s\" ist bereits vorhanden. Es wird versucht, ihr Dateien hinzuzufügen.", + "loc.messages.RemoveBeforeCreation": "Die vorhandene Archivdatei wird vor dem Erstellen entfernt: %s", + "loc.messages.AlreadyExists": "Die Archivdatei \"%s\" ist bereits vorhanden. Es wird versucht, ihr Dateien hinzuzufügen.", + "loc.messages.ArchiveCreationFailedWithError": "Fehler beim Erstellen des Archivs für die Archivdatei: %s \nCode: %d \nstdout: %s \nstderr: %s \nFehler: %s;", + "loc.messages.ArchiveFileExistsButNotAFile": "Die angegebene Archivdatei \"%s\" ist bereits vorhanden und ist keine Datei.", + "loc.messages.FailedArchiveFile": "Die angegebene Archivdatei \"%s\" kann nicht erstellt werden, da nicht auf sie zugegriffen werden kann: %s", + "loc.messages.FoundNFiles": "%d Dateien gefunden", + "loc.messages.ArchivingFile": "Datei wird archiviert: %s", + "loc.messages.MoreFiles": "... %d weitere..." +} \ No newline at end of file diff --git a/_generated/ArchiveFilesV2/Strings/resources.resjson/en-US/resources.resjson b/_generated/ArchiveFilesV2/Strings/resources.resjson/en-US/resources.resjson new file mode 100644 index 000000000000..9de5c7cb22e3 --- /dev/null +++ b/_generated/ArchiveFilesV2/Strings/resources.resjson/en-US/resources.resjson @@ -0,0 +1,35 @@ +{ + "loc.friendlyName": "Archive files", + "loc.helpMarkDown": "[Learn more about this task](http://go.microsoft.com/fwlink/?LinkId=809083)", + "loc.description": "Compress files into .7z, .tar.gz, or .zip", + "loc.instanceNameFormat": "Archive $(rootFolderOrFile)", + "loc.group.displayName.archive": "Archive", + "loc.input.label.rootFolderOrFile": "Root folder or file to archive", + "loc.input.help.rootFolderOrFile": "Enter the root folder or file path to add to the archive. If a folder, everything under the folder will be added to the resulting archive.", + "loc.input.label.includeRootFolder": "Prepend root folder name to archive paths", + "loc.input.help.includeRootFolder": "If selected, the root folder name will be prepended to file paths within the archive. Otherwise, all file paths will start one level lower.

For example, suppose the selected root folder is: `/home/user/output/classes/`, and contains: `com/acme/Main.class`.

  • If selected, the resulting archive would contain: `classes/com/acme/Main.class`.
  • Otherwise, the resulting archive would contain: `com/acme/Main.class`.
", + "loc.input.label.archiveType": "Archive type", + "loc.input.help.archiveType": "Specify the compression scheme used. To create `foo.jar`, for example, choose `zip` for the compression, and specify `foo.jar` as the archive file to create. For all tar files (including compressed ones), choose `tar`.", + "loc.input.label.sevenZipCompression": "7z compression", + "loc.input.help.sevenZipCompression": "Optionally choose a compression level, or choose `None` to create an uncompressed 7z file.", + "loc.input.label.tarCompression": "Tar compression", + "loc.input.help.tarCompression": "Optionally choose a compression scheme, or choose `None` to create an uncompressed tar file.", + "loc.input.label.archiveFile": "Archive file to create", + "loc.input.help.archiveFile": "Specify the name of the archive file to create. For example, to create `foo.tgz`, select the `tar` archive type and `gz` for tar compression.", + "loc.input.label.replaceExistingArchive": "Replace existing archive", + "loc.input.help.replaceExistingArchive": "If an existing archive exists, specify whether to overwrite it. Otherwise, files will be added to it.", + "loc.input.label.verbose": "Force verbose output", + "loc.input.help.verbose": "If set to true, forces tools to use verbose output. Overrides 'quiet'", + "loc.input.label.quiet": "Force quiet output", + "loc.input.help.quiet": "If set to true, forces tools to use quiet output. Can be overridden by 'verbose'", + "loc.messages.Filename": "files=%s", + "loc.messages.TarExists": "Intermediate tar: %s already exists. Attempting to add files to it.", + "loc.messages.RemoveBeforeCreation": "Removing existing archive file before creation: %s", + "loc.messages.AlreadyExists": "Archive file: %s already exists. Attempting to add files to it.", + "loc.messages.ArchiveCreationFailedWithError": "Archive creation failed for archive file: %s \ncode: %d \nstdout: %s \nstderr: %s \nerror: %s;", + "loc.messages.ArchiveFileExistsButNotAFile": "Specified archive file: %s already exists and is not a file.", + "loc.messages.FailedArchiveFile": "Specified archive file: %s cannot be created because it cannot be accessed: %s", + "loc.messages.FoundNFiles": "Found %d files", + "loc.messages.ArchivingFile": "Archiving file: %s", + "loc.messages.MoreFiles": "... %d more ..." +} \ No newline at end of file diff --git a/_generated/ArchiveFilesV2/Strings/resources.resjson/es-ES/resources.resjson b/_generated/ArchiveFilesV2/Strings/resources.resjson/es-ES/resources.resjson new file mode 100644 index 000000000000..8c4c8d6e907e --- /dev/null +++ b/_generated/ArchiveFilesV2/Strings/resources.resjson/es-ES/resources.resjson @@ -0,0 +1,35 @@ +{ + "loc.friendlyName": "Archivos de almacenamiento", + "loc.helpMarkDown": "[Obtener más información acerca de esta tarea](http://go.microsoft.com/fwlink/?LinkId=809083)", + "loc.description": "Comprimir archivos en .7z, .tar.gz o .zip", + "loc.instanceNameFormat": "Archivo $(rootFolderOrFile)", + "loc.group.displayName.archive": "Archivo", + "loc.input.label.rootFolderOrFile": "Archivo o carpeta raíz que se va a archivar", + "loc.input.help.rootFolderOrFile": "Escriba la ruta de acceso al archivo o carpeta raíz que se va a agregar al archivo. Si es una carpeta, todo su contenido se agregará al archivo resultante.", + "loc.input.label.includeRootFolder": "Anteponer el nombre de la carpeta raíz a las rutas de acceso de archivos", + "loc.input.help.includeRootFolder": "Cuando se selecciona, el nombre de la carpeta raíz se antepone a las rutas de acceso de archivo que contiene el archivo. De lo contrario, todas las rutas de acceso de archivo comienzan en un nivel inferior.

Por ejemplo, imagine que la carpeta raíz seleccionada es \"/home/user/output/classes/\", que contiene \"com/acme/Main.class\".

  • Si se selecciona esta opción, el archivo resultante contendría \"classes/com/acme/Main.class\".
  • En caso contrario, contendría \"com/acme/Main.class\".
", + "loc.input.label.archiveType": "Tipo de archivo de almacenamiento", + "loc.input.help.archiveType": "Especifique el esquema de compresión utilizado. Para crear `foo.jar`, por ejemplo, elija `zip` para la compresión y especifique `foo.jar` como archivo de almacenamiento que se va a crear. Para todos los archivos tar (incluidos los comprimidos), elija `tar`.", + "loc.input.label.sevenZipCompression": "Compresión 7z", + "loc.input.help.sevenZipCompression": "También puede elegir un nivel de compresión o seleccionar \"Ninguno\" para crear un archivo 7z descomprimido.", + "loc.input.label.tarCompression": "Compresión tar", + "loc.input.help.tarCompression": "También puede elegir un esquema de compresión, o bien elegir \"Ninguno\" para crear un archivo .tar descomprimido.", + "loc.input.label.archiveFile": "Archivo de almacenamiento que se va a crear", + "loc.input.help.archiveFile": "Especifique el nombre del archivo de almacenamiento que se va a crear. Por ejemplo, para crear \"foo.tgz\", seleccione el tipo de archivo \"tar\" y \"gz\" para la compresión tar.", + "loc.input.label.replaceExistingArchive": "Reemplazar el archivo de almacenamiento existente", + "loc.input.help.replaceExistingArchive": "Si ya existe un archivo de almacenamiento, especifique si quiere sobrescribirlo. De lo contrario, se le agregarán los archivos.", + "loc.input.label.verbose": "Forzar salida detallada", + "loc.input.help.verbose": "Si se establece en true, fuerza a las herramientas a usar una salida detallada. Invalida a \"quiet\".", + "loc.input.label.quiet": "Forzar salida silenciosa", + "loc.input.help.quiet": "Si se establece en true, fuerza a las herramientas a usar una salida silenciosa. Se puede invalidar con \"verbose\".", + "loc.messages.Filename": "files=%s", + "loc.messages.TarExists": "El archivo tar intermedio %s ya existe. Intentando agregar archivos.", + "loc.messages.RemoveBeforeCreation": "Quitando el archivo de almacenamiento existente antes de la creación: %s", + "loc.messages.AlreadyExists": "El archivo de almacenamiento %s ya existe. Intentando agregar archivos.", + "loc.messages.ArchiveCreationFailedWithError": "Error de creación del archivo de almacenamiento: %s \nCódigo: %d \nStdOut: %s \nStdErr: %s \nError: %s;", + "loc.messages.ArchiveFileExistsButNotAFile": "El archivo de almacenamiento especificado %s ya existe y no es un archivo.", + "loc.messages.FailedArchiveFile": "El archivo de almacenamiento %s especificado no se puede crear, porque no se puede acceder a él: %s", + "loc.messages.FoundNFiles": "Se encontraron %d archivos", + "loc.messages.ArchivingFile": "Archivo de almacenamiento: %s", + "loc.messages.MoreFiles": "... %d más..." +} \ No newline at end of file diff --git a/_generated/ArchiveFilesV2/Strings/resources.resjson/fr-FR/resources.resjson b/_generated/ArchiveFilesV2/Strings/resources.resjson/fr-FR/resources.resjson new file mode 100644 index 000000000000..7264d0152063 --- /dev/null +++ b/_generated/ArchiveFilesV2/Strings/resources.resjson/fr-FR/resources.resjson @@ -0,0 +1,35 @@ +{ + "loc.friendlyName": "Archiver les fichiers", + "loc.helpMarkDown": "[En savoir plus sur cette tâche](http://go.microsoft.com/fwlink/?LinkId=809083)", + "loc.description": "Compresser les fichiers aux formats .7z, .tar.gz ou .zip", + "loc.instanceNameFormat": "Archive $(rootFolderOrFile)", + "loc.group.displayName.archive": "Archiver", + "loc.input.label.rootFolderOrFile": "Dossier ou fichier racine à archiver", + "loc.input.help.rootFolderOrFile": "Entrez le chemin du dossier ou fichier racine à ajouter à l'archive. S'il s'agit d'un dossier, tout ce qu'il contient est ajouté à l'archive résultante.", + "loc.input.label.includeRootFolder": "Placer le nom du dossier racine au début des chemins d'archives", + "loc.input.help.includeRootFolder": "Si vous sélectionnez l'option correspondante, le nom du dossier racine est placé au début des chemins de fichiers dans l'archive. Sinon, tous les chemins de fichiers commencent un niveau plus bas.

Par exemple, le dossier racine sélectionné est '/home/user/output/classes/', et contient 'com/acme/Main.class'.

  • Si vous sélectionnez l'option correspondante, l'archive résultante contient 'classes/com/acme/Main.class'.
  • Sinon, l'archive résultante contient 'com/acme/Main.class'.
", + "loc.input.label.archiveType": "Type d'archive", + "loc.input.help.archiveType": "Spécifiez le modèle de compression utilisé. Pour créer 'foo.jar', par exemple, choisissez la compression 'zip', puis spécifiez la création du fichier d'archive 'foo.jar'. Pour tous les fichiers tar (notamment les fichiers compressés), choisissez 'tar'.", + "loc.input.label.sevenZipCompression": "Compression 7z", + "loc.input.help.sevenZipCompression": "Vous pouvez éventuellement choisir un niveau de compression, ou choisir Non pour créer un fichier 7z non compressé.", + "loc.input.label.tarCompression": "Compression Tar", + "loc.input.help.tarCompression": "Vous pouvez éventuellement choisir un modèle de compression, ou choisir 'Non' pour créer un fichier tar non compressé.", + "loc.input.label.archiveFile": "Fichier d'archive à créer", + "loc.input.help.archiveFile": "Spécifiez le nom du fichier d'archive à créer. Par exemple, pour créer 'foo.tgz', sélectionnez le type d'archive 'tar', puis 'gz' pour la compression tar.", + "loc.input.label.replaceExistingArchive": "Remplacer l'archive existante", + "loc.input.help.replaceExistingArchive": "S'il existe déjà une archive, indiquez si elle doit être remplacée. Sinon, les fichiers sont ajoutés à cette archive.", + "loc.input.label.verbose": "Forcer la sortie détaillée", + "loc.input.help.verbose": "Si la valeur est true, force les outils à utiliser une sortie détaillée. Remplace 'quiet'", + "loc.input.label.quiet": "Forcer la sortie sans assistance", + "loc.input.help.quiet": "Si la valeur est true, force les outils à utiliser une sortie sans assistance. Vous pouvez utiliser 'verbose' à la place", + "loc.messages.Filename": "files=%s", + "loc.messages.TarExists": "Le fichier tar intermédiaire %s existe déjà. Tentative d'ajout de fichiers à celui-ci.", + "loc.messages.RemoveBeforeCreation": "Suppression du fichier d'archive existant avant la création : %s", + "loc.messages.AlreadyExists": "Le fichier d'archive %s existe déjà. Tentative d'ajout de fichiers à celui-ci.", + "loc.messages.ArchiveCreationFailedWithError": "La création de l'archive a échoué pour le fichier d'archive %s \nCode : %d \nstdOut : %s \nstderr : %s \nErreur : %s;", + "loc.messages.ArchiveFileExistsButNotAFile": "Le fichier d'archive spécifié %s existe déjà et ce n'est pas un fichier.", + "loc.messages.FailedArchiveFile": "Impossible de créer le fichier d'archive spécifié %s, car il n'est pas accessible : %s", + "loc.messages.FoundNFiles": "%d fichiers trouvés", + "loc.messages.ArchivingFile": "Archivage du fichier : %s", + "loc.messages.MoreFiles": "... %d de plus..." +} \ No newline at end of file diff --git a/_generated/ArchiveFilesV2/Strings/resources.resjson/it-IT/resources.resjson b/_generated/ArchiveFilesV2/Strings/resources.resjson/it-IT/resources.resjson new file mode 100644 index 000000000000..4214ee4fa25e --- /dev/null +++ b/_generated/ArchiveFilesV2/Strings/resources.resjson/it-IT/resources.resjson @@ -0,0 +1,35 @@ +{ + "loc.friendlyName": "Archivia file", + "loc.helpMarkDown": "[Altre informazioni su questa attività](http://go.microsoft.com/fwlink/?LinkId=809083)", + "loc.description": "Comprime i file in formato .7z, .tar.gz o .zip", + "loc.instanceNameFormat": "Archivia $(rootFolderOrFile)", + "loc.group.displayName.archive": "Archivia", + "loc.input.label.rootFolderOrFile": "Cartella radice o file da archiviare", + "loc.input.help.rootFolderOrFile": "Consente di immettere la cartella radice o il percorso file da aggiungere all'archivio. Se è una cartella, tutti gli elementi presenti sotto la cartella verranno aggiunti all'archivio risultante.", + "loc.input.label.includeRootFolder": "Anteponi il nome della cartella radice ai percorsi di archivio", + "loc.input.help.includeRootFolder": "Se questa opzione è selezionata, il nome della cartella radice verrà anteposto ai percorsi di file all'interno dell'archivio. In caso contrario, tutti i percorsi di file inizieranno un livello più in basso.

Ad esempio, si supponga che la cartella radice selezionata sia `/home/user/output/classes/` e che contenga `com/acme/Main.class`.

  • Se questa opzione è selezionata, l'archivio risultante conterrà `classes/com/acme/Main.class`.
  • In caso contrario, l'archivio risultante conterrà `com/acme/Main.class`.
", + "loc.input.label.archiveType": "Tipo di archivio", + "loc.input.help.archiveType": "Specificare lo schema di compressione usato. Per creare `foo.jar`, ad esempio, scegliere `zip` per la compressione e specificare `foo.jar` come file di archivio da creare. Per tutti i file TAR, inclusi quelli compressi, scegliere `tar`.", + "loc.input.label.sevenZipCompression": "Compressione 7z", + "loc.input.help.sevenZipCompression": "Consente facoltativamente di scegliere un livello di compressione oppure `None` per creare un file 7z non compresso.", + "loc.input.label.tarCompression": "Compressione TAR", + "loc.input.help.tarCompression": "Consente facoltativamente di scegliere uno schema di compressione oppure `None` per creare un file TAR non compresso.", + "loc.input.label.archiveFile": "File di archivio da creare", + "loc.input.help.archiveFile": "Specificare il nome del file di archivio da creare. Ad esempio, per creare `foo.tgz`, selezionare il tipo di archivio `tar` e `gz` per la compressione del file TAR.", + "loc.input.label.replaceExistingArchive": "Sostituisci l'archivio esistente", + "loc.input.help.replaceExistingArchive": "Se è presente un archivio esistente, specifica se sovrascriverlo. In caso contrario, i file verranno aggiunti all'archivio.", + "loc.input.label.verbose": "Forza output dettagliato", + "loc.input.help.verbose": "Se è impostato su true, impone agli strumenti di usare l'output dettagliato. Esegue l'override di 'quiet'", + "loc.input.label.quiet": "Forza output non interattivo", + "loc.input.help.quiet": "Se è impostato su true, impone agli strumenti di usare l'output non interattivo. È possibile eseguirne l'override con 'verbose'", + "loc.messages.Filename": "file=%s", + "loc.messages.TarExists": "Il file TAR intermedio %s esiste già. Verrà effettuato il tentativo di aggiungervi file.", + "loc.messages.RemoveBeforeCreation": "Rimozione del file di archivio esistente prima della creazione: %s", + "loc.messages.AlreadyExists": "Il file di archivio %s esiste già. Verrà effettuato il tentativo di aggiungervi file.", + "loc.messages.ArchiveCreationFailedWithError": "La creazione dell'archivio non è riuscita per il file di archivio: %s \nCodice: %d \nStdout: %s \nStderr: %s \nErrore: %s;", + "loc.messages.ArchiveFileExistsButNotAFile": "Il file di archivio specificato %s esiste già e non è un file.", + "loc.messages.FailedArchiveFile": "Non è possibile creare il file di archivio specificato %s perché non è accessibile: %s", + "loc.messages.FoundNFiles": "Sono stati trovati %d file", + "loc.messages.ArchivingFile": "Archiviazione del file: %s", + "loc.messages.MoreFiles": "... altri %d..." +} \ No newline at end of file diff --git a/_generated/ArchiveFilesV2/Strings/resources.resjson/ja-JP/resources.resjson b/_generated/ArchiveFilesV2/Strings/resources.resjson/ja-JP/resources.resjson new file mode 100644 index 000000000000..d08332659271 --- /dev/null +++ b/_generated/ArchiveFilesV2/Strings/resources.resjson/ja-JP/resources.resjson @@ -0,0 +1,35 @@ +{ + "loc.friendlyName": "ファイルのアーカイブ", + "loc.helpMarkDown": "[このタスクの詳細を表示](http://go.microsoft.com/fwlink/?LinkId=809083)", + "loc.description": "ファイルを .7z、.tar.gz、または .zip に圧縮します", + "loc.instanceNameFormat": "アーカイブ $(rootFolderOrFile)", + "loc.group.displayName.archive": "アーカイブ", + "loc.input.label.rootFolderOrFile": "アーカイブするルート フォルダーまたはファイル", + "loc.input.help.rootFolderOrFile": "アーカイブに追加するルート フォルダーまたはファイル パスを入力します。フォルダーの場合、結果として作成されるアーカイブにはそのフォルダー配下のすべてが追加されます。", + "loc.input.label.includeRootFolder": "アーカイブ パスの先頭にルート フォルダー名を追加", + "loc.input.help.includeRootFolder": "選択すると、ルート フォルダーの名前が、アーカイブ内のファイル パスの前に付加されます。選択しない場合には、すべてのファイル パスは 1 レベル深い階層から始まります。

たとえば、選択したルート フォルダーが `/home/user/output/classes/` で、`com/acme/Main.class` が含まれているとします。

  • 選択すると、生成されるアーカイブには `classes/com/acme/Main.class` が入ります。
  • 選択しない場合には、生成されるアーカイブには `com/acme/Main.class` が入ります。
", + "loc.input.label.archiveType": "アーカイブの種類", + "loc.input.help.archiveType": "使用する圧縮スキームを指定します。たとえば、`foo.jar` を作成する場合、圧縮に `zip` を選択し、作成するアーカイブ ファイルとして `foo.jar` を指定します。すべての tar ファイル (圧縮されたものも含め) には、`tar` を選択します。", + "loc.input.label.sevenZipCompression": "7z 圧縮", + "loc.input.help.sevenZipCompression": "(省略可能) 圧縮レベルを選択します。あるいは、圧縮されていない 7z ファイルを作成する場合には `None` を選択します。", + "loc.input.label.tarCompression": "Tar 圧縮", + "loc.input.help.tarCompression": "(省略可能) 圧縮スキーマを選択します。あるいは、圧縮されていない tar ファイルを作成する場合には `None` を選択します。", + "loc.input.label.archiveFile": "作成するアーカイブ ファイル", + "loc.input.help.archiveFile": "作成するアーカイブ ファイルの名前を指定します。たとえば、`foo.tgz` を作成する場合、`tar` アーカイブ型と `gz` を tar 圧縮のために選択します。", + "loc.input.label.replaceExistingArchive": "既存のアーカイブを置換", + "loc.input.help.replaceExistingArchive": "既存のアーカイブが存在する場合、上書きするかどうかを指定します。上書きしない場合には、ファイルは追加されます。", + "loc.input.label.verbose": "詳細出力を強制する", + "loc.input.help.verbose": "True に設定すると、ツールが詳細出力を使用するよう強制します。'quiet' をオーバーライドします", + "loc.input.label.quiet": "非表示出力を強制する", + "loc.input.help.quiet": "True に設定すると、ツールが非表示出力を使用するよう強制します。'verbose' でオーバーライドできます", + "loc.messages.Filename": "files=%s", + "loc.messages.TarExists": "中間 tar %s は既に存在しています。ファイルの追加を試行しています。", + "loc.messages.RemoveBeforeCreation": "作成する前に既存のアーカイブ ファイルを削除しています: %s", + "loc.messages.AlreadyExists": "アーカイブ ファイル %s は既に存在しています。ファイルの追加を試行しています。", + "loc.messages.ArchiveCreationFailedWithError": "次のアーカイブ ファイルのアーカイブ作成に失敗しました: %s \ncode: %d \nstdout: %s \nstderr: %s \nerror: %s;", + "loc.messages.ArchiveFileExistsButNotAFile": "指定されたアーカイブ ファイル %s は既に存在しており、ファイルではありません。", + "loc.messages.FailedArchiveFile": "指定されたアーカイブ ファイル %s は、アクセスできないので作成できません: %s", + "loc.messages.FoundNFiles": "%d 件のファイルが見つかりました", + "loc.messages.ArchivingFile": "ファイル (%s) をアーカイブしています", + "loc.messages.MoreFiles": "... さらに %d 件 ..." +} \ No newline at end of file diff --git a/_generated/ArchiveFilesV2/Strings/resources.resjson/ko-KR/resources.resjson b/_generated/ArchiveFilesV2/Strings/resources.resjson/ko-KR/resources.resjson new file mode 100644 index 000000000000..163538d36397 --- /dev/null +++ b/_generated/ArchiveFilesV2/Strings/resources.resjson/ko-KR/resources.resjson @@ -0,0 +1,35 @@ +{ + "loc.friendlyName": "보관 파일", + "loc.helpMarkDown": "[이 작업에 대한 자세한 정보](http://go.microsoft.com/fwlink/?LinkId=809083)", + "loc.description": "파일을 .7z, .tar.gz 또는 .zip으로 압축", + "loc.instanceNameFormat": "$(rootFolderOrFile) 보관", + "loc.group.displayName.archive": "보관", + "loc.input.label.rootFolderOrFile": "보관할 루트 폴더 또는 파일", + "loc.input.help.rootFolderOrFile": "보관 파일에 추가할 루트 폴더 또는 파일 경로를 입력합니다. 폴더를 입력하는 경우 폴더 아래에 있는 모든 항목이 결과 보관 파일에 추가됩니다.", + "loc.input.label.includeRootFolder": "보관 파일 경로에 루트 폴더 이름을 접두사로 추가", + "loc.input.help.includeRootFolder": "선택하는 경우 루트 폴더 이름이 보관 파일 내의 파일 경로에 접두사로 추가됩니다. 선택하지 않으면 모든 파일 경로가 한 단계 낮은 경로로 시작합니다.

예를 들어 선택한 루트 폴더가 '/home/user/output/classes/'이고, 'com/acme/Main.class'를 포함하고 있다고 가정합니다.

  • 선택하는 경우 결과 보관 파일은 'classes/com/acme/Main.class'를 포함합니다.
  • 선택하지 않으면 결과 보관 파일은 'com/acme/Main.class'를 포함합니다.
", + "loc.input.label.archiveType": "보관 파일 형식", + "loc.input.help.archiveType": "사용되는 압축 체계를 지정합니다. 예를 들어 `foo.jar`을 만들려면 압축 형식으로 `zip`을 선택하고 만들 보관 파일로 `foo.jar`을 선택합니다. 모든 tar 파일(압축된 tar 포함)의 경우 `tar`을 선택합니다.", + "loc.input.label.sevenZipCompression": "7z 압축", + "loc.input.help.sevenZipCompression": "선택적으로 압축 수준을 선택하거나, `없음`을 선택하여 압축되지 않은 7z 파일을 만듭니다.", + "loc.input.label.tarCompression": "Tar 압축", + "loc.input.help.tarCompression": "선택적으로 압축 체계를 선택하거나, `없음`을 선택하여 압축되지 않은 tar 파일을 만듭니다.", + "loc.input.label.archiveFile": "만들 보관 파일", + "loc.input.help.archiveFile": "만들려는 보관 파일의 이름을 지정합니다. 예를 들어 `foo.tgz`를 만들려면 `tar` 보관 파일 형식을 선택하고 tar 압축의 경우 `gz`를 선택합니다.", + "loc.input.label.replaceExistingArchive": "기존 보관 파일 바꾸기", + "loc.input.help.replaceExistingArchive": "기존 보관 파일이 있는 경우 해당 파일을 덮어쓸지 지정합니다. 그러지 않으면 파일이 기존 보관 파일에 추가됩니다.", + "loc.input.label.verbose": "자세한 정보 출력 강제 적용", + "loc.input.help.verbose": "true로 설정하면, 도구에서 강제로 자세한 정보 출력을 사용합니다. 'quiet'를 재정의합니다.", + "loc.input.label.quiet": "자동 출력 강제 적용", + "loc.input.help.quiet": "true로 설정하면, 도구에서 강제로 자동 출력을 사용합니다. 'verbose'를 통해 재정의할 수 있습니다.", + "loc.messages.Filename": "files=%s", + "loc.messages.TarExists": "중간 tar %s이(가) 이미 있습니다. 여기에 파일을 추가하려고 시도하고 있습니다.", + "loc.messages.RemoveBeforeCreation": "만들기 전에 기존 보관 파일을 제거하는 중입니다. %s", + "loc.messages.AlreadyExists": "보관 파일 %s이(가) 이미 있습니다. 이 파일에 파일을 추가하려고 시도하고 있습니다.", + "loc.messages.ArchiveCreationFailedWithError": "보관 파일 %s에 대한 아카이브를 만들지 못했습니다. \n코드: %d \nstdout: %s \nstderr: %s \n오류: %s;", + "loc.messages.ArchiveFileExistsButNotAFile": "지정된 보관 파일 %s은(는) 이미 있으며 파일이 아닙니다.", + "loc.messages.FailedArchiveFile": "지정된 보관 파일 %s은(는) 액세스할 수 없으므로 만들 수 없습니다. %s", + "loc.messages.FoundNFiles": "%d개 파일을 찾았습니다.", + "loc.messages.ArchivingFile": "보관 파일: %s", + "loc.messages.MoreFiles": "... %d개 더..." +} \ No newline at end of file diff --git a/_generated/ArchiveFilesV2/Strings/resources.resjson/ru-RU/resources.resjson b/_generated/ArchiveFilesV2/Strings/resources.resjson/ru-RU/resources.resjson new file mode 100644 index 000000000000..9836a5e06ee7 --- /dev/null +++ b/_generated/ArchiveFilesV2/Strings/resources.resjson/ru-RU/resources.resjson @@ -0,0 +1,35 @@ +{ + "loc.friendlyName": "Архивировать файлы", + "loc.helpMarkDown": "[См. дополнительные сведения об этой задаче](http://go.microsoft.com/fwlink/?LinkId=809083)", + "loc.description": "Сжатие файлов в формате 7Z, TAR.GZ или ZIP", + "loc.instanceNameFormat": "Архив $(rootFolderOrFile)", + "loc.group.displayName.archive": "Архив", + "loc.input.label.rootFolderOrFile": "Корневая папка или файл для архивации", + "loc.input.help.rootFolderOrFile": "Введите корневой путь к файлу или папке для добавления в архив. Если указан путь к папке, в архив будут добавлены все элементы из нее.", + "loc.input.label.includeRootFolder": "Добавлять имя корневой папки в начало путей к архивам", + "loc.input.help.includeRootFolder": "Если этот флажок установлен, имя корневой папки будет добавляться в пути к файлам в архиве в качестве префикса. В противном случае все пути к файлам будут начинаться на один уровень ниже.

Предположим, выбрана корневая папка /home/user/output/classes/, которая содержит файл com/acme/Main.class.

  • Если флажок установлен, полученный архив будет содержать файл classes/com/acme/Main.class.
  • В противном случае полученный архив будет содержать файл com/acme/Main.class.
", + "loc.input.label.archiveType": "Тип архива", + "loc.input.help.archiveType": "Укажите используемую схему сжатия. Например, чтобы создать файл foo.jar, выберите в качестве типа сжатия zip и укажите foo.jar в качестве создаваемого файла архива. Для всех TAR-файлов (включая сжатые) выбирайте tar.", + "loc.input.label.sevenZipCompression": "Сжатие в формате 7Z", + "loc.input.help.sevenZipCompression": "При необходимости выберите уровень сжатия или выберите Нет для создания несжатого 7Z-файла.", + "loc.input.label.tarCompression": "Сжатие TAR", + "loc.input.help.tarCompression": "При необходимости выберите схему сжатия или выберите Нет для создания несжатого TAR-файла.", + "loc.input.label.archiveFile": "Создаваемый файл архива", + "loc.input.help.archiveFile": "Укажите имя файла архива. Например, чтобы создать файл foo.tgz, выберите тип архива tar и gz для сжатия TAR.", + "loc.input.label.replaceExistingArchive": "Заменить существующий архив", + "loc.input.help.replaceExistingArchive": "Если имеется существующий архив, укажите, следует ли перезаписать его. В противном случае файлы будут добавлены в него.", + "loc.input.label.verbose": "Принудительный подробный вывод", + "loc.input.help.verbose": "Если задано значение true, средства принудительно используют подробный вывод. Переопределяет \"тихий\" режим", + "loc.input.label.quiet": "Принудительный тихий вывод", + "loc.input.help.quiet": "Если задано значение true, средства принудительно используют тихий вывод. Может быть переопределен \"подробным\" режимом", + "loc.messages.Filename": "files=%s", + "loc.messages.TarExists": "Промежуточный TAR-файл уже существует: %s. Идет попытка добавления файлов в него.", + "loc.messages.RemoveBeforeCreation": "Удаление существующего архивного файла перед созданием: %s", + "loc.messages.AlreadyExists": "Архивный файл уже существует: %s. Идет попытка добавления файлов в него.", + "loc.messages.ArchiveCreationFailedWithError": "Сбой создания архивного файла: %s \ncode: %d \nstdout: %s \nstderr: %s \nerror: %s;", + "loc.messages.ArchiveFileExistsButNotAFile": "Указанный архивный файл уже существует и не является файлом: %s", + "loc.messages.FailedArchiveFile": "Указанный архивный файл %s невозможно создать, так как он недоступен: %s", + "loc.messages.FoundNFiles": "Найдено файлов: %d", + "loc.messages.ArchivingFile": "Архивный файл: %s", + "loc.messages.MoreFiles": "... еще %d ..." +} \ No newline at end of file diff --git a/_generated/ArchiveFilesV2/Strings/resources.resjson/zh-CN/resources.resjson b/_generated/ArchiveFilesV2/Strings/resources.resjson/zh-CN/resources.resjson new file mode 100644 index 000000000000..e708e125def2 --- /dev/null +++ b/_generated/ArchiveFilesV2/Strings/resources.resjson/zh-CN/resources.resjson @@ -0,0 +1,35 @@ +{ + "loc.friendlyName": "存档文件", + "loc.helpMarkDown": "[详细了解此任务](http://go.microsoft.com/fwlink/?LinkId=809083)", + "loc.description": "将文件压缩为 .7z、.tar、.gz 或 .zip", + "loc.instanceNameFormat": "存档 $(rootFolderOrFile)", + "loc.group.displayName.archive": "存档", + "loc.input.label.rootFolderOrFile": "要存档的根文件夹或文件", + "loc.input.help.rootFolderOrFile": "输入要添加到存档的根文件夹或文件路径。如果是一个文件夹,该文件夹下的所有内容都将添加到生成的存档。", + "loc.input.label.includeRootFolder": "在存档路径前加上根文件夹名称", + "loc.input.help.includeRootFolder": "如果选中,将在存档内向文件路径添加根文件夹名称。否则,所有文件路径将从低一级开始。

例如,假设所选根文件夹为: `/home/user/output/classes/`,且包含: `com/acme/Main.class`

  • 如果选定,则生成的存档将包含: `classes/com/acme/Main.class`
  • 否则,生成的存档将包含: `com/acme/Main.class`
", + "loc.input.label.archiveType": "存档类型", + "loc.input.help.archiveType": "指定使用的压缩方案。例如,若要创建 \"foo.jar\",请选择 \"zip\" 以指定压缩,并指定 \"foo.jar\" 作为要创建的存档文件。对于所有 tar 文件(包括压缩的),请选择 \"tar\"。", + "loc.input.label.sevenZipCompression": "7z 压缩", + "loc.input.help.sevenZipCompression": "可以选择压缩级别,或选择 `None` 以创建未压缩的 7z 文件。", + "loc.input.label.tarCompression": "Tar 压缩", + "loc.input.help.tarCompression": "可以选择压缩方案,或选择“无”以创建未压缩的 tar 文件。", + "loc.input.label.archiveFile": "要创建的存档文件", + "loc.input.help.archiveFile": "指定要创建的存档文件的名称。例如,若要创建 \"foo.tgz\",请选择 \"tar\" 存档类型,并用 \"gz\" 指定 tar 压缩。", + "loc.input.label.replaceExistingArchive": "替换现有存档", + "loc.input.help.replaceExistingArchive": "如果存在现有存档,请指定是否将其覆盖。如果不覆盖,将向其添加文件。", + "loc.input.label.verbose": "强制使用详细输出", + "loc.input.help.verbose": "如果设置为 true,则会强制工具使用详细输出。重写 \"quiet\"", + "loc.input.label.quiet": "强制使用安静输出", + "loc.input.help.quiet": "如果设置为 true,则会强制工具使用安静输出。可由“详细”重写", + "loc.messages.Filename": "files=%s", + "loc.messages.TarExists": "中级 tar %s 已存在。正在尝试将文件添加到其中。", + "loc.messages.RemoveBeforeCreation": "在创建前删除现有存档文件: %s", + "loc.messages.AlreadyExists": "存档文件: %s 已存在。正在尝试将文件添加到其中。", + "loc.messages.ArchiveCreationFailedWithError": "存档文件的存档创建失败: %s \n代码: %d \nStdOut: %s \nstderr: %s \n错误: %s;", + "loc.messages.ArchiveFileExistsButNotAFile": "指定的存档文件 %s 已存在,但它不是文件。", + "loc.messages.FailedArchiveFile": "无法创建指定的存档文件 %s,因为无法访问它: %s", + "loc.messages.FoundNFiles": "已找到 %d 个文件", + "loc.messages.ArchivingFile": "存档文件: %s", + "loc.messages.MoreFiles": "… 其他 %d 个 …" +} \ No newline at end of file diff --git a/_generated/ArchiveFilesV2/Strings/resources.resjson/zh-TW/resources.resjson b/_generated/ArchiveFilesV2/Strings/resources.resjson/zh-TW/resources.resjson new file mode 100644 index 000000000000..adb9f89e33d3 --- /dev/null +++ b/_generated/ArchiveFilesV2/Strings/resources.resjson/zh-TW/resources.resjson @@ -0,0 +1,35 @@ +{ + "loc.friendlyName": "封存檔", + "loc.helpMarkDown": "[深入了解此工作](http://go.microsoft.com/fwlink/?LinkId=809083)", + "loc.description": "將檔案壓縮為 .7z、.tar.gz 或 .zip", + "loc.instanceNameFormat": "封存 $(rootFolderOrFile)", + "loc.group.displayName.archive": "封存", + "loc.input.label.rootFolderOrFile": "要封存的根資料夾或檔案", + "loc.input.help.rootFolderOrFile": "輸入要新增至封存的根資料夾或檔案路徑。若為資料夾,則資料夾下的所有項目將會新增至產生的封存。", + "loc.input.label.includeRootFolder": "在封存路徑之前加上根資料夾名稱", + "loc.input.help.includeRootFolder": "如有選取,將會在封存檔內的檔案路徑前加上根資料夾名稱。否則,所有檔案路徑都會從下一層開始。

例如,假設選取的根資料夾是 `/home/user/output/classes/`,其中包含 `com/acme/Main.class`

  • 如有選取,封存檔最終應包含: `classes/com/acme/Main.class`
  • 否則,封存檔最終應包含: `com/acme/Main.class`
", + "loc.input.label.archiveType": "封存類型", + "loc.input.help.archiveType": "請指定所使用的壓縮配置。例如,若要建立 `foo.jar`,請選擇壓縮類型 [zip],並指定將要建立的封存檔指定為 `foo.jar`。對於所有的 tar 檔案 (包括已壓縮的 tar 檔案),請選擇 [tar]。", + "loc.input.label.sevenZipCompression": "7z 壓縮", + "loc.input.help.sevenZipCompression": "視情況選擇壓縮層級,也可以選擇 [無] 建立未經壓縮的 7z 檔案。", + "loc.input.label.tarCompression": "Tar 壓縮", + "loc.input.help.tarCompression": "您可以視情況選擇壓縮配置,也可選擇 [無] 建立未經壓縮的 tar 檔案。", + "loc.input.label.archiveFile": "要建立的封存檔", + "loc.input.help.archiveFile": "請指定要建立的封存檔案名稱。例如,若要建立 `foo.tgz`,請選取封存類型 [tar],對於 tar 壓縮則選取 [gz]。", + "loc.input.label.replaceExistingArchive": "取代現有的封存檔", + "loc.input.help.replaceExistingArchive": "若已有同名的封存檔,請指定是否要加以覆寫,否則只會將檔案新增至其中。", + "loc.input.label.verbose": "強制詳細資訊輸出", + "loc.input.help.verbose": "若設定為 true,會強制工具使用詳細資訊輸出。覆寫 'quiet'", + "loc.input.label.quiet": "強制無對話輸出", + "loc.input.help.quiet": "若設為 true,即強制工具使用無對話輸出。可由 'verbose' 覆寫", + "loc.messages.Filename": "files=%s", + "loc.messages.TarExists": "中繼 tar %s 已存在。正在嘗試將檔案新增至其中。", + "loc.messages.RemoveBeforeCreation": "在建立前移除現有的封存檔案: %s", + "loc.messages.AlreadyExists": "封存檔案 %s 已存在。正在嘗試將檔案新增至其中。", + "loc.messages.ArchiveCreationFailedWithError": "封存檔案 %s 的封存建立失敗\n代碼: %d \nStdOut: %s \nSTDERR: %s \n錯誤: %s;", + "loc.messages.ArchiveFileExistsButNotAFile": "指定的封存檔案 %s 已存在且不是檔案。", + "loc.messages.FailedArchiveFile": "無法建立指定的封存檔案 : %s,因為無法存取 : %s", + "loc.messages.FoundNFiles": "找到 %d 個檔案", + "loc.messages.ArchivingFile": "正在封存檔案: %s", + "loc.messages.MoreFiles": "... 其他 %d 個 ..." +} \ No newline at end of file diff --git a/_generated/ArchiveFilesV2/Tests/L0.ts b/_generated/ArchiveFilesV2/Tests/L0.ts new file mode 100644 index 000000000000..ac69ffbb52cd --- /dev/null +++ b/_generated/ArchiveFilesV2/Tests/L0.ts @@ -0,0 +1,218 @@ +import * as assert from 'assert'; +import * as utils from '../utils.js'; +import * as ttm from 'azure-pipelines-task-lib/mock-test'; +import fs = require('fs'); +import os = require('os'); +import path = require('path'); +import tl = require('azure-pipelines-task-lib/task'); + +// path to creating archive +let expectedArchivePath: undefined | string = undefined; + +describe('ArchiveFiles L0 Suite', function () { + function deleteFolderRecursive (directoryPath) { + if (fs.existsSync(directoryPath)) { + fs.readdirSync(directoryPath).forEach((file, index) => { + const curPath = path.join(directoryPath, file); + if (fs.lstatSync(curPath).isDirectory()) { + // recurse + deleteFolderRecursive(curPath); + } else { + // delete file + fs.unlinkSync(curPath); + } + }); + fs.rmdirSync(directoryPath); + } + }; + + function runValidations(validator: () => void, tr, done) { + try { + validator(); + done(); + } + catch (error) { + console.log('STDERR', tr.stderr); + console.log('STDOUT', tr.stdout); + done(error); + } + } + + before(() => { + const testTemp = path.join(__dirname, 'test_temp'); + if (!fs.existsSync(testTemp)) { + fs.mkdirSync(testTemp); + } + const testOutput = path.join(__dirname, 'test_output'); + if (!fs.existsSync(testOutput)) { + fs.mkdirSync(testOutput); + } + + const replaceTestOutput = path.join(__dirname, 'test_output', 'replace_test'); + if (!fs.existsSync(replaceTestOutput)) { + fs.mkdirSync(replaceTestOutput); + } + }) + + this.afterEach(() => { + try { + if (expectedArchivePath) fs.unlinkSync(expectedArchivePath); + expectedArchivePath = undefined; + } catch (err) { + console.log('Cannot remove created archive: ' + expectedArchivePath); + } + }); + + this.afterAll(() => { + const testTemp = path.join(__dirname, 'test_temp'); + if (fs.existsSync(testTemp)) { + deleteFolderRecursive(testTemp); + } + const testOutput = path.join(__dirname, 'test_output'); + if (fs.existsSync(testOutput)) { + deleteFolderRecursive(testTemp); + } + }) + + const files = (n) => { + return Array.from( + {length: n}, (v, k) => String(k) + ) + }; + + let test = this; + let cases = [0, 1, 10, 11, 100]; + + tl.setResourcePath(path.join( __dirname, '..', 'task.json')); + cases.forEach(function(numberOfFiles) { + it(`Verify plan output for ${numberOfFiles} files has correct number of lines`, (done: Mocha.Done) => { + test.timeout(1000); + let max = 10; + let plan = utils.reportArchivePlan(files(numberOfFiles), max); + assert(plan.length == Math.min(numberOfFiles+1, max+2)); + + done(); + }); + }); + + it('Successfully creates a zip', function(done: Mocha.Done) { + this.timeout(10000); + process.env['archiveType'] = 'zip'; + process.env['archiveFile'] = 'myZip'; + process.env['includeRootFolder'] = 'true'; + expectedArchivePath = path.join(__dirname, 'test_output', 'myZip.zip'); + + let tp: string = path.join(__dirname, 'L0CreateArchive.js'); + let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + runValidations(() => { + assert(tr.stdout.indexOf('Creating archive') > -1, 'Should have tried to create archive'); + if (process.platform.indexOf('win32') >= 0) { + assert(tr.stdout.indexOf('Add new data to archive: 3 folders, 3 files') > -1, 'Should have found 6 items to compress'); + } else { + assert(tr.stdout.indexOf('adding: test_folder/ (') > -1, 'Should have found 6 items to compress'); + assert(tr.stdout.indexOf('adding: test_folder/a/ (') > -1, 'Should have found 6 items to compress'); + assert(tr.stdout.indexOf('adding: test_folder/a/abc.txt (') > -1, 'Should have found 6 items to compress'); + assert(tr.stdout.indexOf('adding: test_folder/a/def.txt (') > -1, 'Should have found 6 items to compress'); + assert(tr.stdout.indexOf('adding: test_folder/b/ (') > -1, 'Should have found 6 items to compress'); + assert(tr.stdout.indexOf('adding: test_folder/b/abc.txt (') > -1, 'Should have found 6 items to compress'); + } + assert(fs.existsSync(expectedArchivePath), `Should have successfully created the archive at ${expectedArchivePath}, instead directory contents are ${fs.readdirSync(path.dirname(expectedArchivePath))}`); + }, tr, done); + }); + + it('Successfully creates a tar', function(done: Mocha.Done) { + this.timeout(5000); + process.env['archiveType'] = 'tar'; + process.env['archiveFile'] = 'myTar'; + process.env['includeRootFolder'] = 'true'; + expectedArchivePath = path.join(__dirname, 'test_output', 'myTar.gz'); + if (process.platform.indexOf('win32') < 0) { + expectedArchivePath = path.join(__dirname, 'test_output', 'myTar'); + } + + let tp: string = path.join(__dirname, 'L0CreateArchive.js'); + let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + runValidations(() => { + assert(tr.stdout.indexOf('Creating archive') > -1, 'Should have tried to create archive'); + assert(fs.existsSync(expectedArchivePath), `Should have successfully created the archive at ${expectedArchivePath}, instead directory contents are ${fs.readdirSync(path.dirname(expectedArchivePath))}`); + }, tr, done); + }); + +// These tests rely on 7z which isnt present on macOS +if (process.platform.indexOf('darwin') < 0) { + it('Successfully creates a 7z', function(done: Mocha.Done) { + this.timeout(5000); + process.env['archiveType'] = '7z'; + process.env['archiveFile'] = 'my7z'; + process.env['includeRootFolder'] = 'true'; + expectedArchivePath = path.join(__dirname, 'test_output', 'my7z.7z'); + + let tp: string = path.join(__dirname, 'L0CreateArchive.js'); + let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + runValidations(() => { + assert(tr.stdout.indexOf('Creating archive') > -1, 'Should have tried to create archive'); + assert(fs.existsSync(expectedArchivePath), `Should have successfully created the archive at ${expectedArchivePath}, instead directory contents are ${fs.readdirSync(path.dirname(expectedArchivePath))}`); + }, tr, done); + }); + + it('Successfully creates a wim', function(done: Mocha.Done) { + this.timeout(5000); + process.env['archiveType'] = 'wim'; + process.env['archiveFile'] = 'mywim'; + process.env['includeRootFolder'] = 'true'; + expectedArchivePath = path.join(__dirname, 'test_output', 'myWim.wim'); + if (process.platform.indexOf('win') < 0) { + expectedArchivePath = path.join(__dirname, 'test_output', 'mywim.wim'); + } + + let tp: string = path.join(__dirname, 'L0CreateArchive.js'); + let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + runValidations(() => { + assert(tr.stdout.indexOf('Creating archive') > -1, 'Should have tried to create archive'); + assert(fs.existsSync(expectedArchivePath), `Should have successfully created the archive at ${expectedArchivePath}, instead directory contents are ${fs.readdirSync(path.dirname(expectedArchivePath))}`); + }, tr, done); + }); + + it('Replace archive file in the root folder', function(done: Mocha.Done) { + const archiveName = "archive.zip"; + const replaceTestDir = path.join(__dirname, 'test_output', 'replace_test'); + const archivePath = path.join(replaceTestDir, archiveName); + this.timeout(5000); + process.env['archiveType'] = 'zip'; + process.env['archiveFile'] = archiveName; + process.env['includeRootFolder'] = 'false'; + process.env['rootFolderOrFile'] = replaceTestDir; + + fs.writeFileSync(path.join(replaceTestDir, 'test_file.txt'), 'test data'); + + fs.copyFileSync( + path.join(__dirname, 'resources', archiveName), + path.join(archivePath) + ); + + expectedArchivePath = archivePath; + + let tp: string = path.join(__dirname, 'L0ReplaceArchiveInRootFolder.js'); + let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + console.info(tr.stdout); + runValidations(() => { + assert(tr.succeeded, "Task should succeed"); + assert(tr.stdout.indexOf('Creating archive') > -1, 'Should have tried to create archive'); + assert(fs.existsSync(expectedArchivePath), `Should have successfully created the archive at ${expectedArchivePath}, instead directory contents are ${fs.readdirSync(path.dirname(expectedArchivePath))}`); + }, tr, done); + }); +} +}); diff --git a/_generated/ArchiveFilesV2/Tests/L0CreateArchive.ts b/_generated/ArchiveFilesV2/Tests/L0CreateArchive.ts new file mode 100644 index 000000000000..3555bd60e5a8 --- /dev/null +++ b/_generated/ArchiveFilesV2/Tests/L0CreateArchive.ts @@ -0,0 +1,16 @@ +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'archivefiles.js'); +let tmr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +process.env['AGENT_TEMPDIRECTORY'] = path.join(__dirname, 'test_temp'); + +tmr.setInput('rootFolderOrFile', path.join(__dirname, 'test_folder')); +tmr.setInput('includeRootFolder', process.env['includeRootFolder']); +tmr.setInput('archiveType', process.env['archiveType']); +tmr.setInput('archiveFile', path.join('test_output', process.env['archiveFile'])); +tmr.setInput('replaceExistingArchive', 'true'); +tmr.setInput('tarCompression', 'gz'); + +tmr.run(true); \ No newline at end of file diff --git a/_generated/ArchiveFilesV2/Tests/L0ReplaceArchiveInRootFolder.ts b/_generated/ArchiveFilesV2/Tests/L0ReplaceArchiveInRootFolder.ts new file mode 100644 index 000000000000..2a74862ae54c --- /dev/null +++ b/_generated/ArchiveFilesV2/Tests/L0ReplaceArchiveInRootFolder.ts @@ -0,0 +1,16 @@ +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'archivefiles.js'); +let tmr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +process.env['AGENT_TEMPDIRECTORY'] = path.join(__dirname, 'test_temp'); + +tmr.setInput('rootFolderOrFile', path.join(__dirname, 'test_output', 'replace_test')); +tmr.setInput('includeRootFolder', process.env['includeRootFolder']); +tmr.setInput('archiveType', process.env['archiveType']); +tmr.setInput('archiveFile', path.join(__dirname, 'test_output', 'replace_test', process.env['archiveFile'])); +tmr.setInput('replaceExistingArchive', 'true'); +tmr.setInput('tarCompression', 'gz'); + +tmr.run(true); \ No newline at end of file diff --git a/_generated/ArchiveFilesV2/Tests/package-lock.json b/_generated/ArchiveFilesV2/Tests/package-lock.json new file mode 100644 index 000000000000..b6192b6825a2 --- /dev/null +++ b/_generated/ArchiveFilesV2/Tests/package-lock.json @@ -0,0 +1,14 @@ +{ + "name": "ArchiveFiles-tests", + "version": "1.0.7", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/mocha": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", + "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==", + "dev": true + } + } +} diff --git a/_generated/ArchiveFilesV2/Tests/package.json b/_generated/ArchiveFilesV2/Tests/package.json new file mode 100644 index 000000000000..d7e89b137c7b --- /dev/null +++ b/_generated/ArchiveFilesV2/Tests/package.json @@ -0,0 +1,19 @@ +{ + "name": "ArchiveFiles-tests", + "version": "1.0.7", + "description": "Archive Files Task Tests", + "main": "L0.js", + "repository": { + "type": "git", + "url": "git+https://github.com/Microsoft/azure-pipelines-tasks.git" + }, + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Microsoft/azure-pipelines-tasks/issues" + }, + "homepage": "https://github.com/Microsoft/azure-pipelines-tasks#readme", + "devDependencies": { + "@types/mocha": "^5.2.0" + } +} diff --git a/_generated/ArchiveFilesV2/Tests/resources/archive.zip b/_generated/ArchiveFilesV2/Tests/resources/archive.zip new file mode 100644 index 000000000000..15cb0ecb3e21 Binary files /dev/null and b/_generated/ArchiveFilesV2/Tests/resources/archive.zip differ diff --git a/_generated/ArchiveFilesV2/Tests/test_folder/a/abc.txt b/_generated/ArchiveFilesV2/Tests/test_folder/a/abc.txt new file mode 100644 index 000000000000..f2ba8f84ab5c --- /dev/null +++ b/_generated/ArchiveFilesV2/Tests/test_folder/a/abc.txt @@ -0,0 +1 @@ +abc \ No newline at end of file diff --git a/_generated/ArchiveFilesV2/Tests/test_folder/a/def.txt b/_generated/ArchiveFilesV2/Tests/test_folder/a/def.txt new file mode 100644 index 000000000000..0c003832e7bf --- /dev/null +++ b/_generated/ArchiveFilesV2/Tests/test_folder/a/def.txt @@ -0,0 +1 @@ +def \ No newline at end of file diff --git a/_generated/ArchiveFilesV2/Tests/test_folder/b/abc.txt b/_generated/ArchiveFilesV2/Tests/test_folder/b/abc.txt new file mode 100644 index 000000000000..f2ba8f84ab5c --- /dev/null +++ b/_generated/ArchiveFilesV2/Tests/test_folder/b/abc.txt @@ -0,0 +1 @@ +abc \ No newline at end of file diff --git a/_generated/ArchiveFilesV2/ThirdPartyNotices.txt b/_generated/ArchiveFilesV2/ThirdPartyNotices.txt new file mode 100644 index 000000000000..999441b2416f --- /dev/null +++ b/_generated/ArchiveFilesV2/ThirdPartyNotices.txt @@ -0,0 +1,172 @@ +---------------------------------START OF ENTRY FOR THE THIRD PARTY NOTICES---------------------------------------- + 7-Zip + ~~~~~ + License for use and distribution + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + 7-Zip Copyright (C) 1999-2016 Igor Pavlov. + + Licenses for files are: + + 1) 7z.dll: GNU LGPL + unRAR restriction + 2) All other files: GNU LGPL + + The GNU LGPL + unRAR restriction means that you must follow both + GNU LGPL rules and unRAR restriction rules. + + + Note: + You can use 7-Zip on any computer, including a computer in a commercial + organization. You don't need to register or pay for 7-Zip. + + + GNU LGPL information + -------------------- + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You can receive a copy of the GNU Lesser General Public License from + http://www.gnu.org/ + + + unRAR restriction + ----------------- + + The decompression engine for RAR archives was developed using source + code of unRAR program. + All copyrights to original unRAR code are owned by Alexander Roshal. + + The license for original unRAR code has the following restriction: + + The unRAR sources cannot be used to re-create the RAR compression algorithm, + which is proprietary. Distribution of modified unRAR sources in separate form + or as a part of other software is permitted, provided that it is clearly + stated in the documentation and source comments that the code may + not be used to develop a RAR (WinRAR) compatible archiver. + +GNU Lesser General Public License + +Version 2.1, February 1999 + +Copyright (C) 1991, 1999 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. +[This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] + +Preamble + +The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. +This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. +When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. +To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. +For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. +We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. +To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. +Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. +Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. +When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. +We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. +For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. +In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. +Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. +The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. + +TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + +0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". +A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. +The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) +"Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. +Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. + +1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. +You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. + +2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: +a) The modified work must itself be a software library. +b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. +c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. +d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. +(For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) +These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. +Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. +In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. + +3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. +Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. +This option is useful when you wish to copy part of the code of the Library into a program that is not a library. + +4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. +If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. + +5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. +However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. +When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. +If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) +Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. + +6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. +You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: +a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) +b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. +c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. +d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. +e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. +For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. +It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. + +7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: +a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. +b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. + +8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. + +9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. + +10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. + +11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. +If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. +It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. +This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. + +12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. + +13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. +Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. + +14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. + +NO WARRANTY + +15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + +16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +END OF TERMS AND CONDITIONS + +How to Apply These Terms to Your New Libraries + +If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). +To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. + Copyright (C) +This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. +This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. +You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +Also add information on how to contact you by electronic and paper mail. +You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: +Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. + +signature of Ty Coon, 1 April 1990 +Ty Coon, President of Vice + +That's all there is to it! + +----------------------------------------------- END OF ENTRY FOR THE THIRD PARTY NOTICES ---------------------------------------- + diff --git a/_generated/ArchiveFilesV2/archivefiles.ts b/_generated/ArchiveFilesV2/archivefiles.ts new file mode 100644 index 000000000000..8db647f38917 --- /dev/null +++ b/_generated/ArchiveFilesV2/archivefiles.ts @@ -0,0 +1,371 @@ +import path = require('path'); +import tl = require('azure-pipelines-task-lib/task'); +import tr = require('azure-pipelines-task-lib/toolrunner'); +import fs = require('fs'); +import stream = require("stream"); +import utils = require('./utils.js'); + +var repoRoot: string = tl.getVariable('System.DefaultWorkingDirectory'); + +var rootFolderOrFile: string = makeAbsolute(path.normalize(tl.getPathInput('rootFolderOrFile', true, false).trim())); +var includeRootFolder: boolean = tl.getBoolInput('includeRootFolder', true); +var archiveType: string = tl.getInput('archiveType', true); +var archiveFile: string = path.normalize(tl.getPathInput('archiveFile', true, false).trim()); +var replaceExistingArchive: boolean = tl.getBoolInput('replaceExistingArchive', true); +var verbose: boolean = tl.getBoolInput('verbose', false); +var quiet: boolean = tl.getBoolInput('quiet', false); + +tl.debug('repoRoot: ' + repoRoot); + +var win = tl.osType().match(/^Win/); +tl.debug('win: ' + win); + +// archivers +var xpTarLocation: string; +var xpZipLocation: string; +// 7zip +var xpSevenZipLocation: string; +var winSevenZipLocation: string = path.join(__dirname, '7zip/7z.exe'); + +function getSevenZipLocation(): string { + if (win) { + return winSevenZipLocation; + } else { + if (typeof xpTarLocation == "undefined") { + xpSevenZipLocation = tl.which('7z', true); + } + return xpSevenZipLocation; + } +} + +function findFiles(): string[] { + if (includeRootFolder) { + if(!fs.existsSync(rootFolderOrFile)) { + tl.warning(`No file or directory found - ${rootFolderOrFile}`) + } + return [path.basename(rootFolderOrFile)]; + } else { + var fullPaths: string[] = tl.ls('-A', [rootFolderOrFile]); + var baseNames: string[] = []; + for (var i = 0; i < fullPaths.length; i++) { + baseNames[i] = path.basename(fullPaths[i]); + } + return baseNames; + } +} + +function makeAbsolute(normalizedPath: string): string { + tl.debug('makeAbsolute:' + normalizedPath); + + var result = normalizedPath; + if (!path.isAbsolute(normalizedPath)) { + result = path.join(repoRoot, normalizedPath); + tl.debug('Relative file path: ' + normalizedPath + ' resolving to: ' + result); + } + return result; +} + +function createFileList(files: string[]): string { + const tempDirectory: string = tl.getVariable('Agent.TempDirectory'); + const fileName: string = Math.random().toString(36).replace('0.', ''); + const file: string = path.resolve(tempDirectory, fileName); + + try { + fs.writeFileSync( + file, + files.reduce((prev, cur) => prev + cur + "\n", ""), + { encoding: "utf8" }); + } + catch (error) { + if (fs.existsSync(file)) { + fs.unlinkSync(file); + } + + throw error; + } + + return file; +} + +function getOptions(): tr.IExecSyncOptions { + var dirName: string; + if (includeRootFolder) { + dirName = path.dirname(rootFolderOrFile); + tl.debug("cwd (include root folder)= " + dirName); + return { cwd: dirName, outStream: process.stdout as stream.Writable, errStream: process.stderr as stream.Writable }; + } else { + var stats: tl.FsStats = tl.stats(rootFolderOrFile); + if (stats.isFile()) { + dirName = path.dirname(rootFolderOrFile); + } else { + dirName = rootFolderOrFile; + } + tl.debug("cwd (exclude root folder)= " + dirName); + return { cwd: dirName, outStream: process.stdout as stream.Writable, errStream: process.stderr as stream.Writable }; + } +} + +function sevenZipArchive(archive: string, compression: string, files: string[]) { + tl.debug('Creating archive with 7-zip: ' + archive); + var sevenZip = tl.tool(getSevenZipLocation()); + sevenZip.arg('a'); + sevenZip.arg('-t' + compression); + if (verbose) { + // Set highest logging level + sevenZip.arg('-bb3'); + } + + const sevenZipCompression = tl.getInput('sevenZipCompression', false); + if (sevenZipCompression) { + sevenZip.arg('-mx=' + mapSevenZipCompressionLevel(sevenZipCompression)); + } + + sevenZip.arg(archive); + + const fileList: string = createFileList(files); + sevenZip.arg('@' + fileList); + + return handleExecResult(sevenZip.execSync(getOptions()), archive); +} + +// map from YAML-friendly value to 7-Zip numeric value +function mapSevenZipCompressionLevel(sevenZipCompression: string) { + switch (sevenZipCompression.toLowerCase()) { + case "ultra": + return "9"; + case "maximum": + return "7"; + case "normal": + return "5"; + case "fast": + return "3"; + case "fastest": + return "1"; + case "none": + return "0"; + default: + return "5"; + } +} + +// linux & mac only +function zipArchive(archive: string, files: string[]) { + tl.debug('Creating archive with zip: ' + archive); + if (typeof xpZipLocation == "undefined") { + xpZipLocation = tl.which('zip', true); + } + var zip = tl.tool(xpZipLocation); + zip.arg('-r'); + // Verbose gets priority over quiet + if (verbose) { + zip.arg('-v'); + } + else if (quiet) { + zip.arg('-q'); + } + zip.arg(archive); + for (var i = 0; i < files.length; i++) { + zip.arg(files[i]); + console.log(tl.loc('Filename', files[i])); + } + return handleExecResult(zip.execSync(getOptions()), archive); +} + +// linux & mac only +function tarArchive(archive: string, compression: string, files: string[]) { + tl.debug('Creating archive with tar: ' + archive + ' using compression: ' + compression); + if (typeof xpTarLocation == "undefined") { + xpTarLocation = tl.which('tar', true); + } + var tar = tl.tool(xpTarLocation); + if (tl.exist(archive)) { + tar.arg('-r'); // append files to existing tar + } else { + tar.arg('-c'); // create new tar otherwise + } + if (verbose) { + tar.arg('-v'); + } + if (compression) { + tar.arg('--' + compression); + } + tar.arg('-f'); + tar.arg(archive); + for (var i = 0; i < files.length; i++) { + tar.arg(files[i]); + } + return handleExecResult(tar.execSync(getOptions()), archive); +} + +function handleExecResult(execResult, archive) { + if (execResult.code != tl.TaskResult.Succeeded) { + tl.debug('execResult: ' + JSON.stringify(execResult)); + failTask(tl.loc('ArchiveCreationFailedWithError', archive, execResult.code, execResult.stdout, execResult.stderr, execResult.error)); + } +} + +function failTask(message: string) { + throw new FailTaskError(message); +} + +export class FailTaskError extends Error { +} + +/** + * Windows only + * standard gnu-tar extension formats with recognized auto compression formats + * https://www.gnu.org/software/tar/manual/html_section/tar_69.html + * + * Computes the name of the tar to use inside a compressed tar. + * E.g. foo.tar.gz is expected to have foo.tar inside + */ +function computeTarName(archiveName: string): string { + + var lowerArchiveName = archiveName.toLowerCase(); + + //standard full extensions + // gzip xz bzip2 + var fullExtensions = ['.tar.gz', '.tar.xz', '.tar.bz2']; + for (var i = 0; i < fullExtensions.length; i++) { + if (lowerArchiveName.endsWith(fullExtensions[i])) { + return archiveName.substring(0, archiveName.lastIndexOf('.')); + } + } + + //standard abbreviated extensions + // gzip gzip bzip2 bzip2 bzip2 xz + var extensions = ['.tgz', '.taz', '.tz2', 'tbz2', '.tbz', '.txz']; + for (var i = 0; i < extensions.length; i++) { + if (lowerArchiveName.endsWith(extensions[i])) { + return archiveName.substring(0, archiveName.lastIndexOf('.')) + '.tar'; + } + } + + // if 7zip falls down here, or if a .tz2 file is encountered, there is occasionally strange + // behavior resulting in archives that are correct but are renamed + // e.g. test.tz2 has test inside of it instead of test.tar (7z decides to rename it) + // e.g. test_tgz has an outer name of test_tgz.gz (7z decides to add the .gz to it). + + //non standard name + + //foo.tar.anything --> foo.tar + if (lowerArchiveName.lastIndexOf('.tar.') > 0) { + return archiveName.substring(0, lowerArchiveName.lastIndexOf('.tar.') + 4); + } + // foo.anything --> foo.tar + else if (lowerArchiveName.lastIndexOf('.') > 0) { + return archiveName.substring(0, lowerArchiveName.lastIndexOf('.')) + '.tar'; + } + // foo --> foo.tar + return lowerArchiveName + '.tar'; +} + +function createArchive(files: string[]) { + + if (win) { // windows only + if (archiveType == "default" || archiveType == "zip") { //default is zip format + sevenZipArchive(archiveFile, "zip", files); + } else if (archiveType == "tar") { + var tarCompression: string = tl.getInput('tarCompression', true); + if (tarCompression == "none") { + sevenZipArchive(archiveFile, archiveType, files); + } else { + var tarFile = computeTarName(archiveFile); + var tarExists = tl.exist(tarFile); + try { + if (tarExists) { + console.log(tl.loc('TarExists', tarFile)); + } + + // this file could already exist, but not checking because by default files will be added to it + // create the tar file + sevenZipArchive(tarFile, archiveType, files); + // compress the tar file + var sevenZipCompressionFlag = tarCompression; + if (tarCompression == 'gz') { + sevenZipCompressionFlag = 'gzip'; + } else if (tarCompression == 'bz2') { + sevenZipCompressionFlag = 'bzip2'; + } + sevenZipArchive(archiveFile, sevenZipCompressionFlag, [tarFile]); + } finally { + // delete the tar file if we created it. + if (!tarExists) { + tl.rmRF(tarFile); + } + } + } + } else { + sevenZipArchive(archiveFile, archiveType, files); + } + } else { // not windows + if (archiveType == "default" || archiveType == "zip") { //default is zip format + zipArchive(archiveFile, files); + } else if (archiveType == "tar") { + var tarCompression: string = tl.getInput('tarCompression', true); + var tarCompressionFlag; + if (tarCompression == "none") { + tarCompressionFlag = null; + } else if (tarCompression == "gz") { + tarCompressionFlag = "gz"; + } else if (tarCompression == "bz2") { + tarCompressionFlag = "bzip2"; + } else if (tarCompression == "xz") { + tarCompressionFlag = "xz"; + } + tarArchive(archiveFile, tarCompressionFlag, files); + } else { + sevenZipArchive(archiveFile, archiveType, files); + } + } +} + +function doWork() { + try { + tl.setResourcePath(path.join( __dirname, 'task.json')); + + // replaceExistingArchive before creation? + if (tl.exist(archiveFile)) { + if (replaceExistingArchive) { + try { + var stats: tl.FsStats = tl.stats(archiveFile); + if (stats.isFile()) { + console.log(tl.loc('RemoveBeforeCreation', archiveFile)); + tl.rmRF(archiveFile); + } else { + failTask(tl.loc('ArchiveFileExistsButNotAFile', archiveFile)); + } + } catch (e) { + failTask(tl.loc('FailedArchiveFile', archiveFile, e)); + } + } else { + console.log(tl.loc('AlreadyExists', archiveFile)); + } + } + + // Find matching archive files + var files: string[] = findFiles(); + utils.reportArchivePlan(files).forEach(line => console.log(line)); + + tl.debug(`Listing all ${files.length} files to archive:`); + files.forEach(file => tl.debug(file)); + + //ensure output folder exists + var destinationFolder = path.dirname(archiveFile); + tl.debug("Checking for archive destination folder:" + destinationFolder); + if (!tl.exist(destinationFolder)) { + tl.debug("Destination folder does not exist, creating:" + destinationFolder); + tl.mkdirP(destinationFolder); + } + + createArchive(files); + + tl.setResult(tl.TaskResult.Succeeded, 'Successfully created archive: ' + archiveFile); + } catch (e) { + tl.debug(e.message); + tl.error(e); + tl.setResult(tl.TaskResult.Failed, e.message); + } +} + +doWork(); diff --git a/_generated/ArchiveFilesV2/icon.png b/_generated/ArchiveFilesV2/icon.png new file mode 100644 index 000000000000..942dc8ed754e Binary files /dev/null and b/_generated/ArchiveFilesV2/icon.png differ diff --git a/_generated/ArchiveFilesV2/icon.svg b/_generated/ArchiveFilesV2/icon.svg new file mode 100644 index 000000000000..c3daaa283b0c --- /dev/null +++ b/_generated/ArchiveFilesV2/icon.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/_generated/ArchiveFilesV2/make.json b/_generated/ArchiveFilesV2/make.json new file mode 100644 index 000000000000..47e731fe78e3 --- /dev/null +++ b/_generated/ArchiveFilesV2/make.json @@ -0,0 +1,11 @@ +{ + "externals": { + "archivePackages": [ + { + "archiveName": "7zip.zip", + "url": "https://vstsagenttools.blob.core.windows.net/tools/7zip/4/7zip.zip", + "dest": "./" + } + ] + } +} \ No newline at end of file diff --git a/_generated/ArchiveFilesV2/package-lock.json b/_generated/ArchiveFilesV2/package-lock.json new file mode 100644 index 000000000000..120f660e4814 --- /dev/null +++ b/_generated/ArchiveFilesV2/package-lock.json @@ -0,0 +1,483 @@ +{ + "name": "ArchiveFiles", + "version": "1.0.7", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/concat-stream": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz", + "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==", + "requires": { + "@types/node": "*" + } + }, + "@types/form-data": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", + "integrity": "sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==", + "requires": { + "@types/node": "*" + } + }, + "@types/mocha": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.1.1.tgz", + "integrity": "sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==" + }, + "@types/node": { + "version": "16.11.56", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.56.tgz", + "integrity": "sha512-aFcUkv7EddxxOa/9f74DINReQ/celqH8DiB3fRYgVDM2Xm5QJL8sl80QKuAnGvwAsMn+H3IFA6WCrQh1CY7m1A==" + }, + "@types/qs": { + "version": "6.9.8", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.8.tgz", + "integrity": "sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg==" + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "azure-pipelines-task-lib": { + "version": "5.0.0-preview.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-5.0.0-preview.0.tgz", + "integrity": "sha512-uQJEv+q3/7RD7kgphFd33uXijaPwA1ePYoNkAgZpUhbZUtc2u4JL4ujTT/JJfgXBNW/QQNAiDQ2OC7vOQG/0tg==", + "requires": { + "minimatch": "3.0.5", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "sync-request": "6.1.0", + "uuid": "^3.0.1" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, + "form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + } + }, + "get-port": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", + "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==" + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "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" + }, + "dependencies": { + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==" + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "http-basic": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", + "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", + "requires": { + "caseless": "^0.12.0", + "concat-stream": "^1.6.2", + "http-response-object": "^3.0.1", + "parse-cache-control": "^1.0.1" + } + }, + "http-response-object": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", + "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", + "requires": { + "@types/node": "^10.0.3" + }, + "dependencies": { + "@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + } + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" + }, + "is-core-module": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "requires": { + "has": "^1.0.3" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, + "parse-cache-control": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", + "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "promise": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", + "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", + "requires": { + "asap": "~2.0.6" + } + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==" + }, + "qs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "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" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "requires": { + "resolve": "^1.1.6" + } + }, + "resolve": { + "version": "1.22.6", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.6.tgz", + "integrity": "sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==", + "requires": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" + }, + "shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, + "sync-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", + "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==", + "requires": { + "http-response-object": "^3.0.1", + "sync-rpc": "^1.2.1", + "then-request": "^6.0.0" + } + }, + "sync-rpc": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz", + "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==", + "requires": { + "get-port": "^3.1.0" + } + }, + "then-request": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", + "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", + "requires": { + "@types/concat-stream": "^1.6.0", + "@types/form-data": "0.0.33", + "@types/node": "^8.0.0", + "@types/qs": "^6.2.31", + "caseless": "~0.12.0", + "concat-stream": "^1.6.0", + "form-data": "^2.2.0", + "http-basic": "^8.1.1", + "http-response-object": "^3.0.1", + "promise": "^8.0.0", + "qs": "^6.4.0" + }, + "dependencies": { + "@types/node": { + "version": "8.10.66", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", + "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==" + } + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, + "typescript": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.2.tgz", + "integrity": "sha512-e4ERvRV2wb+rRZ/IQeb3jm2VxBsirQLpQhdxplZ2MEzGvDkkMmPglecnNDfSUBivMjP93vRbngYYDQqQ/78bcQ==", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + } + } +} diff --git a/_generated/ArchiveFilesV2/package.json b/_generated/ArchiveFilesV2/package.json new file mode 100644 index 000000000000..4fe1de059b02 --- /dev/null +++ b/_generated/ArchiveFilesV2/package.json @@ -0,0 +1,24 @@ +{ + "name": "ArchiveFiles", + "version": "1.0.7", + "description": "Archive Files Task", + "main": "archivefilestask.js", + "repository": { + "type": "git", + "url": "git+https://github.com/Microsoft/azure-pipelines-tasks.git" + }, + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Microsoft/azure-pipelines-tasks/issues" + }, + "homepage": "https://github.com/Microsoft/azure-pipelines-tasks#readme", + "dependencies": { + "@types/node": "^16.11.39", + "@types/mocha": "^9.1.1", + "azure-pipelines-task-lib": "^5.0.0-preview.0" + }, + "devDependencies": { + "typescript": "4.0.2" + } +} diff --git a/_generated/ArchiveFilesV2/task.json b/_generated/ArchiveFilesV2/task.json new file mode 100644 index 000000000000..ffc3395f10a6 --- /dev/null +++ b/_generated/ArchiveFilesV2/task.json @@ -0,0 +1,170 @@ +{ + "id": "d8b84976-e99a-4b86-b885-4849694435b0", + "name": "ArchiveFiles", + "friendlyName": "Archive files", + "description": "Compress files into .7z, .tar.gz, or .zip", + "author": "Microsoft Corporation", + "helpUrl": "https://docs.microsoft.com/azure/devops/pipelines/tasks/utility/archive-files", + "helpMarkDown": "[Learn more about this task](http://go.microsoft.com/fwlink/?LinkId=809083)", + "category": "Utility", + "visibility": [ + "Build", + "Release" + ], + "runsOn": [ + "Agent", + "DeploymentGroup" + ], + "demands": [], + "minimumAgentVersion": "2.182.1", + "version": { + "Major": 2, + "Minor": 229, + "Patch": 0 + }, + "groups": [ + { + "name": "archive", + "displayName": "Archive", + "isExpanded": true + } + ], + "instanceNameFormat": "Archive $(rootFolderOrFile)", + "inputs": [ + { + "name": "rootFolderOrFile", + "type": "filePath", + "label": "Root folder or file to archive", + "defaultValue": "$(Build.BinariesDirectory)", + "required": true, + "helpMarkDown": "Enter the root folder or file path to add to the archive. If a folder, everything under the folder will be added to the resulting archive." + }, + { + "name": "includeRootFolder", + "type": "boolean", + "label": "Prepend root folder name to archive paths", + "defaultValue": true, + "required": true, + "helpMarkDown": "If selected, the root folder name will be prepended to file paths within the archive. Otherwise, all file paths will start one level lower.

For example, suppose the selected root folder is: `/home/user/output/classes/`, and contains: `com/acme/Main.class`.

  • If selected, the resulting archive would contain: `classes/com/acme/Main.class`.
  • Otherwise, the resulting archive would contain: `com/acme/Main.class`.
" + }, + { + "name": "archiveType", + "type": "pickList", + "label": "Archive type", + "required": true, + "defaultValue": "zip", + "helpMarkDown": "Specify the compression scheme used. To create `foo.jar`, for example, choose `zip` for the compression, and specify `foo.jar` as the archive file to create. For all tar files (including compressed ones), choose `tar`.", + "groupName": "archive", + "options": { + "zip": "zip", + "7z": "7z", + "tar": "tar", + "wim": "wim" + } + }, + { + "name": "sevenZipCompression", + "type": "pickList", + "label": "7z compression", + "required": false, + "defaultValue": "normal", + "helpMarkDown": "Optionally choose a compression level, or choose `None` to create an uncompressed 7z file.", + "groupName": "archive", + "visibleRule": "archiveType = 7z", + "options": { + "ultra": "Ultra", + "maximum": "Maximum", + "normal": "Normal", + "fast": "Fast", + "fastest": "Fastest", + "none": "None" + } + }, + { + "name": "tarCompression", + "type": "pickList", + "label": "Tar compression", + "required": false, + "defaultValue": "gz", + "helpMarkDown": "Optionally choose a compression scheme, or choose `None` to create an uncompressed tar file.", + "groupName": "archive", + "visibleRule": "archiveType = tar", + "options": { + "gz": "gz", + "bz2": "bz2", + "xz": "xz", + "none": "None" + } + }, + { + "name": "archiveFile", + "type": "filePath", + "label": "Archive file to create", + "defaultValue": "$(Build.ArtifactStagingDirectory)/$(Build.BuildId).zip", + "required": true, + "helpMarkDown": "Specify the name of the archive file to create. For example, to create `foo.tgz`, select the `tar` archive type and `gz` for tar compression.", + "groupName": "archive" + }, + { + "name": "replaceExistingArchive", + "type": "boolean", + "label": "Replace existing archive", + "required": true, + "defaultValue": "true", + "helpMarkDown": "If an existing archive exists, specify whether to overwrite it. Otherwise, files will be added to it.", + "groupName": "archive" + }, + { + "name": "verbose", + "type": "boolean", + "label": "Force verbose output", + "required": false, + "defaultValue": false, + "helpMarkDown": "If set to true, forces tools to use verbose output. Overrides 'quiet'", + "groupName": "archive" + }, + { + "name": "quiet", + "type": "boolean", + "label": "Force quiet output", + "required": false, + "defaultValue": false, + "helpMarkDown": "If set to true, forces tools to use quiet output. Can be overridden by 'verbose'", + "groupName": "archive" + } + ], + "execution": { + "Node10": { + "target": "archivefiles.js", + "argumentFormat": "" + }, + "Node16": { + "target": "archivefiles.js", + "argumentFormat": "" + } + }, + "restrictions": { + "commands": { + "mode": "restricted" + }, + "settableVariables": { + "allowed": [] + } + }, + "messages": { + "Filename": "files=%s", + "TarExists": "Intermediate tar: %s already exists. Attempting to add files to it.", + "RemoveBeforeCreation": "Removing existing archive file before creation: %s", + "AlreadyExists": "Archive file: %s already exists. Attempting to add files to it.", + "ArchiveCreationFailedWithError": "Archive creation failed for archive file: %s \ncode: %d \nstdout: %s \nstderr: %s \nerror: %s;", + "ArchiveFileExistsButNotAFile": "Specified archive file: %s already exists and is not a file.", + "FailedArchiveFile": "Specified archive file: %s cannot be created because it cannot be accessed: %s", + "FoundNFiles": "Found %d files", + "ArchivingFile": "Archiving file: %s", + "MoreFiles": "... %d more ..." + }, + "_buildConfigMapping": { + "Default": "2.229.0", + "Node20-225": "2.229.1" + } +} \ No newline at end of file diff --git a/_generated/ArchiveFilesV2/task.loc.json b/_generated/ArchiveFilesV2/task.loc.json new file mode 100644 index 000000000000..2292ef08da58 --- /dev/null +++ b/_generated/ArchiveFilesV2/task.loc.json @@ -0,0 +1,170 @@ +{ + "id": "d8b84976-e99a-4b86-b885-4849694435b0", + "name": "ArchiveFiles", + "friendlyName": "ms-resource:loc.friendlyName", + "description": "ms-resource:loc.description", + "author": "Microsoft Corporation", + "helpUrl": "https://docs.microsoft.com/azure/devops/pipelines/tasks/utility/archive-files", + "helpMarkDown": "ms-resource:loc.helpMarkDown", + "category": "Utility", + "visibility": [ + "Build", + "Release" + ], + "runsOn": [ + "Agent", + "DeploymentGroup" + ], + "demands": [], + "minimumAgentVersion": "2.182.1", + "version": { + "Major": 2, + "Minor": 229, + "Patch": 0 + }, + "groups": [ + { + "name": "archive", + "displayName": "ms-resource:loc.group.displayName.archive", + "isExpanded": true + } + ], + "instanceNameFormat": "ms-resource:loc.instanceNameFormat", + "inputs": [ + { + "name": "rootFolderOrFile", + "type": "filePath", + "label": "ms-resource:loc.input.label.rootFolderOrFile", + "defaultValue": "$(Build.BinariesDirectory)", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.rootFolderOrFile" + }, + { + "name": "includeRootFolder", + "type": "boolean", + "label": "ms-resource:loc.input.label.includeRootFolder", + "defaultValue": true, + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.includeRootFolder" + }, + { + "name": "archiveType", + "type": "pickList", + "label": "ms-resource:loc.input.label.archiveType", + "required": true, + "defaultValue": "zip", + "helpMarkDown": "ms-resource:loc.input.help.archiveType", + "groupName": "archive", + "options": { + "zip": "zip", + "7z": "7z", + "tar": "tar", + "wim": "wim" + } + }, + { + "name": "sevenZipCompression", + "type": "pickList", + "label": "ms-resource:loc.input.label.sevenZipCompression", + "required": false, + "defaultValue": "normal", + "helpMarkDown": "ms-resource:loc.input.help.sevenZipCompression", + "groupName": "archive", + "visibleRule": "archiveType = 7z", + "options": { + "ultra": "Ultra", + "maximum": "Maximum", + "normal": "Normal", + "fast": "Fast", + "fastest": "Fastest", + "none": "None" + } + }, + { + "name": "tarCompression", + "type": "pickList", + "label": "ms-resource:loc.input.label.tarCompression", + "required": false, + "defaultValue": "gz", + "helpMarkDown": "ms-resource:loc.input.help.tarCompression", + "groupName": "archive", + "visibleRule": "archiveType = tar", + "options": { + "gz": "gz", + "bz2": "bz2", + "xz": "xz", + "none": "None" + } + }, + { + "name": "archiveFile", + "type": "filePath", + "label": "ms-resource:loc.input.label.archiveFile", + "defaultValue": "$(Build.ArtifactStagingDirectory)/$(Build.BuildId).zip", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.archiveFile", + "groupName": "archive" + }, + { + "name": "replaceExistingArchive", + "type": "boolean", + "label": "ms-resource:loc.input.label.replaceExistingArchive", + "required": true, + "defaultValue": "true", + "helpMarkDown": "ms-resource:loc.input.help.replaceExistingArchive", + "groupName": "archive" + }, + { + "name": "verbose", + "type": "boolean", + "label": "ms-resource:loc.input.label.verbose", + "required": false, + "defaultValue": false, + "helpMarkDown": "ms-resource:loc.input.help.verbose", + "groupName": "archive" + }, + { + "name": "quiet", + "type": "boolean", + "label": "ms-resource:loc.input.label.quiet", + "required": false, + "defaultValue": false, + "helpMarkDown": "ms-resource:loc.input.help.quiet", + "groupName": "archive" + } + ], + "execution": { + "Node10": { + "target": "archivefiles.js", + "argumentFormat": "" + }, + "Node16": { + "target": "archivefiles.js", + "argumentFormat": "" + } + }, + "restrictions": { + "commands": { + "mode": "restricted" + }, + "settableVariables": { + "allowed": [] + } + }, + "messages": { + "Filename": "ms-resource:loc.messages.Filename", + "TarExists": "ms-resource:loc.messages.TarExists", + "RemoveBeforeCreation": "ms-resource:loc.messages.RemoveBeforeCreation", + "AlreadyExists": "ms-resource:loc.messages.AlreadyExists", + "ArchiveCreationFailedWithError": "ms-resource:loc.messages.ArchiveCreationFailedWithError", + "ArchiveFileExistsButNotAFile": "ms-resource:loc.messages.ArchiveFileExistsButNotAFile", + "FailedArchiveFile": "ms-resource:loc.messages.FailedArchiveFile", + "FoundNFiles": "ms-resource:loc.messages.FoundNFiles", + "ArchivingFile": "ms-resource:loc.messages.ArchivingFile", + "MoreFiles": "ms-resource:loc.messages.MoreFiles" + }, + "_buildConfigMapping": { + "Default": "2.229.0", + "Node20-225": "2.229.1" + } +} \ No newline at end of file diff --git a/_generated/ArchiveFilesV2/tsconfig.json b/_generated/ArchiveFilesV2/tsconfig.json new file mode 100644 index 000000000000..0438b79f69ac --- /dev/null +++ b/_generated/ArchiveFilesV2/tsconfig.json @@ -0,0 +1,6 @@ +{ + "compilerOptions": { + "target": "ES6", + "module": "commonjs" + } +} \ No newline at end of file diff --git a/_generated/ArchiveFilesV2/utils.ts b/_generated/ArchiveFilesV2/utils.ts new file mode 100644 index 000000000000..ce1c4b97d59b --- /dev/null +++ b/_generated/ArchiveFilesV2/utils.ts @@ -0,0 +1,16 @@ +import tl = require("azure-pipelines-task-lib/task"); + +export function reportArchivePlan(files: string[], max: number=10) : string[] { + var plan: string[] = []; + plan.push(tl.loc('FoundNFiles', files.length)); + if (files.length > 0) { + var limit = Math.min(files.length, max); + for (var i = 0; i < limit; i++) { + plan.push(tl.loc('ArchivingFile', files[i])); + } + if (files.length > max) { + plan.push(tl.loc('MoreFiles', files.length - max)); + } + } + return plan; +} \ No newline at end of file diff --git a/_generated/ArchiveFilesV2_Node20/.npmrc b/_generated/ArchiveFilesV2_Node20/.npmrc new file mode 100644 index 000000000000..5fca0d518be7 --- /dev/null +++ b/_generated/ArchiveFilesV2_Node20/.npmrc @@ -0,0 +1 @@ +scripts-prepend-node-path=true diff --git a/_generated/ArchiveFilesV2_Node20/Strings/resources.resjson/de-DE/resources.resjson b/_generated/ArchiveFilesV2_Node20/Strings/resources.resjson/de-DE/resources.resjson new file mode 100644 index 000000000000..0c1afabefe8b --- /dev/null +++ b/_generated/ArchiveFilesV2_Node20/Strings/resources.resjson/de-DE/resources.resjson @@ -0,0 +1,35 @@ +{ + "loc.friendlyName": "Dateien archivieren", + "loc.helpMarkDown": "[Weitere Informationen zu dieser Aufgabe](http://go.microsoft.com/fwlink/?LinkId=809083)", + "loc.description": "Dateien in 7z, TAR, TAR.GZ oder ZIP komprimieren", + "loc.instanceNameFormat": "Archive $(rootFolderOrFile)", + "loc.group.displayName.archive": "Archiv", + "loc.input.label.rootFolderOrFile": "Stammordner oder Datei für Archivierung", + "loc.input.help.rootFolderOrFile": "Geben Sie den Stammordner oder den Dateipfad an, der dem Archiv hinzugefügt werden soll. Wenn es sich um einen Ordner handelt, werden alle im Ordner enthaltenen Elemente dem resultierenden Archiv hinzugefügt.", + "loc.input.label.includeRootFolder": "Archivpfaden den Stammordnernamen voranstellen", + "loc.input.help.includeRootFolder": "Bei Auswahl dieser Option wird dem Namen des Stammordners ein Präfix zu Dateipfaden im Archiv vorangestellt. Andernfalls beginnen alle Dateipfade eine Ebene niedriger.

Angenommen, der ausgewählte Stammordner lautet \"/home/user/output/classes/\" und enthält \"com/acme/Main.class\".

  • Wenn diese Option ausgewählt wird, enthält das sich ergebende Archiv \"classes/com/acme/Main.class\".
  • Andernfalls enthält das Archiv \"com/acme/Main.class\".
", + "loc.input.label.archiveType": "Archivtyp", + "loc.input.help.archiveType": "Geben Sie das verwendete Komprimierungsschema an. Wenn Sie z. B. \"foo.jar\" erstellen möchten, wählen Sie \"zip\" als Komprimierungsoption aus und geben \"foo.jar\" als zu erstellende Archivdatei an. Wählen Sie \"tar\" für alle TAR-Dateien (einschließlich komprimierter Dateien) aus.", + "loc.input.label.sevenZipCompression": "7z-Komprimierung", + "loc.input.help.sevenZipCompression": "Wählen Sie optional eine Komprimierungsebene aus, oder geben Sie Keine an, um eine nicht komprimierte 7z-Datei zu erstellen.", + "loc.input.label.tarCompression": "TAR-Komprimierung", + "loc.input.help.tarCompression": "Wählen Sie optional ein Komprimierungsschema aus, oder wählen Sie \"Ohne\" aus, um eine nicht komprimierte TAR-Datei zu erstellen.", + "loc.input.label.archiveFile": "Zu erstellende Archivdatei", + "loc.input.help.archiveFile": "Geben Sie den Namen der zu erstellenden Archivdatei an. Wenn Sie z. B. \"foo.tgz\" erstellen möchten, wählen Sie den Archivtyp \"tar\" sowie \"gz\" für TAR-Komprimierung aus.", + "loc.input.label.replaceExistingArchive": "Vorhandenes Archiv ersetzen", + "loc.input.help.replaceExistingArchive": "Wenn bereits ein Archiv vorhanden ist, geben Sie an, ob es überschrieben werden soll. Andernfalls werden ihm Dateien hinzugefügt.", + "loc.input.label.verbose": "Ausführliche Ausgabe erzwingen", + "loc.input.help.verbose": "Bei Festlegung auf TRUE wird der ausführliche Ausgabemodus für Tools erzwungen. Diese Einstellung setzt \"quiet\" außer Kraft.", + "loc.input.label.quiet": "Stille Ausgabe erzwingen", + "loc.input.help.quiet": "Bei Festlegung auf TRUE wird der stille Ausgabemodus für Tools erzwungen. Diese Einstellung kann mit \"verbose\" außer Kraft gesetzt werden.", + "loc.messages.Filename": "files=%s", + "loc.messages.TarExists": "Die temporäre TAR-Datei \"%s\" ist bereits vorhanden. Es wird versucht, ihr Dateien hinzuzufügen.", + "loc.messages.RemoveBeforeCreation": "Die vorhandene Archivdatei wird vor dem Erstellen entfernt: %s", + "loc.messages.AlreadyExists": "Die Archivdatei \"%s\" ist bereits vorhanden. Es wird versucht, ihr Dateien hinzuzufügen.", + "loc.messages.ArchiveCreationFailedWithError": "Fehler beim Erstellen des Archivs für die Archivdatei: %s \nCode: %d \nstdout: %s \nstderr: %s \nFehler: %s;", + "loc.messages.ArchiveFileExistsButNotAFile": "Die angegebene Archivdatei \"%s\" ist bereits vorhanden und ist keine Datei.", + "loc.messages.FailedArchiveFile": "Die angegebene Archivdatei \"%s\" kann nicht erstellt werden, da nicht auf sie zugegriffen werden kann: %s", + "loc.messages.FoundNFiles": "%d Dateien gefunden", + "loc.messages.ArchivingFile": "Datei wird archiviert: %s", + "loc.messages.MoreFiles": "... %d weitere..." +} \ No newline at end of file diff --git a/_generated/ArchiveFilesV2_Node20/Strings/resources.resjson/en-US/resources.resjson b/_generated/ArchiveFilesV2_Node20/Strings/resources.resjson/en-US/resources.resjson new file mode 100644 index 000000000000..9de5c7cb22e3 --- /dev/null +++ b/_generated/ArchiveFilesV2_Node20/Strings/resources.resjson/en-US/resources.resjson @@ -0,0 +1,35 @@ +{ + "loc.friendlyName": "Archive files", + "loc.helpMarkDown": "[Learn more about this task](http://go.microsoft.com/fwlink/?LinkId=809083)", + "loc.description": "Compress files into .7z, .tar.gz, or .zip", + "loc.instanceNameFormat": "Archive $(rootFolderOrFile)", + "loc.group.displayName.archive": "Archive", + "loc.input.label.rootFolderOrFile": "Root folder or file to archive", + "loc.input.help.rootFolderOrFile": "Enter the root folder or file path to add to the archive. If a folder, everything under the folder will be added to the resulting archive.", + "loc.input.label.includeRootFolder": "Prepend root folder name to archive paths", + "loc.input.help.includeRootFolder": "If selected, the root folder name will be prepended to file paths within the archive. Otherwise, all file paths will start one level lower.

For example, suppose the selected root folder is: `/home/user/output/classes/`, and contains: `com/acme/Main.class`.

  • If selected, the resulting archive would contain: `classes/com/acme/Main.class`.
  • Otherwise, the resulting archive would contain: `com/acme/Main.class`.
", + "loc.input.label.archiveType": "Archive type", + "loc.input.help.archiveType": "Specify the compression scheme used. To create `foo.jar`, for example, choose `zip` for the compression, and specify `foo.jar` as the archive file to create. For all tar files (including compressed ones), choose `tar`.", + "loc.input.label.sevenZipCompression": "7z compression", + "loc.input.help.sevenZipCompression": "Optionally choose a compression level, or choose `None` to create an uncompressed 7z file.", + "loc.input.label.tarCompression": "Tar compression", + "loc.input.help.tarCompression": "Optionally choose a compression scheme, or choose `None` to create an uncompressed tar file.", + "loc.input.label.archiveFile": "Archive file to create", + "loc.input.help.archiveFile": "Specify the name of the archive file to create. For example, to create `foo.tgz`, select the `tar` archive type and `gz` for tar compression.", + "loc.input.label.replaceExistingArchive": "Replace existing archive", + "loc.input.help.replaceExistingArchive": "If an existing archive exists, specify whether to overwrite it. Otherwise, files will be added to it.", + "loc.input.label.verbose": "Force verbose output", + "loc.input.help.verbose": "If set to true, forces tools to use verbose output. Overrides 'quiet'", + "loc.input.label.quiet": "Force quiet output", + "loc.input.help.quiet": "If set to true, forces tools to use quiet output. Can be overridden by 'verbose'", + "loc.messages.Filename": "files=%s", + "loc.messages.TarExists": "Intermediate tar: %s already exists. Attempting to add files to it.", + "loc.messages.RemoveBeforeCreation": "Removing existing archive file before creation: %s", + "loc.messages.AlreadyExists": "Archive file: %s already exists. Attempting to add files to it.", + "loc.messages.ArchiveCreationFailedWithError": "Archive creation failed for archive file: %s \ncode: %d \nstdout: %s \nstderr: %s \nerror: %s;", + "loc.messages.ArchiveFileExistsButNotAFile": "Specified archive file: %s already exists and is not a file.", + "loc.messages.FailedArchiveFile": "Specified archive file: %s cannot be created because it cannot be accessed: %s", + "loc.messages.FoundNFiles": "Found %d files", + "loc.messages.ArchivingFile": "Archiving file: %s", + "loc.messages.MoreFiles": "... %d more ..." +} \ No newline at end of file diff --git a/_generated/ArchiveFilesV2_Node20/Strings/resources.resjson/es-ES/resources.resjson b/_generated/ArchiveFilesV2_Node20/Strings/resources.resjson/es-ES/resources.resjson new file mode 100644 index 000000000000..8c4c8d6e907e --- /dev/null +++ b/_generated/ArchiveFilesV2_Node20/Strings/resources.resjson/es-ES/resources.resjson @@ -0,0 +1,35 @@ +{ + "loc.friendlyName": "Archivos de almacenamiento", + "loc.helpMarkDown": "[Obtener más información acerca de esta tarea](http://go.microsoft.com/fwlink/?LinkId=809083)", + "loc.description": "Comprimir archivos en .7z, .tar.gz o .zip", + "loc.instanceNameFormat": "Archivo $(rootFolderOrFile)", + "loc.group.displayName.archive": "Archivo", + "loc.input.label.rootFolderOrFile": "Archivo o carpeta raíz que se va a archivar", + "loc.input.help.rootFolderOrFile": "Escriba la ruta de acceso al archivo o carpeta raíz que se va a agregar al archivo. Si es una carpeta, todo su contenido se agregará al archivo resultante.", + "loc.input.label.includeRootFolder": "Anteponer el nombre de la carpeta raíz a las rutas de acceso de archivos", + "loc.input.help.includeRootFolder": "Cuando se selecciona, el nombre de la carpeta raíz se antepone a las rutas de acceso de archivo que contiene el archivo. De lo contrario, todas las rutas de acceso de archivo comienzan en un nivel inferior.

Por ejemplo, imagine que la carpeta raíz seleccionada es \"/home/user/output/classes/\", que contiene \"com/acme/Main.class\".

  • Si se selecciona esta opción, el archivo resultante contendría \"classes/com/acme/Main.class\".
  • En caso contrario, contendría \"com/acme/Main.class\".
", + "loc.input.label.archiveType": "Tipo de archivo de almacenamiento", + "loc.input.help.archiveType": "Especifique el esquema de compresión utilizado. Para crear `foo.jar`, por ejemplo, elija `zip` para la compresión y especifique `foo.jar` como archivo de almacenamiento que se va a crear. Para todos los archivos tar (incluidos los comprimidos), elija `tar`.", + "loc.input.label.sevenZipCompression": "Compresión 7z", + "loc.input.help.sevenZipCompression": "También puede elegir un nivel de compresión o seleccionar \"Ninguno\" para crear un archivo 7z descomprimido.", + "loc.input.label.tarCompression": "Compresión tar", + "loc.input.help.tarCompression": "También puede elegir un esquema de compresión, o bien elegir \"Ninguno\" para crear un archivo .tar descomprimido.", + "loc.input.label.archiveFile": "Archivo de almacenamiento que se va a crear", + "loc.input.help.archiveFile": "Especifique el nombre del archivo de almacenamiento que se va a crear. Por ejemplo, para crear \"foo.tgz\", seleccione el tipo de archivo \"tar\" y \"gz\" para la compresión tar.", + "loc.input.label.replaceExistingArchive": "Reemplazar el archivo de almacenamiento existente", + "loc.input.help.replaceExistingArchive": "Si ya existe un archivo de almacenamiento, especifique si quiere sobrescribirlo. De lo contrario, se le agregarán los archivos.", + "loc.input.label.verbose": "Forzar salida detallada", + "loc.input.help.verbose": "Si se establece en true, fuerza a las herramientas a usar una salida detallada. Invalida a \"quiet\".", + "loc.input.label.quiet": "Forzar salida silenciosa", + "loc.input.help.quiet": "Si se establece en true, fuerza a las herramientas a usar una salida silenciosa. Se puede invalidar con \"verbose\".", + "loc.messages.Filename": "files=%s", + "loc.messages.TarExists": "El archivo tar intermedio %s ya existe. Intentando agregar archivos.", + "loc.messages.RemoveBeforeCreation": "Quitando el archivo de almacenamiento existente antes de la creación: %s", + "loc.messages.AlreadyExists": "El archivo de almacenamiento %s ya existe. Intentando agregar archivos.", + "loc.messages.ArchiveCreationFailedWithError": "Error de creación del archivo de almacenamiento: %s \nCódigo: %d \nStdOut: %s \nStdErr: %s \nError: %s;", + "loc.messages.ArchiveFileExistsButNotAFile": "El archivo de almacenamiento especificado %s ya existe y no es un archivo.", + "loc.messages.FailedArchiveFile": "El archivo de almacenamiento %s especificado no se puede crear, porque no se puede acceder a él: %s", + "loc.messages.FoundNFiles": "Se encontraron %d archivos", + "loc.messages.ArchivingFile": "Archivo de almacenamiento: %s", + "loc.messages.MoreFiles": "... %d más..." +} \ No newline at end of file diff --git a/_generated/ArchiveFilesV2_Node20/Strings/resources.resjson/fr-FR/resources.resjson b/_generated/ArchiveFilesV2_Node20/Strings/resources.resjson/fr-FR/resources.resjson new file mode 100644 index 000000000000..7264d0152063 --- /dev/null +++ b/_generated/ArchiveFilesV2_Node20/Strings/resources.resjson/fr-FR/resources.resjson @@ -0,0 +1,35 @@ +{ + "loc.friendlyName": "Archiver les fichiers", + "loc.helpMarkDown": "[En savoir plus sur cette tâche](http://go.microsoft.com/fwlink/?LinkId=809083)", + "loc.description": "Compresser les fichiers aux formats .7z, .tar.gz ou .zip", + "loc.instanceNameFormat": "Archive $(rootFolderOrFile)", + "loc.group.displayName.archive": "Archiver", + "loc.input.label.rootFolderOrFile": "Dossier ou fichier racine à archiver", + "loc.input.help.rootFolderOrFile": "Entrez le chemin du dossier ou fichier racine à ajouter à l'archive. S'il s'agit d'un dossier, tout ce qu'il contient est ajouté à l'archive résultante.", + "loc.input.label.includeRootFolder": "Placer le nom du dossier racine au début des chemins d'archives", + "loc.input.help.includeRootFolder": "Si vous sélectionnez l'option correspondante, le nom du dossier racine est placé au début des chemins de fichiers dans l'archive. Sinon, tous les chemins de fichiers commencent un niveau plus bas.

Par exemple, le dossier racine sélectionné est '/home/user/output/classes/', et contient 'com/acme/Main.class'.

  • Si vous sélectionnez l'option correspondante, l'archive résultante contient 'classes/com/acme/Main.class'.
  • Sinon, l'archive résultante contient 'com/acme/Main.class'.
", + "loc.input.label.archiveType": "Type d'archive", + "loc.input.help.archiveType": "Spécifiez le modèle de compression utilisé. Pour créer 'foo.jar', par exemple, choisissez la compression 'zip', puis spécifiez la création du fichier d'archive 'foo.jar'. Pour tous les fichiers tar (notamment les fichiers compressés), choisissez 'tar'.", + "loc.input.label.sevenZipCompression": "Compression 7z", + "loc.input.help.sevenZipCompression": "Vous pouvez éventuellement choisir un niveau de compression, ou choisir Non pour créer un fichier 7z non compressé.", + "loc.input.label.tarCompression": "Compression Tar", + "loc.input.help.tarCompression": "Vous pouvez éventuellement choisir un modèle de compression, ou choisir 'Non' pour créer un fichier tar non compressé.", + "loc.input.label.archiveFile": "Fichier d'archive à créer", + "loc.input.help.archiveFile": "Spécifiez le nom du fichier d'archive à créer. Par exemple, pour créer 'foo.tgz', sélectionnez le type d'archive 'tar', puis 'gz' pour la compression tar.", + "loc.input.label.replaceExistingArchive": "Remplacer l'archive existante", + "loc.input.help.replaceExistingArchive": "S'il existe déjà une archive, indiquez si elle doit être remplacée. Sinon, les fichiers sont ajoutés à cette archive.", + "loc.input.label.verbose": "Forcer la sortie détaillée", + "loc.input.help.verbose": "Si la valeur est true, force les outils à utiliser une sortie détaillée. Remplace 'quiet'", + "loc.input.label.quiet": "Forcer la sortie sans assistance", + "loc.input.help.quiet": "Si la valeur est true, force les outils à utiliser une sortie sans assistance. Vous pouvez utiliser 'verbose' à la place", + "loc.messages.Filename": "files=%s", + "loc.messages.TarExists": "Le fichier tar intermédiaire %s existe déjà. Tentative d'ajout de fichiers à celui-ci.", + "loc.messages.RemoveBeforeCreation": "Suppression du fichier d'archive existant avant la création : %s", + "loc.messages.AlreadyExists": "Le fichier d'archive %s existe déjà. Tentative d'ajout de fichiers à celui-ci.", + "loc.messages.ArchiveCreationFailedWithError": "La création de l'archive a échoué pour le fichier d'archive %s \nCode : %d \nstdOut : %s \nstderr : %s \nErreur : %s;", + "loc.messages.ArchiveFileExistsButNotAFile": "Le fichier d'archive spécifié %s existe déjà et ce n'est pas un fichier.", + "loc.messages.FailedArchiveFile": "Impossible de créer le fichier d'archive spécifié %s, car il n'est pas accessible : %s", + "loc.messages.FoundNFiles": "%d fichiers trouvés", + "loc.messages.ArchivingFile": "Archivage du fichier : %s", + "loc.messages.MoreFiles": "... %d de plus..." +} \ No newline at end of file diff --git a/_generated/ArchiveFilesV2_Node20/Strings/resources.resjson/it-IT/resources.resjson b/_generated/ArchiveFilesV2_Node20/Strings/resources.resjson/it-IT/resources.resjson new file mode 100644 index 000000000000..4214ee4fa25e --- /dev/null +++ b/_generated/ArchiveFilesV2_Node20/Strings/resources.resjson/it-IT/resources.resjson @@ -0,0 +1,35 @@ +{ + "loc.friendlyName": "Archivia file", + "loc.helpMarkDown": "[Altre informazioni su questa attività](http://go.microsoft.com/fwlink/?LinkId=809083)", + "loc.description": "Comprime i file in formato .7z, .tar.gz o .zip", + "loc.instanceNameFormat": "Archivia $(rootFolderOrFile)", + "loc.group.displayName.archive": "Archivia", + "loc.input.label.rootFolderOrFile": "Cartella radice o file da archiviare", + "loc.input.help.rootFolderOrFile": "Consente di immettere la cartella radice o il percorso file da aggiungere all'archivio. Se è una cartella, tutti gli elementi presenti sotto la cartella verranno aggiunti all'archivio risultante.", + "loc.input.label.includeRootFolder": "Anteponi il nome della cartella radice ai percorsi di archivio", + "loc.input.help.includeRootFolder": "Se questa opzione è selezionata, il nome della cartella radice verrà anteposto ai percorsi di file all'interno dell'archivio. In caso contrario, tutti i percorsi di file inizieranno un livello più in basso.

Ad esempio, si supponga che la cartella radice selezionata sia `/home/user/output/classes/` e che contenga `com/acme/Main.class`.

  • Se questa opzione è selezionata, l'archivio risultante conterrà `classes/com/acme/Main.class`.
  • In caso contrario, l'archivio risultante conterrà `com/acme/Main.class`.
", + "loc.input.label.archiveType": "Tipo di archivio", + "loc.input.help.archiveType": "Specificare lo schema di compressione usato. Per creare `foo.jar`, ad esempio, scegliere `zip` per la compressione e specificare `foo.jar` come file di archivio da creare. Per tutti i file TAR, inclusi quelli compressi, scegliere `tar`.", + "loc.input.label.sevenZipCompression": "Compressione 7z", + "loc.input.help.sevenZipCompression": "Consente facoltativamente di scegliere un livello di compressione oppure `None` per creare un file 7z non compresso.", + "loc.input.label.tarCompression": "Compressione TAR", + "loc.input.help.tarCompression": "Consente facoltativamente di scegliere uno schema di compressione oppure `None` per creare un file TAR non compresso.", + "loc.input.label.archiveFile": "File di archivio da creare", + "loc.input.help.archiveFile": "Specificare il nome del file di archivio da creare. Ad esempio, per creare `foo.tgz`, selezionare il tipo di archivio `tar` e `gz` per la compressione del file TAR.", + "loc.input.label.replaceExistingArchive": "Sostituisci l'archivio esistente", + "loc.input.help.replaceExistingArchive": "Se è presente un archivio esistente, specifica se sovrascriverlo. In caso contrario, i file verranno aggiunti all'archivio.", + "loc.input.label.verbose": "Forza output dettagliato", + "loc.input.help.verbose": "Se è impostato su true, impone agli strumenti di usare l'output dettagliato. Esegue l'override di 'quiet'", + "loc.input.label.quiet": "Forza output non interattivo", + "loc.input.help.quiet": "Se è impostato su true, impone agli strumenti di usare l'output non interattivo. È possibile eseguirne l'override con 'verbose'", + "loc.messages.Filename": "file=%s", + "loc.messages.TarExists": "Il file TAR intermedio %s esiste già. Verrà effettuato il tentativo di aggiungervi file.", + "loc.messages.RemoveBeforeCreation": "Rimozione del file di archivio esistente prima della creazione: %s", + "loc.messages.AlreadyExists": "Il file di archivio %s esiste già. Verrà effettuato il tentativo di aggiungervi file.", + "loc.messages.ArchiveCreationFailedWithError": "La creazione dell'archivio non è riuscita per il file di archivio: %s \nCodice: %d \nStdout: %s \nStderr: %s \nErrore: %s;", + "loc.messages.ArchiveFileExistsButNotAFile": "Il file di archivio specificato %s esiste già e non è un file.", + "loc.messages.FailedArchiveFile": "Non è possibile creare il file di archivio specificato %s perché non è accessibile: %s", + "loc.messages.FoundNFiles": "Sono stati trovati %d file", + "loc.messages.ArchivingFile": "Archiviazione del file: %s", + "loc.messages.MoreFiles": "... altri %d..." +} \ No newline at end of file diff --git a/_generated/ArchiveFilesV2_Node20/Strings/resources.resjson/ja-JP/resources.resjson b/_generated/ArchiveFilesV2_Node20/Strings/resources.resjson/ja-JP/resources.resjson new file mode 100644 index 000000000000..d08332659271 --- /dev/null +++ b/_generated/ArchiveFilesV2_Node20/Strings/resources.resjson/ja-JP/resources.resjson @@ -0,0 +1,35 @@ +{ + "loc.friendlyName": "ファイルのアーカイブ", + "loc.helpMarkDown": "[このタスクの詳細を表示](http://go.microsoft.com/fwlink/?LinkId=809083)", + "loc.description": "ファイルを .7z、.tar.gz、または .zip に圧縮します", + "loc.instanceNameFormat": "アーカイブ $(rootFolderOrFile)", + "loc.group.displayName.archive": "アーカイブ", + "loc.input.label.rootFolderOrFile": "アーカイブするルート フォルダーまたはファイル", + "loc.input.help.rootFolderOrFile": "アーカイブに追加するルート フォルダーまたはファイル パスを入力します。フォルダーの場合、結果として作成されるアーカイブにはそのフォルダー配下のすべてが追加されます。", + "loc.input.label.includeRootFolder": "アーカイブ パスの先頭にルート フォルダー名を追加", + "loc.input.help.includeRootFolder": "選択すると、ルート フォルダーの名前が、アーカイブ内のファイル パスの前に付加されます。選択しない場合には、すべてのファイル パスは 1 レベル深い階層から始まります。

たとえば、選択したルート フォルダーが `/home/user/output/classes/` で、`com/acme/Main.class` が含まれているとします。

  • 選択すると、生成されるアーカイブには `classes/com/acme/Main.class` が入ります。
  • 選択しない場合には、生成されるアーカイブには `com/acme/Main.class` が入ります。
", + "loc.input.label.archiveType": "アーカイブの種類", + "loc.input.help.archiveType": "使用する圧縮スキームを指定します。たとえば、`foo.jar` を作成する場合、圧縮に `zip` を選択し、作成するアーカイブ ファイルとして `foo.jar` を指定します。すべての tar ファイル (圧縮されたものも含め) には、`tar` を選択します。", + "loc.input.label.sevenZipCompression": "7z 圧縮", + "loc.input.help.sevenZipCompression": "(省略可能) 圧縮レベルを選択します。あるいは、圧縮されていない 7z ファイルを作成する場合には `None` を選択します。", + "loc.input.label.tarCompression": "Tar 圧縮", + "loc.input.help.tarCompression": "(省略可能) 圧縮スキーマを選択します。あるいは、圧縮されていない tar ファイルを作成する場合には `None` を選択します。", + "loc.input.label.archiveFile": "作成するアーカイブ ファイル", + "loc.input.help.archiveFile": "作成するアーカイブ ファイルの名前を指定します。たとえば、`foo.tgz` を作成する場合、`tar` アーカイブ型と `gz` を tar 圧縮のために選択します。", + "loc.input.label.replaceExistingArchive": "既存のアーカイブを置換", + "loc.input.help.replaceExistingArchive": "既存のアーカイブが存在する場合、上書きするかどうかを指定します。上書きしない場合には、ファイルは追加されます。", + "loc.input.label.verbose": "詳細出力を強制する", + "loc.input.help.verbose": "True に設定すると、ツールが詳細出力を使用するよう強制します。'quiet' をオーバーライドします", + "loc.input.label.quiet": "非表示出力を強制する", + "loc.input.help.quiet": "True に設定すると、ツールが非表示出力を使用するよう強制します。'verbose' でオーバーライドできます", + "loc.messages.Filename": "files=%s", + "loc.messages.TarExists": "中間 tar %s は既に存在しています。ファイルの追加を試行しています。", + "loc.messages.RemoveBeforeCreation": "作成する前に既存のアーカイブ ファイルを削除しています: %s", + "loc.messages.AlreadyExists": "アーカイブ ファイル %s は既に存在しています。ファイルの追加を試行しています。", + "loc.messages.ArchiveCreationFailedWithError": "次のアーカイブ ファイルのアーカイブ作成に失敗しました: %s \ncode: %d \nstdout: %s \nstderr: %s \nerror: %s;", + "loc.messages.ArchiveFileExistsButNotAFile": "指定されたアーカイブ ファイル %s は既に存在しており、ファイルではありません。", + "loc.messages.FailedArchiveFile": "指定されたアーカイブ ファイル %s は、アクセスできないので作成できません: %s", + "loc.messages.FoundNFiles": "%d 件のファイルが見つかりました", + "loc.messages.ArchivingFile": "ファイル (%s) をアーカイブしています", + "loc.messages.MoreFiles": "... さらに %d 件 ..." +} \ No newline at end of file diff --git a/_generated/ArchiveFilesV2_Node20/Strings/resources.resjson/ko-KR/resources.resjson b/_generated/ArchiveFilesV2_Node20/Strings/resources.resjson/ko-KR/resources.resjson new file mode 100644 index 000000000000..163538d36397 --- /dev/null +++ b/_generated/ArchiveFilesV2_Node20/Strings/resources.resjson/ko-KR/resources.resjson @@ -0,0 +1,35 @@ +{ + "loc.friendlyName": "보관 파일", + "loc.helpMarkDown": "[이 작업에 대한 자세한 정보](http://go.microsoft.com/fwlink/?LinkId=809083)", + "loc.description": "파일을 .7z, .tar.gz 또는 .zip으로 압축", + "loc.instanceNameFormat": "$(rootFolderOrFile) 보관", + "loc.group.displayName.archive": "보관", + "loc.input.label.rootFolderOrFile": "보관할 루트 폴더 또는 파일", + "loc.input.help.rootFolderOrFile": "보관 파일에 추가할 루트 폴더 또는 파일 경로를 입력합니다. 폴더를 입력하는 경우 폴더 아래에 있는 모든 항목이 결과 보관 파일에 추가됩니다.", + "loc.input.label.includeRootFolder": "보관 파일 경로에 루트 폴더 이름을 접두사로 추가", + "loc.input.help.includeRootFolder": "선택하는 경우 루트 폴더 이름이 보관 파일 내의 파일 경로에 접두사로 추가됩니다. 선택하지 않으면 모든 파일 경로가 한 단계 낮은 경로로 시작합니다.

예를 들어 선택한 루트 폴더가 '/home/user/output/classes/'이고, 'com/acme/Main.class'를 포함하고 있다고 가정합니다.

  • 선택하는 경우 결과 보관 파일은 'classes/com/acme/Main.class'를 포함합니다.
  • 선택하지 않으면 결과 보관 파일은 'com/acme/Main.class'를 포함합니다.
", + "loc.input.label.archiveType": "보관 파일 형식", + "loc.input.help.archiveType": "사용되는 압축 체계를 지정합니다. 예를 들어 `foo.jar`을 만들려면 압축 형식으로 `zip`을 선택하고 만들 보관 파일로 `foo.jar`을 선택합니다. 모든 tar 파일(압축된 tar 포함)의 경우 `tar`을 선택합니다.", + "loc.input.label.sevenZipCompression": "7z 압축", + "loc.input.help.sevenZipCompression": "선택적으로 압축 수준을 선택하거나, `없음`을 선택하여 압축되지 않은 7z 파일을 만듭니다.", + "loc.input.label.tarCompression": "Tar 압축", + "loc.input.help.tarCompression": "선택적으로 압축 체계를 선택하거나, `없음`을 선택하여 압축되지 않은 tar 파일을 만듭니다.", + "loc.input.label.archiveFile": "만들 보관 파일", + "loc.input.help.archiveFile": "만들려는 보관 파일의 이름을 지정합니다. 예를 들어 `foo.tgz`를 만들려면 `tar` 보관 파일 형식을 선택하고 tar 압축의 경우 `gz`를 선택합니다.", + "loc.input.label.replaceExistingArchive": "기존 보관 파일 바꾸기", + "loc.input.help.replaceExistingArchive": "기존 보관 파일이 있는 경우 해당 파일을 덮어쓸지 지정합니다. 그러지 않으면 파일이 기존 보관 파일에 추가됩니다.", + "loc.input.label.verbose": "자세한 정보 출력 강제 적용", + "loc.input.help.verbose": "true로 설정하면, 도구에서 강제로 자세한 정보 출력을 사용합니다. 'quiet'를 재정의합니다.", + "loc.input.label.quiet": "자동 출력 강제 적용", + "loc.input.help.quiet": "true로 설정하면, 도구에서 강제로 자동 출력을 사용합니다. 'verbose'를 통해 재정의할 수 있습니다.", + "loc.messages.Filename": "files=%s", + "loc.messages.TarExists": "중간 tar %s이(가) 이미 있습니다. 여기에 파일을 추가하려고 시도하고 있습니다.", + "loc.messages.RemoveBeforeCreation": "만들기 전에 기존 보관 파일을 제거하는 중입니다. %s", + "loc.messages.AlreadyExists": "보관 파일 %s이(가) 이미 있습니다. 이 파일에 파일을 추가하려고 시도하고 있습니다.", + "loc.messages.ArchiveCreationFailedWithError": "보관 파일 %s에 대한 아카이브를 만들지 못했습니다. \n코드: %d \nstdout: %s \nstderr: %s \n오류: %s;", + "loc.messages.ArchiveFileExistsButNotAFile": "지정된 보관 파일 %s은(는) 이미 있으며 파일이 아닙니다.", + "loc.messages.FailedArchiveFile": "지정된 보관 파일 %s은(는) 액세스할 수 없으므로 만들 수 없습니다. %s", + "loc.messages.FoundNFiles": "%d개 파일을 찾았습니다.", + "loc.messages.ArchivingFile": "보관 파일: %s", + "loc.messages.MoreFiles": "... %d개 더..." +} \ No newline at end of file diff --git a/_generated/ArchiveFilesV2_Node20/Strings/resources.resjson/ru-RU/resources.resjson b/_generated/ArchiveFilesV2_Node20/Strings/resources.resjson/ru-RU/resources.resjson new file mode 100644 index 000000000000..9836a5e06ee7 --- /dev/null +++ b/_generated/ArchiveFilesV2_Node20/Strings/resources.resjson/ru-RU/resources.resjson @@ -0,0 +1,35 @@ +{ + "loc.friendlyName": "Архивировать файлы", + "loc.helpMarkDown": "[См. дополнительные сведения об этой задаче](http://go.microsoft.com/fwlink/?LinkId=809083)", + "loc.description": "Сжатие файлов в формате 7Z, TAR.GZ или ZIP", + "loc.instanceNameFormat": "Архив $(rootFolderOrFile)", + "loc.group.displayName.archive": "Архив", + "loc.input.label.rootFolderOrFile": "Корневая папка или файл для архивации", + "loc.input.help.rootFolderOrFile": "Введите корневой путь к файлу или папке для добавления в архив. Если указан путь к папке, в архив будут добавлены все элементы из нее.", + "loc.input.label.includeRootFolder": "Добавлять имя корневой папки в начало путей к архивам", + "loc.input.help.includeRootFolder": "Если этот флажок установлен, имя корневой папки будет добавляться в пути к файлам в архиве в качестве префикса. В противном случае все пути к файлам будут начинаться на один уровень ниже.

Предположим, выбрана корневая папка /home/user/output/classes/, которая содержит файл com/acme/Main.class.

  • Если флажок установлен, полученный архив будет содержать файл classes/com/acme/Main.class.
  • В противном случае полученный архив будет содержать файл com/acme/Main.class.
", + "loc.input.label.archiveType": "Тип архива", + "loc.input.help.archiveType": "Укажите используемую схему сжатия. Например, чтобы создать файл foo.jar, выберите в качестве типа сжатия zip и укажите foo.jar в качестве создаваемого файла архива. Для всех TAR-файлов (включая сжатые) выбирайте tar.", + "loc.input.label.sevenZipCompression": "Сжатие в формате 7Z", + "loc.input.help.sevenZipCompression": "При необходимости выберите уровень сжатия или выберите Нет для создания несжатого 7Z-файла.", + "loc.input.label.tarCompression": "Сжатие TAR", + "loc.input.help.tarCompression": "При необходимости выберите схему сжатия или выберите Нет для создания несжатого TAR-файла.", + "loc.input.label.archiveFile": "Создаваемый файл архива", + "loc.input.help.archiveFile": "Укажите имя файла архива. Например, чтобы создать файл foo.tgz, выберите тип архива tar и gz для сжатия TAR.", + "loc.input.label.replaceExistingArchive": "Заменить существующий архив", + "loc.input.help.replaceExistingArchive": "Если имеется существующий архив, укажите, следует ли перезаписать его. В противном случае файлы будут добавлены в него.", + "loc.input.label.verbose": "Принудительный подробный вывод", + "loc.input.help.verbose": "Если задано значение true, средства принудительно используют подробный вывод. Переопределяет \"тихий\" режим", + "loc.input.label.quiet": "Принудительный тихий вывод", + "loc.input.help.quiet": "Если задано значение true, средства принудительно используют тихий вывод. Может быть переопределен \"подробным\" режимом", + "loc.messages.Filename": "files=%s", + "loc.messages.TarExists": "Промежуточный TAR-файл уже существует: %s. Идет попытка добавления файлов в него.", + "loc.messages.RemoveBeforeCreation": "Удаление существующего архивного файла перед созданием: %s", + "loc.messages.AlreadyExists": "Архивный файл уже существует: %s. Идет попытка добавления файлов в него.", + "loc.messages.ArchiveCreationFailedWithError": "Сбой создания архивного файла: %s \ncode: %d \nstdout: %s \nstderr: %s \nerror: %s;", + "loc.messages.ArchiveFileExistsButNotAFile": "Указанный архивный файл уже существует и не является файлом: %s", + "loc.messages.FailedArchiveFile": "Указанный архивный файл %s невозможно создать, так как он недоступен: %s", + "loc.messages.FoundNFiles": "Найдено файлов: %d", + "loc.messages.ArchivingFile": "Архивный файл: %s", + "loc.messages.MoreFiles": "... еще %d ..." +} \ No newline at end of file diff --git a/_generated/ArchiveFilesV2_Node20/Strings/resources.resjson/zh-CN/resources.resjson b/_generated/ArchiveFilesV2_Node20/Strings/resources.resjson/zh-CN/resources.resjson new file mode 100644 index 000000000000..e708e125def2 --- /dev/null +++ b/_generated/ArchiveFilesV2_Node20/Strings/resources.resjson/zh-CN/resources.resjson @@ -0,0 +1,35 @@ +{ + "loc.friendlyName": "存档文件", + "loc.helpMarkDown": "[详细了解此任务](http://go.microsoft.com/fwlink/?LinkId=809083)", + "loc.description": "将文件压缩为 .7z、.tar、.gz 或 .zip", + "loc.instanceNameFormat": "存档 $(rootFolderOrFile)", + "loc.group.displayName.archive": "存档", + "loc.input.label.rootFolderOrFile": "要存档的根文件夹或文件", + "loc.input.help.rootFolderOrFile": "输入要添加到存档的根文件夹或文件路径。如果是一个文件夹,该文件夹下的所有内容都将添加到生成的存档。", + "loc.input.label.includeRootFolder": "在存档路径前加上根文件夹名称", + "loc.input.help.includeRootFolder": "如果选中,将在存档内向文件路径添加根文件夹名称。否则,所有文件路径将从低一级开始。

例如,假设所选根文件夹为: `/home/user/output/classes/`,且包含: `com/acme/Main.class`

  • 如果选定,则生成的存档将包含: `classes/com/acme/Main.class`
  • 否则,生成的存档将包含: `com/acme/Main.class`
", + "loc.input.label.archiveType": "存档类型", + "loc.input.help.archiveType": "指定使用的压缩方案。例如,若要创建 \"foo.jar\",请选择 \"zip\" 以指定压缩,并指定 \"foo.jar\" 作为要创建的存档文件。对于所有 tar 文件(包括压缩的),请选择 \"tar\"。", + "loc.input.label.sevenZipCompression": "7z 压缩", + "loc.input.help.sevenZipCompression": "可以选择压缩级别,或选择 `None` 以创建未压缩的 7z 文件。", + "loc.input.label.tarCompression": "Tar 压缩", + "loc.input.help.tarCompression": "可以选择压缩方案,或选择“无”以创建未压缩的 tar 文件。", + "loc.input.label.archiveFile": "要创建的存档文件", + "loc.input.help.archiveFile": "指定要创建的存档文件的名称。例如,若要创建 \"foo.tgz\",请选择 \"tar\" 存档类型,并用 \"gz\" 指定 tar 压缩。", + "loc.input.label.replaceExistingArchive": "替换现有存档", + "loc.input.help.replaceExistingArchive": "如果存在现有存档,请指定是否将其覆盖。如果不覆盖,将向其添加文件。", + "loc.input.label.verbose": "强制使用详细输出", + "loc.input.help.verbose": "如果设置为 true,则会强制工具使用详细输出。重写 \"quiet\"", + "loc.input.label.quiet": "强制使用安静输出", + "loc.input.help.quiet": "如果设置为 true,则会强制工具使用安静输出。可由“详细”重写", + "loc.messages.Filename": "files=%s", + "loc.messages.TarExists": "中级 tar %s 已存在。正在尝试将文件添加到其中。", + "loc.messages.RemoveBeforeCreation": "在创建前删除现有存档文件: %s", + "loc.messages.AlreadyExists": "存档文件: %s 已存在。正在尝试将文件添加到其中。", + "loc.messages.ArchiveCreationFailedWithError": "存档文件的存档创建失败: %s \n代码: %d \nStdOut: %s \nstderr: %s \n错误: %s;", + "loc.messages.ArchiveFileExistsButNotAFile": "指定的存档文件 %s 已存在,但它不是文件。", + "loc.messages.FailedArchiveFile": "无法创建指定的存档文件 %s,因为无法访问它: %s", + "loc.messages.FoundNFiles": "已找到 %d 个文件", + "loc.messages.ArchivingFile": "存档文件: %s", + "loc.messages.MoreFiles": "… 其他 %d 个 …" +} \ No newline at end of file diff --git a/_generated/ArchiveFilesV2_Node20/Strings/resources.resjson/zh-TW/resources.resjson b/_generated/ArchiveFilesV2_Node20/Strings/resources.resjson/zh-TW/resources.resjson new file mode 100644 index 000000000000..adb9f89e33d3 --- /dev/null +++ b/_generated/ArchiveFilesV2_Node20/Strings/resources.resjson/zh-TW/resources.resjson @@ -0,0 +1,35 @@ +{ + "loc.friendlyName": "封存檔", + "loc.helpMarkDown": "[深入了解此工作](http://go.microsoft.com/fwlink/?LinkId=809083)", + "loc.description": "將檔案壓縮為 .7z、.tar.gz 或 .zip", + "loc.instanceNameFormat": "封存 $(rootFolderOrFile)", + "loc.group.displayName.archive": "封存", + "loc.input.label.rootFolderOrFile": "要封存的根資料夾或檔案", + "loc.input.help.rootFolderOrFile": "輸入要新增至封存的根資料夾或檔案路徑。若為資料夾,則資料夾下的所有項目將會新增至產生的封存。", + "loc.input.label.includeRootFolder": "在封存路徑之前加上根資料夾名稱", + "loc.input.help.includeRootFolder": "如有選取,將會在封存檔內的檔案路徑前加上根資料夾名稱。否則,所有檔案路徑都會從下一層開始。

例如,假設選取的根資料夾是 `/home/user/output/classes/`,其中包含 `com/acme/Main.class`

  • 如有選取,封存檔最終應包含: `classes/com/acme/Main.class`
  • 否則,封存檔最終應包含: `com/acme/Main.class`
", + "loc.input.label.archiveType": "封存類型", + "loc.input.help.archiveType": "請指定所使用的壓縮配置。例如,若要建立 `foo.jar`,請選擇壓縮類型 [zip],並指定將要建立的封存檔指定為 `foo.jar`。對於所有的 tar 檔案 (包括已壓縮的 tar 檔案),請選擇 [tar]。", + "loc.input.label.sevenZipCompression": "7z 壓縮", + "loc.input.help.sevenZipCompression": "視情況選擇壓縮層級,也可以選擇 [無] 建立未經壓縮的 7z 檔案。", + "loc.input.label.tarCompression": "Tar 壓縮", + "loc.input.help.tarCompression": "您可以視情況選擇壓縮配置,也可選擇 [無] 建立未經壓縮的 tar 檔案。", + "loc.input.label.archiveFile": "要建立的封存檔", + "loc.input.help.archiveFile": "請指定要建立的封存檔案名稱。例如,若要建立 `foo.tgz`,請選取封存類型 [tar],對於 tar 壓縮則選取 [gz]。", + "loc.input.label.replaceExistingArchive": "取代現有的封存檔", + "loc.input.help.replaceExistingArchive": "若已有同名的封存檔,請指定是否要加以覆寫,否則只會將檔案新增至其中。", + "loc.input.label.verbose": "強制詳細資訊輸出", + "loc.input.help.verbose": "若設定為 true,會強制工具使用詳細資訊輸出。覆寫 'quiet'", + "loc.input.label.quiet": "強制無對話輸出", + "loc.input.help.quiet": "若設為 true,即強制工具使用無對話輸出。可由 'verbose' 覆寫", + "loc.messages.Filename": "files=%s", + "loc.messages.TarExists": "中繼 tar %s 已存在。正在嘗試將檔案新增至其中。", + "loc.messages.RemoveBeforeCreation": "在建立前移除現有的封存檔案: %s", + "loc.messages.AlreadyExists": "封存檔案 %s 已存在。正在嘗試將檔案新增至其中。", + "loc.messages.ArchiveCreationFailedWithError": "封存檔案 %s 的封存建立失敗\n代碼: %d \nStdOut: %s \nSTDERR: %s \n錯誤: %s;", + "loc.messages.ArchiveFileExistsButNotAFile": "指定的封存檔案 %s 已存在且不是檔案。", + "loc.messages.FailedArchiveFile": "無法建立指定的封存檔案 : %s,因為無法存取 : %s", + "loc.messages.FoundNFiles": "找到 %d 個檔案", + "loc.messages.ArchivingFile": "正在封存檔案: %s", + "loc.messages.MoreFiles": "... 其他 %d 個 ..." +} \ No newline at end of file diff --git a/_generated/ArchiveFilesV2_Node20/Tests/L0.ts b/_generated/ArchiveFilesV2_Node20/Tests/L0.ts new file mode 100644 index 000000000000..ac69ffbb52cd --- /dev/null +++ b/_generated/ArchiveFilesV2_Node20/Tests/L0.ts @@ -0,0 +1,218 @@ +import * as assert from 'assert'; +import * as utils from '../utils.js'; +import * as ttm from 'azure-pipelines-task-lib/mock-test'; +import fs = require('fs'); +import os = require('os'); +import path = require('path'); +import tl = require('azure-pipelines-task-lib/task'); + +// path to creating archive +let expectedArchivePath: undefined | string = undefined; + +describe('ArchiveFiles L0 Suite', function () { + function deleteFolderRecursive (directoryPath) { + if (fs.existsSync(directoryPath)) { + fs.readdirSync(directoryPath).forEach((file, index) => { + const curPath = path.join(directoryPath, file); + if (fs.lstatSync(curPath).isDirectory()) { + // recurse + deleteFolderRecursive(curPath); + } else { + // delete file + fs.unlinkSync(curPath); + } + }); + fs.rmdirSync(directoryPath); + } + }; + + function runValidations(validator: () => void, tr, done) { + try { + validator(); + done(); + } + catch (error) { + console.log('STDERR', tr.stderr); + console.log('STDOUT', tr.stdout); + done(error); + } + } + + before(() => { + const testTemp = path.join(__dirname, 'test_temp'); + if (!fs.existsSync(testTemp)) { + fs.mkdirSync(testTemp); + } + const testOutput = path.join(__dirname, 'test_output'); + if (!fs.existsSync(testOutput)) { + fs.mkdirSync(testOutput); + } + + const replaceTestOutput = path.join(__dirname, 'test_output', 'replace_test'); + if (!fs.existsSync(replaceTestOutput)) { + fs.mkdirSync(replaceTestOutput); + } + }) + + this.afterEach(() => { + try { + if (expectedArchivePath) fs.unlinkSync(expectedArchivePath); + expectedArchivePath = undefined; + } catch (err) { + console.log('Cannot remove created archive: ' + expectedArchivePath); + } + }); + + this.afterAll(() => { + const testTemp = path.join(__dirname, 'test_temp'); + if (fs.existsSync(testTemp)) { + deleteFolderRecursive(testTemp); + } + const testOutput = path.join(__dirname, 'test_output'); + if (fs.existsSync(testOutput)) { + deleteFolderRecursive(testTemp); + } + }) + + const files = (n) => { + return Array.from( + {length: n}, (v, k) => String(k) + ) + }; + + let test = this; + let cases = [0, 1, 10, 11, 100]; + + tl.setResourcePath(path.join( __dirname, '..', 'task.json')); + cases.forEach(function(numberOfFiles) { + it(`Verify plan output for ${numberOfFiles} files has correct number of lines`, (done: Mocha.Done) => { + test.timeout(1000); + let max = 10; + let plan = utils.reportArchivePlan(files(numberOfFiles), max); + assert(plan.length == Math.min(numberOfFiles+1, max+2)); + + done(); + }); + }); + + it('Successfully creates a zip', function(done: Mocha.Done) { + this.timeout(10000); + process.env['archiveType'] = 'zip'; + process.env['archiveFile'] = 'myZip'; + process.env['includeRootFolder'] = 'true'; + expectedArchivePath = path.join(__dirname, 'test_output', 'myZip.zip'); + + let tp: string = path.join(__dirname, 'L0CreateArchive.js'); + let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + runValidations(() => { + assert(tr.stdout.indexOf('Creating archive') > -1, 'Should have tried to create archive'); + if (process.platform.indexOf('win32') >= 0) { + assert(tr.stdout.indexOf('Add new data to archive: 3 folders, 3 files') > -1, 'Should have found 6 items to compress'); + } else { + assert(tr.stdout.indexOf('adding: test_folder/ (') > -1, 'Should have found 6 items to compress'); + assert(tr.stdout.indexOf('adding: test_folder/a/ (') > -1, 'Should have found 6 items to compress'); + assert(tr.stdout.indexOf('adding: test_folder/a/abc.txt (') > -1, 'Should have found 6 items to compress'); + assert(tr.stdout.indexOf('adding: test_folder/a/def.txt (') > -1, 'Should have found 6 items to compress'); + assert(tr.stdout.indexOf('adding: test_folder/b/ (') > -1, 'Should have found 6 items to compress'); + assert(tr.stdout.indexOf('adding: test_folder/b/abc.txt (') > -1, 'Should have found 6 items to compress'); + } + assert(fs.existsSync(expectedArchivePath), `Should have successfully created the archive at ${expectedArchivePath}, instead directory contents are ${fs.readdirSync(path.dirname(expectedArchivePath))}`); + }, tr, done); + }); + + it('Successfully creates a tar', function(done: Mocha.Done) { + this.timeout(5000); + process.env['archiveType'] = 'tar'; + process.env['archiveFile'] = 'myTar'; + process.env['includeRootFolder'] = 'true'; + expectedArchivePath = path.join(__dirname, 'test_output', 'myTar.gz'); + if (process.platform.indexOf('win32') < 0) { + expectedArchivePath = path.join(__dirname, 'test_output', 'myTar'); + } + + let tp: string = path.join(__dirname, 'L0CreateArchive.js'); + let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + runValidations(() => { + assert(tr.stdout.indexOf('Creating archive') > -1, 'Should have tried to create archive'); + assert(fs.existsSync(expectedArchivePath), `Should have successfully created the archive at ${expectedArchivePath}, instead directory contents are ${fs.readdirSync(path.dirname(expectedArchivePath))}`); + }, tr, done); + }); + +// These tests rely on 7z which isnt present on macOS +if (process.platform.indexOf('darwin') < 0) { + it('Successfully creates a 7z', function(done: Mocha.Done) { + this.timeout(5000); + process.env['archiveType'] = '7z'; + process.env['archiveFile'] = 'my7z'; + process.env['includeRootFolder'] = 'true'; + expectedArchivePath = path.join(__dirname, 'test_output', 'my7z.7z'); + + let tp: string = path.join(__dirname, 'L0CreateArchive.js'); + let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + runValidations(() => { + assert(tr.stdout.indexOf('Creating archive') > -1, 'Should have tried to create archive'); + assert(fs.existsSync(expectedArchivePath), `Should have successfully created the archive at ${expectedArchivePath}, instead directory contents are ${fs.readdirSync(path.dirname(expectedArchivePath))}`); + }, tr, done); + }); + + it('Successfully creates a wim', function(done: Mocha.Done) { + this.timeout(5000); + process.env['archiveType'] = 'wim'; + process.env['archiveFile'] = 'mywim'; + process.env['includeRootFolder'] = 'true'; + expectedArchivePath = path.join(__dirname, 'test_output', 'myWim.wim'); + if (process.platform.indexOf('win') < 0) { + expectedArchivePath = path.join(__dirname, 'test_output', 'mywim.wim'); + } + + let tp: string = path.join(__dirname, 'L0CreateArchive.js'); + let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + runValidations(() => { + assert(tr.stdout.indexOf('Creating archive') > -1, 'Should have tried to create archive'); + assert(fs.existsSync(expectedArchivePath), `Should have successfully created the archive at ${expectedArchivePath}, instead directory contents are ${fs.readdirSync(path.dirname(expectedArchivePath))}`); + }, tr, done); + }); + + it('Replace archive file in the root folder', function(done: Mocha.Done) { + const archiveName = "archive.zip"; + const replaceTestDir = path.join(__dirname, 'test_output', 'replace_test'); + const archivePath = path.join(replaceTestDir, archiveName); + this.timeout(5000); + process.env['archiveType'] = 'zip'; + process.env['archiveFile'] = archiveName; + process.env['includeRootFolder'] = 'false'; + process.env['rootFolderOrFile'] = replaceTestDir; + + fs.writeFileSync(path.join(replaceTestDir, 'test_file.txt'), 'test data'); + + fs.copyFileSync( + path.join(__dirname, 'resources', archiveName), + path.join(archivePath) + ); + + expectedArchivePath = archivePath; + + let tp: string = path.join(__dirname, 'L0ReplaceArchiveInRootFolder.js'); + let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + console.info(tr.stdout); + runValidations(() => { + assert(tr.succeeded, "Task should succeed"); + assert(tr.stdout.indexOf('Creating archive') > -1, 'Should have tried to create archive'); + assert(fs.existsSync(expectedArchivePath), `Should have successfully created the archive at ${expectedArchivePath}, instead directory contents are ${fs.readdirSync(path.dirname(expectedArchivePath))}`); + }, tr, done); + }); +} +}); diff --git a/_generated/ArchiveFilesV2_Node20/Tests/L0CreateArchive.ts b/_generated/ArchiveFilesV2_Node20/Tests/L0CreateArchive.ts new file mode 100644 index 000000000000..3555bd60e5a8 --- /dev/null +++ b/_generated/ArchiveFilesV2_Node20/Tests/L0CreateArchive.ts @@ -0,0 +1,16 @@ +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'archivefiles.js'); +let tmr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +process.env['AGENT_TEMPDIRECTORY'] = path.join(__dirname, 'test_temp'); + +tmr.setInput('rootFolderOrFile', path.join(__dirname, 'test_folder')); +tmr.setInput('includeRootFolder', process.env['includeRootFolder']); +tmr.setInput('archiveType', process.env['archiveType']); +tmr.setInput('archiveFile', path.join('test_output', process.env['archiveFile'])); +tmr.setInput('replaceExistingArchive', 'true'); +tmr.setInput('tarCompression', 'gz'); + +tmr.run(true); \ No newline at end of file diff --git a/_generated/ArchiveFilesV2_Node20/Tests/L0ReplaceArchiveInRootFolder.ts b/_generated/ArchiveFilesV2_Node20/Tests/L0ReplaceArchiveInRootFolder.ts new file mode 100644 index 000000000000..2a74862ae54c --- /dev/null +++ b/_generated/ArchiveFilesV2_Node20/Tests/L0ReplaceArchiveInRootFolder.ts @@ -0,0 +1,16 @@ +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'archivefiles.js'); +let tmr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +process.env['AGENT_TEMPDIRECTORY'] = path.join(__dirname, 'test_temp'); + +tmr.setInput('rootFolderOrFile', path.join(__dirname, 'test_output', 'replace_test')); +tmr.setInput('includeRootFolder', process.env['includeRootFolder']); +tmr.setInput('archiveType', process.env['archiveType']); +tmr.setInput('archiveFile', path.join(__dirname, 'test_output', 'replace_test', process.env['archiveFile'])); +tmr.setInput('replaceExistingArchive', 'true'); +tmr.setInput('tarCompression', 'gz'); + +tmr.run(true); \ No newline at end of file diff --git a/_generated/ArchiveFilesV2_Node20/Tests/package-lock.json b/_generated/ArchiveFilesV2_Node20/Tests/package-lock.json new file mode 100644 index 000000000000..b6192b6825a2 --- /dev/null +++ b/_generated/ArchiveFilesV2_Node20/Tests/package-lock.json @@ -0,0 +1,14 @@ +{ + "name": "ArchiveFiles-tests", + "version": "1.0.7", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/mocha": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", + "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==", + "dev": true + } + } +} diff --git a/_generated/ArchiveFilesV2_Node20/Tests/package.json b/_generated/ArchiveFilesV2_Node20/Tests/package.json new file mode 100644 index 000000000000..d7e89b137c7b --- /dev/null +++ b/_generated/ArchiveFilesV2_Node20/Tests/package.json @@ -0,0 +1,19 @@ +{ + "name": "ArchiveFiles-tests", + "version": "1.0.7", + "description": "Archive Files Task Tests", + "main": "L0.js", + "repository": { + "type": "git", + "url": "git+https://github.com/Microsoft/azure-pipelines-tasks.git" + }, + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Microsoft/azure-pipelines-tasks/issues" + }, + "homepage": "https://github.com/Microsoft/azure-pipelines-tasks#readme", + "devDependencies": { + "@types/mocha": "^5.2.0" + } +} diff --git a/_generated/ArchiveFilesV2_Node20/Tests/resources/archive.zip b/_generated/ArchiveFilesV2_Node20/Tests/resources/archive.zip new file mode 100644 index 000000000000..15cb0ecb3e21 Binary files /dev/null and b/_generated/ArchiveFilesV2_Node20/Tests/resources/archive.zip differ diff --git a/_generated/ArchiveFilesV2_Node20/Tests/test_folder/a/abc.txt b/_generated/ArchiveFilesV2_Node20/Tests/test_folder/a/abc.txt new file mode 100644 index 000000000000..f2ba8f84ab5c --- /dev/null +++ b/_generated/ArchiveFilesV2_Node20/Tests/test_folder/a/abc.txt @@ -0,0 +1 @@ +abc \ No newline at end of file diff --git a/_generated/ArchiveFilesV2_Node20/Tests/test_folder/a/def.txt b/_generated/ArchiveFilesV2_Node20/Tests/test_folder/a/def.txt new file mode 100644 index 000000000000..0c003832e7bf --- /dev/null +++ b/_generated/ArchiveFilesV2_Node20/Tests/test_folder/a/def.txt @@ -0,0 +1 @@ +def \ No newline at end of file diff --git a/_generated/ArchiveFilesV2_Node20/Tests/test_folder/b/abc.txt b/_generated/ArchiveFilesV2_Node20/Tests/test_folder/b/abc.txt new file mode 100644 index 000000000000..f2ba8f84ab5c --- /dev/null +++ b/_generated/ArchiveFilesV2_Node20/Tests/test_folder/b/abc.txt @@ -0,0 +1 @@ +abc \ No newline at end of file diff --git a/_generated/ArchiveFilesV2_Node20/ThirdPartyNotices.txt b/_generated/ArchiveFilesV2_Node20/ThirdPartyNotices.txt new file mode 100644 index 000000000000..999441b2416f --- /dev/null +++ b/_generated/ArchiveFilesV2_Node20/ThirdPartyNotices.txt @@ -0,0 +1,172 @@ +---------------------------------START OF ENTRY FOR THE THIRD PARTY NOTICES---------------------------------------- + 7-Zip + ~~~~~ + License for use and distribution + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + 7-Zip Copyright (C) 1999-2016 Igor Pavlov. + + Licenses for files are: + + 1) 7z.dll: GNU LGPL + unRAR restriction + 2) All other files: GNU LGPL + + The GNU LGPL + unRAR restriction means that you must follow both + GNU LGPL rules and unRAR restriction rules. + + + Note: + You can use 7-Zip on any computer, including a computer in a commercial + organization. You don't need to register or pay for 7-Zip. + + + GNU LGPL information + -------------------- + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You can receive a copy of the GNU Lesser General Public License from + http://www.gnu.org/ + + + unRAR restriction + ----------------- + + The decompression engine for RAR archives was developed using source + code of unRAR program. + All copyrights to original unRAR code are owned by Alexander Roshal. + + The license for original unRAR code has the following restriction: + + The unRAR sources cannot be used to re-create the RAR compression algorithm, + which is proprietary. Distribution of modified unRAR sources in separate form + or as a part of other software is permitted, provided that it is clearly + stated in the documentation and source comments that the code may + not be used to develop a RAR (WinRAR) compatible archiver. + +GNU Lesser General Public License + +Version 2.1, February 1999 + +Copyright (C) 1991, 1999 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. +[This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] + +Preamble + +The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. +This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. +When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. +To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. +For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. +We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. +To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. +Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. +Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. +When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. +We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. +For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. +In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. +Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. +The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. + +TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + +0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". +A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. +The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) +"Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. +Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. + +1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. +You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. + +2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: +a) The modified work must itself be a software library. +b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. +c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. +d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. +(For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) +These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. +Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. +In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. + +3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. +Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. +This option is useful when you wish to copy part of the code of the Library into a program that is not a library. + +4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. +If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. + +5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. +However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. +When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. +If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) +Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. + +6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. +You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: +a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) +b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. +c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. +d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. +e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. +For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. +It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. + +7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: +a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. +b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. + +8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. + +9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. + +10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. + +11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. +If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. +It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. +This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. + +12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. + +13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. +Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. + +14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. + +NO WARRANTY + +15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + +16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +END OF TERMS AND CONDITIONS + +How to Apply These Terms to Your New Libraries + +If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). +To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. + Copyright (C) +This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. +This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. +You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +Also add information on how to contact you by electronic and paper mail. +You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: +Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. + +signature of Ty Coon, 1 April 1990 +Ty Coon, President of Vice + +That's all there is to it! + +----------------------------------------------- END OF ENTRY FOR THE THIRD PARTY NOTICES ---------------------------------------- + diff --git a/_generated/ArchiveFilesV2_Node20/archivefiles.ts b/_generated/ArchiveFilesV2_Node20/archivefiles.ts new file mode 100644 index 000000000000..8db647f38917 --- /dev/null +++ b/_generated/ArchiveFilesV2_Node20/archivefiles.ts @@ -0,0 +1,371 @@ +import path = require('path'); +import tl = require('azure-pipelines-task-lib/task'); +import tr = require('azure-pipelines-task-lib/toolrunner'); +import fs = require('fs'); +import stream = require("stream"); +import utils = require('./utils.js'); + +var repoRoot: string = tl.getVariable('System.DefaultWorkingDirectory'); + +var rootFolderOrFile: string = makeAbsolute(path.normalize(tl.getPathInput('rootFolderOrFile', true, false).trim())); +var includeRootFolder: boolean = tl.getBoolInput('includeRootFolder', true); +var archiveType: string = tl.getInput('archiveType', true); +var archiveFile: string = path.normalize(tl.getPathInput('archiveFile', true, false).trim()); +var replaceExistingArchive: boolean = tl.getBoolInput('replaceExistingArchive', true); +var verbose: boolean = tl.getBoolInput('verbose', false); +var quiet: boolean = tl.getBoolInput('quiet', false); + +tl.debug('repoRoot: ' + repoRoot); + +var win = tl.osType().match(/^Win/); +tl.debug('win: ' + win); + +// archivers +var xpTarLocation: string; +var xpZipLocation: string; +// 7zip +var xpSevenZipLocation: string; +var winSevenZipLocation: string = path.join(__dirname, '7zip/7z.exe'); + +function getSevenZipLocation(): string { + if (win) { + return winSevenZipLocation; + } else { + if (typeof xpTarLocation == "undefined") { + xpSevenZipLocation = tl.which('7z', true); + } + return xpSevenZipLocation; + } +} + +function findFiles(): string[] { + if (includeRootFolder) { + if(!fs.existsSync(rootFolderOrFile)) { + tl.warning(`No file or directory found - ${rootFolderOrFile}`) + } + return [path.basename(rootFolderOrFile)]; + } else { + var fullPaths: string[] = tl.ls('-A', [rootFolderOrFile]); + var baseNames: string[] = []; + for (var i = 0; i < fullPaths.length; i++) { + baseNames[i] = path.basename(fullPaths[i]); + } + return baseNames; + } +} + +function makeAbsolute(normalizedPath: string): string { + tl.debug('makeAbsolute:' + normalizedPath); + + var result = normalizedPath; + if (!path.isAbsolute(normalizedPath)) { + result = path.join(repoRoot, normalizedPath); + tl.debug('Relative file path: ' + normalizedPath + ' resolving to: ' + result); + } + return result; +} + +function createFileList(files: string[]): string { + const tempDirectory: string = tl.getVariable('Agent.TempDirectory'); + const fileName: string = Math.random().toString(36).replace('0.', ''); + const file: string = path.resolve(tempDirectory, fileName); + + try { + fs.writeFileSync( + file, + files.reduce((prev, cur) => prev + cur + "\n", ""), + { encoding: "utf8" }); + } + catch (error) { + if (fs.existsSync(file)) { + fs.unlinkSync(file); + } + + throw error; + } + + return file; +} + +function getOptions(): tr.IExecSyncOptions { + var dirName: string; + if (includeRootFolder) { + dirName = path.dirname(rootFolderOrFile); + tl.debug("cwd (include root folder)= " + dirName); + return { cwd: dirName, outStream: process.stdout as stream.Writable, errStream: process.stderr as stream.Writable }; + } else { + var stats: tl.FsStats = tl.stats(rootFolderOrFile); + if (stats.isFile()) { + dirName = path.dirname(rootFolderOrFile); + } else { + dirName = rootFolderOrFile; + } + tl.debug("cwd (exclude root folder)= " + dirName); + return { cwd: dirName, outStream: process.stdout as stream.Writable, errStream: process.stderr as stream.Writable }; + } +} + +function sevenZipArchive(archive: string, compression: string, files: string[]) { + tl.debug('Creating archive with 7-zip: ' + archive); + var sevenZip = tl.tool(getSevenZipLocation()); + sevenZip.arg('a'); + sevenZip.arg('-t' + compression); + if (verbose) { + // Set highest logging level + sevenZip.arg('-bb3'); + } + + const sevenZipCompression = tl.getInput('sevenZipCompression', false); + if (sevenZipCompression) { + sevenZip.arg('-mx=' + mapSevenZipCompressionLevel(sevenZipCompression)); + } + + sevenZip.arg(archive); + + const fileList: string = createFileList(files); + sevenZip.arg('@' + fileList); + + return handleExecResult(sevenZip.execSync(getOptions()), archive); +} + +// map from YAML-friendly value to 7-Zip numeric value +function mapSevenZipCompressionLevel(sevenZipCompression: string) { + switch (sevenZipCompression.toLowerCase()) { + case "ultra": + return "9"; + case "maximum": + return "7"; + case "normal": + return "5"; + case "fast": + return "3"; + case "fastest": + return "1"; + case "none": + return "0"; + default: + return "5"; + } +} + +// linux & mac only +function zipArchive(archive: string, files: string[]) { + tl.debug('Creating archive with zip: ' + archive); + if (typeof xpZipLocation == "undefined") { + xpZipLocation = tl.which('zip', true); + } + var zip = tl.tool(xpZipLocation); + zip.arg('-r'); + // Verbose gets priority over quiet + if (verbose) { + zip.arg('-v'); + } + else if (quiet) { + zip.arg('-q'); + } + zip.arg(archive); + for (var i = 0; i < files.length; i++) { + zip.arg(files[i]); + console.log(tl.loc('Filename', files[i])); + } + return handleExecResult(zip.execSync(getOptions()), archive); +} + +// linux & mac only +function tarArchive(archive: string, compression: string, files: string[]) { + tl.debug('Creating archive with tar: ' + archive + ' using compression: ' + compression); + if (typeof xpTarLocation == "undefined") { + xpTarLocation = tl.which('tar', true); + } + var tar = tl.tool(xpTarLocation); + if (tl.exist(archive)) { + tar.arg('-r'); // append files to existing tar + } else { + tar.arg('-c'); // create new tar otherwise + } + if (verbose) { + tar.arg('-v'); + } + if (compression) { + tar.arg('--' + compression); + } + tar.arg('-f'); + tar.arg(archive); + for (var i = 0; i < files.length; i++) { + tar.arg(files[i]); + } + return handleExecResult(tar.execSync(getOptions()), archive); +} + +function handleExecResult(execResult, archive) { + if (execResult.code != tl.TaskResult.Succeeded) { + tl.debug('execResult: ' + JSON.stringify(execResult)); + failTask(tl.loc('ArchiveCreationFailedWithError', archive, execResult.code, execResult.stdout, execResult.stderr, execResult.error)); + } +} + +function failTask(message: string) { + throw new FailTaskError(message); +} + +export class FailTaskError extends Error { +} + +/** + * Windows only + * standard gnu-tar extension formats with recognized auto compression formats + * https://www.gnu.org/software/tar/manual/html_section/tar_69.html + * + * Computes the name of the tar to use inside a compressed tar. + * E.g. foo.tar.gz is expected to have foo.tar inside + */ +function computeTarName(archiveName: string): string { + + var lowerArchiveName = archiveName.toLowerCase(); + + //standard full extensions + // gzip xz bzip2 + var fullExtensions = ['.tar.gz', '.tar.xz', '.tar.bz2']; + for (var i = 0; i < fullExtensions.length; i++) { + if (lowerArchiveName.endsWith(fullExtensions[i])) { + return archiveName.substring(0, archiveName.lastIndexOf('.')); + } + } + + //standard abbreviated extensions + // gzip gzip bzip2 bzip2 bzip2 xz + var extensions = ['.tgz', '.taz', '.tz2', 'tbz2', '.tbz', '.txz']; + for (var i = 0; i < extensions.length; i++) { + if (lowerArchiveName.endsWith(extensions[i])) { + return archiveName.substring(0, archiveName.lastIndexOf('.')) + '.tar'; + } + } + + // if 7zip falls down here, or if a .tz2 file is encountered, there is occasionally strange + // behavior resulting in archives that are correct but are renamed + // e.g. test.tz2 has test inside of it instead of test.tar (7z decides to rename it) + // e.g. test_tgz has an outer name of test_tgz.gz (7z decides to add the .gz to it). + + //non standard name + + //foo.tar.anything --> foo.tar + if (lowerArchiveName.lastIndexOf('.tar.') > 0) { + return archiveName.substring(0, lowerArchiveName.lastIndexOf('.tar.') + 4); + } + // foo.anything --> foo.tar + else if (lowerArchiveName.lastIndexOf('.') > 0) { + return archiveName.substring(0, lowerArchiveName.lastIndexOf('.')) + '.tar'; + } + // foo --> foo.tar + return lowerArchiveName + '.tar'; +} + +function createArchive(files: string[]) { + + if (win) { // windows only + if (archiveType == "default" || archiveType == "zip") { //default is zip format + sevenZipArchive(archiveFile, "zip", files); + } else if (archiveType == "tar") { + var tarCompression: string = tl.getInput('tarCompression', true); + if (tarCompression == "none") { + sevenZipArchive(archiveFile, archiveType, files); + } else { + var tarFile = computeTarName(archiveFile); + var tarExists = tl.exist(tarFile); + try { + if (tarExists) { + console.log(tl.loc('TarExists', tarFile)); + } + + // this file could already exist, but not checking because by default files will be added to it + // create the tar file + sevenZipArchive(tarFile, archiveType, files); + // compress the tar file + var sevenZipCompressionFlag = tarCompression; + if (tarCompression == 'gz') { + sevenZipCompressionFlag = 'gzip'; + } else if (tarCompression == 'bz2') { + sevenZipCompressionFlag = 'bzip2'; + } + sevenZipArchive(archiveFile, sevenZipCompressionFlag, [tarFile]); + } finally { + // delete the tar file if we created it. + if (!tarExists) { + tl.rmRF(tarFile); + } + } + } + } else { + sevenZipArchive(archiveFile, archiveType, files); + } + } else { // not windows + if (archiveType == "default" || archiveType == "zip") { //default is zip format + zipArchive(archiveFile, files); + } else if (archiveType == "tar") { + var tarCompression: string = tl.getInput('tarCompression', true); + var tarCompressionFlag; + if (tarCompression == "none") { + tarCompressionFlag = null; + } else if (tarCompression == "gz") { + tarCompressionFlag = "gz"; + } else if (tarCompression == "bz2") { + tarCompressionFlag = "bzip2"; + } else if (tarCompression == "xz") { + tarCompressionFlag = "xz"; + } + tarArchive(archiveFile, tarCompressionFlag, files); + } else { + sevenZipArchive(archiveFile, archiveType, files); + } + } +} + +function doWork() { + try { + tl.setResourcePath(path.join( __dirname, 'task.json')); + + // replaceExistingArchive before creation? + if (tl.exist(archiveFile)) { + if (replaceExistingArchive) { + try { + var stats: tl.FsStats = tl.stats(archiveFile); + if (stats.isFile()) { + console.log(tl.loc('RemoveBeforeCreation', archiveFile)); + tl.rmRF(archiveFile); + } else { + failTask(tl.loc('ArchiveFileExistsButNotAFile', archiveFile)); + } + } catch (e) { + failTask(tl.loc('FailedArchiveFile', archiveFile, e)); + } + } else { + console.log(tl.loc('AlreadyExists', archiveFile)); + } + } + + // Find matching archive files + var files: string[] = findFiles(); + utils.reportArchivePlan(files).forEach(line => console.log(line)); + + tl.debug(`Listing all ${files.length} files to archive:`); + files.forEach(file => tl.debug(file)); + + //ensure output folder exists + var destinationFolder = path.dirname(archiveFile); + tl.debug("Checking for archive destination folder:" + destinationFolder); + if (!tl.exist(destinationFolder)) { + tl.debug("Destination folder does not exist, creating:" + destinationFolder); + tl.mkdirP(destinationFolder); + } + + createArchive(files); + + tl.setResult(tl.TaskResult.Succeeded, 'Successfully created archive: ' + archiveFile); + } catch (e) { + tl.debug(e.message); + tl.error(e); + tl.setResult(tl.TaskResult.Failed, e.message); + } +} + +doWork(); diff --git a/_generated/ArchiveFilesV2_Node20/icon.png b/_generated/ArchiveFilesV2_Node20/icon.png new file mode 100644 index 000000000000..942dc8ed754e Binary files /dev/null and b/_generated/ArchiveFilesV2_Node20/icon.png differ diff --git a/_generated/ArchiveFilesV2_Node20/icon.svg b/_generated/ArchiveFilesV2_Node20/icon.svg new file mode 100644 index 000000000000..c3daaa283b0c --- /dev/null +++ b/_generated/ArchiveFilesV2_Node20/icon.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/_generated/ArchiveFilesV2_Node20/make.json b/_generated/ArchiveFilesV2_Node20/make.json new file mode 100644 index 000000000000..47e731fe78e3 --- /dev/null +++ b/_generated/ArchiveFilesV2_Node20/make.json @@ -0,0 +1,11 @@ +{ + "externals": { + "archivePackages": [ + { + "archiveName": "7zip.zip", + "url": "https://vstsagenttools.blob.core.windows.net/tools/7zip/4/7zip.zip", + "dest": "./" + } + ] + } +} \ No newline at end of file diff --git a/_generated/ArchiveFilesV2_Node20/package-lock.json b/_generated/ArchiveFilesV2_Node20/package-lock.json new file mode 100644 index 000000000000..7edfbe091e35 --- /dev/null +++ b/_generated/ArchiveFilesV2_Node20/package-lock.json @@ -0,0 +1,483 @@ +{ + "name": "ArchiveFiles", + "version": "1.0.7", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/concat-stream": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz", + "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==", + "requires": { + "@types/node": "*" + } + }, + "@types/form-data": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", + "integrity": "sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==", + "requires": { + "@types/node": "*" + } + }, + "@types/mocha": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.1.1.tgz", + "integrity": "sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==" + }, + "@types/node": { + "version": "20.7.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.7.0.tgz", + "integrity": "sha512-zI22/pJW2wUZOVyguFaUL1HABdmSVxpXrzIqkjsHmyUjNhPoWM1CKfvVuXfetHhIok4RY573cqS0mZ1SJEnoTg==" + }, + "@types/qs": { + "version": "6.9.8", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.8.tgz", + "integrity": "sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg==" + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "azure-pipelines-task-lib": { + "version": "5.0.0-preview.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-5.0.0-preview.0.tgz", + "integrity": "sha512-uQJEv+q3/7RD7kgphFd33uXijaPwA1ePYoNkAgZpUhbZUtc2u4JL4ujTT/JJfgXBNW/QQNAiDQ2OC7vOQG/0tg==", + "requires": { + "minimatch": "3.0.5", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "sync-request": "6.1.0", + "uuid": "^3.0.1" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, + "form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + } + }, + "get-port": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", + "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==" + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "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" + }, + "dependencies": { + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==" + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "http-basic": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", + "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", + "requires": { + "caseless": "^0.12.0", + "concat-stream": "^1.6.2", + "http-response-object": "^3.0.1", + "parse-cache-control": "^1.0.1" + } + }, + "http-response-object": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", + "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", + "requires": { + "@types/node": "^10.0.3" + }, + "dependencies": { + "@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + } + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" + }, + "is-core-module": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "requires": { + "has": "^1.0.3" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, + "parse-cache-control": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", + "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "promise": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", + "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", + "requires": { + "asap": "~2.0.6" + } + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==" + }, + "qs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "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" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "requires": { + "resolve": "^1.1.6" + } + }, + "resolve": { + "version": "1.22.6", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.6.tgz", + "integrity": "sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==", + "requires": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" + }, + "shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, + "sync-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", + "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==", + "requires": { + "http-response-object": "^3.0.1", + "sync-rpc": "^1.2.1", + "then-request": "^6.0.0" + } + }, + "sync-rpc": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz", + "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==", + "requires": { + "get-port": "^3.1.0" + } + }, + "then-request": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", + "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", + "requires": { + "@types/concat-stream": "^1.6.0", + "@types/form-data": "0.0.33", + "@types/node": "^8.0.0", + "@types/qs": "^6.2.31", + "caseless": "~0.12.0", + "concat-stream": "^1.6.0", + "form-data": "^2.2.0", + "http-basic": "^8.1.1", + "http-response-object": "^3.0.1", + "promise": "^8.0.0", + "qs": "^6.4.0" + }, + "dependencies": { + "@types/node": { + "version": "8.10.66", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", + "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==" + } + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, + "typescript": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + } + } +} diff --git a/_generated/ArchiveFilesV2_Node20/package.json b/_generated/ArchiveFilesV2_Node20/package.json new file mode 100644 index 000000000000..c2b278164ee0 --- /dev/null +++ b/_generated/ArchiveFilesV2_Node20/package.json @@ -0,0 +1,24 @@ +{ + "name": "ArchiveFiles", + "version": "1.0.7", + "description": "Archive Files Task", + "main": "archivefilestask.js", + "repository": { + "type": "git", + "url": "git+https://github.com/Microsoft/azure-pipelines-tasks.git" + }, + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Microsoft/azure-pipelines-tasks/issues" + }, + "homepage": "https://github.com/Microsoft/azure-pipelines-tasks#readme", + "dependencies": { + "@types/node": "^20.3.1", + "@types/mocha": "^9.1.1", + "azure-pipelines-task-lib": "^5.0.0-preview.0" + }, + "devDependencies": { + "typescript": "5.1.6" + } +} diff --git a/_generated/ArchiveFilesV2_Node20/task.json b/_generated/ArchiveFilesV2_Node20/task.json new file mode 100644 index 000000000000..c75d60051743 --- /dev/null +++ b/_generated/ArchiveFilesV2_Node20/task.json @@ -0,0 +1,174 @@ +{ + "id": "d8b84976-e99a-4b86-b885-4849694435b0", + "name": "ArchiveFiles", + "friendlyName": "Archive files", + "description": "Compress files into .7z, .tar.gz, or .zip", + "author": "Microsoft Corporation", + "helpUrl": "https://docs.microsoft.com/azure/devops/pipelines/tasks/utility/archive-files", + "helpMarkDown": "[Learn more about this task](http://go.microsoft.com/fwlink/?LinkId=809083)", + "category": "Utility", + "visibility": [ + "Build", + "Release" + ], + "runsOn": [ + "Agent", + "DeploymentGroup" + ], + "demands": [], + "minimumAgentVersion": "2.182.1", + "version": { + "Major": 2, + "Minor": 229, + "Patch": 1 + }, + "groups": [ + { + "name": "archive", + "displayName": "Archive", + "isExpanded": true + } + ], + "instanceNameFormat": "Archive $(rootFolderOrFile)", + "inputs": [ + { + "name": "rootFolderOrFile", + "type": "filePath", + "label": "Root folder or file to archive", + "defaultValue": "$(Build.BinariesDirectory)", + "required": true, + "helpMarkDown": "Enter the root folder or file path to add to the archive. If a folder, everything under the folder will be added to the resulting archive." + }, + { + "name": "includeRootFolder", + "type": "boolean", + "label": "Prepend root folder name to archive paths", + "defaultValue": true, + "required": true, + "helpMarkDown": "If selected, the root folder name will be prepended to file paths within the archive. Otherwise, all file paths will start one level lower.

For example, suppose the selected root folder is: `/home/user/output/classes/`, and contains: `com/acme/Main.class`.

  • If selected, the resulting archive would contain: `classes/com/acme/Main.class`.
  • Otherwise, the resulting archive would contain: `com/acme/Main.class`.
" + }, + { + "name": "archiveType", + "type": "pickList", + "label": "Archive type", + "required": true, + "defaultValue": "zip", + "helpMarkDown": "Specify the compression scheme used. To create `foo.jar`, for example, choose `zip` for the compression, and specify `foo.jar` as the archive file to create. For all tar files (including compressed ones), choose `tar`.", + "groupName": "archive", + "options": { + "zip": "zip", + "7z": "7z", + "tar": "tar", + "wim": "wim" + } + }, + { + "name": "sevenZipCompression", + "type": "pickList", + "label": "7z compression", + "required": false, + "defaultValue": "normal", + "helpMarkDown": "Optionally choose a compression level, or choose `None` to create an uncompressed 7z file.", + "groupName": "archive", + "visibleRule": "archiveType = 7z", + "options": { + "ultra": "Ultra", + "maximum": "Maximum", + "normal": "Normal", + "fast": "Fast", + "fastest": "Fastest", + "none": "None" + } + }, + { + "name": "tarCompression", + "type": "pickList", + "label": "Tar compression", + "required": false, + "defaultValue": "gz", + "helpMarkDown": "Optionally choose a compression scheme, or choose `None` to create an uncompressed tar file.", + "groupName": "archive", + "visibleRule": "archiveType = tar", + "options": { + "gz": "gz", + "bz2": "bz2", + "xz": "xz", + "none": "None" + } + }, + { + "name": "archiveFile", + "type": "filePath", + "label": "Archive file to create", + "defaultValue": "$(Build.ArtifactStagingDirectory)/$(Build.BuildId).zip", + "required": true, + "helpMarkDown": "Specify the name of the archive file to create. For example, to create `foo.tgz`, select the `tar` archive type and `gz` for tar compression.", + "groupName": "archive" + }, + { + "name": "replaceExistingArchive", + "type": "boolean", + "label": "Replace existing archive", + "required": true, + "defaultValue": "true", + "helpMarkDown": "If an existing archive exists, specify whether to overwrite it. Otherwise, files will be added to it.", + "groupName": "archive" + }, + { + "name": "verbose", + "type": "boolean", + "label": "Force verbose output", + "required": false, + "defaultValue": false, + "helpMarkDown": "If set to true, forces tools to use verbose output. Overrides 'quiet'", + "groupName": "archive" + }, + { + "name": "quiet", + "type": "boolean", + "label": "Force quiet output", + "required": false, + "defaultValue": false, + "helpMarkDown": "If set to true, forces tools to use quiet output. Can be overridden by 'verbose'", + "groupName": "archive" + } + ], + "execution": { + "Node10": { + "target": "archivefiles.js", + "argumentFormat": "" + }, + "Node16": { + "target": "archivefiles.js", + "argumentFormat": "" + }, + "Node20": { + "target": "archivefiles.js", + "argumentFormat": "" + } + }, + "restrictions": { + "commands": { + "mode": "restricted" + }, + "settableVariables": { + "allowed": [] + } + }, + "messages": { + "Filename": "files=%s", + "TarExists": "Intermediate tar: %s already exists. Attempting to add files to it.", + "RemoveBeforeCreation": "Removing existing archive file before creation: %s", + "AlreadyExists": "Archive file: %s already exists. Attempting to add files to it.", + "ArchiveCreationFailedWithError": "Archive creation failed for archive file: %s \ncode: %d \nstdout: %s \nstderr: %s \nerror: %s;", + "ArchiveFileExistsButNotAFile": "Specified archive file: %s already exists and is not a file.", + "FailedArchiveFile": "Specified archive file: %s cannot be created because it cannot be accessed: %s", + "FoundNFiles": "Found %d files", + "ArchivingFile": "Archiving file: %s", + "MoreFiles": "... %d more ..." + }, + "_buildConfigMapping": { + "Default": "2.229.0", + "Node20-225": "2.229.1" + } +} \ No newline at end of file diff --git a/_generated/ArchiveFilesV2_Node20/task.loc.json b/_generated/ArchiveFilesV2_Node20/task.loc.json new file mode 100644 index 000000000000..bcdc502b3235 --- /dev/null +++ b/_generated/ArchiveFilesV2_Node20/task.loc.json @@ -0,0 +1,174 @@ +{ + "id": "d8b84976-e99a-4b86-b885-4849694435b0", + "name": "ArchiveFiles", + "friendlyName": "ms-resource:loc.friendlyName", + "description": "ms-resource:loc.description", + "author": "Microsoft Corporation", + "helpUrl": "https://docs.microsoft.com/azure/devops/pipelines/tasks/utility/archive-files", + "helpMarkDown": "ms-resource:loc.helpMarkDown", + "category": "Utility", + "visibility": [ + "Build", + "Release" + ], + "runsOn": [ + "Agent", + "DeploymentGroup" + ], + "demands": [], + "minimumAgentVersion": "2.182.1", + "version": { + "Major": 2, + "Minor": 229, + "Patch": 1 + }, + "groups": [ + { + "name": "archive", + "displayName": "ms-resource:loc.group.displayName.archive", + "isExpanded": true + } + ], + "instanceNameFormat": "ms-resource:loc.instanceNameFormat", + "inputs": [ + { + "name": "rootFolderOrFile", + "type": "filePath", + "label": "ms-resource:loc.input.label.rootFolderOrFile", + "defaultValue": "$(Build.BinariesDirectory)", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.rootFolderOrFile" + }, + { + "name": "includeRootFolder", + "type": "boolean", + "label": "ms-resource:loc.input.label.includeRootFolder", + "defaultValue": true, + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.includeRootFolder" + }, + { + "name": "archiveType", + "type": "pickList", + "label": "ms-resource:loc.input.label.archiveType", + "required": true, + "defaultValue": "zip", + "helpMarkDown": "ms-resource:loc.input.help.archiveType", + "groupName": "archive", + "options": { + "zip": "zip", + "7z": "7z", + "tar": "tar", + "wim": "wim" + } + }, + { + "name": "sevenZipCompression", + "type": "pickList", + "label": "ms-resource:loc.input.label.sevenZipCompression", + "required": false, + "defaultValue": "normal", + "helpMarkDown": "ms-resource:loc.input.help.sevenZipCompression", + "groupName": "archive", + "visibleRule": "archiveType = 7z", + "options": { + "ultra": "Ultra", + "maximum": "Maximum", + "normal": "Normal", + "fast": "Fast", + "fastest": "Fastest", + "none": "None" + } + }, + { + "name": "tarCompression", + "type": "pickList", + "label": "ms-resource:loc.input.label.tarCompression", + "required": false, + "defaultValue": "gz", + "helpMarkDown": "ms-resource:loc.input.help.tarCompression", + "groupName": "archive", + "visibleRule": "archiveType = tar", + "options": { + "gz": "gz", + "bz2": "bz2", + "xz": "xz", + "none": "None" + } + }, + { + "name": "archiveFile", + "type": "filePath", + "label": "ms-resource:loc.input.label.archiveFile", + "defaultValue": "$(Build.ArtifactStagingDirectory)/$(Build.BuildId).zip", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.archiveFile", + "groupName": "archive" + }, + { + "name": "replaceExistingArchive", + "type": "boolean", + "label": "ms-resource:loc.input.label.replaceExistingArchive", + "required": true, + "defaultValue": "true", + "helpMarkDown": "ms-resource:loc.input.help.replaceExistingArchive", + "groupName": "archive" + }, + { + "name": "verbose", + "type": "boolean", + "label": "ms-resource:loc.input.label.verbose", + "required": false, + "defaultValue": false, + "helpMarkDown": "ms-resource:loc.input.help.verbose", + "groupName": "archive" + }, + { + "name": "quiet", + "type": "boolean", + "label": "ms-resource:loc.input.label.quiet", + "required": false, + "defaultValue": false, + "helpMarkDown": "ms-resource:loc.input.help.quiet", + "groupName": "archive" + } + ], + "execution": { + "Node10": { + "target": "archivefiles.js", + "argumentFormat": "" + }, + "Node16": { + "target": "archivefiles.js", + "argumentFormat": "" + }, + "Node20": { + "target": "archivefiles.js", + "argumentFormat": "" + } + }, + "restrictions": { + "commands": { + "mode": "restricted" + }, + "settableVariables": { + "allowed": [] + } + }, + "messages": { + "Filename": "ms-resource:loc.messages.Filename", + "TarExists": "ms-resource:loc.messages.TarExists", + "RemoveBeforeCreation": "ms-resource:loc.messages.RemoveBeforeCreation", + "AlreadyExists": "ms-resource:loc.messages.AlreadyExists", + "ArchiveCreationFailedWithError": "ms-resource:loc.messages.ArchiveCreationFailedWithError", + "ArchiveFileExistsButNotAFile": "ms-resource:loc.messages.ArchiveFileExistsButNotAFile", + "FailedArchiveFile": "ms-resource:loc.messages.FailedArchiveFile", + "FoundNFiles": "ms-resource:loc.messages.FoundNFiles", + "ArchivingFile": "ms-resource:loc.messages.ArchivingFile", + "MoreFiles": "ms-resource:loc.messages.MoreFiles" + }, + "_buildConfigMapping": { + "Default": "2.229.0", + "Node20-225": "2.229.1" + } +} \ No newline at end of file diff --git a/_generated/ArchiveFilesV2_Node20/tsconfig.json b/_generated/ArchiveFilesV2_Node20/tsconfig.json new file mode 100644 index 000000000000..0438b79f69ac --- /dev/null +++ b/_generated/ArchiveFilesV2_Node20/tsconfig.json @@ -0,0 +1,6 @@ +{ + "compilerOptions": { + "target": "ES6", + "module": "commonjs" + } +} \ No newline at end of file diff --git a/_generated/ArchiveFilesV2_Node20/utils.ts b/_generated/ArchiveFilesV2_Node20/utils.ts new file mode 100644 index 000000000000..ce1c4b97d59b --- /dev/null +++ b/_generated/ArchiveFilesV2_Node20/utils.ts @@ -0,0 +1,16 @@ +import tl = require("azure-pipelines-task-lib/task"); + +export function reportArchivePlan(files: string[], max: number=10) : string[] { + var plan: string[] = []; + plan.push(tl.loc('FoundNFiles', files.length)); + if (files.length > 0) { + var limit = Math.min(files.length, max); + for (var i = 0; i < limit; i++) { + plan.push(tl.loc('ArchivingFile', files[i])); + } + if (files.length > max) { + plan.push(tl.loc('MoreFiles', files.length - max)); + } + } + return plan; +} \ No newline at end of file diff --git a/_generated/BashV3.versionmap.txt b/_generated/BashV3.versionmap.txt new file mode 100644 index 000000000000..17ff42b0c908 --- /dev/null +++ b/_generated/BashV3.versionmap.txt @@ -0,0 +1,2 @@ +Default|3.229.0 +Node20-225|3.229.1 diff --git a/_generated/BashV3/README.md b/_generated/BashV3/README.md new file mode 100644 index 000000000000..196e01c56fd7 --- /dev/null +++ b/_generated/BashV3/README.md @@ -0,0 +1,3 @@ +BashV3 + + diff --git a/_generated/BashV3/Strings/resources.resjson/de-DE/resources.resjson b/_generated/BashV3/Strings/resources.resjson/de-DE/resources.resjson new file mode 100644 index 000000000000..d14469b46b32 --- /dev/null +++ b/_generated/BashV3/Strings/resources.resjson/de-DE/resources.resjson @@ -0,0 +1,28 @@ +{ + "loc.friendlyName": "Bash", + "loc.helpMarkDown": "[Erfahren Sie mehr zu dieser Aufgabe](https://go.microsoft.com/fwlink/?linkid=2132213), oder [zeigen Sie die Bash-Dokumentation an](https://www.gnu.org/software/bash/manual/).", + "loc.description": "Hiermit führen Sie ein Bash-Skript unter macOS, Linux oder Windows aus.", + "loc.instanceNameFormat": "Bash-Skript", + "loc.releaseNotes": "Konsistenz des Skripttasks. Es wurde Unterstützung für mehrere Zeilen und für Windows hinzugefügt.", + "loc.group.displayName.advanced": "Erweitert", + "loc.input.label.targetType": "Typ", + "loc.input.help.targetType": "Zielskripttyp: Dateipfad oder Inline", + "loc.input.label.filePath": "Skriptpfad", + "loc.input.help.filePath": "Der Pfad des auszuführenden Skripts. Es muss sich um einen vollqualifizierten Pfad oder einen Pfad relativ zu \"$(System.DefaultWorkingDirectory)\" handeln.", + "loc.input.label.arguments": "Argumente", + "loc.input.help.arguments": "An das Shellskript übergebene Argumente. Entweder Ordnungszahl- oder benannte Parameter.", + "loc.input.label.script": "Skript", + "loc.input.label.workingDirectory": "Arbeitsverzeichnis", + "loc.input.label.failOnStderr": "Fehler aufgrund von Standardfehler.", + "loc.input.help.failOnStderr": "Wenn dies TRUE ist, tritt bei dieser Aufgabe ein Fehler auf, wenn Fehler in den StandardError-Stream geschrieben werden.", + "loc.input.label.bashEnvValue": "Legen Sie Wert für die Umgebungsvariable „BASH_ENV“ fest.", + "loc.input.help.bashEnvValue": "Wenn eine Eingabe angegeben wird, wird der Wert erweitert und als Pfad einer Startdatei verwendet, die vor dem Ausführen des Skripts ausgeführt werden soll. Wenn die Umgebungsvariable „BASH_ENV“ bereits definiert wurde, überschreibt die Aufgabe diese Variable nur für die aktuellen Aufgabe. Weitere Details finden Sie in unter [Link](https://www.gnu.org/software/bash/manual/html_node/Bash-Startup-Files.html).", + "loc.messages.GeneratingScript": "Skript wird erstellt.", + "loc.messages.JS_ExitCode": "Bash wurde mit dem Code \"%s\" beendet.", + "loc.messages.JS_FormattedCommand": "Formatierter Befehl: %s", + "loc.messages.JS_InvalidFilePath": "Ungültiger Dateipfad \"%s\".", + "loc.messages.JS_ScriptContents": "Skriptinhalte:", + "loc.messages.JS_Stderr": "Bash hat mindestens eine Zeile in den Standardfehlerstream geschrieben.", + "loc.messages.JS_TranslatePathFailed": "Der Pfad \"%s\" kann nicht in das Linux-Dateisystem übersetzt werden.", + "loc.messages.JS_BashEnvAlreadyDefined": "Die Umgebungsvariable „BASH_ENV“ wurde bereits auf „%s“ festgelegt. Die Aufgabe überschreibt sie mit „%s“." +} \ No newline at end of file diff --git a/_generated/BashV3/Strings/resources.resjson/en-US/resources.resjson b/_generated/BashV3/Strings/resources.resjson/en-US/resources.resjson new file mode 100644 index 000000000000..793fe175117b --- /dev/null +++ b/_generated/BashV3/Strings/resources.resjson/en-US/resources.resjson @@ -0,0 +1,29 @@ +{ + "loc.friendlyName": "Bash", + "loc.helpMarkDown": "[Learn more about this task](https://go.microsoft.com/fwlink/?linkid=2132213) or [see the Bash documentation](https://www.gnu.org/software/bash/manual/)", + "loc.description": "Run a Bash script on macOS, Linux, or Windows", + "loc.instanceNameFormat": "Bash Script", + "loc.releaseNotes": "Script task consistency. Added support for multiple lines and added support for Windows.", + "loc.group.displayName.advanced": "Advanced", + "loc.input.label.targetType": "Type", + "loc.input.help.targetType": "Target script type: File Path or Inline", + "loc.input.label.filePath": "Script Path", + "loc.input.help.filePath": "Path of the script to execute. Must be a fully qualified path or relative to $(System.DefaultWorkingDirectory).", + "loc.input.label.arguments": "Arguments", + "loc.input.help.arguments": "Arguments passed to the shell script. Either ordinal parameters or named parameters.", + "loc.input.label.script": "Script", + "loc.input.label.workingDirectory": "Working Directory", + "loc.input.label.failOnStderr": "Fail on Standard Error", + "loc.input.help.failOnStderr": "If this is true, this task will fail if any errors are written to the StandardError stream.", + "loc.input.label.bashEnvValue": "Set value for BASH_ENV environment variable", + "loc.input.help.bashEnvValue": "If input is specified, it's value is expanded and used as the path of a startup file to execute before running the script. If the environment variable `BASH_ENV` has already been defined, the task will override this variable only for the current task. You can find more details by [link](https://www.gnu.org/software/bash/manual/html_node/Bash-Startup-Files.html).", + "loc.messages.GeneratingScript": "Generating script.", + "loc.messages.JS_ExitCode": "Bash exited with code '%s'.", + "loc.messages.JS_FormattedCommand": "Formatted command: %s", + "loc.messages.JS_InvalidFilePath": "Invalid file path '%s'.", + "loc.messages.JS_ScriptContents": "Script contents:", + "loc.messages.JS_Stderr": "Bash wrote one or more lines to the standard error stream.", + "loc.messages.JS_TranslatePathFailed": "Unable to translate the path '%s' to the Linux file system.", + "loc.messages.JS_BashEnvAlreadyDefined": "The BASH_ENV environment variable has already been set to a '%s', the task will override it with '%s'", + "loc.messages.ScriptArgsSanitized": "Detected characters in arguments that may not be executed correctly by the shell. Please escape special characters using backslash (\\). More information is available here: https://aka.ms/ado/75787" +} \ No newline at end of file diff --git a/_generated/BashV3/Strings/resources.resjson/es-ES/resources.resjson b/_generated/BashV3/Strings/resources.resjson/es-ES/resources.resjson new file mode 100644 index 000000000000..2f9fcb034ea0 --- /dev/null +++ b/_generated/BashV3/Strings/resources.resjson/es-ES/resources.resjson @@ -0,0 +1,28 @@ +{ + "loc.friendlyName": "Bash", + "loc.helpMarkDown": "[Obtener más información acerca de esta tarea](https://go.microsoft.com/fwlink/?linkid=2132213) o [consultar la documentación de Bash](https://www.gnu.org/software/bash/manual/)", + "loc.description": "Ejecutar un script de Bash en macOS, Linux o Windows", + "loc.instanceNameFormat": "Script de Bash", + "loc.releaseNotes": "Coherencia de la tarea del script. Se ha agregado compatibilidad con varias líneas y también para Windows.", + "loc.group.displayName.advanced": "Avanzado", + "loc.input.label.targetType": "Tipo", + "loc.input.help.targetType": "Tipo de script de destino: ruta de acceso de archivo o insertado", + "loc.input.label.filePath": "Ruta de acceso del script", + "loc.input.help.filePath": "Ruta de acceso del script que se va a ejecutar. Debe ser una ruta de acceso completa o relativa a $(System.DefaultWorkingDirectory).", + "loc.input.label.arguments": "Argumentos", + "loc.input.help.arguments": "Argumentos pasados al script de shell. Pueden ser parámetros ordinales o parámetros con nombre.", + "loc.input.label.script": "Script", + "loc.input.label.workingDirectory": "Directorio de trabajo", + "loc.input.label.failOnStderr": "Error si se produce un error estándar", + "loc.input.help.failOnStderr": "Si es true, esta tarea no se realizará cuando se registre algún error en la secuencia de error estándar.", + "loc.input.label.bashEnvValue": "Establecer valor para la variable de entorno BASH_ENV", + "loc.input.help.bashEnvValue": "Si se especifica la entrada, su valor se expande y se usa como ruta de acceso de un archivo de inicio que se va a ejecutar antes de ejecutar el script. Si la variable de entorno 'BASH_ENV' ya se ha definido, la tarea reemplazará esta variable solo para la tarea actual. Encontrará más detalles en [link](https://www.gnu.org/software/bash/manual/html_node/Bash-Startup-Files.html).", + "loc.messages.GeneratingScript": "Generando script.", + "loc.messages.JS_ExitCode": "Bash se cerró con el código \"%s\".", + "loc.messages.JS_FormattedCommand": "Comando con formato: %s", + "loc.messages.JS_InvalidFilePath": "Ruta de acceso de archivo no válida: %s.", + "loc.messages.JS_ScriptContents": "Contenido del script:", + "loc.messages.JS_Stderr": "Bash escribió una o varias líneas en la secuencia de error estándar.", + "loc.messages.JS_TranslatePathFailed": "La ruta de acceso \"%s\" no se puede traducir al sistema de archivos de Linux.", + "loc.messages.JS_BashEnvAlreadyDefined": "La variable de entorno BASH_ENV ya se ha establecido en '%s'. La tarea la reemplazará por '%s'" +} \ No newline at end of file diff --git a/_generated/BashV3/Strings/resources.resjson/fr-FR/resources.resjson b/_generated/BashV3/Strings/resources.resjson/fr-FR/resources.resjson new file mode 100644 index 000000000000..8d28c34cec95 --- /dev/null +++ b/_generated/BashV3/Strings/resources.resjson/fr-FR/resources.resjson @@ -0,0 +1,28 @@ +{ + "loc.friendlyName": "Bash", + "loc.helpMarkDown": "[En savoir plus sur cette tâche](https://go.microsoft.com/fwlink/?linkid=2132213) ou [consulter la documentation de Bash](https://www.gnu.org/software/bash/manual/)", + "loc.description": "Exécuter un script Bash sur macOS, Linux ou Windows", + "loc.instanceNameFormat": "Script Bash", + "loc.releaseNotes": "Cohérence de la tâche de script. Ajout de la prise en charge de plusieurs lignes et ajout de la prise en charge de Windows.", + "loc.group.displayName.advanced": "Avancé", + "loc.input.label.targetType": "Type", + "loc.input.help.targetType": "Type de script cible : chemin de fichier ou inline", + "loc.input.label.filePath": "Chemin du script", + "loc.input.help.filePath": "Chemin du script à exécuter. Il doit s'agir d'un chemin complet ou d'un chemin relatif à $(System.DefaultWorkingDirectory).", + "loc.input.label.arguments": "Arguments", + "loc.input.help.arguments": "Arguments passés au script d'interpréteur de commandes. Il s'agit de paramètres ordinaux ou nommés.", + "loc.input.label.script": "Script", + "loc.input.label.workingDirectory": "Répertoire de travail", + "loc.input.label.failOnStderr": "Échec sur une erreur standard", + "loc.input.help.failOnStderr": "Si la valeur est true, cette tâche se solde par un échec si des erreurs sont écrites dans le flux de données StandardError.", + "loc.input.label.bashEnvValue": "Définir une valeur pour BASH_ENV variable d’environnement", + "loc.input.help.bashEnvValue": "Si l’entrée est spécifiée, sa valeur est développée et utilisée comme chemin d’accès d’un fichier de démarrage à exécuter avant d’exécuter le script. Si la variable d’environnement ' BASH_ENV' a déjà été définie, la tâche remplace cette variable uniquement pour la tâche active. Pour plus d’informations, consultez [link](https://www.gnu.org/software/bash/manual/html_node/Bash-Startup-Files.html).", + "loc.messages.GeneratingScript": "Génération du script.", + "loc.messages.JS_ExitCode": "Arrêt de Bash. Code de sortie : '%s'.", + "loc.messages.JS_FormattedCommand": "Commande mise en forme : %s", + "loc.messages.JS_InvalidFilePath": "Chemin de fichier non valide : '%s'.", + "loc.messages.JS_ScriptContents": "Contenu du script :", + "loc.messages.JS_Stderr": "Bash a écrit une ou plusieurs lignes dans le flux d'erreurs standard.", + "loc.messages.JS_TranslatePathFailed": "Impossible de traduire le chemin '%s' vers le système de fichiers Linux.", + "loc.messages.JS_BashEnvAlreadyDefined": "La variable d’environnement BASH_ENV a déjà été définie sur un « %s », la tâche la remplacera par « %s »." +} \ No newline at end of file diff --git a/_generated/BashV3/Strings/resources.resjson/it-IT/resources.resjson b/_generated/BashV3/Strings/resources.resjson/it-IT/resources.resjson new file mode 100644 index 000000000000..6ab5955e6e09 --- /dev/null +++ b/_generated/BashV3/Strings/resources.resjson/it-IT/resources.resjson @@ -0,0 +1,28 @@ +{ + "loc.friendlyName": "Bash", + "loc.helpMarkDown": "[Altre informazioni su questa attività](https://go.microsoft.com/fwlink/?linkid=2132213). In alternativa, [vedere la documentazione di Bash](https://www.gnu.org/software/bash/manual/)", + "loc.description": "Consente di eseguire uno script Bash in macOS, Linux o Windows", + "loc.instanceNameFormat": "Script Bash", + "loc.releaseNotes": "Coerenza delle attività per gli script. Aggiunta del supporto per più righe e del supporto per Windows.", + "loc.group.displayName.advanced": "Avanzate", + "loc.input.label.targetType": "Tipo", + "loc.input.help.targetType": "Tipo di script di destinazione: percorso file o inline", + "loc.input.label.filePath": "Percorso script", + "loc.input.help.filePath": "Percorso dello script da eseguire. Deve essere un percorso completo o relativo rispetto a $(System.DefaultWorkingDirectory).", + "loc.input.label.arguments": "Argomenti", + "loc.input.help.arguments": "Argomenti passati allo script della shell. Parametri ordinali o denominati.", + "loc.input.label.script": "Script", + "loc.input.label.workingDirectory": "Directory di lavoro", + "loc.input.label.failOnStderr": "Interrompi in caso di errore standard", + "loc.input.help.failOnStderr": "Se è impostato su true, questa attività non riuscirà nel caso in cui vengano scritti errori nel flusso StandardError.", + "loc.input.label.bashEnvValue": "Imposta il valore per la variabile di ambiente BASH_ENV", + "loc.input.help.bashEnvValue": "Se si specifica l'input, il valore viene espanso e usato come percorso di un file di avvio da eseguire prima di eseguire lo script. Se la variabile di ambiente 'BASH_ENV' è già stata definita, l'attività eseguirà l'override di questa variabile solo per l'attività corrente. Per altre informazioni, vedere [link](https://www.gnu.org/software/bash/manual/html_node/Bash-Startup-Files.html).", + "loc.messages.GeneratingScript": "Generazione dello script.", + "loc.messages.JS_ExitCode": "Bash terminato con codice '%s'.", + "loc.messages.JS_FormattedCommand": "Comando formattato: %s", + "loc.messages.JS_InvalidFilePath": "Il percorso file '%s' non è valido.", + "loc.messages.JS_ScriptContents": "Contenuto dello script:", + "loc.messages.JS_Stderr": "Bash ha scritto una o più righe nel flusso di errore standard.", + "loc.messages.JS_TranslatePathFailed": "Non è possibile convertire il percorso '%s' per il file system Linux.", + "loc.messages.JS_BashEnvAlreadyDefined": "La variabile di ambiente BASH_ENV è già stata impostata su '%s'. L'attività la sostituirà con '%s'" +} \ No newline at end of file diff --git a/_generated/BashV3/Strings/resources.resjson/ja-JP/resources.resjson b/_generated/BashV3/Strings/resources.resjson/ja-JP/resources.resjson new file mode 100644 index 000000000000..588a7388d60e --- /dev/null +++ b/_generated/BashV3/Strings/resources.resjson/ja-JP/resources.resjson @@ -0,0 +1,28 @@ +{ + "loc.friendlyName": "Bash", + "loc.helpMarkDown": "[このタスクの詳細を表示](https://go.microsoft.com/fwlink/?linkid=2132213)、または [Bash のドキュメントを参照](https://www.gnu.org/software/bash/manual/)", + "loc.description": "macOS、Linux、または Windows で Bash スクリプトを実行します", + "loc.instanceNameFormat": "Bash スクリプト", + "loc.releaseNotes": "スクリプト タスクの整合性。複数行のサポートと、Windows のサポートが追加されました。", + "loc.group.displayName.advanced": "詳細設定", + "loc.input.label.targetType": "種類", + "loc.input.help.targetType": "ターゲット スクリプトの種類: ファイル パスまたはインライン", + "loc.input.label.filePath": "スクリプト パス", + "loc.input.help.filePath": "実行するスクリプトのパス。完全修飾パスか、または $(System.DefaultWorkingDirectory) からの相対パスを指定する必要があります。", + "loc.input.label.arguments": "引数", + "loc.input.help.arguments": "引数がシェル スクリプトに渡されます。順序によるパラメーターまたは名前指定されたパラメーターのいずれかです。", + "loc.input.label.script": "スクリプト", + "loc.input.label.workingDirectory": "作業ディレクトリ", + "loc.input.label.failOnStderr": "標準エラーで失敗", + "loc.input.help.failOnStderr": "true の場合、StandardError ストリームにエラーが書き込まれると、このタスクは失敗します。", + "loc.input.label.bashEnvValue": "環境変数 BASH_ENV の値を設定する", + "loc.input.help.bashEnvValue": "input が指定された場合は、その値が展開され、スクリプトを実行する前に実行するスタートアップ ファイルのパスとして使用されます。環境変数 `BASH_ENV` が既に定義されている場合は、現在のタスクに対してのみこの変数を上書きします。詳細は、[link](https://www.gnu.org/software/bash/manual/html_node/Bash-Startup-Files.html) で確認できます。", + "loc.messages.GeneratingScript": "スクリプトを生成しています。", + "loc.messages.JS_ExitCode": "bash がコード '%s' で終了しました。", + "loc.messages.JS_FormattedCommand": "フォーマット後のコマンド: %s", + "loc.messages.JS_InvalidFilePath": "'%s' は、無効なファイル パスです。", + "loc.messages.JS_ScriptContents": "スクリプト コンテンツ:", + "loc.messages.JS_Stderr": "bash が標準エラー ストリームに 1 行以上を書き込みました。", + "loc.messages.JS_TranslatePathFailed": "パス '%s' は、Linux ファイル システムに変換できません。", + "loc.messages.JS_BashEnvAlreadyDefined": "環境変数 BASH_ENV は既に '%s' に設定されていますが、このタスクはこれを '%s' で上書きします" +} \ No newline at end of file diff --git a/_generated/BashV3/Strings/resources.resjson/ko-KR/resources.resjson b/_generated/BashV3/Strings/resources.resjson/ko-KR/resources.resjson new file mode 100644 index 000000000000..2249c3b1b641 --- /dev/null +++ b/_generated/BashV3/Strings/resources.resjson/ko-KR/resources.resjson @@ -0,0 +1,28 @@ +{ + "loc.friendlyName": "Bash", + "loc.helpMarkDown": "[이 작업에 대한 자세한 정보](https://go.microsoft.com/fwlink/?linkid=2132213) 또는 [Bash 설명서 참조](https://www.gnu.org/software/bash/manual/)", + "loc.description": "macOS, Linux 또는 Windows에서 Bash 스크립트 실행", + "loc.instanceNameFormat": "Bash 스크립트", + "loc.releaseNotes": "스크립트 작업 일관성입니다. 추가로 여러 줄과 Windows를 지원합니다.", + "loc.group.displayName.advanced": "고급", + "loc.input.label.targetType": "유형", + "loc.input.help.targetType": "대상 스크립트 유형: 파일 경로 또는 인라인", + "loc.input.label.filePath": "스크립트 경로", + "loc.input.help.filePath": "실행할 스크립트의 경로입니다. 정규화된 경로이거나 $(System.DefaultWorkingDirectory)의 상대 경로여야 합니다.", + "loc.input.label.arguments": "인수", + "loc.input.help.arguments": "셸 스크립트에 전달되는 인수입니다. 서수 매개 변수나 명명된 매개 변수 중 하나입니다.", + "loc.input.label.script": "스크립트", + "loc.input.label.workingDirectory": "작업 디렉터리", + "loc.input.label.failOnStderr": "표준 오류 시 실패", + "loc.input.help.failOnStderr": "true일 경우 StandardError 스트림에 오류가 작성되면 이 작업은 실패하게 됩니다.", + "loc.input.label.bashEnvValue": "BASH_ENV 환경 변수의 값 설정", + "loc.input.help.bashEnvValue": "입력이 지정된 경우 해당 값은 확장되며 스크립트를 실행하기 전에 실행할 시작 파일의 경로로 사용됩니다. 환경 변수 'BASH_ENV'가 이미 정의된 경우 작업에서 현재 작업에 대해서만 이 변수를 재정의합니다. 자세한 내용은 [link](https://www.gnu.org/software/bash/manual/html_node/Bash-Startup-Files.html)에서 확인할 수 있습니다.", + "loc.messages.GeneratingScript": "스크립트를 생성 중입니다.", + "loc.messages.JS_ExitCode": "Bash가 코드 '%s'(으)로 종료되었습니다.", + "loc.messages.JS_FormattedCommand": "형식이 지정된 명령: %s", + "loc.messages.JS_InvalidFilePath": "파일 경로 '%s'이(가) 잘못되었습니다.", + "loc.messages.JS_ScriptContents": "스크립트 내용:", + "loc.messages.JS_Stderr": "Bash가 표준 오류 스트림에 하나 이상의 줄을 썼습니다.", + "loc.messages.JS_TranslatePathFailed": "'%s' 경로를 Linux 파일 시스템으로 변환할 수 없습니다.", + "loc.messages.JS_BashEnvAlreadyDefined": "BASH_ENV 환경 변수가 이미 '%s'(으)로 설정되어 있습니다. 작업에서 '%s'(으)로 재정의합니다." +} \ No newline at end of file diff --git a/_generated/BashV3/Strings/resources.resjson/ru-RU/resources.resjson b/_generated/BashV3/Strings/resources.resjson/ru-RU/resources.resjson new file mode 100644 index 000000000000..9e085a52935a --- /dev/null +++ b/_generated/BashV3/Strings/resources.resjson/ru-RU/resources.resjson @@ -0,0 +1,28 @@ +{ + "loc.friendlyName": "Bash", + "loc.helpMarkDown": "[См. дополнительные сведения об этой задаче](https://go.microsoft.com/fwlink/?linkid=2132213) или [документацию по Bash](https://www.gnu.org/software/bash/manual/)", + "loc.description": "Выполнение скрипта Bash в macOS, Linux или Windows", + "loc.instanceNameFormat": "Скрипт Bash", + "loc.releaseNotes": "Создавайте скрипты для обеспечения согласованности задач. Добавлена поддержка нескольких строк и поддержка Windows.", + "loc.group.displayName.advanced": "Дополнительно", + "loc.input.label.targetType": "Тип", + "loc.input.help.targetType": "Тип целевого скрипта: путь к файлу или встроенный", + "loc.input.label.filePath": "Путь к скрипту", + "loc.input.help.filePath": "Путь к выполняемому скрипту. Это должен быть полный путь или путь относительно $(System.DefaultWorkingDirectory).", + "loc.input.label.arguments": "Аргументы", + "loc.input.help.arguments": "Аргументы, передаваемые в скрипт оболочки. Параметры могут быть порядковыми или именованными.", + "loc.input.label.script": "Скрипт", + "loc.input.label.workingDirectory": "Рабочий каталог", + "loc.input.label.failOnStderr": "Сбой со стандартной ошибкой", + "loc.input.help.failOnStderr": "Если задано значение True, задача завершится сбоем при записи любых ошибок в поток StandardError.", + "loc.input.label.bashEnvValue": "Задайте значение для переменной среды BASH_ENV", + "loc.input.help.bashEnvValue": "Если указаны входные данные, их значение расширяется и используется в качестве пути к файлу запуска, который выполняется перед запуском сценария. Если переменная среды BASH_ENV уже определена, эта задача переопределит эту переменную только для текущей задачи. Дополнительные сведения: [link](https://www.gnu.org/software/bash/manual/html_node/Bash-Startup-Files.html).", + "loc.messages.GeneratingScript": "Формируется скрипт.", + "loc.messages.JS_ExitCode": "Завершение работы Bash с кодом \"%s\".", + "loc.messages.JS_FormattedCommand": "Отформатирована команда: %s", + "loc.messages.JS_InvalidFilePath": "Недопустимый путь к файлу \"%s\".", + "loc.messages.JS_ScriptContents": "Содержимое скрипта:", + "loc.messages.JS_Stderr": "Оболочка Bash записала одну или несколько строк в стандартный поток ошибок.", + "loc.messages.JS_TranslatePathFailed": "Не удалось преобразовать путь \"%s\" для файловой системы Linux.", + "loc.messages.JS_BashEnvAlreadyDefined": "Для переменной среды BASH_ENV уже задано значение \"%s\". Задача переопределит его на \"%s\"" +} \ No newline at end of file diff --git a/_generated/BashV3/Strings/resources.resjson/zh-CN/resources.resjson b/_generated/BashV3/Strings/resources.resjson/zh-CN/resources.resjson new file mode 100644 index 000000000000..b5401ad52007 --- /dev/null +++ b/_generated/BashV3/Strings/resources.resjson/zh-CN/resources.resjson @@ -0,0 +1,28 @@ +{ + "loc.friendlyName": "Bash", + "loc.helpMarkDown": "[详细了解此任务](https://go.microsoft.com/fwlink/?linkid=2132213)或[查看 Bash 文档](https://www.gnu.org/software/bash/manual/)", + "loc.description": "在 MacOS、 Linux 或 Windows 上运行 Bash 脚本", + "loc.instanceNameFormat": "Bash 脚本", + "loc.releaseNotes": "脚本任务一致性。添加了对多个行的支持并添加了对 Windows 的支持。", + "loc.group.displayName.advanced": "高级", + "loc.input.label.targetType": "类型", + "loc.input.help.targetType": "目标脚本类型: 文件路径或内联", + "loc.input.label.filePath": "脚本路径", + "loc.input.help.filePath": "要执行的脚本的路径。必须为完全限定的路径或相对于 $(System.DefaultWorkingDirectory)。", + "loc.input.label.arguments": "参数", + "loc.input.help.arguments": "传递给 Shell 脚本的参数。是序号或命名参数。", + "loc.input.label.script": "脚本", + "loc.input.label.workingDirectory": "工作目录", + "loc.input.label.failOnStderr": "因标准错误而失败", + "loc.input.help.failOnStderr": "如果为 true,则在向 StandardError 流写入任何错误时,此任务都会失败。", + "loc.input.label.bashEnvValue": "设置 BASH_ENV 环境变量的值", + "loc.input.help.bashEnvValue": "如果指定了输入,则会展开该值,并将其用作运行脚本之前要执行的启动文件的路径。如果已定义环境变量“BASH_ENV”,则该任务将仅针对当前任务重写此变量。可以通过 [link](https://www.gnu.org/software/bash/manual/html_node/Bash-Startup-Files.html)查找更多详细信息。", + "loc.messages.GeneratingScript": "正在生成脚本。", + "loc.messages.JS_ExitCode": "Bash 已退出,代码为“%s”。", + "loc.messages.JS_FormattedCommand": "已设置格式的命令: %s", + "loc.messages.JS_InvalidFilePath": "文件路径“%s”无效。", + "loc.messages.JS_ScriptContents": "脚本内容:", + "loc.messages.JS_Stderr": "Bash 向标准错误流写入一个或多个行。", + "loc.messages.JS_TranslatePathFailed": "无法将路径“%s”转换到 Linux 文件系统。", + "loc.messages.JS_BashEnvAlreadyDefined": "已将 BASH_ENV环境变量设置为“%s”,任务将使用“%s”替代它" +} \ No newline at end of file diff --git a/_generated/BashV3/Strings/resources.resjson/zh-TW/resources.resjson b/_generated/BashV3/Strings/resources.resjson/zh-TW/resources.resjson new file mode 100644 index 000000000000..02ed55c06f61 --- /dev/null +++ b/_generated/BashV3/Strings/resources.resjson/zh-TW/resources.resjson @@ -0,0 +1,28 @@ +{ + "loc.friendlyName": "Bash", + "loc.helpMarkDown": "[深入了解此工作](https://go.microsoft.com/fwlink/?linkid=2132213)或[參閱 Bash 文件](https://www.gnu.org/software/bash/manual/)", + "loc.description": "在 macOS、Linux 或 Windows 執行 Bash 指令碼", + "loc.instanceNameFormat": "Bash 指令碼", + "loc.releaseNotes": "指令碼工作一致性。新增了多行支援,並新增 Windows 的支援。", + "loc.group.displayName.advanced": "進階", + "loc.input.label.targetType": "類型", + "loc.input.help.targetType": "目標指令碼類型: 檔案路徑或內嵌", + "loc.input.label.filePath": "指令碼路徑", + "loc.input.help.filePath": "要執行的指令碼之路徑。必須是完整路徑或相對於 $(System.DefaultWorkingDirectory) 的路徑。", + "loc.input.label.arguments": "引數", + "loc.input.help.arguments": "傳遞至殼層指令碼的引數。可以是序號參數或具名參數。", + "loc.input.label.script": "指令碼", + "loc.input.label.workingDirectory": "工作目錄", + "loc.input.label.failOnStderr": "發生標準錯誤的失敗", + "loc.input.help.failOnStderr": "若此為 true,則任何錯誤寫入 StandardError 資料流時,此工作便會失敗。", + "loc.input.label.bashEnvValue": "設定 BASH_ENV 環境變數的值", + "loc.input.help.bashEnvValue": "若指定輸入,其值會展開,並作為執行指令碼前要執行之啟動檔案的路徑。如果已定義環境變數 'BASH_ENV',則工作只會針對目前的工作覆寫此變數。您可以透過 [link] (https://www.gnu.org/software/bash/manual/html_node/Bash-Startup-Files.html) 找到更多詳細資料。", + "loc.messages.GeneratingScript": "正在產生指令碼。", + "loc.messages.JS_ExitCode": "Bash 已結束,代碼為 '%s'。", + "loc.messages.JS_FormattedCommand": "經過格式化的命令: %s", + "loc.messages.JS_InvalidFilePath": "檔案路徑 '%s' 無效。", + "loc.messages.JS_ScriptContents": "指令碼內容:", + "loc.messages.JS_Stderr": "Bash 已將一或多行寫入標準錯誤資料流。", + "loc.messages.JS_TranslatePathFailed": "無法將路徑 '%s' 轉譯成 Linux 檔案系統。", + "loc.messages.JS_BashEnvAlreadyDefined": "BASH_ENV 環境變數已設定為 '%s',工作會以 '%s' 覆寫" +} \ No newline at end of file diff --git a/_generated/BashV3/Tests/EnvExpansion/L0EnvExpansion.ts b/_generated/BashV3/Tests/EnvExpansion/L0EnvExpansion.ts new file mode 100644 index 000000000000..e34dc7063e1e --- /dev/null +++ b/_generated/BashV3/Tests/EnvExpansion/L0EnvExpansion.ts @@ -0,0 +1,109 @@ +import assert = require('assert'); +import { expandBashEnvVariables } from '../../helpers'; + +export const BashEnvProcessingTests = () => { + const testSuites: [string, string, string[], string][] = [ + [ + 'Handles empty line', + '', [], '' + ], + [ + 'Expanding known env variables', + '$VAR1 2', ['VAR1=value1'], 'value1 2' + ], + [ + 'Expanding env variables with brace syntax', + '${VAR1} 2', ['VAR1=value1'], 'value1 2' + ], + [ + 'Expanding multiple env variables', + '1 ${VAR1} $VAR2', ['VAR1=value1', 'VAR2=value2'], '1 value1 value2' + ], + [ + 'Expanding multiple close env variables', + '$VAR1 ${VAR2}$VAR3', ['VAR1=value1', 'VAR2=value2', 'VAR3=value3'], 'value1 value2value3' + ], + [ + 'Expanding multiple close env variables', + '$VAR1 ${VAR2}_$VAR3', ['VAR1=value1', 'VAR2=value2', 'VAR3=value3'], 'value1 value2_value3' + ], + [ + 'Expanding multiple close env variables 3', + '${VAR1}${VAR2}$VAR3', ['VAR1=1', 'VAR2=2', 'VAR3=3'], '123' + ], + [ + 'Expanding multiple env variables 2', + '$VAR1 $VAR2', ['VAR1=1', 'VAR2=2'], '1 2' + ], + [ + 'Not expanding nested env variables', + '$VAR1 $VAR2', ['VAR1=$NESTED', 'VAR2=2', 'NESTED=nested'], '$NESTED 2' + ], + [ + 'Backslash before env var', + '\\$VAR1', ['VAR1=value1'], '$VAR1' + ], + [ + 'Backslash at start of env var', + '$\\VAR1', ['VAR1=value1'], '$\\VAR1' + ], + [ + 'Backslash inside env var - leave as is', + '$V\\AR1', ['VAR1=value1'], '$V\\AR1' + ], + [ + `If it's inside the single quotes - it should be ignored`, + `$VAR1 '$VAR2'`, ['VAR1=value1', 'VAR2=value2'], `value1 '$VAR2'` + ], + [ + `If it's inside the single quotes - it should be ignored 2`, + `$VAR1 ' _ $VAR2 _ '`, ['VAR1=value1', 'VAR2=value2'], `value1 ' _ $VAR2 _ '` + ], + [ + `If it's inside the single quotes - it should be ignored 3`, + `$VAR1 ' _ $VAR2 _ ''$VAR3'`, ['VAR1=value1', 'VAR2=value2', 'VAR3=value3'], `value1 ' _ $VAR2 _ ''$VAR3'` + ], + [ + `If it's inside the double quotes - it should be expanded`, + `$VAR1 "$VAR2"`, ['VAR1=value1', 'VAR2=value2'], `value1 "value2"` + ], + [ + `Close quotes`, + `''$VAR1 $VAR2`, ['VAR1=value1', 'VAR2=value2'], `''value1 value2` + ], + [ + 'Skips variables with indirect expansion', + '${VAR1} ${!VAR2} "${!VAR3}"', ['VAR1=value1', 'VAR2=value2', 'VAR2=value3'], 'value1 ${!VAR2} "${!VAR3}"' + ], + [ + 'Skips variables with invalid name', + "${1VAR1} ${a:b} ${a:+b} ${a:?b} ${VAR1:0:2} ${VAR1\\val\\lav}", ['VAR1=value1', 'a=value3', 'a:b=value4'], "${1VAR1} ${a:b} ${a:+b} ${a:?b} ${VAR1:0:2} ${VAR1\\val\\lav}" + ], + [ + 'If variable syntax is incorrect, it should leave it as is', + '$venv:VAR1 ${_env:VAR2}', ['VAR1=val1', 'VAR2=val2'], '$venv:VAR1 ${_env:VAR2}' + ], + [ + 'If closing brace is not present, it should leave it as is', + '$VAR1 ${VAR2', ['VAR1=val1', 'VAR2=val2'], 'val1 ${VAR2', + ], + [ + 'If closing brace is not present, it should leave it as is 2', + '${VAR1 ${VAR2}', ['VAR1=val1', 'VAR2=val2'], '${VAR1 ${VAR2}', + ] + ] + + for (const [testName, input, variables, expected] of testSuites) { + it(testName, () => { + + for (const variable of variables) { + const [name, value] = variable.split('='); + process.env[name] = value; + } + + const [result] = expandBashEnvVariables(input); + + assert.deepStrictEqual(result, expected); + }); + } +}; diff --git a/_generated/BashV3/Tests/EnvExpansion/L0Telemetry.ts b/_generated/BashV3/Tests/EnvExpansion/L0Telemetry.ts new file mode 100644 index 000000000000..30704dbe8f98 --- /dev/null +++ b/_generated/BashV3/Tests/EnvExpansion/L0Telemetry.ts @@ -0,0 +1,63 @@ +import assert = require('assert'); +import { expandBashEnvVariables } from '../../helpers'; + +export const EnvProcessingTelemetryTests = () => { + // maybe we should treat that differently + it('Found prefixes test', () => { + const argsLine = '$ ${} $'; + const expectedTelemetry = { foundPrefixes: 3 }; + + const [_, resultTelemetry] = expandBashEnvVariables(argsLine); + + assert.deepStrictEqual(resultTelemetry.foundPrefixes, expectedTelemetry.foundPrefixes); + }) + it('Not closed brace syntax', () => { + const argsLine = '${'; + const expectedTelemetry = { notClosedBraceSyntaxPosition: 1 }; + + const [_, resultTelemetry] = expandBashEnvVariables(argsLine); + + assert.deepStrictEqual(resultTelemetry.notClosedBraceSyntaxPosition, expectedTelemetry.notClosedBraceSyntaxPosition); + }) + it('Not closed brace syntax 2', () => { + const argsLine = "'${' ${"; + const expectedTelemetry = { notClosedBraceSyntaxPosition: 6 }; + + const [_, resultTelemetry] = expandBashEnvVariables(argsLine); + + assert.deepStrictEqual(resultTelemetry.notClosedBraceSyntaxPosition, expectedTelemetry.notClosedBraceSyntaxPosition); + }) + it('Not closed quotes', () => { + const argsLine = "' $A"; + const expectedTelemetry = { unmatchedQuotes: 1 }; + + const [_, resultTelemetry] = expandBashEnvVariables(argsLine); + + assert.deepStrictEqual(resultTelemetry.unmatchedQuotes, expectedTelemetry.unmatchedQuotes); + }) + it('Quotted blocks count', () => { + // We're ignores quote blocks where no any env variables + const argsLine = "'$VAR1' '$VAR2' '3'"; + const expectedTelemetry = { quottedBlocks: 2 }; + + const [_, resultTelemetry] = expandBashEnvVariables(argsLine); + + assert.deepStrictEqual(resultTelemetry.quottedBlocks, expectedTelemetry.quottedBlocks); + }) + it('Catches indirect expansion', () => { + const argsLine = "${!VAR1} ${!VAR2}"; + const expectedTelemetry = { indirectExpansion: 2 }; + + const [_, resultTelemetry] = expandBashEnvVariables(argsLine); + + assert.deepStrictEqual(resultTelemetry.indirectExpansionTries, expectedTelemetry.indirectExpansion); + }) + it('Skip indirect expansion inside quotes', () => { + const argsLine = "'${!VAR1}'"; + const expectedTelemetry = { indirectExpansion: 0 }; + + const [_, resultTelemetry] = expandBashEnvVariables(argsLine); + + assert.deepStrictEqual(resultTelemetry.indirectExpansionTries, expectedTelemetry.indirectExpansion); + }) +} diff --git a/_generated/BashV3/Tests/EnvExpansion/index.ts b/_generated/BashV3/Tests/EnvExpansion/index.ts new file mode 100644 index 000000000000..9e450806861c --- /dev/null +++ b/_generated/BashV3/Tests/EnvExpansion/index.ts @@ -0,0 +1,2 @@ +export * from './L0EnvExpansion'; +export * from './L0Telemetry'; diff --git a/_generated/BashV3/Tests/L0.ts b/_generated/BashV3/Tests/L0.ts new file mode 100644 index 000000000000..63cbf34af444 --- /dev/null +++ b/_generated/BashV3/Tests/L0.ts @@ -0,0 +1,161 @@ +import assert = require('assert'); +import path = require('path'); +import * as ttm from 'azure-pipelines-task-lib/mock-test'; +import { BashEnvProcessingTests, EnvProcessingTelemetryTests } from './EnvExpansion'; +import { runValidateFileArgsTests } from './L0ValidateFileArgs'; + +describe('Bash Suite', function () { + this.timeout(parseInt(process.env.TASK_TEST_TIMEOUT) || 80000); + + function runValidations(validator: () => void, tr, done) { + try { + validator(); + done(); + } + catch (error) { + console.log("STDERR", tr.stderr); + console.log("STDOUT", tr.stdout); + done(error); + } + } + + it('Runs an inline script correctly', (done: Mocha.Done) => { + delete process.env['AZP_BASHV3_OLD_SOURCE_BEHAVIOR']; + let tp: string = path.join(__dirname, 'L0Inline.js'); + let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + runValidations(() => { + assert(tr.succeeded, 'Bash should have succeeded.'); + assert(tr.stderr.length === 0, 'Bash should not have written to stderr'); + assert(tr.stdout.indexOf('my script output') > 0, 'Bash should have correctly run the script'); + }, tr, done); + }); + + it('Runs a checked in script correctly', (done: Mocha.Done) => { + delete process.env['AZP_BASHV3_OLD_SOURCE_BEHAVIOR']; + process.env['AZP_TASK_FF_BASHV3_ENABLE_SECURE_ARGS'] = 'false' + let tp: string = path.join(__dirname, 'L0External.js'); + let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + runValidations(() => { + assert(tr.succeeded, 'Bash should have succeeded.'); + assert(tr.stderr.length === 0, 'Bash should not have written to stderr'); + if (process.platform === 'win32') { + // This is different on windows because we change the script name to make sure the normalization call is happening. + assert(tr.stdout.indexOf(`Writing exec bash 'temp/path/script' to temp/path/fileName.sh`) > 0, 'Bash should have written the script to a file'); + } else { + assert(tr.stdout.indexOf(`Writing exec bash 'path/to/script' to temp/path/fileName.sh`) > 0, 'Bash should have written the script to a file'); + } + + assert(tr.stdout.indexOf('my script output') > 0, 'Bash should have correctly run the script'); + }, tr, done); + }); + + it('Runs a checked in script correctly when using the old behavior', (done: Mocha.Done) => { + process.env['AZP_BASHV3_OLD_SOURCE_BEHAVIOR'] = "true"; + process.env['AZP_TASK_FF_BASHV3_ENABLE_SECURE_ARGS'] = 'false' + let tp: string = path.join(__dirname, 'L0External.js'); + let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + runValidations(() => { + assert(tr.succeeded, 'Bash should have succeeded.'); + assert(tr.stderr.length === 0, 'Bash should not have written to stderr'); + if (process.platform === 'win32') { + // This is different on windows because we change the script name to make sure the normalization call is happening. + assert(tr.stdout.indexOf(`Writing . 'temp/path/script' to temp/path/fileName.sh`) > 0, 'Bash should have written the script to a file'); + } else { + assert(tr.stdout.indexOf(`Writing . 'path/to/script' to temp/path/fileName.sh`) > 0, 'Bash should have written the script to a file'); + } + + assert(tr.stdout.indexOf('my script output') > 0, 'Bash should have correctly run the script'); + }, tr, done); + }); + + it('Adds arguments to the script', (done: Mocha.Done) => { + delete process.env['AZP_BASHV3_OLD_SOURCE_BEHAVIOR']; + process.env['AZP_TASK_FF_BASHV3_ENABLE_SECURE_ARGS'] = 'false' + let tp: string = path.join(__dirname, 'L0Args.js'); + let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + runValidations(() => { + assert(tr.succeeded, 'Bash should have succeeded.'); + assert(tr.stderr.length === 0, 'Bash should not have written to stderr'); + if (process.platform === 'win32') { + // This is different on windows because we change the script name to make sure the normalization call is happening. + assert(tr.stdout.indexOf(`Writing exec bash 'temp/path/script' myCustomArg to temp/path/fileName.sh`) > 0, 'Bash should have written the script to a file'); + } else { + assert(tr.stdout.indexOf(`Writing exec bash 'path/to/script' myCustomArg to temp/path/fileName.sh`) > 0, 'Bash should have written the script to a file'); + } + + assert(tr.stdout.indexOf('my script output') > 0, 'Bash should have correctly run the script'); + }, tr, done); + }); + + it('Reports stderr correctly', (done: Mocha.Done) => { + let tp: string = path.join(__dirname, 'L0StdErr.js'); + let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + runValidations(() => { + assert(tr.failed, 'Bash should have failed'); + assert(tr.stdout.indexOf('##vso[task.issue type=error;]myErrorTest') > 0, 'Bash should have correctly written myErrorTest'); + assert(tr.stdout.length > 1000, 'Bash stderr output is not truncated'); + }, tr, done); + }); + + it('Fails on exit code null', (done: Mocha.Done) => { + let tp: string = path.join(__dirname, 'L0FailOnExitCodeNull.js'); + let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + runValidations(() => { + assert(tr.failed, 'Bash should have failed when the script exits with null code'); + }, tr, done); + }); + + it('BASH_ENV - set environment variable', (done: Mocha.Done) => { + delete process.env['BASH_ENV']; + + const testPath: string = path.join(__dirname, 'L0SetBashEnv.js'); + const taskRunner: ttm.MockTestRunner = new ttm.MockTestRunner(testPath); + + taskRunner.run(); + + runValidations(() => { + assert(taskRunner.succeeded, 'Bash should have succeeded.'); + assert(taskRunner.stdout.indexOf('The BASH_ENV environment variable was set to ~/.profile') > 0, 'Task should set BASH_ENV to ~/.profile'); + }, taskRunner, done); + }); + + it('BASH_ENV - override environment variable', (done: Mocha.Done) => { + process.env['BASH_ENV'] = 'some/custom/path'; + + const testPath: string = path.join(__dirname, 'L0SetBashEnv.js'); + const taskRunner: ttm.MockTestRunner = new ttm.MockTestRunner(testPath); + + taskRunner.run(); + + runValidations(() => { + assert(taskRunner.succeeded, 'Bash should have succeeded.'); + assert(taskRunner.stdout.indexOf('The BASH_ENV environment variable was set to ~/.profile') > 0, 'Task should override the value of BASH_ENV with ~/.profile'); + }, taskRunner, done); + }); + + describe('File args env processing tests', () => { + BashEnvProcessingTests() + + EnvProcessingTelemetryTests() + + runValidateFileArgsTests() + }) +}); diff --git a/_generated/BashV3/Tests/L0Args.ts b/_generated/BashV3/Tests/L0Args.ts new file mode 100644 index 000000000000..5e2eb5d45595 --- /dev/null +++ b/_generated/BashV3/Tests/L0Args.ts @@ -0,0 +1,75 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'bash.js'); +let tmr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tmr.setInput('targetType', 'filepath'); +tmr.setInput('filePath', 'path/to/script'); +tmr.setInput('arguments', 'myCustomArg'); +tmr.setInput('workingDirectory', '/fakecwd'); + +//Create assertAgent and getVariable mocks, support not added in this version of task-lib +const tl = require('azure-pipelines-task-lib/mock-task'); +const tlClone = Object.assign({}, tl); +tlClone.getVariable = function(variable: string) { + if (variable.toLowerCase() == 'agent.tempdirectory') { + return 'temp/path'; + } + return null; +}; +tlClone.assertAgent = function(variable: string) { + return; +}; +tmr.registerMock('azure-pipelines-task-lib/mock-task', tlClone); + +// Mock task-lib +let a: ma.TaskLibAnswers = { + 'checkPath' : { + '/fakecwd' : true, + 'path/to/bash': true, + 'temp/path': true + }, + 'which': { + 'bash': 'path/to/bash' + }, + 'assertAgent': { + '2.115.0': true + }, + 'exec': { + 'path/to/bash -c pwd': { + "code": 0, + "stdout": "temp/path" + }, + 'path/to/bash temp/path/fileName.sh': { + "code": 0, + "stdout": "my script output" + } + }, + 'stats': { + 'path/to/script': { + isFile() { + return true; + }, + mode: '777' + } + } +}; +tmr.setAnswers(a); + +// Mock fs +const fs = require('fs'); +const fsClone = Object.assign({}, fs); +fsClone.writeFileSync = function(filePath, contents, options) { + // Normalize to linux paths for logs we check + console.log(`Writing ${contents} to ${filePath.replace(/\\/g, '/')}`); +} +tmr.registerMock('fs', fsClone); + +// Mock uuidv4 +tmr.registerMock('uuid/v4', function () { + return 'fileName'; +}); + +tmr.run(); \ No newline at end of file diff --git a/_generated/BashV3/Tests/L0External.ts b/_generated/BashV3/Tests/L0External.ts new file mode 100644 index 000000000000..efa044affba3 --- /dev/null +++ b/_generated/BashV3/Tests/L0External.ts @@ -0,0 +1,74 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'bash.js'); +let tmr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tmr.setInput('targetType', 'filepath'); +tmr.setInput('filePath', 'path/to/script'); +tmr.setInput('workingDirectory', '/fakecwd'); + +//Create assertAgent and getVariable mocks, support not added in this version of task-lib +const tl = require('azure-pipelines-task-lib/mock-task'); +const tlClone = Object.assign({}, tl); +tlClone.getVariable = function(variable: string) { + if (variable.toLowerCase() == 'agent.tempdirectory') { + return 'temp/path'; + } + return null; +}; +tlClone.assertAgent = function(variable: string) { + return; +}; +tmr.registerMock('azure-pipelines-task-lib/mock-task', tlClone); + +// Mock task-lib +let a: ma.TaskLibAnswers = { + 'checkPath' : { + '/fakecwd' : true, + 'path/to/bash': true, + 'temp/path': true + }, + 'which': { + 'bash': 'path/to/bash' + }, + 'assertAgent': { + '2.115.0': true + }, + 'exec': { + 'path/to/bash -c pwd': { + "code": 0, + "stdout": "temp/path" + }, + 'path/to/bash temp/path/fileName.sh': { + "code": 0, + "stdout": "my script output" + } + }, + 'stats': { + 'path/to/script': { + isFile() { + return true; + }, + mode: '777' + } + } +}; +tmr.setAnswers(a); + +// Mock fs +const fs = require('fs'); +const fsClone = Object.assign({}, fs); +fsClone.writeFileSync = function(filePath, contents, options) { + // Normalize to linux paths for logs we check + console.log(`Writing ${contents} to ${filePath.replace(/\\/g, '/')}`); +} +tmr.registerMock('fs', fsClone); + +// Mock uuidv4 +tmr.registerMock('uuid/v4', function () { + return 'fileName'; +}); + +tmr.run(); \ No newline at end of file diff --git a/_generated/BashV3/Tests/L0FailOnExitCodeNull.ts b/_generated/BashV3/Tests/L0FailOnExitCodeNull.ts new file mode 100644 index 000000000000..1e26e35ace9a --- /dev/null +++ b/_generated/BashV3/Tests/L0FailOnExitCodeNull.ts @@ -0,0 +1,64 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'bash.js'); +let tmr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tmr.setInput('targetType', 'inline'); +tmr.setInput('workingDirectory', '/fakecwd'); +tmr.setInput('script', `echo 'Hello world'\necho 'Goodbye world'`); + +//Create assertAgent and getVariable mocks, support not added in this version of task-lib +const tl = require('azure-pipelines-task-lib/mock-task'); +const tlClone = Object.assign({}, tl); +tlClone.getVariable = function(variable: string) { + if (variable.toLowerCase() == 'agent.tempdirectory') { + return 'temp/path'; + } + return null; +}; +tlClone.assertAgent = function(variable: string) { + return; +}; +tmr.registerMock('azure-pipelines-task-lib/mock-task', tlClone); + +// Mock task-lib +let a: ma.TaskLibAnswers = { + 'checkPath' : { + '/fakecwd' : true, + 'path/to/bash': true, + 'temp/path': true + }, + 'which': { + 'bash': 'path/to/bash' + }, + 'assertAgent': { + '2.115.0': true + }, + 'exec': { + 'path/to/bash -c pwd': { + "code": null, + "stdout": "temp/path" + }, + 'path/to/bash temp/path/fileName.sh': { + "code": null, + } + } +}; +tmr.setAnswers(a); + +// Mock fs +const fs = require('fs'); +const fsClone = Object.assign({}, fs); +fsClone.writeFileSync = function(filePath, contents, options) { + console.log(`Writing ${contents} to ${filePath}`); +} +tmr.registerMock('fs', fsClone); + +// Mock uuidv4 +tmr.registerMock('uuid/v4', function () { + return 'fileName'; +}); + +tmr.run(); \ No newline at end of file diff --git a/_generated/BashV3/Tests/L0Inline.ts b/_generated/BashV3/Tests/L0Inline.ts new file mode 100644 index 000000000000..031203b1ad35 --- /dev/null +++ b/_generated/BashV3/Tests/L0Inline.ts @@ -0,0 +1,65 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'bash.js'); +let tmr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tmr.setInput('targetType', 'inline'); +tmr.setInput('workingDirectory', '/fakecwd'); +tmr.setInput('script', `echo 'Hello world'\necho 'Goodbye world'`); + +//Create assertAgent and getVariable mocks, support not added in this version of task-lib +const tl = require('azure-pipelines-task-lib/mock-task'); +const tlClone = Object.assign({}, tl); +tlClone.getVariable = function(variable: string) { + if (variable.toLowerCase() == 'agent.tempdirectory') { + return 'temp/path'; + } + return null; +}; +tlClone.assertAgent = function(variable: string) { + return; +}; +tmr.registerMock('azure-pipelines-task-lib/mock-task', tlClone); + +// Mock task-lib +let a: ma.TaskLibAnswers = { + 'checkPath' : { + '/fakecwd' : true, + 'path/to/bash': true, + 'temp/path': true + }, + 'which': { + 'bash': 'path/to/bash' + }, + 'assertAgent': { + '2.115.0': true + }, + 'exec': { + 'path/to/bash -c pwd': { + "code": 0, + "stdout": "temp/path" + }, + 'path/to/bash temp/path/fileName.sh': { + "code": 0, + "stdout": "my script output" + } + } +}; +tmr.setAnswers(a); + +// Mock fs +const fs = require('fs'); +const fsClone = Object.assign({}, fs); +fsClone.writeFileSync = function(filePath, contents, options) { + console.log(`Writing ${contents} to ${filePath}`); +} +tmr.registerMock('fs', fsClone); + +// Mock uuidv4 +tmr.registerMock('uuid/v4', function () { + return 'fileName'; +}); + +tmr.run(); \ No newline at end of file diff --git a/_generated/BashV3/Tests/L0SetBashEnv.ts b/_generated/BashV3/Tests/L0SetBashEnv.ts new file mode 100644 index 000000000000..056d659d57e7 --- /dev/null +++ b/_generated/BashV3/Tests/L0SetBashEnv.ts @@ -0,0 +1,76 @@ +import { TaskLibAnswers } from 'azure-pipelines-task-lib/mock-answer'; +import { TaskMockRunner } from 'azure-pipelines-task-lib/mock-run'; +import * as path from 'path'; + +const taskPath: string = path.join(__dirname, '..', 'bash.js'); +const taskRunner: TaskMockRunner = new TaskMockRunner(taskPath); + +taskRunner.setInput('targetType', 'filepath'); +taskRunner.setInput('filePath', 'path/to/script'); +taskRunner.setInput('arguments', 'myCustomArg'); +taskRunner.setInput('workingDirectory', '/fakecwd'); +taskRunner.setInput('bashEnvValue', '~/.profile'); + +//Create assertAgent and getVariable mocks, support not added in this version of task-lib +const tl = require('azure-pipelines-task-lib/mock-task'); +const tlClone = Object.assign({}, tl); +tlClone.getVariable = function (variable: string) { + if (variable.toLowerCase() == 'agent.tempdirectory') { + return 'temp/path'; + } + return null; +}; +tlClone.assertAgent = function (variable: string) { + return; +}; +taskRunner.registerMock('azure-pipelines-task-lib/mock-task', tlClone); + +// Mock task-lib +const mockedAnswers: TaskLibAnswers = { + 'checkPath': { + '/fakecwd': true, + 'path/to/bash': true, + 'temp/path': true + }, + 'which': { + 'bash': 'path/to/bash' + }, + 'assertAgent': { + '2.115.0': true + }, + 'exec': { + 'path/to/bash -c pwd': { + "code": 0, + "stdout": "temp/path" + }, + 'path/to/bash temp/path/fileName.sh': { + "code": 0, + "stdout": "my script output" + } + }, + 'stats': { + 'path/to/script': { + isFile() { + return true; + }, + mode: '777' + } + } +}; +taskRunner.setAnswers(mockedAnswers); + +// Mock fs +const fs = require('fs'); +const fsClone = Object.assign({}, fs); +fsClone.writeFileSync = function (filePath, contents, options) { + // Normalize to linux paths for logs we check + console.log(`Writing ${contents} to ${filePath.replace(/\\/g, '/')}`); +} +taskRunner.registerMock('fs', fsClone); + +// Mock uuidv4 +taskRunner.registerMock('uuid/v4', function () { + return 'fileName'; +}); + +taskRunner.run(); diff --git a/_generated/BashV3/Tests/L0StdErr.ts b/_generated/BashV3/Tests/L0StdErr.ts new file mode 100644 index 000000000000..b0face398ae0 --- /dev/null +++ b/_generated/BashV3/Tests/L0StdErr.ts @@ -0,0 +1,75 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'bash.js'); +let tmr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tmr.setInput('targetType', 'inline'); +tmr.setInput('workingDirectory', '/fakecwd'); +tmr.setInput('script', `>&2 echo "myErrorTest"`); +tmr.setInput('failOnStderr', 'true'); + +//Create assertAgent and getVariable mocks, support not added in this version of task-lib +const tl = require('azure-pipelines-task-lib/mock-task'); +const tlClone = Object.assign({}, tl); +tlClone.getVariable = function(variable: string) { + if (variable.toLowerCase() == 'agent.tempdirectory') { + return 'temp/path'; + } + return null; +}; +tlClone.assertAgent = function(variable: string) { + return; +}; +tmr.registerMock('azure-pipelines-task-lib/mock-task', tlClone); + +function generateBigString(size: number) { + let result:string = ''; + while (result.length < size) { + result += 'a'; + } + return result; +} + +// Mock task-lib +let a: ma.TaskLibAnswers = { + 'checkPath' : { + '/fakecwd' : true, + 'path/to/bash': true, + 'temp/path': true + }, + 'which': { + 'bash': 'path/to/bash' + }, + 'assertAgent': { + '2.115.0': true + }, + 'exec': { + 'path/to/bash -c pwd': { + "code": 0, + "stdout": "temp/path" + }, + 'path/to/bash temp/path/fileName.sh': { + "code": 0, + "stdout": "", + "stderr": "myErrorTest" + generateBigString(1000) + } + } +}; +tmr.setAnswers(a); + +// Mock fs +const fs = require('fs'); +const fsClone = Object.assign({}, fs); +fsClone.writeFileSync = function(filePath, contents, options) { + console.log(`Writing ${contents} to ${filePath}`); +} +tmr.registerMock('fs', fsClone); + +// Mock uuidv4 +tmr.registerMock('uuid/v4', function () { + return 'fileName'; +}); + +tmr.run(); \ No newline at end of file diff --git a/_generated/BashV3/Tests/L0ValidateFileArgs.ts b/_generated/BashV3/Tests/L0ValidateFileArgs.ts new file mode 100644 index 000000000000..8a5465822b8f --- /dev/null +++ b/_generated/BashV3/Tests/L0ValidateFileArgs.ts @@ -0,0 +1,74 @@ +import assert = require('assert'); +import { validateFileArgs } from '../helpers'; +import { ArgsSanitizingError } from '../utils/errors'; + +export const runValidateFileArgsTests = () => { + const notThrowTestSuites: [string, string, string[]][] = [ + [ + "Handles empty line", + "", [] + ], [ + "If no dangerous symbol in present, and FF is on", + "test 1", ["AZP_75787_ENABLE_NEW_LOGIC=true"] + ], [ + "If dangerous symbols are present, and FF is off", + "test; test", ['AZP_75787_ENABLE_NEW_LOGIC=false'] + ], [ + "If inside the args line is env variable with no dangerous symbols", + "test $VAR1 test", ["VAR1=1", "AZP_75787_ENABLE_NEW_LOGIC=true"] + ], [ + "Accepts allowed symbols", + "a A 1 \\ _ ' \" - = / : . * + %", ["AZP_75787_ENABLE_NEW_LOGIC=true"] + ] + ]; + + for (const [testName, inputArguments, envVariables] of notThrowTestSuites) { + it(testName, () => { + envVariables.forEach(envVariable => { + const [envName, envValue] = envVariable.split("="); + process.env[envName] = envValue; + }); + + try { + assert.doesNotThrow(() => validateFileArgs(inputArguments)); + } + finally { + envVariables.forEach(envVariable => { + const [envName] = envVariable.split("="); + delete process.env[envName]; + }); + } + }) + } + + const throwTestSuites: [string, string, string[]][] = [ + [ + "If dangerous symbols are present, and FF is on", + "test; whoami", ['AZP_75787_ENABLE_NEW_LOGIC=true'] + ], [ + "If inside args line is env variable with dangerous symbols", + "test $VAR1 test", ["VAR1=12;3", "AZP_75787_ENABLE_NEW_LOGIC=true"] + ], [ + "If inside args line not correct env syntax", + "test ${VAR1 test", ["VAR1=123", "AZP_75787_ENABLE_NEW_LOGIC=true"] + ] + ] + for (const [testName, inputArguments, envVariables] of throwTestSuites) { + it(testName, () => { + envVariables.forEach(envVariable => { + const [envName, envValue] = envVariable.split("="); + process.env[envName] = envValue; + }); + + try { + assert.throws(() => validateFileArgs(inputArguments), ArgsSanitizingError); + } + finally { + envVariables.forEach(envVariable => { + const [envName] = envVariable.split("="); + delete process.env[envName]; + }); + } + }) + } +} \ No newline at end of file diff --git a/_generated/BashV3/bash.ts b/_generated/BashV3/bash.ts new file mode 100644 index 000000000000..ae1df8bcba43 --- /dev/null +++ b/_generated/BashV3/bash.ts @@ -0,0 +1,229 @@ +import fs = require('fs'); +import path = require('path'); +import tl = require('azure-pipelines-task-lib/task'); +import tr = require('azure-pipelines-task-lib/toolrunner'); +import { emitTelemetry } from 'azure-pipelines-tasks-utility-common/telemetry'; +import { ArgsSanitizingError } from './utils/errors'; +import { validateFileArgs } from './helpers'; +var uuidV4 = require('uuid/v4'); + +async function runBashPwd(bashPath: string, directoryPath: string): Promise { + let pwdOutput = ''; + const bashPwd = tl.tool(bashPath).arg('-c').arg('pwd'); + bashPwd.on('stdout', data => pwdOutput += data.toString()); + + const bashPwdOptions = { + cwd: directoryPath, + failOnStdErr: true, + errStream: process.stdout, + outStream: process.stdout, + ignoreReturnCode: false + }; + + await bashPwd.exec(bashPwdOptions); + + pwdOutput = pwdOutput.trim(); + + if (!pwdOutput) { + throw new Error(tl.loc('JS_TranslatePathFailed', directoryPath)); + } + + return pwdOutput; +} + +async function translateDirectoryPath(bashPath: string, directoryPath: string): Promise { + if (directoryPath.endsWith('\\')) { + directoryPath = directoryPath.slice(0, -1); + } + + const directoryPathTranslated = await runBashPwd(bashPath, directoryPath); + + const parentDirectoryPath = directoryPath.split('\\').slice(0, -1).join('\\'); + + if (parentDirectoryPath.split('\\').join('')) { + const parentDirectoryPathTranslated = await runBashPwd(bashPath, parentDirectoryPath); + + if (directoryPathTranslated == parentDirectoryPathTranslated) { + throw new Error(tl.loc('JS_TranslatePathFailed', directoryPath)); + } + } + + return directoryPathTranslated; +} + +/** + * Set value for `BASH_ENV` environment variable + * + * The pipeline task invokes bash as non-interactive shell. In this mode Bash looks only for `BASH_ENV` environment variable. + * The value of `BASH_ENV` is expanded and used as the name of a startup file to read before executing the script. + * + * If the environment variable `BASH_ENV` has already been defined, the function will override this variable only for the current task. + * + * @param {string} valueToSet - Value that will be set to `BASH_ENV` environment variable + */ +function setBashEnvVariable(valueToSet: string): void { + const bashEnv: string = process.env["BASH_ENV"]; + + if (bashEnv) { + console.log(tl.loc('JS_BashEnvAlreadyDefined', bashEnv, valueToSet)); + } + + process.env["BASH_ENV"] = valueToSet; + tl.debug(`The BASH_ENV environment variable was set to ${valueToSet}`); +} + +async function run() { + try { + tl.setResourcePath(path.join(__dirname, 'task.json')); + + // Get inputs. + let input_failOnStderr = tl.getBoolInput('failOnStderr', false); + let input_workingDirectory = tl.getPathInput('workingDirectory', /*required*/ true, /*check*/ true); + let input_filePath: string; + let input_arguments: string; + let input_script: string; + let old_source_behavior: boolean; + let input_targetType: string = tl.getInput('targetType') || ''; + const input_bashEnvValue: string = tl.getInput('bashEnvValue') || ''; + + if (input_bashEnvValue) { + setBashEnvVariable(input_bashEnvValue); + } + + if (input_targetType.toUpperCase() == 'FILEPATH') { + old_source_behavior = !!process.env['AZP_BASHV3_OLD_SOURCE_BEHAVIOR']; + input_filePath = tl.getPathInput('filePath', /*required*/ true); + if (!tl.stats(input_filePath).isFile()) { + throw new Error(tl.loc('JS_InvalidFilePath', input_filePath)); + } + + input_arguments = tl.getInput('arguments') || ''; + } + else { + input_script = tl.getInput('script', false) || ''; + } + + // Generate the script contents. + console.log(tl.loc('GeneratingScript')); + let bashPath: string = tl.which('bash', true); + let contents: string; + if (input_targetType.toUpperCase() == 'FILEPATH') { + // Translate the target file path from Windows to the Linux file system. + let targetFilePath: string; + if (process.platform == 'win32') { + targetFilePath = await translateDirectoryPath(bashPath, path.dirname(input_filePath)) + '/' + path.basename(input_filePath); + } + else { + targetFilePath = input_filePath; + } + + try { + validateFileArgs(input_arguments); + } + catch (error: any) { + if (error instanceof ArgsSanitizingError) { + throw error; + } + + emitTelemetry('TaskHub', 'BashV3', + { + UnexpectedError: error?.message ?? JSON.stringify(error) ?? null, + ErrorStackTrace: error?.stack ?? null + } + ); + } + + // Choose behavior: + // If they've set old_source_behavior, source the script. This is what we used to do and needs to hang around forever for back compat reasons + // If they've not, execute the script with bash. This is our new desired behavior. + // See https://github.com/Microsoft/azure-pipelines-tasks/blob/master/docs/bashnote.md + if (old_source_behavior) { + contents = `. '${targetFilePath.replace(/'/g, "'\\''")}' ${input_arguments}`.trim(); + } else { + contents = `exec bash '${targetFilePath.replace(/'/g, "'\\''")}' ${input_arguments}`.trim(); + } + console.log(tl.loc('JS_FormattedCommand', contents)); + } + else { + contents = input_script; + + // Print one-liner scripts. + if (contents.indexOf('\n') < 0 && contents.toUpperCase().indexOf('##VSO[') < 0) { + console.log(tl.loc('JS_ScriptContents')); + console.log(contents); + } + } + + // Write the script to disk. + tl.assertAgent('2.115.0'); + let tempDirectory = tl.getVariable('agent.tempDirectory'); + tl.checkPath(tempDirectory, `${tempDirectory} (agent.tempDirectory)`); + let fileName = uuidV4() + '.sh'; + let filePath = path.join(tempDirectory, fileName); + + fs.writeFileSync( + filePath, + contents, + { encoding: 'utf8' }); + + // Translate the script file path from Windows to the Linux file system. + if (process.platform == 'win32') { + filePath = await translateDirectoryPath(bashPath, tempDirectory) + '/' + fileName; + } + + // Create the tool runner. + console.log('========================== Starting Command Output ==========================='); + let bash = tl.tool(bashPath); + bash.arg(filePath); + + let options = { + cwd: input_workingDirectory, + failOnStdErr: false, + errStream: process.stdout, // Direct all output to STDOUT, otherwise the output may appear out + outStream: process.stdout, // of order since Node buffers it's own STDOUT but not STDERR. + ignoreReturnCode: true + }; + + process.on("SIGINT", () => { + tl.debug('Started cancellation of executing script'); + bash.killChildProcess(); + }); + + // Listen for stderr. + let stderrFailure = false; + const aggregatedStderr: string[] = []; + if (input_failOnStderr) { + bash.on('stderr', (data: Buffer) => { + stderrFailure = true; + aggregatedStderr.push(data.toString('utf8')); + }); + } + + // Run bash. + let exitCode: number = await bash.exec(options); + + let result = tl.TaskResult.Succeeded; + + // Fail on exit code. + if (exitCode !== 0) { + tl.error(tl.loc('JS_ExitCode', exitCode)); + result = tl.TaskResult.Failed; + } + + // Fail on stderr. + if (stderrFailure) { + tl.error(tl.loc('JS_Stderr')); + aggregatedStderr.forEach((err: string) => { + tl.error(err); + }); + result = tl.TaskResult.Failed; + } + + tl.setResult(result, null, true); + } + catch (err: any) { + tl.setResult(tl.TaskResult.Failed, err.message || 'run() failed', true); + } +} + +run(); \ No newline at end of file diff --git a/_generated/BashV3/helpers.ts b/_generated/BashV3/helpers.ts new file mode 100644 index 000000000000..4bd227f8aee7 --- /dev/null +++ b/_generated/BashV3/helpers.ts @@ -0,0 +1,206 @@ +import tl = require('azure-pipelines-task-lib/task'); +import { sanitizeArgs } from 'azure-pipelines-tasks-utility-common/argsSanitizer'; +import { emitTelemetry } from "azure-pipelines-tasks-utility-common/telemetry"; +import { ArgsSanitizingError } from './utils/errors'; + +type BashEnvTelemetry = { + foundPrefixes: number, + quottedBlocks: number, + variablesExpanded: number, + escapedVariables: number, + escapedEscapingSymbols: number, + braceSyntaxEntries: number, + bracedVariables: number, + // possibly blockers + variablesWithESInside: number, + // blockers + unmatchedQuotes: number, // like "Hello, world! + notClosedBraceSyntaxPosition: number, // 0 means no this issue, + indirectExpansionTries: number, + invalidEnvName: number, + notExistingEnv: number +} + +export function expandBashEnvVariables(argsLine: string): [string, BashEnvTelemetry] { + const envPrefix = '$' + const quote = '\'' + const escapingSymbol = '\\' + + let result = argsLine + let startIndex = 0 + // backslash - just backslash + // ES (escaping symbol) - active backslash + const telemetry: BashEnvTelemetry = { + foundPrefixes: 0, + quottedBlocks: 0, + variablesExpanded: 0, + escapedVariables: 0, + escapedEscapingSymbols: 0, + braceSyntaxEntries: 0, + bracedVariables: 0, + // possibly blockers + variablesWithESInside: 0, + // blockers + unmatchedQuotes: 0, + notClosedBraceSyntaxPosition: 0, + indirectExpansionTries: 0, + invalidEnvName: 0, // 0 means no this issue, + notExistingEnv: 0 + } + + while (true) { + const prefixIndex = result.indexOf(envPrefix, startIndex) + if (prefixIndex < 0) { + break; + } + + telemetry.foundPrefixes++ + + if (result[prefixIndex - 1] === escapingSymbol) { + if (!(result[prefixIndex - 2]) || result[prefixIndex - 2] !== escapingSymbol) { + startIndex++ + result = result.substring(0, prefixIndex - 1) + result.substring(prefixIndex) + + telemetry.escapedVariables++ + + continue + } + + telemetry.escapedEscapingSymbols++ + } + + const quoteIndex = result.indexOf(quote, startIndex) + if (quoteIndex >= 0 && prefixIndex > quoteIndex) { + const nextQuoteIndex = result.indexOf(quote, quoteIndex + 1) + if (nextQuoteIndex < 0) { + telemetry.unmatchedQuotes = 1 + break + } + + startIndex = nextQuoteIndex + 1 + + telemetry.quottedBlocks++ + + continue + } + + let envName = ''; + let envEndIndex = 0; + let isBraceSyntax = false + + if (result[prefixIndex + 1] === '{') { + isBraceSyntax = true + + telemetry.braceSyntaxEntries++ + } + + const envStartIndex = prefixIndex + envPrefix.length + +isBraceSyntax + + if (isBraceSyntax) { + envEndIndex = findEnclosingBraceIndex(result, prefixIndex) + if (envEndIndex === 0) { + telemetry.notClosedBraceSyntaxPosition = prefixIndex + 1 // +{ + break; + } + + if (result[prefixIndex + envPrefix.length + 1] === '!') { + telemetry.indirectExpansionTries++ + // We're just skipping indirect expansion + startIndex = envEndIndex + continue + } + + envName = result.substring(envStartIndex, envEndIndex) + + telemetry.bracedVariables++ + } else { + envName = result.substring(envStartIndex).split(/[ |"|'|;]/)[0] + envEndIndex = envStartIndex + envName.length + } + + if (!isValidEnvName(envName)) { + telemetry.invalidEnvName++ + startIndex = envEndIndex + continue + } + + const head = result.substring(0, prefixIndex) + if (!isBraceSyntax && envName.includes(escapingSymbol)) { + telemetry.variablesWithESInside++ + } + + // We need case-sensetive env search for windows as well. + let envValue = { ...process.env }[envName]; + // in case we don't have such variable, we just leave it as is + if (!envValue) { + telemetry.notExistingEnv++ + startIndex = envEndIndex + continue + } + + const tail = result.substring(envEndIndex + +isBraceSyntax) + + result = head + envValue + tail + startIndex = prefixIndex + envValue.length + + telemetry.variablesExpanded++ + + continue + } + + return [result, telemetry] +} + +function findEnclosingBraceIndex(input: string, targetIndex: number) { + for (let i = 0; i < input.length; i++) { + if (input[i] === "}" && i > targetIndex) { + return i + } + } + return 0 +} + +function isValidEnvName(envName) { + const regex = /^[a-zA-Z_][a-zA-Z0-9_]*$/; + return regex.test(envName); +} + +export function validateFileArgs(inputArguments: string): void { + const featureFlags = { + audit: tl.getBoolFeatureFlag('AZP_75787_ENABLE_NEW_LOGIC_LOG'), + activate: tl.getBoolFeatureFlag('AZP_75787_ENABLE_NEW_LOGIC'), + telemetry: tl.getBoolFeatureFlag('AZP_75787_ENABLE_COLLECT') + }; + + if (featureFlags.activate || featureFlags.audit || featureFlags.telemetry) { + tl.debug('Validating file args...'); + const [expandedArgs, envTelemetry] = expandBashEnvVariables(inputArguments); + tl.debug(`Expanded file args: ${expandedArgs}`); + + const [sanitizedArgs, sanitizerTelemetry] = sanitizeArgs( + expandedArgs, + { + argsSplitSymbols: '\\\\', + saniziteRegExp: new RegExp(`(? + + + + diff --git a/_generated/BashV3/make.json b/_generated/BashV3/make.json new file mode 100644 index 000000000000..57605b58558a --- /dev/null +++ b/_generated/BashV3/make.json @@ -0,0 +1,12 @@ +{ + "rm": [ + { + "items": [ + "node_modules/azure-pipelines-tool-lib/node_modules/azure-pipelines-task-lib", + "node_modules/azure-pipelines-tasks-utility-common/node_modules/azure-pipelines-task-lib", + "node_modules/mockery" + ], + "options": "-Rf" + } + ] +} \ No newline at end of file diff --git a/_generated/BashV3/package-lock.json b/_generated/BashV3/package-lock.json new file mode 100644 index 000000000000..d2aba54b9eb6 --- /dev/null +++ b/_generated/BashV3/package-lock.json @@ -0,0 +1,613 @@ +{ + "name": "vsts-tasks-bash", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true + }, + "@types/concat-stream": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz", + "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==", + "requires": { + "@types/node": "*" + } + }, + "@types/form-data": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", + "integrity": "sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==", + "requires": { + "@types/node": "*" + } + }, + "@types/mocha": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.1.1.tgz", + "integrity": "sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==" + }, + "@types/node": { + "version": "16.11.56", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.56.tgz", + "integrity": "sha512-aFcUkv7EddxxOa/9f74DINReQ/celqH8DiB3fRYgVDM2Xm5QJL8sl80QKuAnGvwAsMn+H3IFA6WCrQh1CY7m1A==" + }, + "@types/qs": { + "version": "6.9.8", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.8.tgz", + "integrity": "sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg==" + }, + "@types/semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-41qEJgBH/TWgo5NFSvBCJ1qkoi3Q6ONSF2avrHq1LVEZfYpdHmj0y9SuTK+u9ZhG1sYQKBL1AWXKyLWP4RaUoQ==" + }, + "@types/uuid": { + "version": "3.4.10", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-3.4.10.tgz", + "integrity": "sha512-BgeaZuElf7DEYZhWYDTc/XcLZXdVgFkVSTa13BqKvbnmUrxr3TJFKofUxCtDO9UQOdhnV+HPOESdHiHKZOJV1A==" + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "azure-pipelines-task-lib": { + "version": "5.0.0-preview.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-5.0.0-preview.0.tgz", + "integrity": "sha512-uQJEv+q3/7RD7kgphFd33uXijaPwA1ePYoNkAgZpUhbZUtc2u4JL4ujTT/JJfgXBNW/QQNAiDQ2OC7vOQG/0tg==", + "requires": { + "minimatch": "3.0.5", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "sync-request": "6.1.0", + "uuid": "^3.0.1" + } + }, + "azure-pipelines-tasks-utility-common": { + "version": "3.225.1", + "resolved": "https://registry.npmjs.org/azure-pipelines-tasks-utility-common/-/azure-pipelines-tasks-utility-common-3.225.1.tgz", + "integrity": "sha512-4wtVKuvx2PcQI0W8xkMdS/S+tf9Qu7wMJl4HSTLE1gjQ2x9o/6QbhMogz6O1+8ofxvTqmI4scA7GHKccDAwQpQ==", + "requires": { + "@types/node": "^16.11.39", + "azure-pipelines-task-lib": "^4.4.0", + "azure-pipelines-tool-lib": "^2.0.0-preview", + "js-yaml": "3.13.1", + "semver": "^5.4.1" + }, + "dependencies": { + "azure-pipelines-task-lib": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-4.5.0.tgz", + "integrity": "sha512-NGxrpggmho4SxWeEnVID7xEClDHC3o4RndfdBzTO5iBWhMHkQp95N1Z4oaywJyiC5Xa92wkUvqzSm6MSLKzYoQ==", + "requires": { + "minimatch": "3.0.5", + "mockery": "^2.1.0", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "sync-request": "6.1.0", + "uuid": "^3.0.1" + } + } + } + }, + "azure-pipelines-tool-lib": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/azure-pipelines-tool-lib/-/azure-pipelines-tool-lib-2.0.4.tgz", + "integrity": "sha512-LgAelZKJe3k/t3NsKSKzjeRviphns0w0p5tgwz8uHN70I9m2TToiOKl+fogrdXcM6+jiLBk5KTqrcRBqPpv/XA==", + "requires": { + "@types/semver": "^5.3.0", + "@types/uuid": "^3.4.5", + "azure-pipelines-task-lib": "^4.1.0", + "semver": "^5.7.0", + "semver-compare": "^1.0.0", + "typed-rest-client": "^1.8.6", + "uuid": "^3.3.2" + }, + "dependencies": { + "azure-pipelines-task-lib": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-4.5.0.tgz", + "integrity": "sha512-NGxrpggmho4SxWeEnVID7xEClDHC3o4RndfdBzTO5iBWhMHkQp95N1Z4oaywJyiC5Xa92wkUvqzSm6MSLKzYoQ==", + "requires": { + "minimatch": "3.0.5", + "mockery": "^2.1.0", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "sync-request": "6.1.0", + "uuid": "^3.0.1" + } + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + } + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + }, + "form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-intrinsic": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", + "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + } + }, + "get-port": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", + "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==" + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "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" + }, + "dependencies": { + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "http-basic": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", + "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", + "requires": { + "caseless": "^0.12.0", + "concat-stream": "^1.6.2", + "http-response-object": "^3.0.1", + "parse-cache-control": "^1.0.1" + } + }, + "http-response-object": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", + "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", + "requires": { + "@types/node": "^10.0.3" + }, + "dependencies": { + "@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + } + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" + }, + "is-core-module": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "requires": { + "has": "^1.0.3" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "mockery": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mockery/-/mockery-2.1.0.tgz", + "integrity": "sha512-9VkOmxKlWXoDO/h1jDZaS4lH33aWfRiJiNT/tKj+8OGzrcFDLo8d0syGdbsc3Bc4GvRXPb+NMMvojotmuGJTvA==" + }, + "object-inspect": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, + "parse-cache-control": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", + "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "promise": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", + "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", + "requires": { + "asap": "~2.0.6" + } + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==" + }, + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "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" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "requires": { + "resolve": "^1.1.6" + } + }, + "resolve": { + "version": "1.22.6", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.6.tgz", + "integrity": "sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==", + "requires": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==" + }, + "shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, + "sync-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", + "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==", + "requires": { + "http-response-object": "^3.0.1", + "sync-rpc": "^1.2.1", + "then-request": "^6.0.0" + } + }, + "sync-rpc": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz", + "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==", + "requires": { + "get-port": "^3.1.0" + } + }, + "then-request": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", + "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", + "requires": { + "@types/concat-stream": "^1.6.0", + "@types/form-data": "0.0.33", + "@types/node": "^8.0.0", + "@types/qs": "^6.2.31", + "caseless": "~0.12.0", + "concat-stream": "^1.6.0", + "form-data": "^2.2.0", + "http-basic": "^8.1.1", + "http-response-object": "^3.0.1", + "promise": "^8.0.0", + "qs": "^6.4.0" + }, + "dependencies": { + "@types/node": { + "version": "8.10.66", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", + "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==" + } + } + }, + "tunnel": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", + "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==" + }, + "typed-rest-client": { + "version": "1.8.11", + "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.8.11.tgz", + "integrity": "sha512-5UvfMpd1oelmUPRbbaVnq+rHP7ng2cE4qoQkQeAqxRL6PklkxsM0g32/HL0yfvruK6ojQ5x8EE+HF4YV6DtuCA==", + "requires": { + "qs": "^6.9.1", + "tunnel": "0.0.6", + "underscore": "^1.12.1" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, + "typescript": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.2.tgz", + "integrity": "sha512-e4ERvRV2wb+rRZ/IQeb3jm2VxBsirQLpQhdxplZ2MEzGvDkkMmPglecnNDfSUBivMjP93vRbngYYDQqQ/78bcQ==", + "dev": true + }, + "underscore": { + "version": "1.13.6", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz", + "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==" + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "uuid": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", + "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==" + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + } + } +} diff --git a/_generated/BashV3/package.json b/_generated/BashV3/package.json new file mode 100644 index 000000000000..b49f42440809 --- /dev/null +++ b/_generated/BashV3/package.json @@ -0,0 +1,31 @@ +{ + "name": "vsts-tasks-bash", + "version": "1.0.0", + "description": "Azure Pipelines Bash Task", + "main": "bash.js", + "scripts": { + "build": "node ../../make.js build --task BashV3", + "test": "node ../../make.js test --task BashV3" + }, + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/Microsoft/azure-pipelines-tasks.git" + }, + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Microsoft/azure-pipelines-tasks/issues" + }, + "homepage": "https://github.com/Microsoft/azure-pipelines-tasks#readme", + "dependencies": { + "@types/mocha": "^9.1.1", + "@types/node": "^16.11.39", + "azure-pipelines-task-lib": "^5.0.0-preview.0", + "azure-pipelines-tasks-utility-common": "^3.225.1", + "uuid": "^3.0.1" + }, + "devDependencies": { + "@tsconfig/node10": "1.0.9", + "typescript": "4.0.2" + } +} diff --git a/_generated/BashV3/task.json b/_generated/BashV3/task.json new file mode 100644 index 000000000000..1c8f37c6cdb6 --- /dev/null +++ b/_generated/BashV3/task.json @@ -0,0 +1,131 @@ +{ + "id": "6C731C3C-3C68-459A-A5C9-BDE6E6595B5B", + "name": "Bash", + "friendlyName": "Bash", + "description": "Run a Bash script on macOS, Linux, or Windows", + "helpUrl": "https://docs.microsoft.com/azure/devops/pipelines/tasks/utility/bash", + "helpMarkDown": "[Learn more about this task](https://go.microsoft.com/fwlink/?linkid=2132213) or [see the Bash documentation](https://www.gnu.org/software/bash/manual/)", + "category": "Utility", + "visibility": [ + "Build", + "Release" + ], + "runsOn": [ + "Agent", + "DeploymentGroup" + ], + "author": "Microsoft Corporation", + "version": { + "Major": 3, + "Minor": 229, + "Patch": 0 + }, + "releaseNotes": "Script task consistency. Added support for multiple lines and added support for Windows.", + "minimumAgentVersion": "2.115.0", + "instanceNameFormat": "Bash Script", + "showEnvironmentVariables": true, + "groups": [ + { + "name": "advanced", + "displayName": "Advanced", + "isExpanded": false + } + ], + "inputs": [ + { + "name": "targetType", + "type": "radio", + "label": "Type", + "required": false, + "defaultValue": "filePath", + "helpMarkDown": "Target script type: File Path or Inline", + "options": { + "filePath": "File Path", + "inline": "Inline" + } + }, + { + "name": "filePath", + "type": "filePath", + "label": "Script Path", + "visibleRule": "targetType = filePath", + "required": true, + "defaultValue": "", + "helpMarkDown": "Path of the script to execute. Must be a fully qualified path or relative to $(System.DefaultWorkingDirectory)." + }, + { + "name": "arguments", + "type": "string", + "label": "Arguments", + "visibleRule": "targetType = filePath", + "required": false, + "defaultValue": "", + "helpMarkDown": "Arguments passed to the shell script. Either ordinal parameters or named parameters." + }, + { + "name": "script", + "type": "multiLine", + "label": "Script", + "visibleRule": "targetType = inline", + "required": true, + "defaultValue": "# Write your commands here\n\necho 'Hello world'\n", + "properties": { + "resizable": "true", + "rows": "10", + "maxLength": "5000" + }, + "helpMarkDown": "" + }, + { + "name": "workingDirectory", + "type": "filePath", + "label": "Working Directory", + "defaultValue": "", + "required": false, + "groupName": "advanced" + }, + { + "name": "failOnStderr", + "type": "boolean", + "label": "Fail on Standard Error", + "defaultValue": "false", + "required": false, + "helpMarkDown": "If this is true, this task will fail if any errors are written to the StandardError stream.", + "groupName": "advanced" + }, + { + "name": "bashEnvValue", + "type": "string", + "label": "Set value for BASH_ENV environment variable", + "defaultValue": "", + "required": false, + "helpMarkDown": "If input is specified, it's value is expanded and used as the path of a startup file to execute before running the script. If the environment variable `BASH_ENV` has already been defined, the task will override this variable only for the current task. You can find more details by [link](https://www.gnu.org/software/bash/manual/html_node/Bash-Startup-Files.html).", + "groupName": "advanced" + } + ], + "execution": { + "Node10": { + "target": "bash.js", + "argumentFormat": "" + }, + "Node16": { + "target": "bash.js", + "argumentFormat": "" + } + }, + "messages": { + "GeneratingScript": "Generating script.", + "JS_ExitCode": "Bash exited with code '%s'.", + "JS_FormattedCommand": "Formatted command: %s", + "JS_InvalidFilePath": "Invalid file path '%s'.", + "JS_ScriptContents": "Script contents:", + "JS_Stderr": "Bash wrote one or more lines to the standard error stream.", + "JS_TranslatePathFailed": "Unable to translate the path '%s' to the Linux file system.", + "JS_BashEnvAlreadyDefined": "The BASH_ENV environment variable has already been set to a '%s', the task will override it with '%s'", + "ScriptArgsSanitized": "Detected characters in arguments that may not be executed correctly by the shell. Please escape special characters using backslash (\\). More information is available here: https://aka.ms/ado/75787" + }, + "_buildConfigMapping": { + "Default": "3.229.0", + "Node20-225": "3.229.1" + } +} \ No newline at end of file diff --git a/_generated/BashV3/task.loc.json b/_generated/BashV3/task.loc.json new file mode 100644 index 000000000000..27adb591c343 --- /dev/null +++ b/_generated/BashV3/task.loc.json @@ -0,0 +1,131 @@ +{ + "id": "6C731C3C-3C68-459A-A5C9-BDE6E6595B5B", + "name": "Bash", + "friendlyName": "ms-resource:loc.friendlyName", + "description": "ms-resource:loc.description", + "helpUrl": "https://docs.microsoft.com/azure/devops/pipelines/tasks/utility/bash", + "helpMarkDown": "ms-resource:loc.helpMarkDown", + "category": "Utility", + "visibility": [ + "Build", + "Release" + ], + "runsOn": [ + "Agent", + "DeploymentGroup" + ], + "author": "Microsoft Corporation", + "version": { + "Major": 3, + "Minor": 229, + "Patch": 0 + }, + "releaseNotes": "ms-resource:loc.releaseNotes", + "minimumAgentVersion": "2.115.0", + "instanceNameFormat": "ms-resource:loc.instanceNameFormat", + "showEnvironmentVariables": true, + "groups": [ + { + "name": "advanced", + "displayName": "ms-resource:loc.group.displayName.advanced", + "isExpanded": false + } + ], + "inputs": [ + { + "name": "targetType", + "type": "radio", + "label": "ms-resource:loc.input.label.targetType", + "required": false, + "defaultValue": "filePath", + "helpMarkDown": "ms-resource:loc.input.help.targetType", + "options": { + "filePath": "File Path", + "inline": "Inline" + } + }, + { + "name": "filePath", + "type": "filePath", + "label": "ms-resource:loc.input.label.filePath", + "visibleRule": "targetType = filePath", + "required": true, + "defaultValue": "", + "helpMarkDown": "ms-resource:loc.input.help.filePath" + }, + { + "name": "arguments", + "type": "string", + "label": "ms-resource:loc.input.label.arguments", + "visibleRule": "targetType = filePath", + "required": false, + "defaultValue": "", + "helpMarkDown": "ms-resource:loc.input.help.arguments" + }, + { + "name": "script", + "type": "multiLine", + "label": "ms-resource:loc.input.label.script", + "visibleRule": "targetType = inline", + "required": true, + "defaultValue": "# Write your commands here\n\necho 'Hello world'\n", + "properties": { + "resizable": "true", + "rows": "10", + "maxLength": "5000" + }, + "helpMarkDown": "" + }, + { + "name": "workingDirectory", + "type": "filePath", + "label": "ms-resource:loc.input.label.workingDirectory", + "defaultValue": "", + "required": false, + "groupName": "advanced" + }, + { + "name": "failOnStderr", + "type": "boolean", + "label": "ms-resource:loc.input.label.failOnStderr", + "defaultValue": "false", + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.failOnStderr", + "groupName": "advanced" + }, + { + "name": "bashEnvValue", + "type": "string", + "label": "ms-resource:loc.input.label.bashEnvValue", + "defaultValue": "", + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.bashEnvValue", + "groupName": "advanced" + } + ], + "execution": { + "Node10": { + "target": "bash.js", + "argumentFormat": "" + }, + "Node16": { + "target": "bash.js", + "argumentFormat": "" + } + }, + "messages": { + "GeneratingScript": "ms-resource:loc.messages.GeneratingScript", + "JS_ExitCode": "ms-resource:loc.messages.JS_ExitCode", + "JS_FormattedCommand": "ms-resource:loc.messages.JS_FormattedCommand", + "JS_InvalidFilePath": "ms-resource:loc.messages.JS_InvalidFilePath", + "JS_ScriptContents": "ms-resource:loc.messages.JS_ScriptContents", + "JS_Stderr": "ms-resource:loc.messages.JS_Stderr", + "JS_TranslatePathFailed": "ms-resource:loc.messages.JS_TranslatePathFailed", + "JS_BashEnvAlreadyDefined": "ms-resource:loc.messages.JS_BashEnvAlreadyDefined", + "ScriptArgsSanitized": "ms-resource:loc.messages.ScriptArgsSanitized" + }, + "_buildConfigMapping": { + "Default": "3.229.0", + "Node20-225": "3.229.1" + } +} \ No newline at end of file diff --git a/_generated/BashV3/tsconfig.json b/_generated/BashV3/tsconfig.json new file mode 100644 index 000000000000..c22264963171 --- /dev/null +++ b/_generated/BashV3/tsconfig.json @@ -0,0 +1,7 @@ +{ + "extends": "@tsconfig/node10/tsconfig.json", + "compilerOptions": { + "noImplicitAny": false, + "strictNullChecks": false, + } +} \ No newline at end of file diff --git a/_generated/BashV3/utils/errors.ts b/_generated/BashV3/utils/errors.ts new file mode 100644 index 000000000000..b86763d43eee --- /dev/null +++ b/_generated/BashV3/utils/errors.ts @@ -0,0 +1,5 @@ +export class ArgsSanitizingError extends Error { + constructor(message: string) { + super(message); + } +} diff --git a/_generated/BashV3_Node20/.npmrc b/_generated/BashV3_Node20/.npmrc new file mode 100644 index 000000000000..5fca0d518be7 --- /dev/null +++ b/_generated/BashV3_Node20/.npmrc @@ -0,0 +1 @@ +scripts-prepend-node-path=true diff --git a/_generated/BashV3_Node20/README.md b/_generated/BashV3_Node20/README.md new file mode 100644 index 000000000000..196e01c56fd7 --- /dev/null +++ b/_generated/BashV3_Node20/README.md @@ -0,0 +1,3 @@ +BashV3 + + diff --git a/_generated/BashV3_Node20/Strings/resources.resjson/de-DE/resources.resjson b/_generated/BashV3_Node20/Strings/resources.resjson/de-DE/resources.resjson new file mode 100644 index 000000000000..d14469b46b32 --- /dev/null +++ b/_generated/BashV3_Node20/Strings/resources.resjson/de-DE/resources.resjson @@ -0,0 +1,28 @@ +{ + "loc.friendlyName": "Bash", + "loc.helpMarkDown": "[Erfahren Sie mehr zu dieser Aufgabe](https://go.microsoft.com/fwlink/?linkid=2132213), oder [zeigen Sie die Bash-Dokumentation an](https://www.gnu.org/software/bash/manual/).", + "loc.description": "Hiermit führen Sie ein Bash-Skript unter macOS, Linux oder Windows aus.", + "loc.instanceNameFormat": "Bash-Skript", + "loc.releaseNotes": "Konsistenz des Skripttasks. Es wurde Unterstützung für mehrere Zeilen und für Windows hinzugefügt.", + "loc.group.displayName.advanced": "Erweitert", + "loc.input.label.targetType": "Typ", + "loc.input.help.targetType": "Zielskripttyp: Dateipfad oder Inline", + "loc.input.label.filePath": "Skriptpfad", + "loc.input.help.filePath": "Der Pfad des auszuführenden Skripts. Es muss sich um einen vollqualifizierten Pfad oder einen Pfad relativ zu \"$(System.DefaultWorkingDirectory)\" handeln.", + "loc.input.label.arguments": "Argumente", + "loc.input.help.arguments": "An das Shellskript übergebene Argumente. Entweder Ordnungszahl- oder benannte Parameter.", + "loc.input.label.script": "Skript", + "loc.input.label.workingDirectory": "Arbeitsverzeichnis", + "loc.input.label.failOnStderr": "Fehler aufgrund von Standardfehler.", + "loc.input.help.failOnStderr": "Wenn dies TRUE ist, tritt bei dieser Aufgabe ein Fehler auf, wenn Fehler in den StandardError-Stream geschrieben werden.", + "loc.input.label.bashEnvValue": "Legen Sie Wert für die Umgebungsvariable „BASH_ENV“ fest.", + "loc.input.help.bashEnvValue": "Wenn eine Eingabe angegeben wird, wird der Wert erweitert und als Pfad einer Startdatei verwendet, die vor dem Ausführen des Skripts ausgeführt werden soll. Wenn die Umgebungsvariable „BASH_ENV“ bereits definiert wurde, überschreibt die Aufgabe diese Variable nur für die aktuellen Aufgabe. Weitere Details finden Sie in unter [Link](https://www.gnu.org/software/bash/manual/html_node/Bash-Startup-Files.html).", + "loc.messages.GeneratingScript": "Skript wird erstellt.", + "loc.messages.JS_ExitCode": "Bash wurde mit dem Code \"%s\" beendet.", + "loc.messages.JS_FormattedCommand": "Formatierter Befehl: %s", + "loc.messages.JS_InvalidFilePath": "Ungültiger Dateipfad \"%s\".", + "loc.messages.JS_ScriptContents": "Skriptinhalte:", + "loc.messages.JS_Stderr": "Bash hat mindestens eine Zeile in den Standardfehlerstream geschrieben.", + "loc.messages.JS_TranslatePathFailed": "Der Pfad \"%s\" kann nicht in das Linux-Dateisystem übersetzt werden.", + "loc.messages.JS_BashEnvAlreadyDefined": "Die Umgebungsvariable „BASH_ENV“ wurde bereits auf „%s“ festgelegt. Die Aufgabe überschreibt sie mit „%s“." +} \ No newline at end of file diff --git a/_generated/BashV3_Node20/Strings/resources.resjson/en-US/resources.resjson b/_generated/BashV3_Node20/Strings/resources.resjson/en-US/resources.resjson new file mode 100644 index 000000000000..793fe175117b --- /dev/null +++ b/_generated/BashV3_Node20/Strings/resources.resjson/en-US/resources.resjson @@ -0,0 +1,29 @@ +{ + "loc.friendlyName": "Bash", + "loc.helpMarkDown": "[Learn more about this task](https://go.microsoft.com/fwlink/?linkid=2132213) or [see the Bash documentation](https://www.gnu.org/software/bash/manual/)", + "loc.description": "Run a Bash script on macOS, Linux, or Windows", + "loc.instanceNameFormat": "Bash Script", + "loc.releaseNotes": "Script task consistency. Added support for multiple lines and added support for Windows.", + "loc.group.displayName.advanced": "Advanced", + "loc.input.label.targetType": "Type", + "loc.input.help.targetType": "Target script type: File Path or Inline", + "loc.input.label.filePath": "Script Path", + "loc.input.help.filePath": "Path of the script to execute. Must be a fully qualified path or relative to $(System.DefaultWorkingDirectory).", + "loc.input.label.arguments": "Arguments", + "loc.input.help.arguments": "Arguments passed to the shell script. Either ordinal parameters or named parameters.", + "loc.input.label.script": "Script", + "loc.input.label.workingDirectory": "Working Directory", + "loc.input.label.failOnStderr": "Fail on Standard Error", + "loc.input.help.failOnStderr": "If this is true, this task will fail if any errors are written to the StandardError stream.", + "loc.input.label.bashEnvValue": "Set value for BASH_ENV environment variable", + "loc.input.help.bashEnvValue": "If input is specified, it's value is expanded and used as the path of a startup file to execute before running the script. If the environment variable `BASH_ENV` has already been defined, the task will override this variable only for the current task. You can find more details by [link](https://www.gnu.org/software/bash/manual/html_node/Bash-Startup-Files.html).", + "loc.messages.GeneratingScript": "Generating script.", + "loc.messages.JS_ExitCode": "Bash exited with code '%s'.", + "loc.messages.JS_FormattedCommand": "Formatted command: %s", + "loc.messages.JS_InvalidFilePath": "Invalid file path '%s'.", + "loc.messages.JS_ScriptContents": "Script contents:", + "loc.messages.JS_Stderr": "Bash wrote one or more lines to the standard error stream.", + "loc.messages.JS_TranslatePathFailed": "Unable to translate the path '%s' to the Linux file system.", + "loc.messages.JS_BashEnvAlreadyDefined": "The BASH_ENV environment variable has already been set to a '%s', the task will override it with '%s'", + "loc.messages.ScriptArgsSanitized": "Detected characters in arguments that may not be executed correctly by the shell. Please escape special characters using backslash (\\). More information is available here: https://aka.ms/ado/75787" +} \ No newline at end of file diff --git a/_generated/BashV3_Node20/Strings/resources.resjson/es-ES/resources.resjson b/_generated/BashV3_Node20/Strings/resources.resjson/es-ES/resources.resjson new file mode 100644 index 000000000000..2f9fcb034ea0 --- /dev/null +++ b/_generated/BashV3_Node20/Strings/resources.resjson/es-ES/resources.resjson @@ -0,0 +1,28 @@ +{ + "loc.friendlyName": "Bash", + "loc.helpMarkDown": "[Obtener más información acerca de esta tarea](https://go.microsoft.com/fwlink/?linkid=2132213) o [consultar la documentación de Bash](https://www.gnu.org/software/bash/manual/)", + "loc.description": "Ejecutar un script de Bash en macOS, Linux o Windows", + "loc.instanceNameFormat": "Script de Bash", + "loc.releaseNotes": "Coherencia de la tarea del script. Se ha agregado compatibilidad con varias líneas y también para Windows.", + "loc.group.displayName.advanced": "Avanzado", + "loc.input.label.targetType": "Tipo", + "loc.input.help.targetType": "Tipo de script de destino: ruta de acceso de archivo o insertado", + "loc.input.label.filePath": "Ruta de acceso del script", + "loc.input.help.filePath": "Ruta de acceso del script que se va a ejecutar. Debe ser una ruta de acceso completa o relativa a $(System.DefaultWorkingDirectory).", + "loc.input.label.arguments": "Argumentos", + "loc.input.help.arguments": "Argumentos pasados al script de shell. Pueden ser parámetros ordinales o parámetros con nombre.", + "loc.input.label.script": "Script", + "loc.input.label.workingDirectory": "Directorio de trabajo", + "loc.input.label.failOnStderr": "Error si se produce un error estándar", + "loc.input.help.failOnStderr": "Si es true, esta tarea no se realizará cuando se registre algún error en la secuencia de error estándar.", + "loc.input.label.bashEnvValue": "Establecer valor para la variable de entorno BASH_ENV", + "loc.input.help.bashEnvValue": "Si se especifica la entrada, su valor se expande y se usa como ruta de acceso de un archivo de inicio que se va a ejecutar antes de ejecutar el script. Si la variable de entorno 'BASH_ENV' ya se ha definido, la tarea reemplazará esta variable solo para la tarea actual. Encontrará más detalles en [link](https://www.gnu.org/software/bash/manual/html_node/Bash-Startup-Files.html).", + "loc.messages.GeneratingScript": "Generando script.", + "loc.messages.JS_ExitCode": "Bash se cerró con el código \"%s\".", + "loc.messages.JS_FormattedCommand": "Comando con formato: %s", + "loc.messages.JS_InvalidFilePath": "Ruta de acceso de archivo no válida: %s.", + "loc.messages.JS_ScriptContents": "Contenido del script:", + "loc.messages.JS_Stderr": "Bash escribió una o varias líneas en la secuencia de error estándar.", + "loc.messages.JS_TranslatePathFailed": "La ruta de acceso \"%s\" no se puede traducir al sistema de archivos de Linux.", + "loc.messages.JS_BashEnvAlreadyDefined": "La variable de entorno BASH_ENV ya se ha establecido en '%s'. La tarea la reemplazará por '%s'" +} \ No newline at end of file diff --git a/_generated/BashV3_Node20/Strings/resources.resjson/fr-FR/resources.resjson b/_generated/BashV3_Node20/Strings/resources.resjson/fr-FR/resources.resjson new file mode 100644 index 000000000000..8d28c34cec95 --- /dev/null +++ b/_generated/BashV3_Node20/Strings/resources.resjson/fr-FR/resources.resjson @@ -0,0 +1,28 @@ +{ + "loc.friendlyName": "Bash", + "loc.helpMarkDown": "[En savoir plus sur cette tâche](https://go.microsoft.com/fwlink/?linkid=2132213) ou [consulter la documentation de Bash](https://www.gnu.org/software/bash/manual/)", + "loc.description": "Exécuter un script Bash sur macOS, Linux ou Windows", + "loc.instanceNameFormat": "Script Bash", + "loc.releaseNotes": "Cohérence de la tâche de script. Ajout de la prise en charge de plusieurs lignes et ajout de la prise en charge de Windows.", + "loc.group.displayName.advanced": "Avancé", + "loc.input.label.targetType": "Type", + "loc.input.help.targetType": "Type de script cible : chemin de fichier ou inline", + "loc.input.label.filePath": "Chemin du script", + "loc.input.help.filePath": "Chemin du script à exécuter. Il doit s'agir d'un chemin complet ou d'un chemin relatif à $(System.DefaultWorkingDirectory).", + "loc.input.label.arguments": "Arguments", + "loc.input.help.arguments": "Arguments passés au script d'interpréteur de commandes. Il s'agit de paramètres ordinaux ou nommés.", + "loc.input.label.script": "Script", + "loc.input.label.workingDirectory": "Répertoire de travail", + "loc.input.label.failOnStderr": "Échec sur une erreur standard", + "loc.input.help.failOnStderr": "Si la valeur est true, cette tâche se solde par un échec si des erreurs sont écrites dans le flux de données StandardError.", + "loc.input.label.bashEnvValue": "Définir une valeur pour BASH_ENV variable d’environnement", + "loc.input.help.bashEnvValue": "Si l’entrée est spécifiée, sa valeur est développée et utilisée comme chemin d’accès d’un fichier de démarrage à exécuter avant d’exécuter le script. Si la variable d’environnement ' BASH_ENV' a déjà été définie, la tâche remplace cette variable uniquement pour la tâche active. Pour plus d’informations, consultez [link](https://www.gnu.org/software/bash/manual/html_node/Bash-Startup-Files.html).", + "loc.messages.GeneratingScript": "Génération du script.", + "loc.messages.JS_ExitCode": "Arrêt de Bash. Code de sortie : '%s'.", + "loc.messages.JS_FormattedCommand": "Commande mise en forme : %s", + "loc.messages.JS_InvalidFilePath": "Chemin de fichier non valide : '%s'.", + "loc.messages.JS_ScriptContents": "Contenu du script :", + "loc.messages.JS_Stderr": "Bash a écrit une ou plusieurs lignes dans le flux d'erreurs standard.", + "loc.messages.JS_TranslatePathFailed": "Impossible de traduire le chemin '%s' vers le système de fichiers Linux.", + "loc.messages.JS_BashEnvAlreadyDefined": "La variable d’environnement BASH_ENV a déjà été définie sur un « %s », la tâche la remplacera par « %s »." +} \ No newline at end of file diff --git a/_generated/BashV3_Node20/Strings/resources.resjson/it-IT/resources.resjson b/_generated/BashV3_Node20/Strings/resources.resjson/it-IT/resources.resjson new file mode 100644 index 000000000000..6ab5955e6e09 --- /dev/null +++ b/_generated/BashV3_Node20/Strings/resources.resjson/it-IT/resources.resjson @@ -0,0 +1,28 @@ +{ + "loc.friendlyName": "Bash", + "loc.helpMarkDown": "[Altre informazioni su questa attività](https://go.microsoft.com/fwlink/?linkid=2132213). In alternativa, [vedere la documentazione di Bash](https://www.gnu.org/software/bash/manual/)", + "loc.description": "Consente di eseguire uno script Bash in macOS, Linux o Windows", + "loc.instanceNameFormat": "Script Bash", + "loc.releaseNotes": "Coerenza delle attività per gli script. Aggiunta del supporto per più righe e del supporto per Windows.", + "loc.group.displayName.advanced": "Avanzate", + "loc.input.label.targetType": "Tipo", + "loc.input.help.targetType": "Tipo di script di destinazione: percorso file o inline", + "loc.input.label.filePath": "Percorso script", + "loc.input.help.filePath": "Percorso dello script da eseguire. Deve essere un percorso completo o relativo rispetto a $(System.DefaultWorkingDirectory).", + "loc.input.label.arguments": "Argomenti", + "loc.input.help.arguments": "Argomenti passati allo script della shell. Parametri ordinali o denominati.", + "loc.input.label.script": "Script", + "loc.input.label.workingDirectory": "Directory di lavoro", + "loc.input.label.failOnStderr": "Interrompi in caso di errore standard", + "loc.input.help.failOnStderr": "Se è impostato su true, questa attività non riuscirà nel caso in cui vengano scritti errori nel flusso StandardError.", + "loc.input.label.bashEnvValue": "Imposta il valore per la variabile di ambiente BASH_ENV", + "loc.input.help.bashEnvValue": "Se si specifica l'input, il valore viene espanso e usato come percorso di un file di avvio da eseguire prima di eseguire lo script. Se la variabile di ambiente 'BASH_ENV' è già stata definita, l'attività eseguirà l'override di questa variabile solo per l'attività corrente. Per altre informazioni, vedere [link](https://www.gnu.org/software/bash/manual/html_node/Bash-Startup-Files.html).", + "loc.messages.GeneratingScript": "Generazione dello script.", + "loc.messages.JS_ExitCode": "Bash terminato con codice '%s'.", + "loc.messages.JS_FormattedCommand": "Comando formattato: %s", + "loc.messages.JS_InvalidFilePath": "Il percorso file '%s' non è valido.", + "loc.messages.JS_ScriptContents": "Contenuto dello script:", + "loc.messages.JS_Stderr": "Bash ha scritto una o più righe nel flusso di errore standard.", + "loc.messages.JS_TranslatePathFailed": "Non è possibile convertire il percorso '%s' per il file system Linux.", + "loc.messages.JS_BashEnvAlreadyDefined": "La variabile di ambiente BASH_ENV è già stata impostata su '%s'. L'attività la sostituirà con '%s'" +} \ No newline at end of file diff --git a/_generated/BashV3_Node20/Strings/resources.resjson/ja-JP/resources.resjson b/_generated/BashV3_Node20/Strings/resources.resjson/ja-JP/resources.resjson new file mode 100644 index 000000000000..588a7388d60e --- /dev/null +++ b/_generated/BashV3_Node20/Strings/resources.resjson/ja-JP/resources.resjson @@ -0,0 +1,28 @@ +{ + "loc.friendlyName": "Bash", + "loc.helpMarkDown": "[このタスクの詳細を表示](https://go.microsoft.com/fwlink/?linkid=2132213)、または [Bash のドキュメントを参照](https://www.gnu.org/software/bash/manual/)", + "loc.description": "macOS、Linux、または Windows で Bash スクリプトを実行します", + "loc.instanceNameFormat": "Bash スクリプト", + "loc.releaseNotes": "スクリプト タスクの整合性。複数行のサポートと、Windows のサポートが追加されました。", + "loc.group.displayName.advanced": "詳細設定", + "loc.input.label.targetType": "種類", + "loc.input.help.targetType": "ターゲット スクリプトの種類: ファイル パスまたはインライン", + "loc.input.label.filePath": "スクリプト パス", + "loc.input.help.filePath": "実行するスクリプトのパス。完全修飾パスか、または $(System.DefaultWorkingDirectory) からの相対パスを指定する必要があります。", + "loc.input.label.arguments": "引数", + "loc.input.help.arguments": "引数がシェル スクリプトに渡されます。順序によるパラメーターまたは名前指定されたパラメーターのいずれかです。", + "loc.input.label.script": "スクリプト", + "loc.input.label.workingDirectory": "作業ディレクトリ", + "loc.input.label.failOnStderr": "標準エラーで失敗", + "loc.input.help.failOnStderr": "true の場合、StandardError ストリームにエラーが書き込まれると、このタスクは失敗します。", + "loc.input.label.bashEnvValue": "環境変数 BASH_ENV の値を設定する", + "loc.input.help.bashEnvValue": "input が指定された場合は、その値が展開され、スクリプトを実行する前に実行するスタートアップ ファイルのパスとして使用されます。環境変数 `BASH_ENV` が既に定義されている場合は、現在のタスクに対してのみこの変数を上書きします。詳細は、[link](https://www.gnu.org/software/bash/manual/html_node/Bash-Startup-Files.html) で確認できます。", + "loc.messages.GeneratingScript": "スクリプトを生成しています。", + "loc.messages.JS_ExitCode": "bash がコード '%s' で終了しました。", + "loc.messages.JS_FormattedCommand": "フォーマット後のコマンド: %s", + "loc.messages.JS_InvalidFilePath": "'%s' は、無効なファイル パスです。", + "loc.messages.JS_ScriptContents": "スクリプト コンテンツ:", + "loc.messages.JS_Stderr": "bash が標準エラー ストリームに 1 行以上を書き込みました。", + "loc.messages.JS_TranslatePathFailed": "パス '%s' は、Linux ファイル システムに変換できません。", + "loc.messages.JS_BashEnvAlreadyDefined": "環境変数 BASH_ENV は既に '%s' に設定されていますが、このタスクはこれを '%s' で上書きします" +} \ No newline at end of file diff --git a/_generated/BashV3_Node20/Strings/resources.resjson/ko-KR/resources.resjson b/_generated/BashV3_Node20/Strings/resources.resjson/ko-KR/resources.resjson new file mode 100644 index 000000000000..2249c3b1b641 --- /dev/null +++ b/_generated/BashV3_Node20/Strings/resources.resjson/ko-KR/resources.resjson @@ -0,0 +1,28 @@ +{ + "loc.friendlyName": "Bash", + "loc.helpMarkDown": "[이 작업에 대한 자세한 정보](https://go.microsoft.com/fwlink/?linkid=2132213) 또는 [Bash 설명서 참조](https://www.gnu.org/software/bash/manual/)", + "loc.description": "macOS, Linux 또는 Windows에서 Bash 스크립트 실행", + "loc.instanceNameFormat": "Bash 스크립트", + "loc.releaseNotes": "스크립트 작업 일관성입니다. 추가로 여러 줄과 Windows를 지원합니다.", + "loc.group.displayName.advanced": "고급", + "loc.input.label.targetType": "유형", + "loc.input.help.targetType": "대상 스크립트 유형: 파일 경로 또는 인라인", + "loc.input.label.filePath": "스크립트 경로", + "loc.input.help.filePath": "실행할 스크립트의 경로입니다. 정규화된 경로이거나 $(System.DefaultWorkingDirectory)의 상대 경로여야 합니다.", + "loc.input.label.arguments": "인수", + "loc.input.help.arguments": "셸 스크립트에 전달되는 인수입니다. 서수 매개 변수나 명명된 매개 변수 중 하나입니다.", + "loc.input.label.script": "스크립트", + "loc.input.label.workingDirectory": "작업 디렉터리", + "loc.input.label.failOnStderr": "표준 오류 시 실패", + "loc.input.help.failOnStderr": "true일 경우 StandardError 스트림에 오류가 작성되면 이 작업은 실패하게 됩니다.", + "loc.input.label.bashEnvValue": "BASH_ENV 환경 변수의 값 설정", + "loc.input.help.bashEnvValue": "입력이 지정된 경우 해당 값은 확장되며 스크립트를 실행하기 전에 실행할 시작 파일의 경로로 사용됩니다. 환경 변수 'BASH_ENV'가 이미 정의된 경우 작업에서 현재 작업에 대해서만 이 변수를 재정의합니다. 자세한 내용은 [link](https://www.gnu.org/software/bash/manual/html_node/Bash-Startup-Files.html)에서 확인할 수 있습니다.", + "loc.messages.GeneratingScript": "스크립트를 생성 중입니다.", + "loc.messages.JS_ExitCode": "Bash가 코드 '%s'(으)로 종료되었습니다.", + "loc.messages.JS_FormattedCommand": "형식이 지정된 명령: %s", + "loc.messages.JS_InvalidFilePath": "파일 경로 '%s'이(가) 잘못되었습니다.", + "loc.messages.JS_ScriptContents": "스크립트 내용:", + "loc.messages.JS_Stderr": "Bash가 표준 오류 스트림에 하나 이상의 줄을 썼습니다.", + "loc.messages.JS_TranslatePathFailed": "'%s' 경로를 Linux 파일 시스템으로 변환할 수 없습니다.", + "loc.messages.JS_BashEnvAlreadyDefined": "BASH_ENV 환경 변수가 이미 '%s'(으)로 설정되어 있습니다. 작업에서 '%s'(으)로 재정의합니다." +} \ No newline at end of file diff --git a/_generated/BashV3_Node20/Strings/resources.resjson/ru-RU/resources.resjson b/_generated/BashV3_Node20/Strings/resources.resjson/ru-RU/resources.resjson new file mode 100644 index 000000000000..9e085a52935a --- /dev/null +++ b/_generated/BashV3_Node20/Strings/resources.resjson/ru-RU/resources.resjson @@ -0,0 +1,28 @@ +{ + "loc.friendlyName": "Bash", + "loc.helpMarkDown": "[См. дополнительные сведения об этой задаче](https://go.microsoft.com/fwlink/?linkid=2132213) или [документацию по Bash](https://www.gnu.org/software/bash/manual/)", + "loc.description": "Выполнение скрипта Bash в macOS, Linux или Windows", + "loc.instanceNameFormat": "Скрипт Bash", + "loc.releaseNotes": "Создавайте скрипты для обеспечения согласованности задач. Добавлена поддержка нескольких строк и поддержка Windows.", + "loc.group.displayName.advanced": "Дополнительно", + "loc.input.label.targetType": "Тип", + "loc.input.help.targetType": "Тип целевого скрипта: путь к файлу или встроенный", + "loc.input.label.filePath": "Путь к скрипту", + "loc.input.help.filePath": "Путь к выполняемому скрипту. Это должен быть полный путь или путь относительно $(System.DefaultWorkingDirectory).", + "loc.input.label.arguments": "Аргументы", + "loc.input.help.arguments": "Аргументы, передаваемые в скрипт оболочки. Параметры могут быть порядковыми или именованными.", + "loc.input.label.script": "Скрипт", + "loc.input.label.workingDirectory": "Рабочий каталог", + "loc.input.label.failOnStderr": "Сбой со стандартной ошибкой", + "loc.input.help.failOnStderr": "Если задано значение True, задача завершится сбоем при записи любых ошибок в поток StandardError.", + "loc.input.label.bashEnvValue": "Задайте значение для переменной среды BASH_ENV", + "loc.input.help.bashEnvValue": "Если указаны входные данные, их значение расширяется и используется в качестве пути к файлу запуска, который выполняется перед запуском сценария. Если переменная среды BASH_ENV уже определена, эта задача переопределит эту переменную только для текущей задачи. Дополнительные сведения: [link](https://www.gnu.org/software/bash/manual/html_node/Bash-Startup-Files.html).", + "loc.messages.GeneratingScript": "Формируется скрипт.", + "loc.messages.JS_ExitCode": "Завершение работы Bash с кодом \"%s\".", + "loc.messages.JS_FormattedCommand": "Отформатирована команда: %s", + "loc.messages.JS_InvalidFilePath": "Недопустимый путь к файлу \"%s\".", + "loc.messages.JS_ScriptContents": "Содержимое скрипта:", + "loc.messages.JS_Stderr": "Оболочка Bash записала одну или несколько строк в стандартный поток ошибок.", + "loc.messages.JS_TranslatePathFailed": "Не удалось преобразовать путь \"%s\" для файловой системы Linux.", + "loc.messages.JS_BashEnvAlreadyDefined": "Для переменной среды BASH_ENV уже задано значение \"%s\". Задача переопределит его на \"%s\"" +} \ No newline at end of file diff --git a/_generated/BashV3_Node20/Strings/resources.resjson/zh-CN/resources.resjson b/_generated/BashV3_Node20/Strings/resources.resjson/zh-CN/resources.resjson new file mode 100644 index 000000000000..b5401ad52007 --- /dev/null +++ b/_generated/BashV3_Node20/Strings/resources.resjson/zh-CN/resources.resjson @@ -0,0 +1,28 @@ +{ + "loc.friendlyName": "Bash", + "loc.helpMarkDown": "[详细了解此任务](https://go.microsoft.com/fwlink/?linkid=2132213)或[查看 Bash 文档](https://www.gnu.org/software/bash/manual/)", + "loc.description": "在 MacOS、 Linux 或 Windows 上运行 Bash 脚本", + "loc.instanceNameFormat": "Bash 脚本", + "loc.releaseNotes": "脚本任务一致性。添加了对多个行的支持并添加了对 Windows 的支持。", + "loc.group.displayName.advanced": "高级", + "loc.input.label.targetType": "类型", + "loc.input.help.targetType": "目标脚本类型: 文件路径或内联", + "loc.input.label.filePath": "脚本路径", + "loc.input.help.filePath": "要执行的脚本的路径。必须为完全限定的路径或相对于 $(System.DefaultWorkingDirectory)。", + "loc.input.label.arguments": "参数", + "loc.input.help.arguments": "传递给 Shell 脚本的参数。是序号或命名参数。", + "loc.input.label.script": "脚本", + "loc.input.label.workingDirectory": "工作目录", + "loc.input.label.failOnStderr": "因标准错误而失败", + "loc.input.help.failOnStderr": "如果为 true,则在向 StandardError 流写入任何错误时,此任务都会失败。", + "loc.input.label.bashEnvValue": "设置 BASH_ENV 环境变量的值", + "loc.input.help.bashEnvValue": "如果指定了输入,则会展开该值,并将其用作运行脚本之前要执行的启动文件的路径。如果已定义环境变量“BASH_ENV”,则该任务将仅针对当前任务重写此变量。可以通过 [link](https://www.gnu.org/software/bash/manual/html_node/Bash-Startup-Files.html)查找更多详细信息。", + "loc.messages.GeneratingScript": "正在生成脚本。", + "loc.messages.JS_ExitCode": "Bash 已退出,代码为“%s”。", + "loc.messages.JS_FormattedCommand": "已设置格式的命令: %s", + "loc.messages.JS_InvalidFilePath": "文件路径“%s”无效。", + "loc.messages.JS_ScriptContents": "脚本内容:", + "loc.messages.JS_Stderr": "Bash 向标准错误流写入一个或多个行。", + "loc.messages.JS_TranslatePathFailed": "无法将路径“%s”转换到 Linux 文件系统。", + "loc.messages.JS_BashEnvAlreadyDefined": "已将 BASH_ENV环境变量设置为“%s”,任务将使用“%s”替代它" +} \ No newline at end of file diff --git a/_generated/BashV3_Node20/Strings/resources.resjson/zh-TW/resources.resjson b/_generated/BashV3_Node20/Strings/resources.resjson/zh-TW/resources.resjson new file mode 100644 index 000000000000..02ed55c06f61 --- /dev/null +++ b/_generated/BashV3_Node20/Strings/resources.resjson/zh-TW/resources.resjson @@ -0,0 +1,28 @@ +{ + "loc.friendlyName": "Bash", + "loc.helpMarkDown": "[深入了解此工作](https://go.microsoft.com/fwlink/?linkid=2132213)或[參閱 Bash 文件](https://www.gnu.org/software/bash/manual/)", + "loc.description": "在 macOS、Linux 或 Windows 執行 Bash 指令碼", + "loc.instanceNameFormat": "Bash 指令碼", + "loc.releaseNotes": "指令碼工作一致性。新增了多行支援,並新增 Windows 的支援。", + "loc.group.displayName.advanced": "進階", + "loc.input.label.targetType": "類型", + "loc.input.help.targetType": "目標指令碼類型: 檔案路徑或內嵌", + "loc.input.label.filePath": "指令碼路徑", + "loc.input.help.filePath": "要執行的指令碼之路徑。必須是完整路徑或相對於 $(System.DefaultWorkingDirectory) 的路徑。", + "loc.input.label.arguments": "引數", + "loc.input.help.arguments": "傳遞至殼層指令碼的引數。可以是序號參數或具名參數。", + "loc.input.label.script": "指令碼", + "loc.input.label.workingDirectory": "工作目錄", + "loc.input.label.failOnStderr": "發生標準錯誤的失敗", + "loc.input.help.failOnStderr": "若此為 true,則任何錯誤寫入 StandardError 資料流時,此工作便會失敗。", + "loc.input.label.bashEnvValue": "設定 BASH_ENV 環境變數的值", + "loc.input.help.bashEnvValue": "若指定輸入,其值會展開,並作為執行指令碼前要執行之啟動檔案的路徑。如果已定義環境變數 'BASH_ENV',則工作只會針對目前的工作覆寫此變數。您可以透過 [link] (https://www.gnu.org/software/bash/manual/html_node/Bash-Startup-Files.html) 找到更多詳細資料。", + "loc.messages.GeneratingScript": "正在產生指令碼。", + "loc.messages.JS_ExitCode": "Bash 已結束,代碼為 '%s'。", + "loc.messages.JS_FormattedCommand": "經過格式化的命令: %s", + "loc.messages.JS_InvalidFilePath": "檔案路徑 '%s' 無效。", + "loc.messages.JS_ScriptContents": "指令碼內容:", + "loc.messages.JS_Stderr": "Bash 已將一或多行寫入標準錯誤資料流。", + "loc.messages.JS_TranslatePathFailed": "無法將路徑 '%s' 轉譯成 Linux 檔案系統。", + "loc.messages.JS_BashEnvAlreadyDefined": "BASH_ENV 環境變數已設定為 '%s',工作會以 '%s' 覆寫" +} \ No newline at end of file diff --git a/_generated/BashV3_Node20/Tests/EnvExpansion/L0EnvExpansion.ts b/_generated/BashV3_Node20/Tests/EnvExpansion/L0EnvExpansion.ts new file mode 100644 index 000000000000..e34dc7063e1e --- /dev/null +++ b/_generated/BashV3_Node20/Tests/EnvExpansion/L0EnvExpansion.ts @@ -0,0 +1,109 @@ +import assert = require('assert'); +import { expandBashEnvVariables } from '../../helpers'; + +export const BashEnvProcessingTests = () => { + const testSuites: [string, string, string[], string][] = [ + [ + 'Handles empty line', + '', [], '' + ], + [ + 'Expanding known env variables', + '$VAR1 2', ['VAR1=value1'], 'value1 2' + ], + [ + 'Expanding env variables with brace syntax', + '${VAR1} 2', ['VAR1=value1'], 'value1 2' + ], + [ + 'Expanding multiple env variables', + '1 ${VAR1} $VAR2', ['VAR1=value1', 'VAR2=value2'], '1 value1 value2' + ], + [ + 'Expanding multiple close env variables', + '$VAR1 ${VAR2}$VAR3', ['VAR1=value1', 'VAR2=value2', 'VAR3=value3'], 'value1 value2value3' + ], + [ + 'Expanding multiple close env variables', + '$VAR1 ${VAR2}_$VAR3', ['VAR1=value1', 'VAR2=value2', 'VAR3=value3'], 'value1 value2_value3' + ], + [ + 'Expanding multiple close env variables 3', + '${VAR1}${VAR2}$VAR3', ['VAR1=1', 'VAR2=2', 'VAR3=3'], '123' + ], + [ + 'Expanding multiple env variables 2', + '$VAR1 $VAR2', ['VAR1=1', 'VAR2=2'], '1 2' + ], + [ + 'Not expanding nested env variables', + '$VAR1 $VAR2', ['VAR1=$NESTED', 'VAR2=2', 'NESTED=nested'], '$NESTED 2' + ], + [ + 'Backslash before env var', + '\\$VAR1', ['VAR1=value1'], '$VAR1' + ], + [ + 'Backslash at start of env var', + '$\\VAR1', ['VAR1=value1'], '$\\VAR1' + ], + [ + 'Backslash inside env var - leave as is', + '$V\\AR1', ['VAR1=value1'], '$V\\AR1' + ], + [ + `If it's inside the single quotes - it should be ignored`, + `$VAR1 '$VAR2'`, ['VAR1=value1', 'VAR2=value2'], `value1 '$VAR2'` + ], + [ + `If it's inside the single quotes - it should be ignored 2`, + `$VAR1 ' _ $VAR2 _ '`, ['VAR1=value1', 'VAR2=value2'], `value1 ' _ $VAR2 _ '` + ], + [ + `If it's inside the single quotes - it should be ignored 3`, + `$VAR1 ' _ $VAR2 _ ''$VAR3'`, ['VAR1=value1', 'VAR2=value2', 'VAR3=value3'], `value1 ' _ $VAR2 _ ''$VAR3'` + ], + [ + `If it's inside the double quotes - it should be expanded`, + `$VAR1 "$VAR2"`, ['VAR1=value1', 'VAR2=value2'], `value1 "value2"` + ], + [ + `Close quotes`, + `''$VAR1 $VAR2`, ['VAR1=value1', 'VAR2=value2'], `''value1 value2` + ], + [ + 'Skips variables with indirect expansion', + '${VAR1} ${!VAR2} "${!VAR3}"', ['VAR1=value1', 'VAR2=value2', 'VAR2=value3'], 'value1 ${!VAR2} "${!VAR3}"' + ], + [ + 'Skips variables with invalid name', + "${1VAR1} ${a:b} ${a:+b} ${a:?b} ${VAR1:0:2} ${VAR1\\val\\lav}", ['VAR1=value1', 'a=value3', 'a:b=value4'], "${1VAR1} ${a:b} ${a:+b} ${a:?b} ${VAR1:0:2} ${VAR1\\val\\lav}" + ], + [ + 'If variable syntax is incorrect, it should leave it as is', + '$venv:VAR1 ${_env:VAR2}', ['VAR1=val1', 'VAR2=val2'], '$venv:VAR1 ${_env:VAR2}' + ], + [ + 'If closing brace is not present, it should leave it as is', + '$VAR1 ${VAR2', ['VAR1=val1', 'VAR2=val2'], 'val1 ${VAR2', + ], + [ + 'If closing brace is not present, it should leave it as is 2', + '${VAR1 ${VAR2}', ['VAR1=val1', 'VAR2=val2'], '${VAR1 ${VAR2}', + ] + ] + + for (const [testName, input, variables, expected] of testSuites) { + it(testName, () => { + + for (const variable of variables) { + const [name, value] = variable.split('='); + process.env[name] = value; + } + + const [result] = expandBashEnvVariables(input); + + assert.deepStrictEqual(result, expected); + }); + } +}; diff --git a/_generated/BashV3_Node20/Tests/EnvExpansion/L0Telemetry.ts b/_generated/BashV3_Node20/Tests/EnvExpansion/L0Telemetry.ts new file mode 100644 index 000000000000..30704dbe8f98 --- /dev/null +++ b/_generated/BashV3_Node20/Tests/EnvExpansion/L0Telemetry.ts @@ -0,0 +1,63 @@ +import assert = require('assert'); +import { expandBashEnvVariables } from '../../helpers'; + +export const EnvProcessingTelemetryTests = () => { + // maybe we should treat that differently + it('Found prefixes test', () => { + const argsLine = '$ ${} $'; + const expectedTelemetry = { foundPrefixes: 3 }; + + const [_, resultTelemetry] = expandBashEnvVariables(argsLine); + + assert.deepStrictEqual(resultTelemetry.foundPrefixes, expectedTelemetry.foundPrefixes); + }) + it('Not closed brace syntax', () => { + const argsLine = '${'; + const expectedTelemetry = { notClosedBraceSyntaxPosition: 1 }; + + const [_, resultTelemetry] = expandBashEnvVariables(argsLine); + + assert.deepStrictEqual(resultTelemetry.notClosedBraceSyntaxPosition, expectedTelemetry.notClosedBraceSyntaxPosition); + }) + it('Not closed brace syntax 2', () => { + const argsLine = "'${' ${"; + const expectedTelemetry = { notClosedBraceSyntaxPosition: 6 }; + + const [_, resultTelemetry] = expandBashEnvVariables(argsLine); + + assert.deepStrictEqual(resultTelemetry.notClosedBraceSyntaxPosition, expectedTelemetry.notClosedBraceSyntaxPosition); + }) + it('Not closed quotes', () => { + const argsLine = "' $A"; + const expectedTelemetry = { unmatchedQuotes: 1 }; + + const [_, resultTelemetry] = expandBashEnvVariables(argsLine); + + assert.deepStrictEqual(resultTelemetry.unmatchedQuotes, expectedTelemetry.unmatchedQuotes); + }) + it('Quotted blocks count', () => { + // We're ignores quote blocks where no any env variables + const argsLine = "'$VAR1' '$VAR2' '3'"; + const expectedTelemetry = { quottedBlocks: 2 }; + + const [_, resultTelemetry] = expandBashEnvVariables(argsLine); + + assert.deepStrictEqual(resultTelemetry.quottedBlocks, expectedTelemetry.quottedBlocks); + }) + it('Catches indirect expansion', () => { + const argsLine = "${!VAR1} ${!VAR2}"; + const expectedTelemetry = { indirectExpansion: 2 }; + + const [_, resultTelemetry] = expandBashEnvVariables(argsLine); + + assert.deepStrictEqual(resultTelemetry.indirectExpansionTries, expectedTelemetry.indirectExpansion); + }) + it('Skip indirect expansion inside quotes', () => { + const argsLine = "'${!VAR1}'"; + const expectedTelemetry = { indirectExpansion: 0 }; + + const [_, resultTelemetry] = expandBashEnvVariables(argsLine); + + assert.deepStrictEqual(resultTelemetry.indirectExpansionTries, expectedTelemetry.indirectExpansion); + }) +} diff --git a/_generated/BashV3_Node20/Tests/EnvExpansion/index.ts b/_generated/BashV3_Node20/Tests/EnvExpansion/index.ts new file mode 100644 index 000000000000..9e450806861c --- /dev/null +++ b/_generated/BashV3_Node20/Tests/EnvExpansion/index.ts @@ -0,0 +1,2 @@ +export * from './L0EnvExpansion'; +export * from './L0Telemetry'; diff --git a/_generated/BashV3_Node20/Tests/L0.ts b/_generated/BashV3_Node20/Tests/L0.ts new file mode 100644 index 000000000000..63cbf34af444 --- /dev/null +++ b/_generated/BashV3_Node20/Tests/L0.ts @@ -0,0 +1,161 @@ +import assert = require('assert'); +import path = require('path'); +import * as ttm from 'azure-pipelines-task-lib/mock-test'; +import { BashEnvProcessingTests, EnvProcessingTelemetryTests } from './EnvExpansion'; +import { runValidateFileArgsTests } from './L0ValidateFileArgs'; + +describe('Bash Suite', function () { + this.timeout(parseInt(process.env.TASK_TEST_TIMEOUT) || 80000); + + function runValidations(validator: () => void, tr, done) { + try { + validator(); + done(); + } + catch (error) { + console.log("STDERR", tr.stderr); + console.log("STDOUT", tr.stdout); + done(error); + } + } + + it('Runs an inline script correctly', (done: Mocha.Done) => { + delete process.env['AZP_BASHV3_OLD_SOURCE_BEHAVIOR']; + let tp: string = path.join(__dirname, 'L0Inline.js'); + let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + runValidations(() => { + assert(tr.succeeded, 'Bash should have succeeded.'); + assert(tr.stderr.length === 0, 'Bash should not have written to stderr'); + assert(tr.stdout.indexOf('my script output') > 0, 'Bash should have correctly run the script'); + }, tr, done); + }); + + it('Runs a checked in script correctly', (done: Mocha.Done) => { + delete process.env['AZP_BASHV3_OLD_SOURCE_BEHAVIOR']; + process.env['AZP_TASK_FF_BASHV3_ENABLE_SECURE_ARGS'] = 'false' + let tp: string = path.join(__dirname, 'L0External.js'); + let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + runValidations(() => { + assert(tr.succeeded, 'Bash should have succeeded.'); + assert(tr.stderr.length === 0, 'Bash should not have written to stderr'); + if (process.platform === 'win32') { + // This is different on windows because we change the script name to make sure the normalization call is happening. + assert(tr.stdout.indexOf(`Writing exec bash 'temp/path/script' to temp/path/fileName.sh`) > 0, 'Bash should have written the script to a file'); + } else { + assert(tr.stdout.indexOf(`Writing exec bash 'path/to/script' to temp/path/fileName.sh`) > 0, 'Bash should have written the script to a file'); + } + + assert(tr.stdout.indexOf('my script output') > 0, 'Bash should have correctly run the script'); + }, tr, done); + }); + + it('Runs a checked in script correctly when using the old behavior', (done: Mocha.Done) => { + process.env['AZP_BASHV3_OLD_SOURCE_BEHAVIOR'] = "true"; + process.env['AZP_TASK_FF_BASHV3_ENABLE_SECURE_ARGS'] = 'false' + let tp: string = path.join(__dirname, 'L0External.js'); + let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + runValidations(() => { + assert(tr.succeeded, 'Bash should have succeeded.'); + assert(tr.stderr.length === 0, 'Bash should not have written to stderr'); + if (process.platform === 'win32') { + // This is different on windows because we change the script name to make sure the normalization call is happening. + assert(tr.stdout.indexOf(`Writing . 'temp/path/script' to temp/path/fileName.sh`) > 0, 'Bash should have written the script to a file'); + } else { + assert(tr.stdout.indexOf(`Writing . 'path/to/script' to temp/path/fileName.sh`) > 0, 'Bash should have written the script to a file'); + } + + assert(tr.stdout.indexOf('my script output') > 0, 'Bash should have correctly run the script'); + }, tr, done); + }); + + it('Adds arguments to the script', (done: Mocha.Done) => { + delete process.env['AZP_BASHV3_OLD_SOURCE_BEHAVIOR']; + process.env['AZP_TASK_FF_BASHV3_ENABLE_SECURE_ARGS'] = 'false' + let tp: string = path.join(__dirname, 'L0Args.js'); + let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + runValidations(() => { + assert(tr.succeeded, 'Bash should have succeeded.'); + assert(tr.stderr.length === 0, 'Bash should not have written to stderr'); + if (process.platform === 'win32') { + // This is different on windows because we change the script name to make sure the normalization call is happening. + assert(tr.stdout.indexOf(`Writing exec bash 'temp/path/script' myCustomArg to temp/path/fileName.sh`) > 0, 'Bash should have written the script to a file'); + } else { + assert(tr.stdout.indexOf(`Writing exec bash 'path/to/script' myCustomArg to temp/path/fileName.sh`) > 0, 'Bash should have written the script to a file'); + } + + assert(tr.stdout.indexOf('my script output') > 0, 'Bash should have correctly run the script'); + }, tr, done); + }); + + it('Reports stderr correctly', (done: Mocha.Done) => { + let tp: string = path.join(__dirname, 'L0StdErr.js'); + let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + runValidations(() => { + assert(tr.failed, 'Bash should have failed'); + assert(tr.stdout.indexOf('##vso[task.issue type=error;]myErrorTest') > 0, 'Bash should have correctly written myErrorTest'); + assert(tr.stdout.length > 1000, 'Bash stderr output is not truncated'); + }, tr, done); + }); + + it('Fails on exit code null', (done: Mocha.Done) => { + let tp: string = path.join(__dirname, 'L0FailOnExitCodeNull.js'); + let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + runValidations(() => { + assert(tr.failed, 'Bash should have failed when the script exits with null code'); + }, tr, done); + }); + + it('BASH_ENV - set environment variable', (done: Mocha.Done) => { + delete process.env['BASH_ENV']; + + const testPath: string = path.join(__dirname, 'L0SetBashEnv.js'); + const taskRunner: ttm.MockTestRunner = new ttm.MockTestRunner(testPath); + + taskRunner.run(); + + runValidations(() => { + assert(taskRunner.succeeded, 'Bash should have succeeded.'); + assert(taskRunner.stdout.indexOf('The BASH_ENV environment variable was set to ~/.profile') > 0, 'Task should set BASH_ENV to ~/.profile'); + }, taskRunner, done); + }); + + it('BASH_ENV - override environment variable', (done: Mocha.Done) => { + process.env['BASH_ENV'] = 'some/custom/path'; + + const testPath: string = path.join(__dirname, 'L0SetBashEnv.js'); + const taskRunner: ttm.MockTestRunner = new ttm.MockTestRunner(testPath); + + taskRunner.run(); + + runValidations(() => { + assert(taskRunner.succeeded, 'Bash should have succeeded.'); + assert(taskRunner.stdout.indexOf('The BASH_ENV environment variable was set to ~/.profile') > 0, 'Task should override the value of BASH_ENV with ~/.profile'); + }, taskRunner, done); + }); + + describe('File args env processing tests', () => { + BashEnvProcessingTests() + + EnvProcessingTelemetryTests() + + runValidateFileArgsTests() + }) +}); diff --git a/_generated/BashV3_Node20/Tests/L0Args.ts b/_generated/BashV3_Node20/Tests/L0Args.ts new file mode 100644 index 000000000000..5e2eb5d45595 --- /dev/null +++ b/_generated/BashV3_Node20/Tests/L0Args.ts @@ -0,0 +1,75 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'bash.js'); +let tmr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tmr.setInput('targetType', 'filepath'); +tmr.setInput('filePath', 'path/to/script'); +tmr.setInput('arguments', 'myCustomArg'); +tmr.setInput('workingDirectory', '/fakecwd'); + +//Create assertAgent and getVariable mocks, support not added in this version of task-lib +const tl = require('azure-pipelines-task-lib/mock-task'); +const tlClone = Object.assign({}, tl); +tlClone.getVariable = function(variable: string) { + if (variable.toLowerCase() == 'agent.tempdirectory') { + return 'temp/path'; + } + return null; +}; +tlClone.assertAgent = function(variable: string) { + return; +}; +tmr.registerMock('azure-pipelines-task-lib/mock-task', tlClone); + +// Mock task-lib +let a: ma.TaskLibAnswers = { + 'checkPath' : { + '/fakecwd' : true, + 'path/to/bash': true, + 'temp/path': true + }, + 'which': { + 'bash': 'path/to/bash' + }, + 'assertAgent': { + '2.115.0': true + }, + 'exec': { + 'path/to/bash -c pwd': { + "code": 0, + "stdout": "temp/path" + }, + 'path/to/bash temp/path/fileName.sh': { + "code": 0, + "stdout": "my script output" + } + }, + 'stats': { + 'path/to/script': { + isFile() { + return true; + }, + mode: '777' + } + } +}; +tmr.setAnswers(a); + +// Mock fs +const fs = require('fs'); +const fsClone = Object.assign({}, fs); +fsClone.writeFileSync = function(filePath, contents, options) { + // Normalize to linux paths for logs we check + console.log(`Writing ${contents} to ${filePath.replace(/\\/g, '/')}`); +} +tmr.registerMock('fs', fsClone); + +// Mock uuidv4 +tmr.registerMock('uuid/v4', function () { + return 'fileName'; +}); + +tmr.run(); \ No newline at end of file diff --git a/_generated/BashV3_Node20/Tests/L0External.ts b/_generated/BashV3_Node20/Tests/L0External.ts new file mode 100644 index 000000000000..efa044affba3 --- /dev/null +++ b/_generated/BashV3_Node20/Tests/L0External.ts @@ -0,0 +1,74 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'bash.js'); +let tmr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tmr.setInput('targetType', 'filepath'); +tmr.setInput('filePath', 'path/to/script'); +tmr.setInput('workingDirectory', '/fakecwd'); + +//Create assertAgent and getVariable mocks, support not added in this version of task-lib +const tl = require('azure-pipelines-task-lib/mock-task'); +const tlClone = Object.assign({}, tl); +tlClone.getVariable = function(variable: string) { + if (variable.toLowerCase() == 'agent.tempdirectory') { + return 'temp/path'; + } + return null; +}; +tlClone.assertAgent = function(variable: string) { + return; +}; +tmr.registerMock('azure-pipelines-task-lib/mock-task', tlClone); + +// Mock task-lib +let a: ma.TaskLibAnswers = { + 'checkPath' : { + '/fakecwd' : true, + 'path/to/bash': true, + 'temp/path': true + }, + 'which': { + 'bash': 'path/to/bash' + }, + 'assertAgent': { + '2.115.0': true + }, + 'exec': { + 'path/to/bash -c pwd': { + "code": 0, + "stdout": "temp/path" + }, + 'path/to/bash temp/path/fileName.sh': { + "code": 0, + "stdout": "my script output" + } + }, + 'stats': { + 'path/to/script': { + isFile() { + return true; + }, + mode: '777' + } + } +}; +tmr.setAnswers(a); + +// Mock fs +const fs = require('fs'); +const fsClone = Object.assign({}, fs); +fsClone.writeFileSync = function(filePath, contents, options) { + // Normalize to linux paths for logs we check + console.log(`Writing ${contents} to ${filePath.replace(/\\/g, '/')}`); +} +tmr.registerMock('fs', fsClone); + +// Mock uuidv4 +tmr.registerMock('uuid/v4', function () { + return 'fileName'; +}); + +tmr.run(); \ No newline at end of file diff --git a/_generated/BashV3_Node20/Tests/L0FailOnExitCodeNull.ts b/_generated/BashV3_Node20/Tests/L0FailOnExitCodeNull.ts new file mode 100644 index 000000000000..1e26e35ace9a --- /dev/null +++ b/_generated/BashV3_Node20/Tests/L0FailOnExitCodeNull.ts @@ -0,0 +1,64 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'bash.js'); +let tmr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tmr.setInput('targetType', 'inline'); +tmr.setInput('workingDirectory', '/fakecwd'); +tmr.setInput('script', `echo 'Hello world'\necho 'Goodbye world'`); + +//Create assertAgent and getVariable mocks, support not added in this version of task-lib +const tl = require('azure-pipelines-task-lib/mock-task'); +const tlClone = Object.assign({}, tl); +tlClone.getVariable = function(variable: string) { + if (variable.toLowerCase() == 'agent.tempdirectory') { + return 'temp/path'; + } + return null; +}; +tlClone.assertAgent = function(variable: string) { + return; +}; +tmr.registerMock('azure-pipelines-task-lib/mock-task', tlClone); + +// Mock task-lib +let a: ma.TaskLibAnswers = { + 'checkPath' : { + '/fakecwd' : true, + 'path/to/bash': true, + 'temp/path': true + }, + 'which': { + 'bash': 'path/to/bash' + }, + 'assertAgent': { + '2.115.0': true + }, + 'exec': { + 'path/to/bash -c pwd': { + "code": null, + "stdout": "temp/path" + }, + 'path/to/bash temp/path/fileName.sh': { + "code": null, + } + } +}; +tmr.setAnswers(a); + +// Mock fs +const fs = require('fs'); +const fsClone = Object.assign({}, fs); +fsClone.writeFileSync = function(filePath, contents, options) { + console.log(`Writing ${contents} to ${filePath}`); +} +tmr.registerMock('fs', fsClone); + +// Mock uuidv4 +tmr.registerMock('uuid/v4', function () { + return 'fileName'; +}); + +tmr.run(); \ No newline at end of file diff --git a/_generated/BashV3_Node20/Tests/L0Inline.ts b/_generated/BashV3_Node20/Tests/L0Inline.ts new file mode 100644 index 000000000000..031203b1ad35 --- /dev/null +++ b/_generated/BashV3_Node20/Tests/L0Inline.ts @@ -0,0 +1,65 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'bash.js'); +let tmr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tmr.setInput('targetType', 'inline'); +tmr.setInput('workingDirectory', '/fakecwd'); +tmr.setInput('script', `echo 'Hello world'\necho 'Goodbye world'`); + +//Create assertAgent and getVariable mocks, support not added in this version of task-lib +const tl = require('azure-pipelines-task-lib/mock-task'); +const tlClone = Object.assign({}, tl); +tlClone.getVariable = function(variable: string) { + if (variable.toLowerCase() == 'agent.tempdirectory') { + return 'temp/path'; + } + return null; +}; +tlClone.assertAgent = function(variable: string) { + return; +}; +tmr.registerMock('azure-pipelines-task-lib/mock-task', tlClone); + +// Mock task-lib +let a: ma.TaskLibAnswers = { + 'checkPath' : { + '/fakecwd' : true, + 'path/to/bash': true, + 'temp/path': true + }, + 'which': { + 'bash': 'path/to/bash' + }, + 'assertAgent': { + '2.115.0': true + }, + 'exec': { + 'path/to/bash -c pwd': { + "code": 0, + "stdout": "temp/path" + }, + 'path/to/bash temp/path/fileName.sh': { + "code": 0, + "stdout": "my script output" + } + } +}; +tmr.setAnswers(a); + +// Mock fs +const fs = require('fs'); +const fsClone = Object.assign({}, fs); +fsClone.writeFileSync = function(filePath, contents, options) { + console.log(`Writing ${contents} to ${filePath}`); +} +tmr.registerMock('fs', fsClone); + +// Mock uuidv4 +tmr.registerMock('uuid/v4', function () { + return 'fileName'; +}); + +tmr.run(); \ No newline at end of file diff --git a/_generated/BashV3_Node20/Tests/L0SetBashEnv.ts b/_generated/BashV3_Node20/Tests/L0SetBashEnv.ts new file mode 100644 index 000000000000..056d659d57e7 --- /dev/null +++ b/_generated/BashV3_Node20/Tests/L0SetBashEnv.ts @@ -0,0 +1,76 @@ +import { TaskLibAnswers } from 'azure-pipelines-task-lib/mock-answer'; +import { TaskMockRunner } from 'azure-pipelines-task-lib/mock-run'; +import * as path from 'path'; + +const taskPath: string = path.join(__dirname, '..', 'bash.js'); +const taskRunner: TaskMockRunner = new TaskMockRunner(taskPath); + +taskRunner.setInput('targetType', 'filepath'); +taskRunner.setInput('filePath', 'path/to/script'); +taskRunner.setInput('arguments', 'myCustomArg'); +taskRunner.setInput('workingDirectory', '/fakecwd'); +taskRunner.setInput('bashEnvValue', '~/.profile'); + +//Create assertAgent and getVariable mocks, support not added in this version of task-lib +const tl = require('azure-pipelines-task-lib/mock-task'); +const tlClone = Object.assign({}, tl); +tlClone.getVariable = function (variable: string) { + if (variable.toLowerCase() == 'agent.tempdirectory') { + return 'temp/path'; + } + return null; +}; +tlClone.assertAgent = function (variable: string) { + return; +}; +taskRunner.registerMock('azure-pipelines-task-lib/mock-task', tlClone); + +// Mock task-lib +const mockedAnswers: TaskLibAnswers = { + 'checkPath': { + '/fakecwd': true, + 'path/to/bash': true, + 'temp/path': true + }, + 'which': { + 'bash': 'path/to/bash' + }, + 'assertAgent': { + '2.115.0': true + }, + 'exec': { + 'path/to/bash -c pwd': { + "code": 0, + "stdout": "temp/path" + }, + 'path/to/bash temp/path/fileName.sh': { + "code": 0, + "stdout": "my script output" + } + }, + 'stats': { + 'path/to/script': { + isFile() { + return true; + }, + mode: '777' + } + } +}; +taskRunner.setAnswers(mockedAnswers); + +// Mock fs +const fs = require('fs'); +const fsClone = Object.assign({}, fs); +fsClone.writeFileSync = function (filePath, contents, options) { + // Normalize to linux paths for logs we check + console.log(`Writing ${contents} to ${filePath.replace(/\\/g, '/')}`); +} +taskRunner.registerMock('fs', fsClone); + +// Mock uuidv4 +taskRunner.registerMock('uuid/v4', function () { + return 'fileName'; +}); + +taskRunner.run(); diff --git a/_generated/BashV3_Node20/Tests/L0StdErr.ts b/_generated/BashV3_Node20/Tests/L0StdErr.ts new file mode 100644 index 000000000000..b0face398ae0 --- /dev/null +++ b/_generated/BashV3_Node20/Tests/L0StdErr.ts @@ -0,0 +1,75 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'bash.js'); +let tmr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tmr.setInput('targetType', 'inline'); +tmr.setInput('workingDirectory', '/fakecwd'); +tmr.setInput('script', `>&2 echo "myErrorTest"`); +tmr.setInput('failOnStderr', 'true'); + +//Create assertAgent and getVariable mocks, support not added in this version of task-lib +const tl = require('azure-pipelines-task-lib/mock-task'); +const tlClone = Object.assign({}, tl); +tlClone.getVariable = function(variable: string) { + if (variable.toLowerCase() == 'agent.tempdirectory') { + return 'temp/path'; + } + return null; +}; +tlClone.assertAgent = function(variable: string) { + return; +}; +tmr.registerMock('azure-pipelines-task-lib/mock-task', tlClone); + +function generateBigString(size: number) { + let result:string = ''; + while (result.length < size) { + result += 'a'; + } + return result; +} + +// Mock task-lib +let a: ma.TaskLibAnswers = { + 'checkPath' : { + '/fakecwd' : true, + 'path/to/bash': true, + 'temp/path': true + }, + 'which': { + 'bash': 'path/to/bash' + }, + 'assertAgent': { + '2.115.0': true + }, + 'exec': { + 'path/to/bash -c pwd': { + "code": 0, + "stdout": "temp/path" + }, + 'path/to/bash temp/path/fileName.sh': { + "code": 0, + "stdout": "", + "stderr": "myErrorTest" + generateBigString(1000) + } + } +}; +tmr.setAnswers(a); + +// Mock fs +const fs = require('fs'); +const fsClone = Object.assign({}, fs); +fsClone.writeFileSync = function(filePath, contents, options) { + console.log(`Writing ${contents} to ${filePath}`); +} +tmr.registerMock('fs', fsClone); + +// Mock uuidv4 +tmr.registerMock('uuid/v4', function () { + return 'fileName'; +}); + +tmr.run(); \ No newline at end of file diff --git a/_generated/BashV3_Node20/Tests/L0ValidateFileArgs.ts b/_generated/BashV3_Node20/Tests/L0ValidateFileArgs.ts new file mode 100644 index 000000000000..8a5465822b8f --- /dev/null +++ b/_generated/BashV3_Node20/Tests/L0ValidateFileArgs.ts @@ -0,0 +1,74 @@ +import assert = require('assert'); +import { validateFileArgs } from '../helpers'; +import { ArgsSanitizingError } from '../utils/errors'; + +export const runValidateFileArgsTests = () => { + const notThrowTestSuites: [string, string, string[]][] = [ + [ + "Handles empty line", + "", [] + ], [ + "If no dangerous symbol in present, and FF is on", + "test 1", ["AZP_75787_ENABLE_NEW_LOGIC=true"] + ], [ + "If dangerous symbols are present, and FF is off", + "test; test", ['AZP_75787_ENABLE_NEW_LOGIC=false'] + ], [ + "If inside the args line is env variable with no dangerous symbols", + "test $VAR1 test", ["VAR1=1", "AZP_75787_ENABLE_NEW_LOGIC=true"] + ], [ + "Accepts allowed symbols", + "a A 1 \\ _ ' \" - = / : . * + %", ["AZP_75787_ENABLE_NEW_LOGIC=true"] + ] + ]; + + for (const [testName, inputArguments, envVariables] of notThrowTestSuites) { + it(testName, () => { + envVariables.forEach(envVariable => { + const [envName, envValue] = envVariable.split("="); + process.env[envName] = envValue; + }); + + try { + assert.doesNotThrow(() => validateFileArgs(inputArguments)); + } + finally { + envVariables.forEach(envVariable => { + const [envName] = envVariable.split("="); + delete process.env[envName]; + }); + } + }) + } + + const throwTestSuites: [string, string, string[]][] = [ + [ + "If dangerous symbols are present, and FF is on", + "test; whoami", ['AZP_75787_ENABLE_NEW_LOGIC=true'] + ], [ + "If inside args line is env variable with dangerous symbols", + "test $VAR1 test", ["VAR1=12;3", "AZP_75787_ENABLE_NEW_LOGIC=true"] + ], [ + "If inside args line not correct env syntax", + "test ${VAR1 test", ["VAR1=123", "AZP_75787_ENABLE_NEW_LOGIC=true"] + ] + ] + for (const [testName, inputArguments, envVariables] of throwTestSuites) { + it(testName, () => { + envVariables.forEach(envVariable => { + const [envName, envValue] = envVariable.split("="); + process.env[envName] = envValue; + }); + + try { + assert.throws(() => validateFileArgs(inputArguments), ArgsSanitizingError); + } + finally { + envVariables.forEach(envVariable => { + const [envName] = envVariable.split("="); + delete process.env[envName]; + }); + } + }) + } +} \ No newline at end of file diff --git a/_generated/BashV3_Node20/bash.ts b/_generated/BashV3_Node20/bash.ts new file mode 100644 index 000000000000..ae1df8bcba43 --- /dev/null +++ b/_generated/BashV3_Node20/bash.ts @@ -0,0 +1,229 @@ +import fs = require('fs'); +import path = require('path'); +import tl = require('azure-pipelines-task-lib/task'); +import tr = require('azure-pipelines-task-lib/toolrunner'); +import { emitTelemetry } from 'azure-pipelines-tasks-utility-common/telemetry'; +import { ArgsSanitizingError } from './utils/errors'; +import { validateFileArgs } from './helpers'; +var uuidV4 = require('uuid/v4'); + +async function runBashPwd(bashPath: string, directoryPath: string): Promise { + let pwdOutput = ''; + const bashPwd = tl.tool(bashPath).arg('-c').arg('pwd'); + bashPwd.on('stdout', data => pwdOutput += data.toString()); + + const bashPwdOptions = { + cwd: directoryPath, + failOnStdErr: true, + errStream: process.stdout, + outStream: process.stdout, + ignoreReturnCode: false + }; + + await bashPwd.exec(bashPwdOptions); + + pwdOutput = pwdOutput.trim(); + + if (!pwdOutput) { + throw new Error(tl.loc('JS_TranslatePathFailed', directoryPath)); + } + + return pwdOutput; +} + +async function translateDirectoryPath(bashPath: string, directoryPath: string): Promise { + if (directoryPath.endsWith('\\')) { + directoryPath = directoryPath.slice(0, -1); + } + + const directoryPathTranslated = await runBashPwd(bashPath, directoryPath); + + const parentDirectoryPath = directoryPath.split('\\').slice(0, -1).join('\\'); + + if (parentDirectoryPath.split('\\').join('')) { + const parentDirectoryPathTranslated = await runBashPwd(bashPath, parentDirectoryPath); + + if (directoryPathTranslated == parentDirectoryPathTranslated) { + throw new Error(tl.loc('JS_TranslatePathFailed', directoryPath)); + } + } + + return directoryPathTranslated; +} + +/** + * Set value for `BASH_ENV` environment variable + * + * The pipeline task invokes bash as non-interactive shell. In this mode Bash looks only for `BASH_ENV` environment variable. + * The value of `BASH_ENV` is expanded and used as the name of a startup file to read before executing the script. + * + * If the environment variable `BASH_ENV` has already been defined, the function will override this variable only for the current task. + * + * @param {string} valueToSet - Value that will be set to `BASH_ENV` environment variable + */ +function setBashEnvVariable(valueToSet: string): void { + const bashEnv: string = process.env["BASH_ENV"]; + + if (bashEnv) { + console.log(tl.loc('JS_BashEnvAlreadyDefined', bashEnv, valueToSet)); + } + + process.env["BASH_ENV"] = valueToSet; + tl.debug(`The BASH_ENV environment variable was set to ${valueToSet}`); +} + +async function run() { + try { + tl.setResourcePath(path.join(__dirname, 'task.json')); + + // Get inputs. + let input_failOnStderr = tl.getBoolInput('failOnStderr', false); + let input_workingDirectory = tl.getPathInput('workingDirectory', /*required*/ true, /*check*/ true); + let input_filePath: string; + let input_arguments: string; + let input_script: string; + let old_source_behavior: boolean; + let input_targetType: string = tl.getInput('targetType') || ''; + const input_bashEnvValue: string = tl.getInput('bashEnvValue') || ''; + + if (input_bashEnvValue) { + setBashEnvVariable(input_bashEnvValue); + } + + if (input_targetType.toUpperCase() == 'FILEPATH') { + old_source_behavior = !!process.env['AZP_BASHV3_OLD_SOURCE_BEHAVIOR']; + input_filePath = tl.getPathInput('filePath', /*required*/ true); + if (!tl.stats(input_filePath).isFile()) { + throw new Error(tl.loc('JS_InvalidFilePath', input_filePath)); + } + + input_arguments = tl.getInput('arguments') || ''; + } + else { + input_script = tl.getInput('script', false) || ''; + } + + // Generate the script contents. + console.log(tl.loc('GeneratingScript')); + let bashPath: string = tl.which('bash', true); + let contents: string; + if (input_targetType.toUpperCase() == 'FILEPATH') { + // Translate the target file path from Windows to the Linux file system. + let targetFilePath: string; + if (process.platform == 'win32') { + targetFilePath = await translateDirectoryPath(bashPath, path.dirname(input_filePath)) + '/' + path.basename(input_filePath); + } + else { + targetFilePath = input_filePath; + } + + try { + validateFileArgs(input_arguments); + } + catch (error: any) { + if (error instanceof ArgsSanitizingError) { + throw error; + } + + emitTelemetry('TaskHub', 'BashV3', + { + UnexpectedError: error?.message ?? JSON.stringify(error) ?? null, + ErrorStackTrace: error?.stack ?? null + } + ); + } + + // Choose behavior: + // If they've set old_source_behavior, source the script. This is what we used to do and needs to hang around forever for back compat reasons + // If they've not, execute the script with bash. This is our new desired behavior. + // See https://github.com/Microsoft/azure-pipelines-tasks/blob/master/docs/bashnote.md + if (old_source_behavior) { + contents = `. '${targetFilePath.replace(/'/g, "'\\''")}' ${input_arguments}`.trim(); + } else { + contents = `exec bash '${targetFilePath.replace(/'/g, "'\\''")}' ${input_arguments}`.trim(); + } + console.log(tl.loc('JS_FormattedCommand', contents)); + } + else { + contents = input_script; + + // Print one-liner scripts. + if (contents.indexOf('\n') < 0 && contents.toUpperCase().indexOf('##VSO[') < 0) { + console.log(tl.loc('JS_ScriptContents')); + console.log(contents); + } + } + + // Write the script to disk. + tl.assertAgent('2.115.0'); + let tempDirectory = tl.getVariable('agent.tempDirectory'); + tl.checkPath(tempDirectory, `${tempDirectory} (agent.tempDirectory)`); + let fileName = uuidV4() + '.sh'; + let filePath = path.join(tempDirectory, fileName); + + fs.writeFileSync( + filePath, + contents, + { encoding: 'utf8' }); + + // Translate the script file path from Windows to the Linux file system. + if (process.platform == 'win32') { + filePath = await translateDirectoryPath(bashPath, tempDirectory) + '/' + fileName; + } + + // Create the tool runner. + console.log('========================== Starting Command Output ==========================='); + let bash = tl.tool(bashPath); + bash.arg(filePath); + + let options = { + cwd: input_workingDirectory, + failOnStdErr: false, + errStream: process.stdout, // Direct all output to STDOUT, otherwise the output may appear out + outStream: process.stdout, // of order since Node buffers it's own STDOUT but not STDERR. + ignoreReturnCode: true + }; + + process.on("SIGINT", () => { + tl.debug('Started cancellation of executing script'); + bash.killChildProcess(); + }); + + // Listen for stderr. + let stderrFailure = false; + const aggregatedStderr: string[] = []; + if (input_failOnStderr) { + bash.on('stderr', (data: Buffer) => { + stderrFailure = true; + aggregatedStderr.push(data.toString('utf8')); + }); + } + + // Run bash. + let exitCode: number = await bash.exec(options); + + let result = tl.TaskResult.Succeeded; + + // Fail on exit code. + if (exitCode !== 0) { + tl.error(tl.loc('JS_ExitCode', exitCode)); + result = tl.TaskResult.Failed; + } + + // Fail on stderr. + if (stderrFailure) { + tl.error(tl.loc('JS_Stderr')); + aggregatedStderr.forEach((err: string) => { + tl.error(err); + }); + result = tl.TaskResult.Failed; + } + + tl.setResult(result, null, true); + } + catch (err: any) { + tl.setResult(tl.TaskResult.Failed, err.message || 'run() failed', true); + } +} + +run(); \ No newline at end of file diff --git a/_generated/BashV3_Node20/helpers.ts b/_generated/BashV3_Node20/helpers.ts new file mode 100644 index 000000000000..4bd227f8aee7 --- /dev/null +++ b/_generated/BashV3_Node20/helpers.ts @@ -0,0 +1,206 @@ +import tl = require('azure-pipelines-task-lib/task'); +import { sanitizeArgs } from 'azure-pipelines-tasks-utility-common/argsSanitizer'; +import { emitTelemetry } from "azure-pipelines-tasks-utility-common/telemetry"; +import { ArgsSanitizingError } from './utils/errors'; + +type BashEnvTelemetry = { + foundPrefixes: number, + quottedBlocks: number, + variablesExpanded: number, + escapedVariables: number, + escapedEscapingSymbols: number, + braceSyntaxEntries: number, + bracedVariables: number, + // possibly blockers + variablesWithESInside: number, + // blockers + unmatchedQuotes: number, // like "Hello, world! + notClosedBraceSyntaxPosition: number, // 0 means no this issue, + indirectExpansionTries: number, + invalidEnvName: number, + notExistingEnv: number +} + +export function expandBashEnvVariables(argsLine: string): [string, BashEnvTelemetry] { + const envPrefix = '$' + const quote = '\'' + const escapingSymbol = '\\' + + let result = argsLine + let startIndex = 0 + // backslash - just backslash + // ES (escaping symbol) - active backslash + const telemetry: BashEnvTelemetry = { + foundPrefixes: 0, + quottedBlocks: 0, + variablesExpanded: 0, + escapedVariables: 0, + escapedEscapingSymbols: 0, + braceSyntaxEntries: 0, + bracedVariables: 0, + // possibly blockers + variablesWithESInside: 0, + // blockers + unmatchedQuotes: 0, + notClosedBraceSyntaxPosition: 0, + indirectExpansionTries: 0, + invalidEnvName: 0, // 0 means no this issue, + notExistingEnv: 0 + } + + while (true) { + const prefixIndex = result.indexOf(envPrefix, startIndex) + if (prefixIndex < 0) { + break; + } + + telemetry.foundPrefixes++ + + if (result[prefixIndex - 1] === escapingSymbol) { + if (!(result[prefixIndex - 2]) || result[prefixIndex - 2] !== escapingSymbol) { + startIndex++ + result = result.substring(0, prefixIndex - 1) + result.substring(prefixIndex) + + telemetry.escapedVariables++ + + continue + } + + telemetry.escapedEscapingSymbols++ + } + + const quoteIndex = result.indexOf(quote, startIndex) + if (quoteIndex >= 0 && prefixIndex > quoteIndex) { + const nextQuoteIndex = result.indexOf(quote, quoteIndex + 1) + if (nextQuoteIndex < 0) { + telemetry.unmatchedQuotes = 1 + break + } + + startIndex = nextQuoteIndex + 1 + + telemetry.quottedBlocks++ + + continue + } + + let envName = ''; + let envEndIndex = 0; + let isBraceSyntax = false + + if (result[prefixIndex + 1] === '{') { + isBraceSyntax = true + + telemetry.braceSyntaxEntries++ + } + + const envStartIndex = prefixIndex + envPrefix.length + +isBraceSyntax + + if (isBraceSyntax) { + envEndIndex = findEnclosingBraceIndex(result, prefixIndex) + if (envEndIndex === 0) { + telemetry.notClosedBraceSyntaxPosition = prefixIndex + 1 // +{ + break; + } + + if (result[prefixIndex + envPrefix.length + 1] === '!') { + telemetry.indirectExpansionTries++ + // We're just skipping indirect expansion + startIndex = envEndIndex + continue + } + + envName = result.substring(envStartIndex, envEndIndex) + + telemetry.bracedVariables++ + } else { + envName = result.substring(envStartIndex).split(/[ |"|'|;]/)[0] + envEndIndex = envStartIndex + envName.length + } + + if (!isValidEnvName(envName)) { + telemetry.invalidEnvName++ + startIndex = envEndIndex + continue + } + + const head = result.substring(0, prefixIndex) + if (!isBraceSyntax && envName.includes(escapingSymbol)) { + telemetry.variablesWithESInside++ + } + + // We need case-sensetive env search for windows as well. + let envValue = { ...process.env }[envName]; + // in case we don't have such variable, we just leave it as is + if (!envValue) { + telemetry.notExistingEnv++ + startIndex = envEndIndex + continue + } + + const tail = result.substring(envEndIndex + +isBraceSyntax) + + result = head + envValue + tail + startIndex = prefixIndex + envValue.length + + telemetry.variablesExpanded++ + + continue + } + + return [result, telemetry] +} + +function findEnclosingBraceIndex(input: string, targetIndex: number) { + for (let i = 0; i < input.length; i++) { + if (input[i] === "}" && i > targetIndex) { + return i + } + } + return 0 +} + +function isValidEnvName(envName) { + const regex = /^[a-zA-Z_][a-zA-Z0-9_]*$/; + return regex.test(envName); +} + +export function validateFileArgs(inputArguments: string): void { + const featureFlags = { + audit: tl.getBoolFeatureFlag('AZP_75787_ENABLE_NEW_LOGIC_LOG'), + activate: tl.getBoolFeatureFlag('AZP_75787_ENABLE_NEW_LOGIC'), + telemetry: tl.getBoolFeatureFlag('AZP_75787_ENABLE_COLLECT') + }; + + if (featureFlags.activate || featureFlags.audit || featureFlags.telemetry) { + tl.debug('Validating file args...'); + const [expandedArgs, envTelemetry] = expandBashEnvVariables(inputArguments); + tl.debug(`Expanded file args: ${expandedArgs}`); + + const [sanitizedArgs, sanitizerTelemetry] = sanitizeArgs( + expandedArgs, + { + argsSplitSymbols: '\\\\', + saniziteRegExp: new RegExp(`(? + + + + diff --git a/_generated/BashV3_Node20/make.json b/_generated/BashV3_Node20/make.json new file mode 100644 index 000000000000..57605b58558a --- /dev/null +++ b/_generated/BashV3_Node20/make.json @@ -0,0 +1,12 @@ +{ + "rm": [ + { + "items": [ + "node_modules/azure-pipelines-tool-lib/node_modules/azure-pipelines-task-lib", + "node_modules/azure-pipelines-tasks-utility-common/node_modules/azure-pipelines-task-lib", + "node_modules/mockery" + ], + "options": "-Rf" + } + ] +} \ No newline at end of file diff --git a/_generated/BashV3_Node20/package-lock.json b/_generated/BashV3_Node20/package-lock.json new file mode 100644 index 000000000000..c3aee69cd408 --- /dev/null +++ b/_generated/BashV3_Node20/package-lock.json @@ -0,0 +1,618 @@ +{ + "name": "vsts-tasks-bash", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true + }, + "@types/concat-stream": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz", + "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==", + "requires": { + "@types/node": "*" + } + }, + "@types/form-data": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", + "integrity": "sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==", + "requires": { + "@types/node": "*" + } + }, + "@types/mocha": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.1.1.tgz", + "integrity": "sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==" + }, + "@types/node": { + "version": "20.7.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.7.0.tgz", + "integrity": "sha512-zI22/pJW2wUZOVyguFaUL1HABdmSVxpXrzIqkjsHmyUjNhPoWM1CKfvVuXfetHhIok4RY573cqS0mZ1SJEnoTg==" + }, + "@types/qs": { + "version": "6.9.8", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.8.tgz", + "integrity": "sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg==" + }, + "@types/semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-41qEJgBH/TWgo5NFSvBCJ1qkoi3Q6ONSF2avrHq1LVEZfYpdHmj0y9SuTK+u9ZhG1sYQKBL1AWXKyLWP4RaUoQ==" + }, + "@types/uuid": { + "version": "3.4.10", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-3.4.10.tgz", + "integrity": "sha512-BgeaZuElf7DEYZhWYDTc/XcLZXdVgFkVSTa13BqKvbnmUrxr3TJFKofUxCtDO9UQOdhnV+HPOESdHiHKZOJV1A==" + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "azure-pipelines-task-lib": { + "version": "5.0.0-preview.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-5.0.0-preview.0.tgz", + "integrity": "sha512-uQJEv+q3/7RD7kgphFd33uXijaPwA1ePYoNkAgZpUhbZUtc2u4JL4ujTT/JJfgXBNW/QQNAiDQ2OC7vOQG/0tg==", + "requires": { + "minimatch": "3.0.5", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "sync-request": "6.1.0", + "uuid": "^3.0.1" + } + }, + "azure-pipelines-tasks-utility-common": { + "version": "3.225.1", + "resolved": "https://registry.npmjs.org/azure-pipelines-tasks-utility-common/-/azure-pipelines-tasks-utility-common-3.225.1.tgz", + "integrity": "sha512-4wtVKuvx2PcQI0W8xkMdS/S+tf9Qu7wMJl4HSTLE1gjQ2x9o/6QbhMogz6O1+8ofxvTqmI4scA7GHKccDAwQpQ==", + "requires": { + "@types/node": "^16.11.39", + "azure-pipelines-task-lib": "^4.4.0", + "azure-pipelines-tool-lib": "^2.0.0-preview", + "js-yaml": "3.13.1", + "semver": "^5.4.1" + }, + "dependencies": { + "@types/node": { + "version": "16.18.54", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.54.tgz", + "integrity": "sha512-oTmGy68gxZZ21FhTJVVvZBYpQHEBZxHKTsGshobMqm9qWpbqdZsA5jvsuPZcHu0KwpmLrOHWPdEfg7XDpNT9UA==" + }, + "azure-pipelines-task-lib": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-4.5.0.tgz", + "integrity": "sha512-NGxrpggmho4SxWeEnVID7xEClDHC3o4RndfdBzTO5iBWhMHkQp95N1Z4oaywJyiC5Xa92wkUvqzSm6MSLKzYoQ==", + "requires": { + "minimatch": "3.0.5", + "mockery": "^2.1.0", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "sync-request": "6.1.0", + "uuid": "^3.0.1" + } + } + } + }, + "azure-pipelines-tool-lib": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/azure-pipelines-tool-lib/-/azure-pipelines-tool-lib-2.0.4.tgz", + "integrity": "sha512-LgAelZKJe3k/t3NsKSKzjeRviphns0w0p5tgwz8uHN70I9m2TToiOKl+fogrdXcM6+jiLBk5KTqrcRBqPpv/XA==", + "requires": { + "@types/semver": "^5.3.0", + "@types/uuid": "^3.4.5", + "azure-pipelines-task-lib": "^4.1.0", + "semver": "^5.7.0", + "semver-compare": "^1.0.0", + "typed-rest-client": "^1.8.6", + "uuid": "^3.3.2" + }, + "dependencies": { + "azure-pipelines-task-lib": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-4.5.0.tgz", + "integrity": "sha512-NGxrpggmho4SxWeEnVID7xEClDHC3o4RndfdBzTO5iBWhMHkQp95N1Z4oaywJyiC5Xa92wkUvqzSm6MSLKzYoQ==", + "requires": { + "minimatch": "3.0.5", + "mockery": "^2.1.0", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "sync-request": "6.1.0", + "uuid": "^3.0.1" + } + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + } + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + }, + "form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-intrinsic": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", + "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + } + }, + "get-port": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", + "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==" + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "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" + }, + "dependencies": { + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "http-basic": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", + "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", + "requires": { + "caseless": "^0.12.0", + "concat-stream": "^1.6.2", + "http-response-object": "^3.0.1", + "parse-cache-control": "^1.0.1" + } + }, + "http-response-object": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", + "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", + "requires": { + "@types/node": "^10.0.3" + }, + "dependencies": { + "@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + } + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" + }, + "is-core-module": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "requires": { + "has": "^1.0.3" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "mockery": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mockery/-/mockery-2.1.0.tgz", + "integrity": "sha512-9VkOmxKlWXoDO/h1jDZaS4lH33aWfRiJiNT/tKj+8OGzrcFDLo8d0syGdbsc3Bc4GvRXPb+NMMvojotmuGJTvA==" + }, + "object-inspect": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, + "parse-cache-control": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", + "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "promise": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", + "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", + "requires": { + "asap": "~2.0.6" + } + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==" + }, + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "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" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "requires": { + "resolve": "^1.1.6" + } + }, + "resolve": { + "version": "1.22.6", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.6.tgz", + "integrity": "sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==", + "requires": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==" + }, + "shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, + "sync-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", + "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==", + "requires": { + "http-response-object": "^3.0.1", + "sync-rpc": "^1.2.1", + "then-request": "^6.0.0" + } + }, + "sync-rpc": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz", + "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==", + "requires": { + "get-port": "^3.1.0" + } + }, + "then-request": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", + "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", + "requires": { + "@types/concat-stream": "^1.6.0", + "@types/form-data": "0.0.33", + "@types/node": "^8.0.0", + "@types/qs": "^6.2.31", + "caseless": "~0.12.0", + "concat-stream": "^1.6.0", + "form-data": "^2.2.0", + "http-basic": "^8.1.1", + "http-response-object": "^3.0.1", + "promise": "^8.0.0", + "qs": "^6.4.0" + }, + "dependencies": { + "@types/node": { + "version": "8.10.66", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", + "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==" + } + } + }, + "tunnel": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", + "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==" + }, + "typed-rest-client": { + "version": "1.8.11", + "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.8.11.tgz", + "integrity": "sha512-5UvfMpd1oelmUPRbbaVnq+rHP7ng2cE4qoQkQeAqxRL6PklkxsM0g32/HL0yfvruK6ojQ5x8EE+HF4YV6DtuCA==", + "requires": { + "qs": "^6.9.1", + "tunnel": "0.0.6", + "underscore": "^1.12.1" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, + "typescript": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "dev": true + }, + "underscore": { + "version": "1.13.6", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz", + "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==" + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "uuid": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", + "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==" + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + } + } +} diff --git a/_generated/BashV3_Node20/package.json b/_generated/BashV3_Node20/package.json new file mode 100644 index 000000000000..6022bd1df350 --- /dev/null +++ b/_generated/BashV3_Node20/package.json @@ -0,0 +1,31 @@ +{ + "name": "vsts-tasks-bash", + "version": "1.0.0", + "description": "Azure Pipelines Bash Task", + "main": "bash.js", + "scripts": { + "build": "node ../../make.js build --task BashV3", + "test": "node ../../make.js test --task BashV3" + }, + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/Microsoft/azure-pipelines-tasks.git" + }, + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Microsoft/azure-pipelines-tasks/issues" + }, + "homepage": "https://github.com/Microsoft/azure-pipelines-tasks#readme", + "dependencies": { + "@types/mocha": "^9.1.1", + "@types/node": "^20.3.1", + "azure-pipelines-task-lib": "^5.0.0-preview.0", + "azure-pipelines-tasks-utility-common": "^3.225.1", + "uuid": "^3.0.1" + }, + "devDependencies": { + "@tsconfig/node10": "1.0.9", + "typescript": "5.1.6" + } +} diff --git a/_generated/BashV3_Node20/task.json b/_generated/BashV3_Node20/task.json new file mode 100644 index 000000000000..c4b8f09ddb68 --- /dev/null +++ b/_generated/BashV3_Node20/task.json @@ -0,0 +1,135 @@ +{ + "id": "6C731C3C-3C68-459A-A5C9-BDE6E6595B5B", + "name": "Bash", + "friendlyName": "Bash", + "description": "Run a Bash script on macOS, Linux, or Windows", + "helpUrl": "https://docs.microsoft.com/azure/devops/pipelines/tasks/utility/bash", + "helpMarkDown": "[Learn more about this task](https://go.microsoft.com/fwlink/?linkid=2132213) or [see the Bash documentation](https://www.gnu.org/software/bash/manual/)", + "category": "Utility", + "visibility": [ + "Build", + "Release" + ], + "runsOn": [ + "Agent", + "DeploymentGroup" + ], + "author": "Microsoft Corporation", + "version": { + "Major": 3, + "Minor": 229, + "Patch": 1 + }, + "releaseNotes": "Script task consistency. Added support for multiple lines and added support for Windows.", + "minimumAgentVersion": "2.115.0", + "instanceNameFormat": "Bash Script", + "showEnvironmentVariables": true, + "groups": [ + { + "name": "advanced", + "displayName": "Advanced", + "isExpanded": false + } + ], + "inputs": [ + { + "name": "targetType", + "type": "radio", + "label": "Type", + "required": false, + "defaultValue": "filePath", + "helpMarkDown": "Target script type: File Path or Inline", + "options": { + "filePath": "File Path", + "inline": "Inline" + } + }, + { + "name": "filePath", + "type": "filePath", + "label": "Script Path", + "visibleRule": "targetType = filePath", + "required": true, + "defaultValue": "", + "helpMarkDown": "Path of the script to execute. Must be a fully qualified path or relative to $(System.DefaultWorkingDirectory)." + }, + { + "name": "arguments", + "type": "string", + "label": "Arguments", + "visibleRule": "targetType = filePath", + "required": false, + "defaultValue": "", + "helpMarkDown": "Arguments passed to the shell script. Either ordinal parameters or named parameters." + }, + { + "name": "script", + "type": "multiLine", + "label": "Script", + "visibleRule": "targetType = inline", + "required": true, + "defaultValue": "# Write your commands here\n\necho 'Hello world'\n", + "properties": { + "resizable": "true", + "rows": "10", + "maxLength": "5000" + }, + "helpMarkDown": "" + }, + { + "name": "workingDirectory", + "type": "filePath", + "label": "Working Directory", + "defaultValue": "", + "required": false, + "groupName": "advanced" + }, + { + "name": "failOnStderr", + "type": "boolean", + "label": "Fail on Standard Error", + "defaultValue": "false", + "required": false, + "helpMarkDown": "If this is true, this task will fail if any errors are written to the StandardError stream.", + "groupName": "advanced" + }, + { + "name": "bashEnvValue", + "type": "string", + "label": "Set value for BASH_ENV environment variable", + "defaultValue": "", + "required": false, + "helpMarkDown": "If input is specified, it's value is expanded and used as the path of a startup file to execute before running the script. If the environment variable `BASH_ENV` has already been defined, the task will override this variable only for the current task. You can find more details by [link](https://www.gnu.org/software/bash/manual/html_node/Bash-Startup-Files.html).", + "groupName": "advanced" + } + ], + "execution": { + "Node10": { + "target": "bash.js", + "argumentFormat": "" + }, + "Node16": { + "target": "bash.js", + "argumentFormat": "" + }, + "Node20": { + "target": "bash.js", + "argumentFormat": "" + } + }, + "messages": { + "GeneratingScript": "Generating script.", + "JS_ExitCode": "Bash exited with code '%s'.", + "JS_FormattedCommand": "Formatted command: %s", + "JS_InvalidFilePath": "Invalid file path '%s'.", + "JS_ScriptContents": "Script contents:", + "JS_Stderr": "Bash wrote one or more lines to the standard error stream.", + "JS_TranslatePathFailed": "Unable to translate the path '%s' to the Linux file system.", + "JS_BashEnvAlreadyDefined": "The BASH_ENV environment variable has already been set to a '%s', the task will override it with '%s'", + "ScriptArgsSanitized": "Detected characters in arguments that may not be executed correctly by the shell. Please escape special characters using backslash (\\). More information is available here: https://aka.ms/ado/75787" + }, + "_buildConfigMapping": { + "Default": "3.229.0", + "Node20-225": "3.229.1" + } +} \ No newline at end of file diff --git a/_generated/BashV3_Node20/task.loc.json b/_generated/BashV3_Node20/task.loc.json new file mode 100644 index 000000000000..dba00831129e --- /dev/null +++ b/_generated/BashV3_Node20/task.loc.json @@ -0,0 +1,135 @@ +{ + "id": "6C731C3C-3C68-459A-A5C9-BDE6E6595B5B", + "name": "Bash", + "friendlyName": "ms-resource:loc.friendlyName", + "description": "ms-resource:loc.description", + "helpUrl": "https://docs.microsoft.com/azure/devops/pipelines/tasks/utility/bash", + "helpMarkDown": "ms-resource:loc.helpMarkDown", + "category": "Utility", + "visibility": [ + "Build", + "Release" + ], + "runsOn": [ + "Agent", + "DeploymentGroup" + ], + "author": "Microsoft Corporation", + "version": { + "Major": 3, + "Minor": 229, + "Patch": 1 + }, + "releaseNotes": "ms-resource:loc.releaseNotes", + "minimumAgentVersion": "2.115.0", + "instanceNameFormat": "ms-resource:loc.instanceNameFormat", + "showEnvironmentVariables": true, + "groups": [ + { + "name": "advanced", + "displayName": "ms-resource:loc.group.displayName.advanced", + "isExpanded": false + } + ], + "inputs": [ + { + "name": "targetType", + "type": "radio", + "label": "ms-resource:loc.input.label.targetType", + "required": false, + "defaultValue": "filePath", + "helpMarkDown": "ms-resource:loc.input.help.targetType", + "options": { + "filePath": "File Path", + "inline": "Inline" + } + }, + { + "name": "filePath", + "type": "filePath", + "label": "ms-resource:loc.input.label.filePath", + "visibleRule": "targetType = filePath", + "required": true, + "defaultValue": "", + "helpMarkDown": "ms-resource:loc.input.help.filePath" + }, + { + "name": "arguments", + "type": "string", + "label": "ms-resource:loc.input.label.arguments", + "visibleRule": "targetType = filePath", + "required": false, + "defaultValue": "", + "helpMarkDown": "ms-resource:loc.input.help.arguments" + }, + { + "name": "script", + "type": "multiLine", + "label": "ms-resource:loc.input.label.script", + "visibleRule": "targetType = inline", + "required": true, + "defaultValue": "# Write your commands here\n\necho 'Hello world'\n", + "properties": { + "resizable": "true", + "rows": "10", + "maxLength": "5000" + }, + "helpMarkDown": "" + }, + { + "name": "workingDirectory", + "type": "filePath", + "label": "ms-resource:loc.input.label.workingDirectory", + "defaultValue": "", + "required": false, + "groupName": "advanced" + }, + { + "name": "failOnStderr", + "type": "boolean", + "label": "ms-resource:loc.input.label.failOnStderr", + "defaultValue": "false", + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.failOnStderr", + "groupName": "advanced" + }, + { + "name": "bashEnvValue", + "type": "string", + "label": "ms-resource:loc.input.label.bashEnvValue", + "defaultValue": "", + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.bashEnvValue", + "groupName": "advanced" + } + ], + "execution": { + "Node10": { + "target": "bash.js", + "argumentFormat": "" + }, + "Node16": { + "target": "bash.js", + "argumentFormat": "" + }, + "Node20": { + "target": "bash.js", + "argumentFormat": "" + } + }, + "messages": { + "GeneratingScript": "ms-resource:loc.messages.GeneratingScript", + "JS_ExitCode": "ms-resource:loc.messages.JS_ExitCode", + "JS_FormattedCommand": "ms-resource:loc.messages.JS_FormattedCommand", + "JS_InvalidFilePath": "ms-resource:loc.messages.JS_InvalidFilePath", + "JS_ScriptContents": "ms-resource:loc.messages.JS_ScriptContents", + "JS_Stderr": "ms-resource:loc.messages.JS_Stderr", + "JS_TranslatePathFailed": "ms-resource:loc.messages.JS_TranslatePathFailed", + "JS_BashEnvAlreadyDefined": "ms-resource:loc.messages.JS_BashEnvAlreadyDefined", + "ScriptArgsSanitized": "ms-resource:loc.messages.ScriptArgsSanitized" + }, + "_buildConfigMapping": { + "Default": "3.229.0", + "Node20-225": "3.229.1" + } +} \ No newline at end of file diff --git a/_generated/BashV3_Node20/tsconfig.json b/_generated/BashV3_Node20/tsconfig.json new file mode 100644 index 000000000000..c22264963171 --- /dev/null +++ b/_generated/BashV3_Node20/tsconfig.json @@ -0,0 +1,7 @@ +{ + "extends": "@tsconfig/node10/tsconfig.json", + "compilerOptions": { + "noImplicitAny": false, + "strictNullChecks": false, + } +} \ No newline at end of file diff --git a/_generated/BashV3_Node20/utils/errors.ts b/_generated/BashV3_Node20/utils/errors.ts new file mode 100644 index 000000000000..b86763d43eee --- /dev/null +++ b/_generated/BashV3_Node20/utils/errors.ts @@ -0,0 +1,5 @@ +export class ArgsSanitizingError extends Error { + constructor(message: string) { + super(message); + } +} diff --git a/_generated/CMakeV1.versionmap.txt b/_generated/CMakeV1.versionmap.txt new file mode 100644 index 000000000000..f74febd08e1e --- /dev/null +++ b/_generated/CMakeV1.versionmap.txt @@ -0,0 +1,2 @@ +Default|1.229.0 +Node20-225|1.229.1 diff --git a/_generated/CMakeV1/Strings/resources.resjson/de-DE/resources.resjson b/_generated/CMakeV1/Strings/resources.resjson/de-DE/resources.resjson new file mode 100644 index 000000000000..8660eca6ee80 --- /dev/null +++ b/_generated/CMakeV1/Strings/resources.resjson/de-DE/resources.resjson @@ -0,0 +1,15 @@ +{ + "loc.friendlyName": "CMake", + "loc.helpMarkDown": "[Weitere Informationen zu dieser Aufgabe](https://go.microsoft.com/fwlink/?LinkID=613719)", + "loc.description": "Mit dem plattformübergreifenden CMake-Buildsystem erstellen", + "loc.instanceNameFormat": "CMake $(cmakeArgs)", + "loc.group.displayName.advanced": "Erweitert", + "loc.input.label.cwd": "Arbeitsverzeichnis", + "loc.input.help.cwd": "Aktuelles Arbeitsverzeichnis bei Ausführung von CMake.", + "loc.input.label.cmakeArgs": "Argumente", + "loc.input.help.cmakeArgs": "An CMake übergebene Argumente", + "loc.input.label.runInsideShell": "CMake-Befehl in Shell ausführen", + "loc.input.help.runInsideShell": "CMake-Argumente werden wie in einer betriebssystemspezifischen Shell behandelt. Diese Option kann zum Verarbeiten von Umgebungsvariablen innerhalb von Argumentzeichenfolgen verwendet werden.", + "loc.messages.CMakeReturnCode": "CMake wurde mit dem folgenden Rückgabecode beendet: %d", + "loc.messages.CMakeFailed": "CMake-Fehler: %s" +} \ No newline at end of file diff --git a/_generated/CMakeV1/Strings/resources.resjson/en-US/resources.resjson b/_generated/CMakeV1/Strings/resources.resjson/en-US/resources.resjson new file mode 100644 index 000000000000..d16cc4f35573 --- /dev/null +++ b/_generated/CMakeV1/Strings/resources.resjson/en-US/resources.resjson @@ -0,0 +1,15 @@ +{ + "loc.friendlyName": "CMake", + "loc.helpMarkDown": "[Learn more about this task](https://go.microsoft.com/fwlink/?LinkID=613719)", + "loc.description": "Build with the CMake cross-platform build system", + "loc.instanceNameFormat": "CMake $(cmakeArgs)", + "loc.group.displayName.advanced": "Advanced", + "loc.input.label.cwd": "Working Directory", + "loc.input.help.cwd": "Current working directory when cmake is run.", + "loc.input.label.cmakeArgs": "Arguments", + "loc.input.help.cmakeArgs": "Arguments passed to cmake", + "loc.input.label.runInsideShell": "Run cmake command inside shell", + "loc.input.help.runInsideShell": "CMake arguments will be handled like they would be inside of an OS specific shell. It can be used to handle environment variables inside of argument strings.", + "loc.messages.CMakeReturnCode": "CMake exited with return code: %d", + "loc.messages.CMakeFailed": "CMake failed with error: %s" +} \ No newline at end of file diff --git a/_generated/CMakeV1/Strings/resources.resjson/es-ES/resources.resjson b/_generated/CMakeV1/Strings/resources.resjson/es-ES/resources.resjson new file mode 100644 index 000000000000..e1f5569be022 --- /dev/null +++ b/_generated/CMakeV1/Strings/resources.resjson/es-ES/resources.resjson @@ -0,0 +1,15 @@ +{ + "loc.friendlyName": "CMake", + "loc.helpMarkDown": "[Obtener más información acerca de esta tarea](https://go.microsoft.com/fwlink/?LinkID=613719)", + "loc.description": "Compilar con el sistema de compilación multiplataforma de CMake", + "loc.instanceNameFormat": "CMake $(cmakeArgs)", + "loc.group.displayName.advanced": "Avanzado", + "loc.input.label.cwd": "Directorio de trabajo", + "loc.input.help.cwd": "Directorio de trabajo actual cuando cmake se ejecuta.", + "loc.input.label.cmakeArgs": "Argumentos", + "loc.input.help.cmakeArgs": "Argumentos pasados a cmake", + "loc.input.label.runInsideShell": "Ejecutar el comando de cmake dentro de Shell", + "loc.input.help.runInsideShell": "Los argumentos de CMake se tratarán como si estuvieran en un shell específico del sistema operativo. Se puede usar para controlar las variables de entorno dentro de cadenas de argumentos.", + "loc.messages.CMakeReturnCode": "CMake se cerró con el código de retorno: %d", + "loc.messages.CMakeFailed": "Error de CMake: %s" +} \ No newline at end of file diff --git a/_generated/CMakeV1/Strings/resources.resjson/fr-FR/resources.resjson b/_generated/CMakeV1/Strings/resources.resjson/fr-FR/resources.resjson new file mode 100644 index 000000000000..4cd19161f2d8 --- /dev/null +++ b/_generated/CMakeV1/Strings/resources.resjson/fr-FR/resources.resjson @@ -0,0 +1,15 @@ +{ + "loc.friendlyName": "CMake", + "loc.helpMarkDown": "[En savoir plus sur cette tâche](https://go.microsoft.com/fwlink/?LinkID=613719)", + "loc.description": "Générer avec le système de build multiplateforme CMake", + "loc.instanceNameFormat": "CMake $(cmakeArgs)", + "loc.group.displayName.advanced": "Avancé", + "loc.input.label.cwd": "Répertoire de travail", + "loc.input.help.cwd": "Répertoire de travail actuel pendant l'exécution de cmake.", + "loc.input.label.cmakeArgs": "Arguments", + "loc.input.help.cmakeArgs": "Arguments passés à cmake", + "loc.input.label.runInsideShell": "Exécuter la commande cmake dans l'interpréteur de commandes", + "loc.input.help.runInsideShell": "Les arguments CMake sont pris en charge comme s'ils se trouvaient dans un interpréteur de commandes spécifique à l'OS. Cela permet de prendre en charge les variables d'environnement dans les chaînes d'arguments.", + "loc.messages.CMakeReturnCode": "Sortie de CMake. Code de retour : %d", + "loc.messages.CMakeFailed": "Échec de CMake. Erreur : %s" +} \ No newline at end of file diff --git a/_generated/CMakeV1/Strings/resources.resjson/it-IT/resources.resjson b/_generated/CMakeV1/Strings/resources.resjson/it-IT/resources.resjson new file mode 100644 index 000000000000..70614ebde6de --- /dev/null +++ b/_generated/CMakeV1/Strings/resources.resjson/it-IT/resources.resjson @@ -0,0 +1,15 @@ +{ + "loc.friendlyName": "CMake", + "loc.helpMarkDown": "[Altre informazioni su questa attività](https://go.microsoft.com/fwlink/?LinkID=613719)", + "loc.description": "Consente di compilare con il sistema di compilazione multipiattaforma CMake", + "loc.instanceNameFormat": "CMake $(cmakeArgs)", + "loc.group.displayName.advanced": "Avanzate", + "loc.input.label.cwd": "Directory di lavoro", + "loc.input.help.cwd": "Directory di lavoro corrente durante l'esecuzione di cmake.", + "loc.input.label.cmakeArgs": "Argomenti", + "loc.input.help.cmakeArgs": "Argomenti passati a cmake", + "loc.input.label.runInsideShell": "Esegui il comando CMake all'interno della shell", + "loc.input.help.runInsideShell": "Gli argomenti di CMake verranno gestiti come se fossero all'interno di una shell specifica del sistema operativo. Può essere usato per gestire variabili di ambiente all'interno di stringhe di argomento.", + "loc.messages.CMakeReturnCode": "CMake terminato. Codice restituito: %d", + "loc.messages.CMakeFailed": "CMake non riuscito. Errore: %s" +} \ No newline at end of file diff --git a/_generated/CMakeV1/Strings/resources.resjson/ja-JP/resources.resjson b/_generated/CMakeV1/Strings/resources.resjson/ja-JP/resources.resjson new file mode 100644 index 000000000000..2909160539eb --- /dev/null +++ b/_generated/CMakeV1/Strings/resources.resjson/ja-JP/resources.resjson @@ -0,0 +1,15 @@ +{ + "loc.friendlyName": "CMake", + "loc.helpMarkDown": "[このタスクの詳細を表示](https://go.microsoft.com/fwlink/?LinkID=613719)", + "loc.description": "CMake クロス プラットフォームのビルド システムを使ってビルドします", + "loc.instanceNameFormat": "CMake $(cmakeArgs)", + "loc.group.displayName.advanced": "詳細設定", + "loc.input.label.cwd": "作業ディレクトリ", + "loc.input.help.cwd": "cmake の実行時の現行の作業ディレクトリ。", + "loc.input.label.cmakeArgs": "引数 ", + "loc.input.help.cmakeArgs": "cmake に渡される引数 ", + "loc.input.label.runInsideShell": "シェル内で CMake コマンドを実行する", + "loc.input.help.runInsideShell": "CMake 引数は、OS 固有のシェル内にあるかのように処理されます。引数文字列内の環境変数を処理するために使用できます。", + "loc.messages.CMakeReturnCode": "CMake は、リターン コードを伴って終了しました: %d ", + "loc.messages.CMakeFailed": "CMake でエラーが発生しました: %s" +} \ No newline at end of file diff --git a/_generated/CMakeV1/Strings/resources.resjson/ko-KR/resources.resjson b/_generated/CMakeV1/Strings/resources.resjson/ko-KR/resources.resjson new file mode 100644 index 000000000000..d7c8ad2b9216 --- /dev/null +++ b/_generated/CMakeV1/Strings/resources.resjson/ko-KR/resources.resjson @@ -0,0 +1,15 @@ +{ + "loc.friendlyName": "CMake", + "loc.helpMarkDown": "[이 작업에 대한 자세한 정보](https://go.microsoft.com/fwlink/?LinkID=613719)", + "loc.description": "CMake 플랫폼 간 빌드 시스템으로 빌드", + "loc.instanceNameFormat": "CMake $(cmakeArgs)", + "loc.group.displayName.advanced": "고급", + "loc.input.label.cwd": "작업 디렉터리", + "loc.input.help.cwd": "cmake가 실행될 때 현재의 작업 디렉터리입니다.", + "loc.input.label.cmakeArgs": "인수", + "loc.input.help.cmakeArgs": "인수가 cmake로 전달되었습니다.", + "loc.input.label.runInsideShell": "셸 내에서 cmake 명령 실행", + "loc.input.help.runInsideShell": "CMake 인수는 OS 특정 셸 내에 있는 것처럼 처리됩니다. 인수 문자열 내에서 환경 변수를 처리하는 데 사용할 수 있습니다.", + "loc.messages.CMakeReturnCode": "반환 코드 %d(으)로 CMake 종료", + "loc.messages.CMakeFailed": "오류 %s(으)로 CMake 실패" +} \ No newline at end of file diff --git a/_generated/CMakeV1/Strings/resources.resjson/ru-RU/resources.resjson b/_generated/CMakeV1/Strings/resources.resjson/ru-RU/resources.resjson new file mode 100644 index 000000000000..08ac166db921 --- /dev/null +++ b/_generated/CMakeV1/Strings/resources.resjson/ru-RU/resources.resjson @@ -0,0 +1,15 @@ +{ + "loc.friendlyName": "CMake", + "loc.helpMarkDown": "[См. дополнительные сведения об этой задаче](https://go.microsoft.com/fwlink/?LinkID=613719)", + "loc.description": "Сборка с помощью кроссплатформенной системы сборок CMake", + "loc.instanceNameFormat": "CMake $(cmakeArgs)", + "loc.group.displayName.advanced": "Дополнительно", + "loc.input.label.cwd": "Рабочий каталог", + "loc.input.help.cwd": "Текущий рабочий каталог при выполнении CMake.", + "loc.input.label.cmakeArgs": "Аргументы", + "loc.input.help.cmakeArgs": "Аргументы, передаваемые в CMake", + "loc.input.label.runInsideShell": "Выполнять команды CMake в оболочке", + "loc.input.help.runInsideShell": "Аргументы CMake будут обрабатываться так же, как если бы они находились в оболочке для определенной ОС. Это можно использовать для обработки переменных среды внутри строк аргументов.", + "loc.messages.CMakeReturnCode": "Завершение работы CMake с кодом возврата: %d", + "loc.messages.CMakeFailed": "Сбой CMake с ошибкой: %s" +} \ No newline at end of file diff --git a/_generated/CMakeV1/Strings/resources.resjson/zh-CN/resources.resjson b/_generated/CMakeV1/Strings/resources.resjson/zh-CN/resources.resjson new file mode 100644 index 000000000000..44346b51f26b --- /dev/null +++ b/_generated/CMakeV1/Strings/resources.resjson/zh-CN/resources.resjson @@ -0,0 +1,15 @@ +{ + "loc.friendlyName": "CMake", + "loc.helpMarkDown": "[详细了解此任务](https://go.microsoft.com/fwlink/?LinkID=613719)", + "loc.description": "使用 CMake 跨平台生成系统生成", + "loc.instanceNameFormat": "CMake $(cmakeArgs)", + "loc.group.displayName.advanced": "高级", + "loc.input.label.cwd": "工作目录", + "loc.input.help.cwd": "cmake 运行时的当前工作目录。", + "loc.input.label.cmakeArgs": "参数", + "loc.input.help.cmakeArgs": "传递给 cmake 的参数", + "loc.input.label.runInsideShell": "在 shell 中运行 cmake 命令", + "loc.input.help.runInsideShell": "CMake 参数的处理方式与在特定于 OS 的 shell 中的相同。它可用于处理参数字符串中的环境变量。", + "loc.messages.CMakeReturnCode": "CMake 已退出,返回代码为: %d", + "loc.messages.CMakeFailed": "CMake 失败,出现错误: %s" +} \ No newline at end of file diff --git a/_generated/CMakeV1/Strings/resources.resjson/zh-TW/resources.resjson b/_generated/CMakeV1/Strings/resources.resjson/zh-TW/resources.resjson new file mode 100644 index 000000000000..0164ecfaa198 --- /dev/null +++ b/_generated/CMakeV1/Strings/resources.resjson/zh-TW/resources.resjson @@ -0,0 +1,15 @@ +{ + "loc.friendlyName": "CMake", + "loc.helpMarkDown": "[深入了解此工作](https://go.microsoft.com/fwlink/?LinkID=613719)", + "loc.description": "使用 CMake 跨平台建置系統建置", + "loc.instanceNameFormat": "CMake $(cmakeArgs)", + "loc.group.displayName.advanced": "進階", + "loc.input.label.cwd": "工作目錄", + "loc.input.help.cwd": "執行 cmake 時的目前工作目錄。", + "loc.input.label.cmakeArgs": "引數", + "loc.input.help.cmakeArgs": "傳遞至 cmake 的引數", + "loc.input.label.runInsideShell": "在殼層內執行 cmake 命令", + "loc.input.help.runInsideShell": "CMake 引數的處理方式就和在 OS 特定殼層內一樣。可用以處理引數字串內部的環境變數。", + "loc.messages.CMakeReturnCode": "CMake 已結束,傳回碼為: %d", + "loc.messages.CMakeFailed": "CMake 失敗,錯誤為: %s" +} \ No newline at end of file diff --git a/_generated/CMakeV1/Tests/L0.ts b/_generated/CMakeV1/Tests/L0.ts new file mode 100644 index 000000000000..028328f474c1 --- /dev/null +++ b/_generated/CMakeV1/Tests/L0.ts @@ -0,0 +1,51 @@ +import assert = require('assert'); +import path = require('path'); +import { MockTestRunner } from 'azure-pipelines-task-lib/mock-test'; + +describe('CMake Suite', function () { + this.timeout(parseInt(process.env.TASK_TEST_TIMEOUT) || 20000); + + it('run cmake in cwd', (done: Mocha.Done) => { + const testPath = path.join(__dirname, 'L0RunInCwd.js'); + const runner: MockTestRunner = new MockTestRunner(testPath); + + runner.run(); + + assert(runner.ran('/usr/local/bin/cmake ..'), 'it should have run cmake'); + assert(runner.invokedToolCount == 1, 'should have only run cmake'); + assert(runner.stderr.length == 0, 'should not have written to stderr'); + assert(runner.succeeded, 'task should have succeeded'); + + done() + }) + + it('fails if cmake fails', (done: Mocha.Done) => { + const testPath = path.join(__dirname, 'L0ShouldFail.js'); + const runner: MockTestRunner = new MockTestRunner(testPath); + + runner.run(); + + assert(runner.ran('/usr/local/bin/cmake ..'), 'it should have run cmake'); + assert.strictEqual(runner.invokedToolCount, 1, 'should have only run cmake'); + + const expectedErr: string = '/usr/local/bin/cmake failed with return code: 50'; + assert(runner.stdOutContained(expectedErr), 'should have printed: ' + expectedErr); + assert(runner.failed, 'task should have failed'); + + done(); + }) + + it('errors if cwd not set', (done: Mocha.Done) => { + const testPath = path.join(__dirname, 'L0NoCwdSet.js'); + const runner: MockTestRunner = new MockTestRunner(testPath); + + runner.run(); + + assert(runner.failed, 'should have failed'); + const expectedErr = 'Input required: cwd'; + assert(runner.stdOutContained(expectedErr), 'should have said: ' + expectedErr); + assert.strictEqual(runner.invokedToolCount, 0, 'should exit before running CMake'); + + done(); + }) +}); diff --git a/_generated/CMakeV1/Tests/L0NoCwdSet.ts b/_generated/CMakeV1/Tests/L0NoCwdSet.ts new file mode 100644 index 000000000000..b89deec0c043 --- /dev/null +++ b/_generated/CMakeV1/Tests/L0NoCwdSet.ts @@ -0,0 +1,18 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'cmaketask.js'); +let tmr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +let answers: ma.TaskLibAnswers = { + "which": { + "cmake": "/usr/local/bin/cmake" + }, + "checkPath": { + "/usr/local/bin/cmake": true + } +} +tmr.setAnswers(answers); + +tmr.run(); diff --git a/_generated/CMakeV1/Tests/L0RunInCwd.ts b/_generated/CMakeV1/Tests/L0RunInCwd.ts new file mode 100644 index 000000000000..7611388b5e91 --- /dev/null +++ b/_generated/CMakeV1/Tests/L0RunInCwd.ts @@ -0,0 +1,29 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'cmaketask.js'); +let tmr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tmr.setInput('cmakeArgs', '..'); +tmr.setInput('cwd', 'fake/wd'); + +let answers: ma.TaskLibAnswers = { + "which": { + "cmake": "/usr/local/bin/cmake", + "node": "/usr/local/bin/node" + }, + "checkPath": { + "/usr/local/bin/cmake": true, + "/usr/local/bin/node": true + }, + "exec": { + "/usr/local/bin/cmake ..": { + "code": 0, + "stdout": "cmake output here" + } + } +} +tmr.setAnswers(answers); + +tmr.run(); diff --git a/_generated/CMakeV1/Tests/L0ShouldFail.ts b/_generated/CMakeV1/Tests/L0ShouldFail.ts new file mode 100644 index 000000000000..46516b4c44e5 --- /dev/null +++ b/_generated/CMakeV1/Tests/L0ShouldFail.ts @@ -0,0 +1,30 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'cmaketask.js'); +let tmr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tmr.setInput('cmakeArgs', '..'); +tmr.setInput('cwd', 'fake/wd'); + +let answers: ma.TaskLibAnswers = { + "which": { + "cmake": "/usr/local/bin/cmake", + "node": "/usr/local/bin/node" + }, + "checkPath": { + "/usr/local/bin/cmake": true, + "/usr/local/bin/node": true + }, + "exec": { + "/usr/local/bin/cmake ..": { + "code": 50, + "stdout": "cmake output here", + "stderr": "cmake failed with this output" + } + } +} +tmr.setAnswers(answers); + +tmr.run(); diff --git a/_generated/CMakeV1/Tests/package-lock.json b/_generated/CMakeV1/Tests/package-lock.json new file mode 100644 index 000000000000..161d7c3dff39 --- /dev/null +++ b/_generated/CMakeV1/Tests/package-lock.json @@ -0,0 +1,14 @@ +{ + "name": "cmake-tests", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/mocha": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", + "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==", + "dev": true + } + } +} diff --git a/_generated/CMakeV1/Tests/package.json b/_generated/CMakeV1/Tests/package.json new file mode 100644 index 000000000000..5c3e780545a0 --- /dev/null +++ b/_generated/CMakeV1/Tests/package.json @@ -0,0 +1,22 @@ +{ + "name": "cmake-tests", + "version": "1.0.0", + "description": "Azure Pipelines CMake V1 Task Tests", + "main": "L0.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/Microsoft/azure-pipelines-tasks.git" + }, + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Microsoft/azure-pipelines-tasks/issues" + }, + "homepage": "https://github.com/Microsoft/azure-pipelines-tasks#readme", + "devDependencies": { + "@types/mocha": "^5.2.7" + } +} diff --git a/_generated/CMakeV1/cmaketask.ts b/_generated/CMakeV1/cmaketask.ts new file mode 100644 index 000000000000..fe2015edd974 --- /dev/null +++ b/_generated/CMakeV1/cmaketask.ts @@ -0,0 +1,32 @@ +import path = require('path'); +import tl = require('azure-pipelines-task-lib/task'); +import trm = require('azure-pipelines-task-lib/toolrunner'); + +async function run() { + try { + tl.setResourcePath(path.join(__dirname, 'task.json')); + + const cmake: trm.ToolRunner = tl.tool(tl.which('cmake', true)); + + const cwd: string = tl.getPathInput('cwd', true, false); + tl.mkdirP(cwd); + tl.cd(cwd); + + cmake.line(tl.getInput('cmakeArgs', false)); + + const runInsideShell: boolean = tl.getBoolInput('runInsideShell', false); + + const options: trm.IExecOptions = { + shell: runInsideShell + }; + + const code: number = await cmake.exec(options); + tl.setResult(tl.TaskResult.Succeeded, tl.loc('CMakeReturnCode', code)); + } + catch (err) { + tl.error(err.message); + tl.setResult(tl.TaskResult.Failed, tl.loc('CMakeFailed', err.message)); + } +} + +run(); diff --git a/_generated/CMakeV1/icon.png b/_generated/CMakeV1/icon.png new file mode 100644 index 000000000000..3063d0a413f8 Binary files /dev/null and b/_generated/CMakeV1/icon.png differ diff --git a/_generated/CMakeV1/icon.svg b/_generated/CMakeV1/icon.svg new file mode 100644 index 000000000000..c49b556d7b4c --- /dev/null +++ b/_generated/CMakeV1/icon.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/_generated/CMakeV1/package-lock.json b/_generated/CMakeV1/package-lock.json new file mode 100644 index 000000000000..896d5a3af02b --- /dev/null +++ b/_generated/CMakeV1/package-lock.json @@ -0,0 +1,483 @@ +{ + "name": "vsts-cmake-task", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/concat-stream": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz", + "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==", + "requires": { + "@types/node": "*" + } + }, + "@types/form-data": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", + "integrity": "sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==", + "requires": { + "@types/node": "*" + } + }, + "@types/mocha": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", + "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==" + }, + "@types/node": { + "version": "16.11.62", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.62.tgz", + "integrity": "sha512-K/ggecSdwAAy2NUW4WKmF4Rc03GKbsfP+k326UWgckoS+Rzd2PaWbjk76dSmqdLQvLTJAO9axiTUJ6488mFsYQ==" + }, + "@types/qs": { + "version": "6.9.8", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.8.tgz", + "integrity": "sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg==" + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "azure-pipelines-task-lib": { + "version": "5.0.0-preview.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-5.0.0-preview.0.tgz", + "integrity": "sha512-uQJEv+q3/7RD7kgphFd33uXijaPwA1ePYoNkAgZpUhbZUtc2u4JL4ujTT/JJfgXBNW/QQNAiDQ2OC7vOQG/0tg==", + "requires": { + "minimatch": "3.0.5", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "sync-request": "6.1.0", + "uuid": "^3.0.1" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, + "form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + } + }, + "get-port": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", + "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==" + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "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" + }, + "dependencies": { + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==" + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "http-basic": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", + "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", + "requires": { + "caseless": "^0.12.0", + "concat-stream": "^1.6.2", + "http-response-object": "^3.0.1", + "parse-cache-control": "^1.0.1" + } + }, + "http-response-object": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", + "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", + "requires": { + "@types/node": "^10.0.3" + }, + "dependencies": { + "@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + } + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" + }, + "is-core-module": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "requires": { + "has": "^1.0.3" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, + "parse-cache-control": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", + "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "promise": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", + "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", + "requires": { + "asap": "~2.0.6" + } + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==" + }, + "qs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "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" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "requires": { + "resolve": "^1.1.6" + } + }, + "resolve": { + "version": "1.22.6", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.6.tgz", + "integrity": "sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==", + "requires": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" + }, + "shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, + "sync-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", + "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==", + "requires": { + "http-response-object": "^3.0.1", + "sync-rpc": "^1.2.1", + "then-request": "^6.0.0" + } + }, + "sync-rpc": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz", + "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==", + "requires": { + "get-port": "^3.1.0" + } + }, + "then-request": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", + "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", + "requires": { + "@types/concat-stream": "^1.6.0", + "@types/form-data": "0.0.33", + "@types/node": "^8.0.0", + "@types/qs": "^6.2.31", + "caseless": "~0.12.0", + "concat-stream": "^1.6.0", + "form-data": "^2.2.0", + "http-basic": "^8.1.1", + "http-response-object": "^3.0.1", + "promise": "^8.0.0", + "qs": "^6.4.0" + }, + "dependencies": { + "@types/node": { + "version": "8.10.66", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", + "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==" + } + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, + "typescript": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.2.tgz", + "integrity": "sha512-e4ERvRV2wb+rRZ/IQeb3jm2VxBsirQLpQhdxplZ2MEzGvDkkMmPglecnNDfSUBivMjP93vRbngYYDQqQ/78bcQ==", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + } + } +} diff --git a/_generated/CMakeV1/package.json b/_generated/CMakeV1/package.json new file mode 100644 index 000000000000..443733f94256 --- /dev/null +++ b/_generated/CMakeV1/package.json @@ -0,0 +1,27 @@ +{ + "name": "vsts-cmake-task", + "version": "1.0.0", + "description": "Azure Pipelines CMake Task", + "main": "cmaketask.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/Microsoft/azure-pipelines-tasks.git" + }, + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Microsoft/azure-pipelines-tasks/issues" + }, + "homepage": "https://github.com/Microsoft/azure-pipelines-tasks#readme", + "dependencies": { + "azure-pipelines-task-lib": "^5.0.0-preview.0", + "@types/node": "^16.11.39", + "@types/mocha": "^5.2.7" + }, + "devDependencies": { + "typescript": "4.0.2" + } +} diff --git a/_generated/CMakeV1/task.json b/_generated/CMakeV1/task.json new file mode 100644 index 000000000000..4aaeb507d997 --- /dev/null +++ b/_generated/CMakeV1/task.json @@ -0,0 +1,77 @@ +{ + "id": "7D831C3C-3C68-459A-A5C9-BDE6E659596C", + "name": "CMake", + "friendlyName": "CMake", + "description": "Build with the CMake cross-platform build system", + "helpUrl": "https://docs.microsoft.com/azure/devops/pipelines/tasks/build/cmake", + "helpMarkDown": "[Learn more about this task](https://go.microsoft.com/fwlink/?LinkID=613719)", + "category": "Build", + "visibility": [ + "Build" + ], + "author": "Microsoft Corporation", + "groups": [ + { + "name": "advanced", + "displayName": "Advanced" + } + ], + "demands": [ + "cmake" + ], + "version": { + "Major": 1, + "Minor": 229, + "Patch": 0 + }, + "minimumAgentVersion": "1.91.0", + "instanceNameFormat": "CMake $(cmakeArgs)", + "inputs": [ + { + "name": "cwd", + "aliases": [ + "workingDirectory" + ], + "type": "filePath", + "label": "Working Directory", + "defaultValue": "build", + "required": false, + "helpMarkDown": "Current working directory when cmake is run." + }, + { + "name": "cmakeArgs", + "type": "string", + "label": "Arguments", + "defaultValue": "", + "required": false, + "helpMarkDown": "Arguments passed to cmake" + }, + { + "name": "runInsideShell", + "type": "boolean", + "label": "Run cmake command inside shell", + "required": false, + "defaultValue": false, + "helpMarkDown": "CMake arguments will be handled like they would be inside of an OS specific shell. It can be used to handle environment variables inside of argument strings.", + "groupName": "advanced" + } + ], + "execution": { + "Node10": { + "target": "cmaketask.js", + "argumentFormat": "" + }, + "Node16": { + "target": "cmaketask.js", + "argumentFormat": "" + } + }, + "messages": { + "CMakeReturnCode": "CMake exited with return code: %d", + "CMakeFailed": "CMake failed with error: %s" + }, + "_buildConfigMapping": { + "Default": "1.229.0", + "Node20-225": "1.229.1" + } +} \ No newline at end of file diff --git a/_generated/CMakeV1/task.loc.json b/_generated/CMakeV1/task.loc.json new file mode 100644 index 000000000000..0c4119c1729e --- /dev/null +++ b/_generated/CMakeV1/task.loc.json @@ -0,0 +1,77 @@ +{ + "id": "7D831C3C-3C68-459A-A5C9-BDE6E659596C", + "name": "CMake", + "friendlyName": "ms-resource:loc.friendlyName", + "description": "ms-resource:loc.description", + "helpUrl": "https://docs.microsoft.com/azure/devops/pipelines/tasks/build/cmake", + "helpMarkDown": "ms-resource:loc.helpMarkDown", + "category": "Build", + "visibility": [ + "Build" + ], + "author": "Microsoft Corporation", + "groups": [ + { + "name": "advanced", + "displayName": "ms-resource:loc.group.displayName.advanced" + } + ], + "demands": [ + "cmake" + ], + "version": { + "Major": 1, + "Minor": 229, + "Patch": 0 + }, + "minimumAgentVersion": "1.91.0", + "instanceNameFormat": "ms-resource:loc.instanceNameFormat", + "inputs": [ + { + "name": "cwd", + "aliases": [ + "workingDirectory" + ], + "type": "filePath", + "label": "ms-resource:loc.input.label.cwd", + "defaultValue": "build", + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.cwd" + }, + { + "name": "cmakeArgs", + "type": "string", + "label": "ms-resource:loc.input.label.cmakeArgs", + "defaultValue": "", + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.cmakeArgs" + }, + { + "name": "runInsideShell", + "type": "boolean", + "label": "ms-resource:loc.input.label.runInsideShell", + "required": false, + "defaultValue": false, + "helpMarkDown": "ms-resource:loc.input.help.runInsideShell", + "groupName": "advanced" + } + ], + "execution": { + "Node10": { + "target": "cmaketask.js", + "argumentFormat": "" + }, + "Node16": { + "target": "cmaketask.js", + "argumentFormat": "" + } + }, + "messages": { + "CMakeReturnCode": "ms-resource:loc.messages.CMakeReturnCode", + "CMakeFailed": "ms-resource:loc.messages.CMakeFailed" + }, + "_buildConfigMapping": { + "Default": "1.229.0", + "Node20-225": "1.229.1" + } +} \ No newline at end of file diff --git a/_generated/CMakeV1/tsconfig.json b/_generated/CMakeV1/tsconfig.json new file mode 100644 index 000000000000..0438b79f69ac --- /dev/null +++ b/_generated/CMakeV1/tsconfig.json @@ -0,0 +1,6 @@ +{ + "compilerOptions": { + "target": "ES6", + "module": "commonjs" + } +} \ No newline at end of file diff --git a/_generated/CMakeV1_Node20/.npmrc b/_generated/CMakeV1_Node20/.npmrc new file mode 100644 index 000000000000..5fca0d518be7 --- /dev/null +++ b/_generated/CMakeV1_Node20/.npmrc @@ -0,0 +1 @@ +scripts-prepend-node-path=true diff --git a/_generated/CMakeV1_Node20/Strings/resources.resjson/de-DE/resources.resjson b/_generated/CMakeV1_Node20/Strings/resources.resjson/de-DE/resources.resjson new file mode 100644 index 000000000000..8660eca6ee80 --- /dev/null +++ b/_generated/CMakeV1_Node20/Strings/resources.resjson/de-DE/resources.resjson @@ -0,0 +1,15 @@ +{ + "loc.friendlyName": "CMake", + "loc.helpMarkDown": "[Weitere Informationen zu dieser Aufgabe](https://go.microsoft.com/fwlink/?LinkID=613719)", + "loc.description": "Mit dem plattformübergreifenden CMake-Buildsystem erstellen", + "loc.instanceNameFormat": "CMake $(cmakeArgs)", + "loc.group.displayName.advanced": "Erweitert", + "loc.input.label.cwd": "Arbeitsverzeichnis", + "loc.input.help.cwd": "Aktuelles Arbeitsverzeichnis bei Ausführung von CMake.", + "loc.input.label.cmakeArgs": "Argumente", + "loc.input.help.cmakeArgs": "An CMake übergebene Argumente", + "loc.input.label.runInsideShell": "CMake-Befehl in Shell ausführen", + "loc.input.help.runInsideShell": "CMake-Argumente werden wie in einer betriebssystemspezifischen Shell behandelt. Diese Option kann zum Verarbeiten von Umgebungsvariablen innerhalb von Argumentzeichenfolgen verwendet werden.", + "loc.messages.CMakeReturnCode": "CMake wurde mit dem folgenden Rückgabecode beendet: %d", + "loc.messages.CMakeFailed": "CMake-Fehler: %s" +} \ No newline at end of file diff --git a/_generated/CMakeV1_Node20/Strings/resources.resjson/en-US/resources.resjson b/_generated/CMakeV1_Node20/Strings/resources.resjson/en-US/resources.resjson new file mode 100644 index 000000000000..d16cc4f35573 --- /dev/null +++ b/_generated/CMakeV1_Node20/Strings/resources.resjson/en-US/resources.resjson @@ -0,0 +1,15 @@ +{ + "loc.friendlyName": "CMake", + "loc.helpMarkDown": "[Learn more about this task](https://go.microsoft.com/fwlink/?LinkID=613719)", + "loc.description": "Build with the CMake cross-platform build system", + "loc.instanceNameFormat": "CMake $(cmakeArgs)", + "loc.group.displayName.advanced": "Advanced", + "loc.input.label.cwd": "Working Directory", + "loc.input.help.cwd": "Current working directory when cmake is run.", + "loc.input.label.cmakeArgs": "Arguments", + "loc.input.help.cmakeArgs": "Arguments passed to cmake", + "loc.input.label.runInsideShell": "Run cmake command inside shell", + "loc.input.help.runInsideShell": "CMake arguments will be handled like they would be inside of an OS specific shell. It can be used to handle environment variables inside of argument strings.", + "loc.messages.CMakeReturnCode": "CMake exited with return code: %d", + "loc.messages.CMakeFailed": "CMake failed with error: %s" +} \ No newline at end of file diff --git a/_generated/CMakeV1_Node20/Strings/resources.resjson/es-ES/resources.resjson b/_generated/CMakeV1_Node20/Strings/resources.resjson/es-ES/resources.resjson new file mode 100644 index 000000000000..e1f5569be022 --- /dev/null +++ b/_generated/CMakeV1_Node20/Strings/resources.resjson/es-ES/resources.resjson @@ -0,0 +1,15 @@ +{ + "loc.friendlyName": "CMake", + "loc.helpMarkDown": "[Obtener más información acerca de esta tarea](https://go.microsoft.com/fwlink/?LinkID=613719)", + "loc.description": "Compilar con el sistema de compilación multiplataforma de CMake", + "loc.instanceNameFormat": "CMake $(cmakeArgs)", + "loc.group.displayName.advanced": "Avanzado", + "loc.input.label.cwd": "Directorio de trabajo", + "loc.input.help.cwd": "Directorio de trabajo actual cuando cmake se ejecuta.", + "loc.input.label.cmakeArgs": "Argumentos", + "loc.input.help.cmakeArgs": "Argumentos pasados a cmake", + "loc.input.label.runInsideShell": "Ejecutar el comando de cmake dentro de Shell", + "loc.input.help.runInsideShell": "Los argumentos de CMake se tratarán como si estuvieran en un shell específico del sistema operativo. Se puede usar para controlar las variables de entorno dentro de cadenas de argumentos.", + "loc.messages.CMakeReturnCode": "CMake se cerró con el código de retorno: %d", + "loc.messages.CMakeFailed": "Error de CMake: %s" +} \ No newline at end of file diff --git a/_generated/CMakeV1_Node20/Strings/resources.resjson/fr-FR/resources.resjson b/_generated/CMakeV1_Node20/Strings/resources.resjson/fr-FR/resources.resjson new file mode 100644 index 000000000000..4cd19161f2d8 --- /dev/null +++ b/_generated/CMakeV1_Node20/Strings/resources.resjson/fr-FR/resources.resjson @@ -0,0 +1,15 @@ +{ + "loc.friendlyName": "CMake", + "loc.helpMarkDown": "[En savoir plus sur cette tâche](https://go.microsoft.com/fwlink/?LinkID=613719)", + "loc.description": "Générer avec le système de build multiplateforme CMake", + "loc.instanceNameFormat": "CMake $(cmakeArgs)", + "loc.group.displayName.advanced": "Avancé", + "loc.input.label.cwd": "Répertoire de travail", + "loc.input.help.cwd": "Répertoire de travail actuel pendant l'exécution de cmake.", + "loc.input.label.cmakeArgs": "Arguments", + "loc.input.help.cmakeArgs": "Arguments passés à cmake", + "loc.input.label.runInsideShell": "Exécuter la commande cmake dans l'interpréteur de commandes", + "loc.input.help.runInsideShell": "Les arguments CMake sont pris en charge comme s'ils se trouvaient dans un interpréteur de commandes spécifique à l'OS. Cela permet de prendre en charge les variables d'environnement dans les chaînes d'arguments.", + "loc.messages.CMakeReturnCode": "Sortie de CMake. Code de retour : %d", + "loc.messages.CMakeFailed": "Échec de CMake. Erreur : %s" +} \ No newline at end of file diff --git a/_generated/CMakeV1_Node20/Strings/resources.resjson/it-IT/resources.resjson b/_generated/CMakeV1_Node20/Strings/resources.resjson/it-IT/resources.resjson new file mode 100644 index 000000000000..70614ebde6de --- /dev/null +++ b/_generated/CMakeV1_Node20/Strings/resources.resjson/it-IT/resources.resjson @@ -0,0 +1,15 @@ +{ + "loc.friendlyName": "CMake", + "loc.helpMarkDown": "[Altre informazioni su questa attività](https://go.microsoft.com/fwlink/?LinkID=613719)", + "loc.description": "Consente di compilare con il sistema di compilazione multipiattaforma CMake", + "loc.instanceNameFormat": "CMake $(cmakeArgs)", + "loc.group.displayName.advanced": "Avanzate", + "loc.input.label.cwd": "Directory di lavoro", + "loc.input.help.cwd": "Directory di lavoro corrente durante l'esecuzione di cmake.", + "loc.input.label.cmakeArgs": "Argomenti", + "loc.input.help.cmakeArgs": "Argomenti passati a cmake", + "loc.input.label.runInsideShell": "Esegui il comando CMake all'interno della shell", + "loc.input.help.runInsideShell": "Gli argomenti di CMake verranno gestiti come se fossero all'interno di una shell specifica del sistema operativo. Può essere usato per gestire variabili di ambiente all'interno di stringhe di argomento.", + "loc.messages.CMakeReturnCode": "CMake terminato. Codice restituito: %d", + "loc.messages.CMakeFailed": "CMake non riuscito. Errore: %s" +} \ No newline at end of file diff --git a/_generated/CMakeV1_Node20/Strings/resources.resjson/ja-JP/resources.resjson b/_generated/CMakeV1_Node20/Strings/resources.resjson/ja-JP/resources.resjson new file mode 100644 index 000000000000..2909160539eb --- /dev/null +++ b/_generated/CMakeV1_Node20/Strings/resources.resjson/ja-JP/resources.resjson @@ -0,0 +1,15 @@ +{ + "loc.friendlyName": "CMake", + "loc.helpMarkDown": "[このタスクの詳細を表示](https://go.microsoft.com/fwlink/?LinkID=613719)", + "loc.description": "CMake クロス プラットフォームのビルド システムを使ってビルドします", + "loc.instanceNameFormat": "CMake $(cmakeArgs)", + "loc.group.displayName.advanced": "詳細設定", + "loc.input.label.cwd": "作業ディレクトリ", + "loc.input.help.cwd": "cmake の実行時の現行の作業ディレクトリ。", + "loc.input.label.cmakeArgs": "引数 ", + "loc.input.help.cmakeArgs": "cmake に渡される引数 ", + "loc.input.label.runInsideShell": "シェル内で CMake コマンドを実行する", + "loc.input.help.runInsideShell": "CMake 引数は、OS 固有のシェル内にあるかのように処理されます。引数文字列内の環境変数を処理するために使用できます。", + "loc.messages.CMakeReturnCode": "CMake は、リターン コードを伴って終了しました: %d ", + "loc.messages.CMakeFailed": "CMake でエラーが発生しました: %s" +} \ No newline at end of file diff --git a/_generated/CMakeV1_Node20/Strings/resources.resjson/ko-KR/resources.resjson b/_generated/CMakeV1_Node20/Strings/resources.resjson/ko-KR/resources.resjson new file mode 100644 index 000000000000..d7c8ad2b9216 --- /dev/null +++ b/_generated/CMakeV1_Node20/Strings/resources.resjson/ko-KR/resources.resjson @@ -0,0 +1,15 @@ +{ + "loc.friendlyName": "CMake", + "loc.helpMarkDown": "[이 작업에 대한 자세한 정보](https://go.microsoft.com/fwlink/?LinkID=613719)", + "loc.description": "CMake 플랫폼 간 빌드 시스템으로 빌드", + "loc.instanceNameFormat": "CMake $(cmakeArgs)", + "loc.group.displayName.advanced": "고급", + "loc.input.label.cwd": "작업 디렉터리", + "loc.input.help.cwd": "cmake가 실행될 때 현재의 작업 디렉터리입니다.", + "loc.input.label.cmakeArgs": "인수", + "loc.input.help.cmakeArgs": "인수가 cmake로 전달되었습니다.", + "loc.input.label.runInsideShell": "셸 내에서 cmake 명령 실행", + "loc.input.help.runInsideShell": "CMake 인수는 OS 특정 셸 내에 있는 것처럼 처리됩니다. 인수 문자열 내에서 환경 변수를 처리하는 데 사용할 수 있습니다.", + "loc.messages.CMakeReturnCode": "반환 코드 %d(으)로 CMake 종료", + "loc.messages.CMakeFailed": "오류 %s(으)로 CMake 실패" +} \ No newline at end of file diff --git a/_generated/CMakeV1_Node20/Strings/resources.resjson/ru-RU/resources.resjson b/_generated/CMakeV1_Node20/Strings/resources.resjson/ru-RU/resources.resjson new file mode 100644 index 000000000000..08ac166db921 --- /dev/null +++ b/_generated/CMakeV1_Node20/Strings/resources.resjson/ru-RU/resources.resjson @@ -0,0 +1,15 @@ +{ + "loc.friendlyName": "CMake", + "loc.helpMarkDown": "[См. дополнительные сведения об этой задаче](https://go.microsoft.com/fwlink/?LinkID=613719)", + "loc.description": "Сборка с помощью кроссплатформенной системы сборок CMake", + "loc.instanceNameFormat": "CMake $(cmakeArgs)", + "loc.group.displayName.advanced": "Дополнительно", + "loc.input.label.cwd": "Рабочий каталог", + "loc.input.help.cwd": "Текущий рабочий каталог при выполнении CMake.", + "loc.input.label.cmakeArgs": "Аргументы", + "loc.input.help.cmakeArgs": "Аргументы, передаваемые в CMake", + "loc.input.label.runInsideShell": "Выполнять команды CMake в оболочке", + "loc.input.help.runInsideShell": "Аргументы CMake будут обрабатываться так же, как если бы они находились в оболочке для определенной ОС. Это можно использовать для обработки переменных среды внутри строк аргументов.", + "loc.messages.CMakeReturnCode": "Завершение работы CMake с кодом возврата: %d", + "loc.messages.CMakeFailed": "Сбой CMake с ошибкой: %s" +} \ No newline at end of file diff --git a/_generated/CMakeV1_Node20/Strings/resources.resjson/zh-CN/resources.resjson b/_generated/CMakeV1_Node20/Strings/resources.resjson/zh-CN/resources.resjson new file mode 100644 index 000000000000..44346b51f26b --- /dev/null +++ b/_generated/CMakeV1_Node20/Strings/resources.resjson/zh-CN/resources.resjson @@ -0,0 +1,15 @@ +{ + "loc.friendlyName": "CMake", + "loc.helpMarkDown": "[详细了解此任务](https://go.microsoft.com/fwlink/?LinkID=613719)", + "loc.description": "使用 CMake 跨平台生成系统生成", + "loc.instanceNameFormat": "CMake $(cmakeArgs)", + "loc.group.displayName.advanced": "高级", + "loc.input.label.cwd": "工作目录", + "loc.input.help.cwd": "cmake 运行时的当前工作目录。", + "loc.input.label.cmakeArgs": "参数", + "loc.input.help.cmakeArgs": "传递给 cmake 的参数", + "loc.input.label.runInsideShell": "在 shell 中运行 cmake 命令", + "loc.input.help.runInsideShell": "CMake 参数的处理方式与在特定于 OS 的 shell 中的相同。它可用于处理参数字符串中的环境变量。", + "loc.messages.CMakeReturnCode": "CMake 已退出,返回代码为: %d", + "loc.messages.CMakeFailed": "CMake 失败,出现错误: %s" +} \ No newline at end of file diff --git a/_generated/CMakeV1_Node20/Strings/resources.resjson/zh-TW/resources.resjson b/_generated/CMakeV1_Node20/Strings/resources.resjson/zh-TW/resources.resjson new file mode 100644 index 000000000000..0164ecfaa198 --- /dev/null +++ b/_generated/CMakeV1_Node20/Strings/resources.resjson/zh-TW/resources.resjson @@ -0,0 +1,15 @@ +{ + "loc.friendlyName": "CMake", + "loc.helpMarkDown": "[深入了解此工作](https://go.microsoft.com/fwlink/?LinkID=613719)", + "loc.description": "使用 CMake 跨平台建置系統建置", + "loc.instanceNameFormat": "CMake $(cmakeArgs)", + "loc.group.displayName.advanced": "進階", + "loc.input.label.cwd": "工作目錄", + "loc.input.help.cwd": "執行 cmake 時的目前工作目錄。", + "loc.input.label.cmakeArgs": "引數", + "loc.input.help.cmakeArgs": "傳遞至 cmake 的引數", + "loc.input.label.runInsideShell": "在殼層內執行 cmake 命令", + "loc.input.help.runInsideShell": "CMake 引數的處理方式就和在 OS 特定殼層內一樣。可用以處理引數字串內部的環境變數。", + "loc.messages.CMakeReturnCode": "CMake 已結束,傳回碼為: %d", + "loc.messages.CMakeFailed": "CMake 失敗,錯誤為: %s" +} \ No newline at end of file diff --git a/_generated/CMakeV1_Node20/Tests/L0.ts b/_generated/CMakeV1_Node20/Tests/L0.ts new file mode 100644 index 000000000000..028328f474c1 --- /dev/null +++ b/_generated/CMakeV1_Node20/Tests/L0.ts @@ -0,0 +1,51 @@ +import assert = require('assert'); +import path = require('path'); +import { MockTestRunner } from 'azure-pipelines-task-lib/mock-test'; + +describe('CMake Suite', function () { + this.timeout(parseInt(process.env.TASK_TEST_TIMEOUT) || 20000); + + it('run cmake in cwd', (done: Mocha.Done) => { + const testPath = path.join(__dirname, 'L0RunInCwd.js'); + const runner: MockTestRunner = new MockTestRunner(testPath); + + runner.run(); + + assert(runner.ran('/usr/local/bin/cmake ..'), 'it should have run cmake'); + assert(runner.invokedToolCount == 1, 'should have only run cmake'); + assert(runner.stderr.length == 0, 'should not have written to stderr'); + assert(runner.succeeded, 'task should have succeeded'); + + done() + }) + + it('fails if cmake fails', (done: Mocha.Done) => { + const testPath = path.join(__dirname, 'L0ShouldFail.js'); + const runner: MockTestRunner = new MockTestRunner(testPath); + + runner.run(); + + assert(runner.ran('/usr/local/bin/cmake ..'), 'it should have run cmake'); + assert.strictEqual(runner.invokedToolCount, 1, 'should have only run cmake'); + + const expectedErr: string = '/usr/local/bin/cmake failed with return code: 50'; + assert(runner.stdOutContained(expectedErr), 'should have printed: ' + expectedErr); + assert(runner.failed, 'task should have failed'); + + done(); + }) + + it('errors if cwd not set', (done: Mocha.Done) => { + const testPath = path.join(__dirname, 'L0NoCwdSet.js'); + const runner: MockTestRunner = new MockTestRunner(testPath); + + runner.run(); + + assert(runner.failed, 'should have failed'); + const expectedErr = 'Input required: cwd'; + assert(runner.stdOutContained(expectedErr), 'should have said: ' + expectedErr); + assert.strictEqual(runner.invokedToolCount, 0, 'should exit before running CMake'); + + done(); + }) +}); diff --git a/_generated/CMakeV1_Node20/Tests/L0NoCwdSet.ts b/_generated/CMakeV1_Node20/Tests/L0NoCwdSet.ts new file mode 100644 index 000000000000..b89deec0c043 --- /dev/null +++ b/_generated/CMakeV1_Node20/Tests/L0NoCwdSet.ts @@ -0,0 +1,18 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'cmaketask.js'); +let tmr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +let answers: ma.TaskLibAnswers = { + "which": { + "cmake": "/usr/local/bin/cmake" + }, + "checkPath": { + "/usr/local/bin/cmake": true + } +} +tmr.setAnswers(answers); + +tmr.run(); diff --git a/_generated/CMakeV1_Node20/Tests/L0RunInCwd.ts b/_generated/CMakeV1_Node20/Tests/L0RunInCwd.ts new file mode 100644 index 000000000000..7611388b5e91 --- /dev/null +++ b/_generated/CMakeV1_Node20/Tests/L0RunInCwd.ts @@ -0,0 +1,29 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'cmaketask.js'); +let tmr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tmr.setInput('cmakeArgs', '..'); +tmr.setInput('cwd', 'fake/wd'); + +let answers: ma.TaskLibAnswers = { + "which": { + "cmake": "/usr/local/bin/cmake", + "node": "/usr/local/bin/node" + }, + "checkPath": { + "/usr/local/bin/cmake": true, + "/usr/local/bin/node": true + }, + "exec": { + "/usr/local/bin/cmake ..": { + "code": 0, + "stdout": "cmake output here" + } + } +} +tmr.setAnswers(answers); + +tmr.run(); diff --git a/_generated/CMakeV1_Node20/Tests/L0ShouldFail.ts b/_generated/CMakeV1_Node20/Tests/L0ShouldFail.ts new file mode 100644 index 000000000000..46516b4c44e5 --- /dev/null +++ b/_generated/CMakeV1_Node20/Tests/L0ShouldFail.ts @@ -0,0 +1,30 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'cmaketask.js'); +let tmr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tmr.setInput('cmakeArgs', '..'); +tmr.setInput('cwd', 'fake/wd'); + +let answers: ma.TaskLibAnswers = { + "which": { + "cmake": "/usr/local/bin/cmake", + "node": "/usr/local/bin/node" + }, + "checkPath": { + "/usr/local/bin/cmake": true, + "/usr/local/bin/node": true + }, + "exec": { + "/usr/local/bin/cmake ..": { + "code": 50, + "stdout": "cmake output here", + "stderr": "cmake failed with this output" + } + } +} +tmr.setAnswers(answers); + +tmr.run(); diff --git a/_generated/CMakeV1_Node20/Tests/package-lock.json b/_generated/CMakeV1_Node20/Tests/package-lock.json new file mode 100644 index 000000000000..161d7c3dff39 --- /dev/null +++ b/_generated/CMakeV1_Node20/Tests/package-lock.json @@ -0,0 +1,14 @@ +{ + "name": "cmake-tests", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/mocha": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", + "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==", + "dev": true + } + } +} diff --git a/_generated/CMakeV1_Node20/Tests/package.json b/_generated/CMakeV1_Node20/Tests/package.json new file mode 100644 index 000000000000..5c3e780545a0 --- /dev/null +++ b/_generated/CMakeV1_Node20/Tests/package.json @@ -0,0 +1,22 @@ +{ + "name": "cmake-tests", + "version": "1.0.0", + "description": "Azure Pipelines CMake V1 Task Tests", + "main": "L0.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/Microsoft/azure-pipelines-tasks.git" + }, + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Microsoft/azure-pipelines-tasks/issues" + }, + "homepage": "https://github.com/Microsoft/azure-pipelines-tasks#readme", + "devDependencies": { + "@types/mocha": "^5.2.7" + } +} diff --git a/_generated/CMakeV1_Node20/cmaketask.ts b/_generated/CMakeV1_Node20/cmaketask.ts new file mode 100644 index 000000000000..fe2015edd974 --- /dev/null +++ b/_generated/CMakeV1_Node20/cmaketask.ts @@ -0,0 +1,32 @@ +import path = require('path'); +import tl = require('azure-pipelines-task-lib/task'); +import trm = require('azure-pipelines-task-lib/toolrunner'); + +async function run() { + try { + tl.setResourcePath(path.join(__dirname, 'task.json')); + + const cmake: trm.ToolRunner = tl.tool(tl.which('cmake', true)); + + const cwd: string = tl.getPathInput('cwd', true, false); + tl.mkdirP(cwd); + tl.cd(cwd); + + cmake.line(tl.getInput('cmakeArgs', false)); + + const runInsideShell: boolean = tl.getBoolInput('runInsideShell', false); + + const options: trm.IExecOptions = { + shell: runInsideShell + }; + + const code: number = await cmake.exec(options); + tl.setResult(tl.TaskResult.Succeeded, tl.loc('CMakeReturnCode', code)); + } + catch (err) { + tl.error(err.message); + tl.setResult(tl.TaskResult.Failed, tl.loc('CMakeFailed', err.message)); + } +} + +run(); diff --git a/_generated/CMakeV1_Node20/icon.png b/_generated/CMakeV1_Node20/icon.png new file mode 100644 index 000000000000..3063d0a413f8 Binary files /dev/null and b/_generated/CMakeV1_Node20/icon.png differ diff --git a/_generated/CMakeV1_Node20/icon.svg b/_generated/CMakeV1_Node20/icon.svg new file mode 100644 index 000000000000..c49b556d7b4c --- /dev/null +++ b/_generated/CMakeV1_Node20/icon.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/_generated/CMakeV1_Node20/package-lock.json b/_generated/CMakeV1_Node20/package-lock.json new file mode 100644 index 000000000000..63ca65ab63d1 --- /dev/null +++ b/_generated/CMakeV1_Node20/package-lock.json @@ -0,0 +1,483 @@ +{ + "name": "vsts-cmake-task", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/concat-stream": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz", + "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==", + "requires": { + "@types/node": "*" + } + }, + "@types/form-data": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", + "integrity": "sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==", + "requires": { + "@types/node": "*" + } + }, + "@types/mocha": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", + "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==" + }, + "@types/node": { + "version": "20.7.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.7.0.tgz", + "integrity": "sha512-zI22/pJW2wUZOVyguFaUL1HABdmSVxpXrzIqkjsHmyUjNhPoWM1CKfvVuXfetHhIok4RY573cqS0mZ1SJEnoTg==" + }, + "@types/qs": { + "version": "6.9.8", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.8.tgz", + "integrity": "sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg==" + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "azure-pipelines-task-lib": { + "version": "5.0.0-preview.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-5.0.0-preview.0.tgz", + "integrity": "sha512-uQJEv+q3/7RD7kgphFd33uXijaPwA1ePYoNkAgZpUhbZUtc2u4JL4ujTT/JJfgXBNW/QQNAiDQ2OC7vOQG/0tg==", + "requires": { + "minimatch": "3.0.5", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "sync-request": "6.1.0", + "uuid": "^3.0.1" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, + "form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + } + }, + "get-port": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", + "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==" + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "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" + }, + "dependencies": { + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==" + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "http-basic": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", + "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", + "requires": { + "caseless": "^0.12.0", + "concat-stream": "^1.6.2", + "http-response-object": "^3.0.1", + "parse-cache-control": "^1.0.1" + } + }, + "http-response-object": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", + "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", + "requires": { + "@types/node": "^10.0.3" + }, + "dependencies": { + "@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + } + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" + }, + "is-core-module": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "requires": { + "has": "^1.0.3" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, + "parse-cache-control": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", + "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "promise": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", + "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", + "requires": { + "asap": "~2.0.6" + } + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==" + }, + "qs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "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" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "requires": { + "resolve": "^1.1.6" + } + }, + "resolve": { + "version": "1.22.6", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.6.tgz", + "integrity": "sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==", + "requires": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" + }, + "shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, + "sync-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", + "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==", + "requires": { + "http-response-object": "^3.0.1", + "sync-rpc": "^1.2.1", + "then-request": "^6.0.0" + } + }, + "sync-rpc": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz", + "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==", + "requires": { + "get-port": "^3.1.0" + } + }, + "then-request": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", + "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", + "requires": { + "@types/concat-stream": "^1.6.0", + "@types/form-data": "0.0.33", + "@types/node": "^8.0.0", + "@types/qs": "^6.2.31", + "caseless": "~0.12.0", + "concat-stream": "^1.6.0", + "form-data": "^2.2.0", + "http-basic": "^8.1.1", + "http-response-object": "^3.0.1", + "promise": "^8.0.0", + "qs": "^6.4.0" + }, + "dependencies": { + "@types/node": { + "version": "8.10.66", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", + "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==" + } + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, + "typescript": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + } + } +} diff --git a/_generated/CMakeV1_Node20/package.json b/_generated/CMakeV1_Node20/package.json new file mode 100644 index 000000000000..235991d382cd --- /dev/null +++ b/_generated/CMakeV1_Node20/package.json @@ -0,0 +1,27 @@ +{ + "name": "vsts-cmake-task", + "version": "1.0.0", + "description": "Azure Pipelines CMake Task", + "main": "cmaketask.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/Microsoft/azure-pipelines-tasks.git" + }, + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Microsoft/azure-pipelines-tasks/issues" + }, + "homepage": "https://github.com/Microsoft/azure-pipelines-tasks#readme", + "dependencies": { + "azure-pipelines-task-lib": "^5.0.0-preview.0", + "@types/node": "^20.3.1", + "@types/mocha": "^5.2.7" + }, + "devDependencies": { + "typescript": "5.1.6" + } +} diff --git a/_generated/CMakeV1_Node20/task.json b/_generated/CMakeV1_Node20/task.json new file mode 100644 index 000000000000..06edafad449e --- /dev/null +++ b/_generated/CMakeV1_Node20/task.json @@ -0,0 +1,81 @@ +{ + "id": "7D831C3C-3C68-459A-A5C9-BDE6E659596C", + "name": "CMake", + "friendlyName": "CMake", + "description": "Build with the CMake cross-platform build system", + "helpUrl": "https://docs.microsoft.com/azure/devops/pipelines/tasks/build/cmake", + "helpMarkDown": "[Learn more about this task](https://go.microsoft.com/fwlink/?LinkID=613719)", + "category": "Build", + "visibility": [ + "Build" + ], + "author": "Microsoft Corporation", + "groups": [ + { + "name": "advanced", + "displayName": "Advanced" + } + ], + "demands": [ + "cmake" + ], + "version": { + "Major": 1, + "Minor": 229, + "Patch": 1 + }, + "minimumAgentVersion": "1.91.0", + "instanceNameFormat": "CMake $(cmakeArgs)", + "inputs": [ + { + "name": "cwd", + "aliases": [ + "workingDirectory" + ], + "type": "filePath", + "label": "Working Directory", + "defaultValue": "build", + "required": false, + "helpMarkDown": "Current working directory when cmake is run." + }, + { + "name": "cmakeArgs", + "type": "string", + "label": "Arguments", + "defaultValue": "", + "required": false, + "helpMarkDown": "Arguments passed to cmake" + }, + { + "name": "runInsideShell", + "type": "boolean", + "label": "Run cmake command inside shell", + "required": false, + "defaultValue": false, + "helpMarkDown": "CMake arguments will be handled like they would be inside of an OS specific shell. It can be used to handle environment variables inside of argument strings.", + "groupName": "advanced" + } + ], + "execution": { + "Node10": { + "target": "cmaketask.js", + "argumentFormat": "" + }, + "Node16": { + "target": "cmaketask.js", + "argumentFormat": "" + }, + "Node20": { + "target": "cmaketask.js", + "argumentFormat": "" + } + }, + "messages": { + "CMakeReturnCode": "CMake exited with return code: %d", + "CMakeFailed": "CMake failed with error: %s" + }, + "_buildConfigMapping": { + "Default": "1.229.0", + "Node20-225": "1.229.1" + } +} \ No newline at end of file diff --git a/_generated/CMakeV1_Node20/task.loc.json b/_generated/CMakeV1_Node20/task.loc.json new file mode 100644 index 000000000000..5fbdf4444f62 --- /dev/null +++ b/_generated/CMakeV1_Node20/task.loc.json @@ -0,0 +1,81 @@ +{ + "id": "7D831C3C-3C68-459A-A5C9-BDE6E659596C", + "name": "CMake", + "friendlyName": "ms-resource:loc.friendlyName", + "description": "ms-resource:loc.description", + "helpUrl": "https://docs.microsoft.com/azure/devops/pipelines/tasks/build/cmake", + "helpMarkDown": "ms-resource:loc.helpMarkDown", + "category": "Build", + "visibility": [ + "Build" + ], + "author": "Microsoft Corporation", + "groups": [ + { + "name": "advanced", + "displayName": "ms-resource:loc.group.displayName.advanced" + } + ], + "demands": [ + "cmake" + ], + "version": { + "Major": 1, + "Minor": 229, + "Patch": 1 + }, + "minimumAgentVersion": "1.91.0", + "instanceNameFormat": "ms-resource:loc.instanceNameFormat", + "inputs": [ + { + "name": "cwd", + "aliases": [ + "workingDirectory" + ], + "type": "filePath", + "label": "ms-resource:loc.input.label.cwd", + "defaultValue": "build", + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.cwd" + }, + { + "name": "cmakeArgs", + "type": "string", + "label": "ms-resource:loc.input.label.cmakeArgs", + "defaultValue": "", + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.cmakeArgs" + }, + { + "name": "runInsideShell", + "type": "boolean", + "label": "ms-resource:loc.input.label.runInsideShell", + "required": false, + "defaultValue": false, + "helpMarkDown": "ms-resource:loc.input.help.runInsideShell", + "groupName": "advanced" + } + ], + "execution": { + "Node10": { + "target": "cmaketask.js", + "argumentFormat": "" + }, + "Node16": { + "target": "cmaketask.js", + "argumentFormat": "" + }, + "Node20": { + "target": "cmaketask.js", + "argumentFormat": "" + } + }, + "messages": { + "CMakeReturnCode": "ms-resource:loc.messages.CMakeReturnCode", + "CMakeFailed": "ms-resource:loc.messages.CMakeFailed" + }, + "_buildConfigMapping": { + "Default": "1.229.0", + "Node20-225": "1.229.1" + } +} \ No newline at end of file diff --git a/_generated/CMakeV1_Node20/tsconfig.json b/_generated/CMakeV1_Node20/tsconfig.json new file mode 100644 index 000000000000..0438b79f69ac --- /dev/null +++ b/_generated/CMakeV1_Node20/tsconfig.json @@ -0,0 +1,6 @@ +{ + "compilerOptions": { + "target": "ES6", + "module": "commonjs" + } +} \ No newline at end of file diff --git a/_generated/CUrlUploaderV2.versionmap.txt b/_generated/CUrlUploaderV2.versionmap.txt new file mode 100644 index 000000000000..22bfac82ab29 --- /dev/null +++ b/_generated/CUrlUploaderV2.versionmap.txt @@ -0,0 +1,2 @@ +Default|2.229.0 +Node20-225|2.229.1 diff --git a/_generated/CUrlUploaderV2/Strings/resources.resjson/de-DE/resources.resjson b/_generated/CUrlUploaderV2/Strings/resources.resjson/de-DE/resources.resjson new file mode 100644 index 000000000000..5de0fe35a640 --- /dev/null +++ b/_generated/CUrlUploaderV2/Strings/resources.resjson/de-DE/resources.resjson @@ -0,0 +1,31 @@ +{ + "loc.friendlyName": "cURL-Uploaddateien", + "loc.helpMarkDown": "[Weitere Informationen zu dieser Aufgabe](https://go.microsoft.com/fwlink/?LinkID=627418)", + "loc.description": "Hiermit werden die von cURL unterstützten Protokolle zum Hochladen von Dateien verwendet.", + "loc.instanceNameFormat": "$(files) mit cURL hochladen", + "loc.group.displayName.advanced": "Erweitert", + "loc.input.label.files": "Dateien", + "loc.input.help.files": "Die hochzuladenden Dateien. Platzhalter können verwendet werden. Beispiel: \"*/*.zip\" für alle ZIP-Dateien in allen Unterordnern.", + "loc.input.label.authType": "Authentifizierungsmethode", + "loc.input.label.serviceEndpoint": "Dienstverbindung", + "loc.input.help.serviceEndpoint": "Die Dienstverbindung mit den Anmeldeinformationen für die Serverauthentifizierung. Verwenden Sie den Dienstverbindungstyp \"Generisch\" für die Dienstverbindung.", + "loc.input.label.username": "Benutzername", + "loc.input.help.username": "Geben Sie den Benutzernamen für die Serverauthentifizierung an.", + "loc.input.label.password": "Kennwort", + "loc.input.help.password": "Geben Sie das Kennwort für die Serverauthentifizierung an. Verwenden Sie eine neue Buildvariable, deren Sperre auf der Registerkarte \"Variablen\" aktiviert ist, um diesen Wert zu verschlüsseln.", + "loc.input.label.url": "URL", + "loc.input.help.url": "Geben Sie die URL an, zu der die Dateien hochgeladen werden. Das Verzeichnis muss mit einem nachgestellten Schrägstrich enden. Mögliche URL-Protokolle: DICT, FILE, FTP, FTPS, GOPHER, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMTP, SMTPS, TELNET und TFTP.", + "loc.input.label.remotePath": "Remoteverzeichnis", + "loc.input.help.remotePath": "Falls angegeben ist dies der Unterordner auf dem Remoteserver für die URL, die in den Anmeldeinformationen festgelegt ist.", + "loc.input.label.options": "Optionale Argumente", + "loc.input.help.options": "Zusätzliche Argumente, die an cURL übergeben werden.", + "loc.input.label.redirectStderr": "Standardfehler an Standardausgabe umleiten", + "loc.input.help.redirectStderr": "Fügt cURL \"--stderr -\" als Argument hinzu. Standardmäßig schreibt cURL die Statusleiste in stderr. Dies wird vom Build als Fehlerausgabe interpretiert. Wenn Sie dieses Kontrollkästchen aktivieren, wird dieses Verhalten unterdrückt.", + "loc.messages.CurlReturnCode": "curl wurde mit dem folgenden Rückgabecode beendet: %d", + "loc.messages.CurlFailed": "curl-Fehler: %s", + "loc.messages.NoMatchingFilesFound": "Keine mit dem Suchmuster übereinstimmenden Dateien gefunden: %s", + "loc.messages.UploadingFiles": "Datei(en) werden hochgeladen: %s", + "loc.messages.CurlNotFound": "curl wurde nicht in PATH gefunden.", + "loc.messages.NotAllFilesUploaded": "Nicht alle Dateien wurden hochgeladen; hochgeladen: %d; gesamt: %d", + "loc.messages.IncompleteEndpoint": "Die Dienstverbindung enthält nicht alle erforderlichen Felder." +} \ No newline at end of file diff --git a/_generated/CUrlUploaderV2/Strings/resources.resjson/en-US/resources.resjson b/_generated/CUrlUploaderV2/Strings/resources.resjson/en-US/resources.resjson new file mode 100644 index 000000000000..cb23543aceca --- /dev/null +++ b/_generated/CUrlUploaderV2/Strings/resources.resjson/en-US/resources.resjson @@ -0,0 +1,31 @@ +{ + "loc.friendlyName": "cURL upload files", + "loc.helpMarkDown": "[Learn more about this task](https://go.microsoft.com/fwlink/?LinkID=627418)", + "loc.description": "Use cURL's supported protocols to upload files", + "loc.instanceNameFormat": "Upload $(files) with cURL", + "loc.group.displayName.advanced": "Advanced", + "loc.input.label.files": "Files", + "loc.input.help.files": "File(s) to be uploaded. Wildcards can be used. For example, `**/*.zip` for all ZIP files in all subfolders.", + "loc.input.label.authType": "Authentication Method", + "loc.input.label.serviceEndpoint": "Service Connection", + "loc.input.help.serviceEndpoint": "The service connection with the credentials for the server authentication. Use the Generic service connection type for the service connection.", + "loc.input.label.username": "Username", + "loc.input.help.username": "Specify the username for server authentication.", + "loc.input.label.password": "Password", + "loc.input.help.password": "Specify the password for server authentication. Use a new build variable with its lock enabled on the Variables tab to encrypt this value.", + "loc.input.label.url": "URL", + "loc.input.help.url": "Specify the URL to where the file(s) will be uploaded. The directory should end with a trailing slash. Possible URL protocols include `DICT://`, `FILE://`, `FTP://`, `FTPS://`, `GOPHER://`, `HTTP://`, `HTTPS://`, `IMAP://`, `IMAPS://`, `LDAP://`, `LDAPS://`, `POP3://`, `POP3S://`, `RTMP://`, `RTSP://`, `SCP://`, `SFTP://`, `SMTP://`, `SMTPS://`, `TELNET://` and `TFTP://`.", + "loc.input.label.remotePath": "Remote Directory", + "loc.input.help.remotePath": "If supplied, this is the sub-folder on the remote server for the URL supplied in the credentials.", + "loc.input.label.options": "Optional Arguments", + "loc.input.help.options": "Additional arguments that will be passed to cURL.", + "loc.input.label.redirectStderr": "Redirect Standard Error to Standard Out", + "loc.input.help.redirectStderr": "Adds '--stderr -' as an argument to cURL. By default, cURL writes its progress bar to stderr, which is interpreted by the build as error output. Enabling this checkbox suppresses that behavior.", + "loc.messages.CurlReturnCode": "curl exited with return code: %d", + "loc.messages.CurlFailed": "curl failed with error: %s", + "loc.messages.NoMatchingFilesFound": "No matching files were found with search pattern: %s", + "loc.messages.UploadingFiles": "Uploading file(s): %s", + "loc.messages.CurlNotFound": "curl was not found in the PATH.", + "loc.messages.NotAllFilesUploaded": "Not all files were uploaded; Uploaded: %d; Total: %d", + "loc.messages.IncompleteEndpoint": "The service connection does not contain all required fields." +} \ No newline at end of file diff --git a/_generated/CUrlUploaderV2/Strings/resources.resjson/es-ES/resources.resjson b/_generated/CUrlUploaderV2/Strings/resources.resjson/es-ES/resources.resjson new file mode 100644 index 000000000000..8a43a8c5bf0a --- /dev/null +++ b/_generated/CUrlUploaderV2/Strings/resources.resjson/es-ES/resources.resjson @@ -0,0 +1,31 @@ +{ + "loc.friendlyName": "Cargar archivos con cURL", + "loc.helpMarkDown": "[Obtener más información acerca de esta tarea](https://go.microsoft.com/fwlink/?LinkID=627418)", + "loc.description": "Usa los protocolos compatibles con cURL para cargar archivos.", + "loc.instanceNameFormat": "Upload $(files) with cURL", + "loc.group.displayName.advanced": "Avanzado", + "loc.input.label.files": "Archivos", + "loc.input.help.files": "Archivos que se van a cargar. Se pueden usar caracteres comodín. Por ejemplo: \"**/*.zip\" para todos los archivos ZIP de todas las subcarpetas.", + "loc.input.label.authType": "Método de autenticación", + "loc.input.label.serviceEndpoint": "Conexión de servicio", + "loc.input.help.serviceEndpoint": "La conexión de servicio con las credenciales para la autenticación del servidor. Use el tipo de conexión de servicio genérico para la conexión del servicio.", + "loc.input.label.username": "Nombre de usuario", + "loc.input.help.username": "Especifique el nombre de usuario para la autenticación de servidor.", + "loc.input.label.password": "Contraseña", + "loc.input.help.password": "Especifique la contraseña para la autenticación de servidor. Use una nueva variable de compilación con el bloqueo habilitado en la pestaña Variables para cifrar este valor.", + "loc.input.label.url": "URL", + "loc.input.help.url": "Especifique la dirección URL en la que se van a cargar los archivos. El directorio debe finalizar con una barra diagonal. Entre los protocolos de URL posibles se incluyen \"DICT://\", \"FILE://\", \"FTP://\", \"FTPS://\", \"GOPHER://\", \"HTTP://\", \"HTTPS://\", \"IMAP://\", \"IMAPS://\", \"LDAP://\", \"LDAPS://\", \"POP3://\", \"POP3S://\", \"RTMP://\", \"RTSP://\", \"SCP://\", \"SFTP://\", \"SMTP://\", \"SMTPS://\", \"TELNET://\" y \"TFTP://\".", + "loc.input.label.remotePath": "Directorio remoto", + "loc.input.help.remotePath": "Si se proporciona, esta es la subcarpeta en el servidor remoto para la dirección URL especificada en las credenciales.", + "loc.input.label.options": "Argumentos opcionales", + "loc.input.help.options": "Argumentos adicionales que se van a pasar a cURL.", + "loc.input.label.redirectStderr": "Redirigir error estándar a salida estándar", + "loc.input.help.redirectStderr": "Agrega \"--stderr -\" como un argumento a cURL. De manera predeterminada, cURL escribe su barra de progreso en stderr, cosa que la compilación considerará un resultado erróneo. Al habilitar esta casilla, se suprime ese comportamiento.", + "loc.messages.CurlReturnCode": "Se cerró curl con el código de devolución: %d", + "loc.messages.CurlFailed": "Error de curl con el mensaje: %s", + "loc.messages.NoMatchingFilesFound": "No se encontraron archivos coincidentes con el patrón de búsqueda: %s", + "loc.messages.UploadingFiles": "Cargando archivos(s): %s", + "loc.messages.CurlNotFound": "No se ha encontrado curl en la RUTA DE ACCESO.", + "loc.messages.NotAllFilesUploaded": "No se han cargado todos los archivos. Cargados: %d; total: %d", + "loc.messages.IncompleteEndpoint": "La conexión de servicio no contiene todos los campos obligatorios." +} \ No newline at end of file diff --git a/_generated/CUrlUploaderV2/Strings/resources.resjson/fr-FR/resources.resjson b/_generated/CUrlUploaderV2/Strings/resources.resjson/fr-FR/resources.resjson new file mode 100644 index 000000000000..5efdd057e787 --- /dev/null +++ b/_generated/CUrlUploaderV2/Strings/resources.resjson/fr-FR/resources.resjson @@ -0,0 +1,31 @@ +{ + "loc.friendlyName": "Chargement de fichiers via cURL", + "loc.helpMarkDown": "[En savoir plus sur cette tâche](https://go.microsoft.com/fwlink/?LinkID=627418)", + "loc.description": "Utiliser les protocoles pris en charge par cURL pour charger des fichiers", + "loc.instanceNameFormat": "Télécharger $(files) avec cURL", + "loc.group.displayName.advanced": "Avancé", + "loc.input.label.files": "Fichiers", + "loc.input.help.files": "Fichier(s) à charger. Vous pouvez utiliser des caractères génériques. Par exemple, '**/*.zip' pour tous les fichiers ZIP de tous les sous-dossiers.", + "loc.input.label.authType": "Méthode d'authentification", + "loc.input.label.serviceEndpoint": "Connexion de service", + "loc.input.help.serviceEndpoint": "Connexion de service avec les informations d'identification pour l'authentification serveur. Utilisez le type de connexion de service Générique pour la connexion de service.", + "loc.input.label.username": "Nom d'utilisateur", + "loc.input.help.username": "Spécifiez le nom d'utilisateur pour l'authentification du serveur.", + "loc.input.label.password": "Mot de passe", + "loc.input.help.password": "Spécifiez le mot de passe pour l'authentification du serveur. Pour chiffrer cette valeur, utilisez une nouvelle variable de build avec le verrou activé sous l'onglet Variables.", + "loc.input.label.url": "URL", + "loc.input.help.url": "Spécifiez l'URL à utiliser pour charger le ou les fichiers. Le répertoire doit se terminer par une barre oblique finale. Les protocoles d'URL sont notamment 'DICT://', 'FILE://', 'FTP://', 'FTPS://', 'GOPHER://', 'HTTP://', 'HTTPS://', 'IMAP://', 'IMAPS://', 'LDAP://', 'LDAPS://', 'POP3://', 'POP3S://', 'RTMP://', 'RTSP://', 'SCP://', 'SFTP://', 'SMTP://', 'SMTPS://', 'TELNET://' et 'TFTP://'.", + "loc.input.label.remotePath": "Répertoire distant", + "loc.input.help.remotePath": "S'il est fourni, il s'agit du sous-dossier du serveur distant correspondant à l'URL fournie dans les informations d'identification.", + "loc.input.label.options": "Arguments facultatifs", + "loc.input.help.options": "Arguments supplémentaires qui seront passés à cURL.", + "loc.input.label.redirectStderr": "Rediriger une erreur standard vers une sortie standard", + "loc.input.help.redirectStderr": "Ajoute '--stderr -' comme argument à cURL. Par défaut, cURL écrit sa barre de progression dans stderr, que la build interprète comme une sortie d'erreur. Si vous cochez cette case, ce comportement est supprimé.", + "loc.messages.CurlReturnCode": "Sortie de curl avec le code de retour : %d", + "loc.messages.CurlFailed": "Échec de curl avec l'erreur : %s", + "loc.messages.NoMatchingFilesFound": "Aucun fichier correspondant n'a été trouvé avec le modèle de recherche : %s", + "loc.messages.UploadingFiles": "Téléchargement du ou des fichiers : %s", + "loc.messages.CurlNotFound": "curl introuvable dans le CHEMIN.", + "loc.messages.NotAllFilesUploaded": "Tous les fichiers n'ont pas été chargés. Fichiers chargés : %d. Total : %d", + "loc.messages.IncompleteEndpoint": "La connexion de service ne contient pas tous les champs obligatoires." +} \ No newline at end of file diff --git a/_generated/CUrlUploaderV2/Strings/resources.resjson/it-IT/resources.resjson b/_generated/CUrlUploaderV2/Strings/resources.resjson/it-IT/resources.resjson new file mode 100644 index 000000000000..c806de85e807 --- /dev/null +++ b/_generated/CUrlUploaderV2/Strings/resources.resjson/it-IT/resources.resjson @@ -0,0 +1,31 @@ +{ + "loc.friendlyName": "Caricamento file con cURL", + "loc.helpMarkDown": "[Altre informazioni su questa attività](https://go.microsoft.com/fwlink/?LinkID=627418)", + "loc.description": "Usa i protocolli supportati da cURL per caricare i file", + "loc.instanceNameFormat": "Carica $(files) con cURL", + "loc.group.displayName.advanced": "Avanzate", + "loc.input.label.files": "File", + "loc.input.help.files": "File da caricare. È possibile usare i caratteri jolly. Usare ad esempio `**/*.zip` per indicare tutti i file ZIP in tutte le sottocartelle.", + "loc.input.label.authType": "Metodo di autenticazione", + "loc.input.label.serviceEndpoint": "Connessione al servizio", + "loc.input.help.serviceEndpoint": "Connessione al servizio con le credenziali per l'autenticazione del server. Usare il tipo di connessione al servizio generica per la connessione al servizio.", + "loc.input.label.username": "Nome utente", + "loc.input.help.username": "Consente di specificare il nome utente per l'autenticazione server.", + "loc.input.label.password": "Password", + "loc.input.help.password": "Consente di specificare la password per l'autenticazione server. Per crittografare questo valore, usare una nuova variabile di compilazione con il relativo blocco abilitato nella scheda Variabili.", + "loc.input.label.url": "URL", + "loc.input.help.url": "Consente di specificare l'URL in cui verranno caricati i file. La directory deve terminare con una barra finale. I protocolli URL possibili includono: `DICT://`, `FILE://`, `FTP://`, `FTPS://`, `GOPHER://`, `HTTP://`, `HTTPS://`, `IMAP://`, `IMAPS://`, `LDAP://`, `LDAPS://`, `POP3://`, `POP3S://`, `RTMP://`, `RTSP://`, `SCP://`, `SFTP://`, `SMTP://`, `SMTPS://`, `TELNET://` e `TFTP://`.", + "loc.input.label.remotePath": "Directory remota", + "loc.input.help.remotePath": "Se specificata, si tratta della sottocartella nel server remoto per l'URL fornito nelle credenziali.", + "loc.input.label.options": "Argomenti facoltativi", + "loc.input.help.options": "Argomenti aggiuntivi che verranno passati a cURL.", + "loc.input.label.redirectStderr": "Reindirizza errore standard a output standard", + "loc.input.help.redirectStderr": "Consente di aggiungere '--stderr -' come argomento di cURL. Per impostazione predefinita, cURL scrive l'indicatore di stato in stderr e questo viene interpretato da dalla compilazione come un output di errore. Per evitare tale comportamento, abilitare questa casella di controllo.", + "loc.messages.CurlReturnCode": "Il comando curl è stato terminato. Codice restituito: %d", + "loc.messages.CurlFailed": "Il comando curl non è riuscito. Errore: %s", + "loc.messages.NoMatchingFilesFound": "Non sono stati trovati file corrispondenti con il criterio di ricerca: %s", + "loc.messages.UploadingFiles": "Caricamento dei file: %s", + "loc.messages.CurlNotFound": "Il comando curl non è stato trovato in PATH.", + "loc.messages.NotAllFilesUploaded": "Non sono stati caricati tutti i file. File caricati: %d; file totali: %d", + "loc.messages.IncompleteEndpoint": "La connessione al servizio non contiene tutti i campi obbligatori." +} \ No newline at end of file diff --git a/_generated/CUrlUploaderV2/Strings/resources.resjson/ja-JP/resources.resjson b/_generated/CUrlUploaderV2/Strings/resources.resjson/ja-JP/resources.resjson new file mode 100644 index 000000000000..c7831dfe5a9b --- /dev/null +++ b/_generated/CUrlUploaderV2/Strings/resources.resjson/ja-JP/resources.resjson @@ -0,0 +1,31 @@ +{ + "loc.friendlyName": "ファイルを cURL でアップロード", + "loc.helpMarkDown": "[このタスクの詳細を表示](https://go.microsoft.com/fwlink/?LinkID=627418)", + "loc.description": "cURL のサポートされているプロトコルを使用してファイルをアップロードします", + "loc.instanceNameFormat": "cURL で $(files) をアップロード", + "loc.group.displayName.advanced": "詳細設定", + "loc.input.label.files": "ファイル", + "loc.input.help.files": "アップロードするファイル。ワイルドカードを使用できます。たとえば、全サブフォルダー内のすべての ZIP ファイルの場合は `**/*.zip` です。", + "loc.input.label.authType": "認証方法", + "loc.input.label.serviceEndpoint": "サービス接続", + "loc.input.help.serviceEndpoint": "サーバー認証の資格情報を使用したサービス接続です。サービス接続には汎用サービス接続の種類を使用します。", + "loc.input.label.username": "ユーザー名", + "loc.input.help.username": "サーバー認証のユーザー名を指定します。", + "loc.input.label.password": "パスワード", + "loc.input.help.password": "サーバー認証のパスワードを指定します。[変数] タブでロックが有効になっている新しいビルド変数を使用して、この値を暗号化します。", + "loc.input.label.url": "URL", + "loc.input.help.url": "ファイルのアップロード先の URL を指定します。ディレクトリの末尾はスラッシュで終わる必要があります。使用可能な URL プロトコルは、`DICT://`、`FILE://`、`FTP://`、`FTPS://`、`GOPHER://`、`HTTP://`、`HTTPS://`、`IMAP://`、`IMAPS://`、`LDAP://`、`LDAPS://`、`POP3://`、`POP3S://`、`RTMP://`、`RTSP://`、`SCP://`、`SFTP://`、`SMTP://`、`SMTPS://`、`TELNET://`、`TFTP://` などです。", + "loc.input.label.remotePath": "リモート ディレクトリ", + "loc.input.help.remotePath": "指定する場合、これは資格情報で提供された URL のリモート サーバー上のサブフォルダーです。", + "loc.input.label.options": "オプションの引数", + "loc.input.help.options": "cURL に渡す追加の引数。", + "loc.input.label.redirectStderr": "標準エラーを標準出力にリダイレクトします", + "loc.input.help.redirectStderr": "引数として '--stderr -' を cURL に追加します。既定では、cURL は stderr に進行状況バーを書き込み、ビルドはそれをエラー出力と見なします。このチェックボックスをオンにするとその動作が抑制されます。", + "loc.messages.CurlReturnCode": "curl が次のリターン コードで終了しました: %d", + "loc.messages.CurlFailed": "curl に失敗し、次のエラーが発生しました: %s", + "loc.messages.NoMatchingFilesFound": "次の検索パターンと一致するファイルが見つかりませんでした: %s", + "loc.messages.UploadingFiles": "ファイルをアップロードしています: %s", + "loc.messages.CurlNotFound": "curl がパスにありませんでした。", + "loc.messages.NotAllFilesUploaded": "一部のファイルがアップロードされませんでした。アップロード数: %d、合計数: %d", + "loc.messages.IncompleteEndpoint": "サービス接続にはすべての必要なフィールドが含まれていません。" +} \ No newline at end of file diff --git a/_generated/CUrlUploaderV2/Strings/resources.resjson/ko-KR/resources.resjson b/_generated/CUrlUploaderV2/Strings/resources.resjson/ko-KR/resources.resjson new file mode 100644 index 000000000000..a733c3d8c83b --- /dev/null +++ b/_generated/CUrlUploaderV2/Strings/resources.resjson/ko-KR/resources.resjson @@ -0,0 +1,31 @@ +{ + "loc.friendlyName": "cURL 파일 업로드", + "loc.helpMarkDown": "[이 작업에 대한 자세한 정보](https://go.microsoft.com/fwlink/?LinkID=627418)", + "loc.description": "cURL에서 지원되는 프로토콜을 사용하여 파일을 업로드합니다.", + "loc.instanceNameFormat": "cURL로 $(files) 업로드", + "loc.group.displayName.advanced": "고급", + "loc.input.label.files": "파일", + "loc.input.help.files": "업로드할 파일입니다. 와일드카드를 사용할 수 있습니다. 예를 들어 모든 하위 폴더에 있는 ZIP 파일을 모두 표시하려면 '**/*.zip'을 사용합니다.", + "loc.input.label.authType": "인증 방법", + "loc.input.label.serviceEndpoint": "서비스 연결", + "loc.input.help.serviceEndpoint": "서버 인증을 위한 자격 증명이 포함된 서비스 연결입니다. 서비스 연결에는 일반 서비스 연결 형식을 사용하세요.", + "loc.input.label.username": "사용자 이름", + "loc.input.help.username": "서버 인증을 위한 사용자 이름을 지정하세요.", + "loc.input.label.password": "암호", + "loc.input.help.password": "서버 인증을 위한 암호를 지정하세요. 이 값을 암호화하려면 [변수] 탭에서 해당 잠금을 사용하도록 설정한 상태로 새 빌드 변수를 사용하세요.", + "loc.input.label.url": "URL", + "loc.input.help.url": "파일을 업로드할 URL을 지정하세요. 디렉터리는 후행 슬래시로 끝나야 합니다. `DICT://`, `FILE://`, `FTP://`, `FTPS://`, `GOPHER://`, `HTTP://`, `HTTPS://`, `IMAP://`, `IMAPS://`, `LDAP://`, `LDAPS://`, `POP3://`, `POP3S://`, `RTMP://`, `RTSP://`, `SCP://`, `SFTP://`, `SMTP://`, `SMTPS://`, `TELNET://`, `TFTP://`와 같은 URL 프로토콜을 사용할 수 있습니다.", + "loc.input.label.remotePath": "원격 디렉터리", + "loc.input.help.remotePath": "지정된 경우 자격 증명에 제공된 URL에 대한 원격 서버의 하위 폴더입니다.", + "loc.input.label.options": "선택적 인수", + "loc.input.help.options": "cURL에 전달할 추가 인수입니다.", + "loc.input.label.redirectStderr": "표준 오류를 표준 출력으로 리디렉션", + "loc.input.help.redirectStderr": "'--stderr -'을 cURL에 인수로 추가합니다. 기본적으로 cURL은 진행률 표시줄을 stderr에 쓰고 이는 빌드에 의해 오류 출력으로 해석됩니다. 이 확인란을 사용하면 해당 동작이 표시되지 않습니다.", + "loc.messages.CurlReturnCode": "cURL이 종료되었습니다(반환 코드: %d).", + "loc.messages.CurlFailed": "cURL이 실패했습니다(오류: %s).", + "loc.messages.NoMatchingFilesFound": "다음 검색 패턴과 일치하는 파일을 찾을 수 없습니다. %s", + "loc.messages.UploadingFiles": "%s 파일을 업로드하는 중입니다.", + "loc.messages.CurlNotFound": "PATH에서 cURL을 찾을 수 없습니다.", + "loc.messages.NotAllFilesUploaded": "일부 파일이 업로드되지 않았습니다. 업로드됨: %d. 전체: %d", + "loc.messages.IncompleteEndpoint": "서비스 연결에 필수 필드 중 일부가 포함되어 있지 않습니다." +} \ No newline at end of file diff --git a/_generated/CUrlUploaderV2/Strings/resources.resjson/ru-RU/resources.resjson b/_generated/CUrlUploaderV2/Strings/resources.resjson/ru-RU/resources.resjson new file mode 100644 index 000000000000..bd36a3cb8e59 --- /dev/null +++ b/_generated/CUrlUploaderV2/Strings/resources.resjson/ru-RU/resources.resjson @@ -0,0 +1,31 @@ +{ + "loc.friendlyName": "Отправка файлов с помощью cURL", + "loc.helpMarkDown": "[См. дополнительные сведения об этой задаче](https://go.microsoft.com/fwlink/?LinkID=627418)", + "loc.description": "Использовать поддерживаемые протоколы cURL для отправки файлов", + "loc.instanceNameFormat": "Отправить $(files) с помощью cURL", + "loc.group.displayName.advanced": "Дополнительно", + "loc.input.label.files": "Файлы", + "loc.input.help.files": "Файлы, которые нужно отправить. Можно использовать подстановочные знаки. Например: \"**\\*.zip\" для всех ZIP-файлов во всех вложенных папках.", + "loc.input.label.authType": "Способ проверки подлинности", + "loc.input.label.serviceEndpoint": "Подключение к службе", + "loc.input.help.serviceEndpoint": "Подключение к службе с использованием учетных данных для проверки подлинности сервера. Используйте универсальный тип подключения к службе.", + "loc.input.label.username": "Имя пользователя", + "loc.input.help.username": "Укажите имя пользователя для проверки подлинности сервера.", + "loc.input.label.password": "Пароль", + "loc.input.help.password": "Укажите пароль, используемый для проверки подлинности сервера. Чтобы зашифровать это значение, используйте новую переменную сборки с включенной блокировкой на вкладке \"Переменные\".", + "loc.input.label.url": "URL-адрес", + "loc.input.help.url": "Укажите URL-адрес, по которому будут отправлены файлы. Каталог должен завершаться косой чертой. Возможные протоколы: \"DICT://\", \"FILE://\", \"FTP://\", \"FTPS://\", \"GOPHER://\", \"HTTP://\", \"HTTPS://\", \"IMAP://\", \"IMAPS://\", \"LDAP://\", \"LDAPS://\", \"POP3://\", \"POP3S://\", \"RTMP://\", \"RTSP://\", \"SCP://\", \"SFTP://\", \"SMTP://\", \"SMTPS://\", \"TELNET://\" и \"TFTP://\".", + "loc.input.label.remotePath": "Удаленный каталог", + "loc.input.help.remotePath": "Если задано, это вложенная папка на удаленном сервере для URL-адреса, указанного в учетных данных.", + "loc.input.label.options": "Дополнительные аргументы", + "loc.input.help.options": "Дополнительные аргументы, которые будут переданы в cURL.", + "loc.input.label.redirectStderr": "Перенаправление стандартной ошибки на стандартный выход", + "loc.input.help.redirectStderr": "Добавьте параметр \"--stderr -\" в cURL. По умолчанию cURL записывает данные индикатора выполнения в stderr. Сборка интерпретирует эти данные как выходные данные ошибки. Если установить этот флажок, данное поведение будет переопределено.", + "loc.messages.CurlReturnCode": "curl завершила работу с кодом возврата: %d", + "loc.messages.CurlFailed": "Сбой curl с ошибкой %s", + "loc.messages.NoMatchingFilesFound": "Не найдены файлы, соответствующие шаблону поиска: %s.", + "loc.messages.UploadingFiles": "Отправка файлов: %s", + "loc.messages.CurlNotFound": "curl не найдена в переменной среды PATH.", + "loc.messages.NotAllFilesUploaded": "Отправлены не все файлы. Отправлено: %d; всего: %d", + "loc.messages.IncompleteEndpoint": "Подключение к службе содержит не все обязательные поля." +} \ No newline at end of file diff --git a/_generated/CUrlUploaderV2/Strings/resources.resjson/zh-CN/resources.resjson b/_generated/CUrlUploaderV2/Strings/resources.resjson/zh-CN/resources.resjson new file mode 100644 index 000000000000..c2c8687e4e0b --- /dev/null +++ b/_generated/CUrlUploaderV2/Strings/resources.resjson/zh-CN/resources.resjson @@ -0,0 +1,31 @@ +{ + "loc.friendlyName": "cURL 上传文件", + "loc.helpMarkDown": "[详细了解此任务](https://go.microsoft.com/fwlink/?LinkID=627418)", + "loc.description": "使用 cURL 的受支持协议上传文件", + "loc.instanceNameFormat": "使用 cURL 上载 $(files)", + "loc.group.displayName.advanced": "高级", + "loc.input.label.files": "文件", + "loc.input.help.files": "要上传的文件。可以使用通配符。例如,\"**/*.zip\" 表示所有子文件夹中的所有 ZIP 文件。", + "loc.input.label.authType": "身份验证方法", + "loc.input.label.serviceEndpoint": "服务连接", + "loc.input.help.serviceEndpoint": "使用凭据进行服务器身份验证的服务连接。使用通用服务连接类型来实现服务连接。", + "loc.input.label.username": "用户名", + "loc.input.help.username": "指定要用于服务器身份验证的用户名。", + "loc.input.label.password": "密码", + "loc.input.help.password": "指定要用于服务器身份验证的密码。使用在“变量”选项卡上启用了锁定的新的生成变量来加密该值。", + "loc.input.label.url": "URL", + "loc.input.help.url": "指定文件将上传到的 URL。目录应以尾部反斜杠结尾。可能的 URL 协议包括 \"DICT://\"、\"FILE://\"、\"FTP://\"、\"FTPS://\"、\"GOPHER://\"、\"HTTP://\"、\"HTTPS://\"、\"IMAP://\"、\"IMAPS://\"、\"LDAP://\"、\"LDAPS://\"、\"POP3://\"、\"POP3S://\"、\"RTMP://\"、\"RTSP://\"、\"SCP://\"、\"SFTP://\"、\"SMTP://\"、\"SMTPS://\"、\"TELNET://\" 和 \"TFTP://\"。", + "loc.input.label.remotePath": "远程目录", + "loc.input.help.remotePath": "如果提供,则此为凭据中提供的 URL 的远程服务器上的子文件夹。", + "loc.input.label.options": "可选参数", + "loc.input.help.options": "将传递给 cURL 的其他参数。", + "loc.input.label.redirectStderr": "将标准错误重定向到标准输出", + "loc.input.help.redirectStderr": "将 \"--stderr -\" 作为参数添加到 cURL。默认情况下,cURL 将其进度条写入 stderr,生成将此过程解释为错误输出。启用此复选框可阻止该行为。", + "loc.messages.CurlReturnCode": "curl 已退出,返回代码为: %d", + "loc.messages.CurlFailed": "curl 失败,出现错误: %s", + "loc.messages.NoMatchingFilesFound": "使用搜索模式 %s 未找到匹配的文件", + "loc.messages.UploadingFiles": "正在上传文件: %s", + "loc.messages.CurlNotFound": "路径中未找到 curl。", + "loc.messages.NotAllFilesUploaded": "并非所有文件都已上传。已上传: %d;总计: %d", + "loc.messages.IncompleteEndpoint": "服务连接未包含所有必填字段。" +} \ No newline at end of file diff --git a/_generated/CUrlUploaderV2/Strings/resources.resjson/zh-TW/resources.resjson b/_generated/CUrlUploaderV2/Strings/resources.resjson/zh-TW/resources.resjson new file mode 100644 index 000000000000..900d13eced8c --- /dev/null +++ b/_generated/CUrlUploaderV2/Strings/resources.resjson/zh-TW/resources.resjson @@ -0,0 +1,31 @@ +{ + "loc.friendlyName": "cURL 上傳檔案", + "loc.helpMarkDown": "[深入了解此工作](https://go.microsoft.com/fwlink/?LinkID=627418)", + "loc.description": "使用 cURL 的支援通訊協定來上傳檔案", + "loc.instanceNameFormat": "使用 cURL 上傳 $(files) ", + "loc.group.displayName.advanced": "進階", + "loc.input.label.files": "檔案", + "loc.input.help.files": "要上傳的檔案。可使用萬用字元。例如,`**/*.zip` 即適用於所有子資料夾中的所有 ZIP 檔案。", + "loc.input.label.authType": "驗證方法", + "loc.input.label.serviceEndpoint": "服務連線", + "loc.input.help.serviceEndpoint": "用於進行伺服器驗證的具認證服務連線。請為服務連線使用一般服務連線類型。", + "loc.input.label.username": "使用者名稱", + "loc.input.help.username": "指定進行伺服器驗證的使用者名稱。", + "loc.input.label.password": "密碼", + "loc.input.help.password": "指定進行伺服器驗證的密碼。請使用已在 [變數] 索引標籤上啟用其鎖定的新組建變數來加密這個值。", + "loc.input.label.url": "URL", + "loc.input.help.url": "指定要將檔案上傳至其中的 URL。目錄的結尾應該是正斜線結尾。可能的 URL 通訊協定包括 `DICT://`、`FILE://`、`FTP://`、`FTPS://`、`GOPHER://`、`HTTP://`、`HTTPS://`、`IMAP://`、`IMAPS://`、`LDAP://`、`LDAPS://`、`POP3://`、`POP3S://`、`RTMP://`、`RTSP://`、`SCP://`、`SFTP://`、`SMTP://`、`SMTPS://`、`TELNET://` 和 `TFTP://`。", + "loc.input.label.remotePath": "遠端目錄", + "loc.input.help.remotePath": "若有提供,這會是認證中所提供之 URL 的遠端伺服器上之子資料夾。", + "loc.input.label.options": "選擇性引數", + "loc.input.help.options": "即將傳遞至 cURL 的額外引數。", + "loc.input.label.redirectStderr": "將標準錯誤重新導向至標準輸出", + "loc.input.help.redirectStderr": "將 '--stderr -' 以引數形式加入 cURL。cURL 預設會將其進度列寫入 stderr,而組建會將之解譯為錯誤輸出。啟用這個核取方塊會隱藏該行為。", + "loc.messages.CurlReturnCode": "curl 結束,傳回碼為: %d", + "loc.messages.CurlFailed": "curl 失敗,發生錯誤: %s", + "loc.messages.NoMatchingFilesFound": "使用下列搜尋模式找不到任何相符檔案: %s", + "loc.messages.UploadingFiles": "正在上傳檔案: %s", + "loc.messages.CurlNotFound": "在 PATH 中找不到 curl。", + "loc.messages.NotAllFilesUploaded": "並未上傳所有檔案; 已上傳: %d; 總計: %d", + "loc.messages.IncompleteEndpoint": "此服務連線並未包含所有必要欄位。" +} \ No newline at end of file diff --git a/_generated/CUrlUploaderV2/Tests/L0.ts b/_generated/CUrlUploaderV2/Tests/L0.ts new file mode 100644 index 000000000000..fe251c7a447e --- /dev/null +++ b/_generated/CUrlUploaderV2/Tests/L0.ts @@ -0,0 +1,60 @@ +import fs = require('fs'); +import assert = require('assert'); +import path = require('path'); +import * as ttm from 'azure-pipelines-task-lib/mock-test'; + +describe('CUrlUploaderV2 Suite', function () { + this.timeout(parseInt(process.env.TASK_TEST_TIMEOUT) || 20000); + + it('runs a curl with single file', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0CurlGoodSingleFile.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.invokedToolCount == 1, 'should have only run curl'); + assert(tr.stderr.length == 0, 'should not have written to stderr'); + assert(tr.succeeded, 'task should have succeeded'); + + done(); + }); + + it('fails if url (req) input not set', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0NoUrl.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.stdOutContained('Input required: url'), 'Should have printed: Input required: url'); + assert(tr.failed, 'task should have failed'); + assert(tr.invokedToolCount == 0, 'should exit before running curl'); + + done(); + }); + + it('fails if files (req) input not set', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0NoFiles.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.stdOutContained('Input required: files'), 'Should have printed: Input required: files'); + assert(tr.failed, 'task should have failed'); + assert(tr.invokedToolCount == 0, 'should exit before running curl'); + + done(); + }); + + it('run curl with multiple files', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0CurlGoodMultiFiles.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.invokedToolCount == 1, 'should have only run curl'); + assert(tr.stderr.length == 0, 'should not have written to stderr'); + assert(tr.succeeded, 'task should have succeeded'); + + done(); + }); +}); diff --git a/_generated/CUrlUploaderV2/Tests/L0CurlGoodMultiFiles.ts b/_generated/CUrlUploaderV2/Tests/L0CurlGoodMultiFiles.ts new file mode 100644 index 000000000000..af1336d4be35 --- /dev/null +++ b/_generated/CUrlUploaderV2/Tests/L0CurlGoodMultiFiles.ts @@ -0,0 +1,41 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'curluploader.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('files', '/some/path/file*'); +tr.setInput('username', 'user'); +tr.setInput('password', 'pass'); +tr.setInput('url', 'ftp://some.ftp.com/'); +tr.setInput('redirectStderr', 'true'); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "curl": "/usr/local/bin/curl", + "node": "/usr/local/bin/node" + }, + "exec": { + "curl -T {/some/path/file1,/some/path/file2} ftp://some.ftp.com/ --stderr - -u user:pass": { + "code": 0, + "stdout": "curl output here" + } + }, + "find": { + "/some/path": [ + "/some/path/file1", + "/some/path/file2" + ] + }, + "match": { + "/some/path/file*": [ + "/some/path/file1", + "/some/path/file2" + ] + }, +}; +tr.setAnswers(a); + +tr.run(); \ No newline at end of file diff --git a/_generated/CUrlUploaderV2/Tests/L0CurlGoodSingleFile.ts b/_generated/CUrlUploaderV2/Tests/L0CurlGoodSingleFile.ts new file mode 100644 index 000000000000..606f510be939 --- /dev/null +++ b/_generated/CUrlUploaderV2/Tests/L0CurlGoodSingleFile.ts @@ -0,0 +1,32 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'curluploader.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('files', '/some/path/one'); +tr.setInput('username', 'user'); +tr.setInput('password', 'pass'); +tr.setInput('url', 'ftp://some.ftp.com/'); +tr.setInput('redirectStderr', 'true'); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "curl": "/usr/local/bin/curl", + "node": "/usr/local/bin/node" + }, + "exec": { + "curl -T /some/path/one ftp://some.ftp.com/ --stderr - -u user:pass": { + "code": 0, + "stdout": "curl output here" + } + }, + "checkPath": { + "/some/path/one": true + } +}; +tr.setAnswers(a); + +tr.run(); \ No newline at end of file diff --git a/_generated/CUrlUploaderV2/Tests/L0NoFiles.ts b/_generated/CUrlUploaderV2/Tests/L0NoFiles.ts new file mode 100644 index 000000000000..f09097203978 --- /dev/null +++ b/_generated/CUrlUploaderV2/Tests/L0NoFiles.ts @@ -0,0 +1,28 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'curluploader.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('url', 'ftp://some.ftp.com/'); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "curl": "/usr/local/bin/curl", + "node": "/usr/local/bin/node" + }, + "exec": { + "curl -T /some/path/one ftp://some.ftp.com/ --stderr - -u user:pass": { + "code": 0, + "stdout": "curl output here" + } + }, + "checkPath": { + "/some/path/one": true + } +}; +tr.setAnswers(a); + +tr.run(); \ No newline at end of file diff --git a/_generated/CUrlUploaderV2/Tests/L0NoUrl.ts b/_generated/CUrlUploaderV2/Tests/L0NoUrl.ts new file mode 100644 index 000000000000..2e00a3762337 --- /dev/null +++ b/_generated/CUrlUploaderV2/Tests/L0NoUrl.ts @@ -0,0 +1,28 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'curluploader.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('files', '/some/path/one'); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "curl": "/usr/local/bin/curl", + "node": "/usr/local/bin/node" + }, + "exec": { + "curl -T /some/path/one ftp://some.ftp.com/ --stderr - -u user:pass": { + "code": 0, + "stdout": "curl output here" + } + }, + "checkPath": { + "/some/path/one": true + } +}; +tr.setAnswers(a); + +tr.run(); \ No newline at end of file diff --git a/_generated/CUrlUploaderV2/Tests/package-lock.json b/_generated/CUrlUploaderV2/Tests/package-lock.json new file mode 100644 index 000000000000..2249be616e7d --- /dev/null +++ b/_generated/CUrlUploaderV2/Tests/package-lock.json @@ -0,0 +1,14 @@ +{ + "name": "curl-uploader-tests", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/mocha": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", + "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==", + "dev": true + } + } +} diff --git a/_generated/CUrlUploaderV2/Tests/package.json b/_generated/CUrlUploaderV2/Tests/package.json new file mode 100644 index 000000000000..c2e3f9a1554e --- /dev/null +++ b/_generated/CUrlUploaderV2/Tests/package.json @@ -0,0 +1,22 @@ +{ + "name": "curl-uploader-tests", + "version": "1.0.0", + "description": "Azure Pipelines Curl Uploader V2 Task Tests", + "main": "L0.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/Microsoft/azure-pipelines-tasks.git" + }, + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Microsoft/azure-pipelines-tasks/issues" + }, + "homepage": "https://github.com/Microsoft/azure-pipelines-tasks#readme", + "devDependencies": { + "@types/mocha": "^5.2.0" + } +} diff --git a/_generated/CUrlUploaderV2/curluploader.ts b/_generated/CUrlUploaderV2/curluploader.ts new file mode 100644 index 000000000000..200bf818a2dd --- /dev/null +++ b/_generated/CUrlUploaderV2/curluploader.ts @@ -0,0 +1,167 @@ +import path = require('path'); +import tl = require('azure-pipelines-task-lib/task'); +import os = require('os'); +import trm = require('azure-pipelines-task-lib/toolrunner'); +import URL = require('url'); + +var firstWildcardIndex = function (str) { + var idx = str.indexOf('*'); + + var idxOfWildcard = str.indexOf('?'); + if (idxOfWildcard > -1) { + if (idx > -1) { + idx = Math.min(idx, idxOfWildcard); + } else { + idx = idxOfWildcard; + } + } + + return idx; +} + +async function run() { + try { + tl.setResourcePath(path.join( __dirname, 'task.json')); + + var isWin = os.type().match(/^Win/); + + var filesPattern: string = tl.getInput('files', true); + var redirectStderr: boolean = tl.getBoolInput('redirectStderr', false); + var options: string = tl.getInput('options', false); + + let url: string = ''; + let username: string = ''; + let password: string = ''; + let authType: string = tl.getInput('authType', false); + if (authType === 'ServiceEndpoint') { + let serviceEndpointID: string = tl.getInput('serviceEndpoint', true); + let serviceEndpoint: tl.EndpointAuthorization = tl.getEndpointAuthorization(serviceEndpointID, false); + username = serviceEndpoint.parameters['username']; + password = serviceEndpoint.parameters['password']; + url = URL.format(URL.parse(tl.getEndpointUrl(serviceEndpointID, false))); // url has a / at the end + if (!username || !password || !url) { + throw new Error(tl.loc('IncompleteEndpoint')); + } + } else { + username = tl.getInput('username', false); + password = tl.getInput('password', false); + url = tl.getInput('url', true); + } + url = url.trim(); + + let remotePath: string = tl.getInput('remotePath', false); + if (remotePath) { + if(authType === 'UserAndPass'){ + // slash should only be added when authType is UserAndPass + // when authType is ServiceEndpoint there already is a slash + url = url + "/"; + } + url = url + remotePath.replace(/\\/gi, "/").trim(); + } + + // Find location of curl + var curlPath: string = tl.which('curl'); + if (!curlPath) { + throw new Error(tl.loc('CurlNotFound')); + } + + // Prepare curl upload command line + var curlRunner: trm.ToolRunner = tl.tool('curl'); + + // Resolve files for the specified value or pattern + let uploadCount = 1; + if (filesPattern.indexOf('*') == -1 && filesPattern.indexOf('?') == -1) { + // No pattern found, check literal path to a single file + tl.checkPath(filesPattern, "filesPattern"); + + // Use the specified single file + var uploadFiles = filesPattern; + } + else { + // Find app files matching the specified pattern + tl.debug('Matching glob pattern: ' + filesPattern); + + // First find the most complete path without any matching patterns + var idx = firstWildcardIndex(filesPattern); + tl.debug('Index of first wildcard: ' + idx); + + var findPathRoot = path.dirname(filesPattern.slice(0, idx)); + tl.debug('find root dir: ' + findPathRoot); + + // Now we get a list of all files under this root + var allFiles = tl.find(findPathRoot); + + // Now matching the pattern against all files + var uploadFilesList = tl.match(allFiles, filesPattern, undefined, {matchBase: true}).map( (s) => { + // If running on Windows agent, normalize the Windows style file paths to use '/' rather than '\'. + // If running on Linux or macOS, escape any '\' in filenames. This is necessary as curl.exe treats + // '\' in filenames as escape characters, preventing it from finding those files. + return isWin ? s.replace(/\\/g, '/') : s.replace(/\\/g, '\\\\'); + }); + + // Fail if no matching app files were found + if (!uploadFilesList || uploadFilesList.length == 0) { + throw new Error(tl.loc('NoMatchingFilesFound', filesPattern)); + } + + uploadCount = uploadFilesList.length; + var uploadFiles = '{' + uploadFilesList.join(',') + '}' + } + tl.debug(tl.loc('UploadingFiles', uploadFiles)); + + curlRunner.arg('-T') + // arrayify the arg so vsts-task-lib does not try to break args at space + // this is required for any file input that could potentially contain spaces + curlRunner.arg([uploadFiles]); + + curlRunner.arg(url); + + if (redirectStderr) { + curlRunner.arg('--stderr'); + curlRunner.arg('-'); + } + + if (options) { + curlRunner.line(options); + } + + if (username || password) { + var userPassCombo = ""; + if (username) { + userPassCombo += username; + } + + userPassCombo += ":"; + + if (password) { + userPassCombo += password; + } + + curlRunner.arg('-u'); + curlRunner.arg(userPassCombo); + } + + let output:string = ''; + curlRunner.on('stdout', (buffer: Buffer) => { + process.stdout.write(buffer); + output = output.concat(buffer ? buffer.toString() : ''); + }); + + var code: number = await curlRunner.exec(); + tl.setResult(tl.TaskResult.Succeeded, tl.loc('CurlReturnCode', code)); + + let outputMatch:RegExpMatchArray = output.match(/[\n\r]100\s/g); + let completed: number = outputMatch ? outputMatch.length : 0; + tl.debug('Successfully uploaded: ' + completed); + if (completed < uploadCount) { + tl.debug('Tested output [' + output + ']'); + tl.warning(tl.loc('NotAllFilesUploaded', completed, uploadCount)); + } + } + catch(err) { + tl.error(err.message); + tl.setResult(tl.TaskResult.Failed, tl.loc('CurlFailed', err.message)); + } +} + +run(); diff --git a/_generated/CUrlUploaderV2/icon.png b/_generated/CUrlUploaderV2/icon.png new file mode 100644 index 000000000000..8890ca55715d Binary files /dev/null and b/_generated/CUrlUploaderV2/icon.png differ diff --git a/_generated/CUrlUploaderV2/icon.svg b/_generated/CUrlUploaderV2/icon.svg new file mode 100644 index 000000000000..ae658e11c76a --- /dev/null +++ b/_generated/CUrlUploaderV2/icon.svg @@ -0,0 +1,4 @@ + + + + diff --git a/_generated/CUrlUploaderV2/package-lock.json b/_generated/CUrlUploaderV2/package-lock.json new file mode 100644 index 000000000000..fd7443b1266d --- /dev/null +++ b/_generated/CUrlUploaderV2/package-lock.json @@ -0,0 +1,488 @@ +{ + "name": "vsts-curluploader-task", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/concat-stream": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz", + "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==", + "requires": { + "@types/node": "*" + } + }, + "@types/form-data": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", + "integrity": "sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==", + "requires": { + "@types/node": "*" + } + }, + "@types/mocha": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.1.1.tgz", + "integrity": "sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==" + }, + "@types/node": { + "version": "16.11.57", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.57.tgz", + "integrity": "sha512-diBb5AE2V8h9Fs9zEDtBwSeLvIACng/aAkdZ3ujMV+cGuIQ9Nc/V+wQqurk9HJp8ni5roBxQHW21z/ZYbGDivg==" + }, + "@types/q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.1.tgz", + "integrity": "sha512-eqz8c/0kwNi/OEHQfvIuJVLTst3in0e7uTKeuY+WL/zfKn0xVujOTp42bS/vUUokhK5P2BppLd9JXMOMHcgbjA==" + }, + "@types/qs": { + "version": "6.9.8", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.8.tgz", + "integrity": "sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg==" + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "azure-pipelines-task-lib": { + "version": "5.0.0-preview.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-5.0.0-preview.0.tgz", + "integrity": "sha512-uQJEv+q3/7RD7kgphFd33uXijaPwA1ePYoNkAgZpUhbZUtc2u4JL4ujTT/JJfgXBNW/QQNAiDQ2OC7vOQG/0tg==", + "requires": { + "minimatch": "3.0.5", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "sync-request": "6.1.0", + "uuid": "^3.0.1" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, + "form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + } + }, + "get-port": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", + "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==" + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "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" + }, + "dependencies": { + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==" + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "http-basic": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", + "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", + "requires": { + "caseless": "^0.12.0", + "concat-stream": "^1.6.2", + "http-response-object": "^3.0.1", + "parse-cache-control": "^1.0.1" + } + }, + "http-response-object": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", + "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", + "requires": { + "@types/node": "^10.0.3" + }, + "dependencies": { + "@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + } + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" + }, + "is-core-module": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "requires": { + "has": "^1.0.3" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, + "parse-cache-control": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", + "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "promise": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", + "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", + "requires": { + "asap": "~2.0.6" + } + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==" + }, + "qs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "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" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "requires": { + "resolve": "^1.1.6" + } + }, + "resolve": { + "version": "1.22.6", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.6.tgz", + "integrity": "sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==", + "requires": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" + }, + "shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, + "sync-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", + "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==", + "requires": { + "http-response-object": "^3.0.1", + "sync-rpc": "^1.2.1", + "then-request": "^6.0.0" + } + }, + "sync-rpc": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz", + "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==", + "requires": { + "get-port": "^3.1.0" + } + }, + "then-request": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", + "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", + "requires": { + "@types/concat-stream": "^1.6.0", + "@types/form-data": "0.0.33", + "@types/node": "^8.0.0", + "@types/qs": "^6.2.31", + "caseless": "~0.12.0", + "concat-stream": "^1.6.0", + "form-data": "^2.2.0", + "http-basic": "^8.1.1", + "http-response-object": "^3.0.1", + "promise": "^8.0.0", + "qs": "^6.4.0" + }, + "dependencies": { + "@types/node": { + "version": "8.10.66", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", + "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==" + } + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, + "typescript": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.2.tgz", + "integrity": "sha512-e4ERvRV2wb+rRZ/IQeb3jm2VxBsirQLpQhdxplZ2MEzGvDkkMmPglecnNDfSUBivMjP93vRbngYYDQqQ/78bcQ==", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + } + } +} diff --git a/_generated/CUrlUploaderV2/package.json b/_generated/CUrlUploaderV2/package.json new file mode 100644 index 000000000000..68de9e0d04fb --- /dev/null +++ b/_generated/CUrlUploaderV2/package.json @@ -0,0 +1,28 @@ +{ + "name": "vsts-curluploader-task", + "version": "1.0.0", + "description": "Azure Pipelines Curl Uploader Task", + "main": "curluploader.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/Microsoft/azure-pipelines-tasks.git" + }, + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Microsoft/azure-pipelines-tasks/issues" + }, + "homepage": "https://github.com/Microsoft/azure-pipelines-tasks#readme", + "dependencies": { + "@types/node": "^16.11.39", + "@types/mocha": "^9.1.1", + "@types/q": "^1.0.7", + "azure-pipelines-task-lib": "^5.0.0-preview.0" + }, + "devDependencies": { + "typescript": "4.0.2" + } +} diff --git a/_generated/CUrlUploaderV2/task.json b/_generated/CUrlUploaderV2/task.json new file mode 100644 index 000000000000..560d33b82122 --- /dev/null +++ b/_generated/CUrlUploaderV2/task.json @@ -0,0 +1,142 @@ +{ + "id": "AD8974D8-DE11-11E4-B2FE-7FB898A745F3", + "name": "cURLUploader", + "friendlyName": "cURL upload files", + "description": "Use cURL's supported protocols to upload files", + "helpUrl": "https://docs.microsoft.com/azure/devops/pipelines/tasks/utility/curl-upload-files", + "helpMarkDown": "[Learn more about this task](https://go.microsoft.com/fwlink/?LinkID=627418)", + "category": "Utility", + "author": "Microsoft Corporation", + "version": { + "Major": 2, + "Minor": 229, + "Patch": 0 + }, + "runsOn": [ + "Agent", + "DeploymentGroup" + ], + "demands": [], + "minimumAgentVersion": "2.182.1", + "groups": [ + { + "name": "advanced", + "displayName": "Advanced", + "isExpanded": false + } + ], + "inputs": [ + { + "name": "files", + "type": "filePath", + "label": "Files", + "defaultValue": "", + "required": true, + "helpMarkDown": "File(s) to be uploaded. Wildcards can be used. For example, `**/*.zip` for all ZIP files in all subfolders." + }, + { + "name": "authType", + "type": "pickList", + "label": "Authentication Method", + "defaultValue": "ServiceEndpoint", + "helpMarkDown": "", + "options": { + "ServiceEndpoint": "Service connection", + "UserAndPass": "Username and password" + } + }, + { + "name": "serviceEndpoint", + "type": "connectedService:Generic", + "label": "Service Connection", + "defaultValue": "", + "required": true, + "helpMarkDown": "The service connection with the credentials for the server authentication. Use the Generic service connection type for the service connection.", + "visibleRule": "authType = ServiceEndpoint" + }, + { + "name": "username", + "type": "string", + "label": "Username", + "defaultValue": "", + "required": false, + "helpMarkDown": "Specify the username for server authentication.", + "visibleRule": "authType = UserAndPass" + }, + { + "name": "password", + "type": "string", + "label": "Password", + "defaultValue": "", + "required": false, + "helpMarkDown": "Specify the password for server authentication. Use a new build variable with its lock enabled on the Variables tab to encrypt this value.", + "visibleRule": "authType = UserAndPass" + }, + { + "name": "url", + "type": "string", + "label": "URL", + "defaultValue": "", + "required": true, + "helpMarkDown": "Specify the URL to where the file(s) will be uploaded. The directory should end with a trailing slash. Possible URL protocols include `DICT://`, `FILE://`, `FTP://`, `FTPS://`, `GOPHER://`, `HTTP://`, `HTTPS://`, `IMAP://`, `IMAPS://`, `LDAP://`, `LDAPS://`, `POP3://`, `POP3S://`, `RTMP://`, `RTSP://`, `SCP://`, `SFTP://`, `SMTP://`, `SMTPS://`, `TELNET://` and `TFTP://`.", + "visibleRule": "authType = UserAndPass" + }, + { + "name": "remotePath", + "type": "string", + "label": "Remote Directory", + "defaultValue": "upload/$(Build.BuildId)/", + "required": false, + "helpMarkDown": "If supplied, this is the sub-folder on the remote server for the URL supplied in the credentials." + }, + { + "name": "options", + "type": "string", + "label": "Optional Arguments", + "defaultValue": "", + "required": false, + "helpMarkDown": "Additional arguments that will be passed to cURL." + }, + { + "name": "redirectStderr", + "type": "boolean", + "label": "Redirect Standard Error to Standard Out", + "defaultValue": "true", + "required": false, + "groupName": "advanced", + "helpMarkDown": "Adds '--stderr -' as an argument to cURL. By default, cURL writes its progress bar to stderr, which is interpreted by the build as error output. Enabling this checkbox suppresses that behavior." + } + ], + "instanceNameFormat": "Upload $(files) with cURL", + "execution": { + "Node10": { + "target": "curluploader.js", + "argumentFormat": "" + }, + "Node16": { + "target": "curluploader.js", + "argumentFormat": "" + } + }, + "restrictions": { + "commands": { + "mode": "restricted" + }, + "settableVariables": { + "allowed": [] + } + }, + "messages": { + "CurlReturnCode": "curl exited with return code: %d", + "CurlFailed": "curl failed with error: %s", + "NoMatchingFilesFound": "No matching files were found with search pattern: %s", + "UploadingFiles": "Uploading file(s): %s", + "CurlNotFound": "curl was not found in the PATH.", + "NotAllFilesUploaded": "Not all files were uploaded; Uploaded: %d; Total: %d", + "IncompleteEndpoint": "The service connection does not contain all required fields." + }, + "_buildConfigMapping": { + "Default": "2.229.0", + "Node20-225": "2.229.1" + } +} \ No newline at end of file diff --git a/_generated/CUrlUploaderV2/task.loc.json b/_generated/CUrlUploaderV2/task.loc.json new file mode 100644 index 000000000000..73ab629107d9 --- /dev/null +++ b/_generated/CUrlUploaderV2/task.loc.json @@ -0,0 +1,142 @@ +{ + "id": "AD8974D8-DE11-11E4-B2FE-7FB898A745F3", + "name": "cURLUploader", + "friendlyName": "ms-resource:loc.friendlyName", + "description": "ms-resource:loc.description", + "helpUrl": "https://docs.microsoft.com/azure/devops/pipelines/tasks/utility/curl-upload-files", + "helpMarkDown": "ms-resource:loc.helpMarkDown", + "category": "Utility", + "author": "Microsoft Corporation", + "version": { + "Major": 2, + "Minor": 229, + "Patch": 0 + }, + "runsOn": [ + "Agent", + "DeploymentGroup" + ], + "demands": [], + "minimumAgentVersion": "2.182.1", + "groups": [ + { + "name": "advanced", + "displayName": "ms-resource:loc.group.displayName.advanced", + "isExpanded": false + } + ], + "inputs": [ + { + "name": "files", + "type": "filePath", + "label": "ms-resource:loc.input.label.files", + "defaultValue": "", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.files" + }, + { + "name": "authType", + "type": "pickList", + "label": "ms-resource:loc.input.label.authType", + "defaultValue": "ServiceEndpoint", + "helpMarkDown": "", + "options": { + "ServiceEndpoint": "Service connection", + "UserAndPass": "Username and password" + } + }, + { + "name": "serviceEndpoint", + "type": "connectedService:Generic", + "label": "ms-resource:loc.input.label.serviceEndpoint", + "defaultValue": "", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.serviceEndpoint", + "visibleRule": "authType = ServiceEndpoint" + }, + { + "name": "username", + "type": "string", + "label": "ms-resource:loc.input.label.username", + "defaultValue": "", + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.username", + "visibleRule": "authType = UserAndPass" + }, + { + "name": "password", + "type": "string", + "label": "ms-resource:loc.input.label.password", + "defaultValue": "", + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.password", + "visibleRule": "authType = UserAndPass" + }, + { + "name": "url", + "type": "string", + "label": "ms-resource:loc.input.label.url", + "defaultValue": "", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.url", + "visibleRule": "authType = UserAndPass" + }, + { + "name": "remotePath", + "type": "string", + "label": "ms-resource:loc.input.label.remotePath", + "defaultValue": "upload/$(Build.BuildId)/", + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.remotePath" + }, + { + "name": "options", + "type": "string", + "label": "ms-resource:loc.input.label.options", + "defaultValue": "", + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.options" + }, + { + "name": "redirectStderr", + "type": "boolean", + "label": "ms-resource:loc.input.label.redirectStderr", + "defaultValue": "true", + "required": false, + "groupName": "advanced", + "helpMarkDown": "ms-resource:loc.input.help.redirectStderr" + } + ], + "instanceNameFormat": "ms-resource:loc.instanceNameFormat", + "execution": { + "Node10": { + "target": "curluploader.js", + "argumentFormat": "" + }, + "Node16": { + "target": "curluploader.js", + "argumentFormat": "" + } + }, + "restrictions": { + "commands": { + "mode": "restricted" + }, + "settableVariables": { + "allowed": [] + } + }, + "messages": { + "CurlReturnCode": "ms-resource:loc.messages.CurlReturnCode", + "CurlFailed": "ms-resource:loc.messages.CurlFailed", + "NoMatchingFilesFound": "ms-resource:loc.messages.NoMatchingFilesFound", + "UploadingFiles": "ms-resource:loc.messages.UploadingFiles", + "CurlNotFound": "ms-resource:loc.messages.CurlNotFound", + "NotAllFilesUploaded": "ms-resource:loc.messages.NotAllFilesUploaded", + "IncompleteEndpoint": "ms-resource:loc.messages.IncompleteEndpoint" + }, + "_buildConfigMapping": { + "Default": "2.229.0", + "Node20-225": "2.229.1" + } +} \ No newline at end of file diff --git a/_generated/CUrlUploaderV2/tsconfig.json b/_generated/CUrlUploaderV2/tsconfig.json new file mode 100644 index 000000000000..0438b79f69ac --- /dev/null +++ b/_generated/CUrlUploaderV2/tsconfig.json @@ -0,0 +1,6 @@ +{ + "compilerOptions": { + "target": "ES6", + "module": "commonjs" + } +} \ No newline at end of file diff --git a/_generated/CUrlUploaderV2_Node20/.npmrc b/_generated/CUrlUploaderV2_Node20/.npmrc new file mode 100644 index 000000000000..5fca0d518be7 --- /dev/null +++ b/_generated/CUrlUploaderV2_Node20/.npmrc @@ -0,0 +1 @@ +scripts-prepend-node-path=true diff --git a/_generated/CUrlUploaderV2_Node20/Strings/resources.resjson/de-DE/resources.resjson b/_generated/CUrlUploaderV2_Node20/Strings/resources.resjson/de-DE/resources.resjson new file mode 100644 index 000000000000..5de0fe35a640 --- /dev/null +++ b/_generated/CUrlUploaderV2_Node20/Strings/resources.resjson/de-DE/resources.resjson @@ -0,0 +1,31 @@ +{ + "loc.friendlyName": "cURL-Uploaddateien", + "loc.helpMarkDown": "[Weitere Informationen zu dieser Aufgabe](https://go.microsoft.com/fwlink/?LinkID=627418)", + "loc.description": "Hiermit werden die von cURL unterstützten Protokolle zum Hochladen von Dateien verwendet.", + "loc.instanceNameFormat": "$(files) mit cURL hochladen", + "loc.group.displayName.advanced": "Erweitert", + "loc.input.label.files": "Dateien", + "loc.input.help.files": "Die hochzuladenden Dateien. Platzhalter können verwendet werden. Beispiel: \"*/*.zip\" für alle ZIP-Dateien in allen Unterordnern.", + "loc.input.label.authType": "Authentifizierungsmethode", + "loc.input.label.serviceEndpoint": "Dienstverbindung", + "loc.input.help.serviceEndpoint": "Die Dienstverbindung mit den Anmeldeinformationen für die Serverauthentifizierung. Verwenden Sie den Dienstverbindungstyp \"Generisch\" für die Dienstverbindung.", + "loc.input.label.username": "Benutzername", + "loc.input.help.username": "Geben Sie den Benutzernamen für die Serverauthentifizierung an.", + "loc.input.label.password": "Kennwort", + "loc.input.help.password": "Geben Sie das Kennwort für die Serverauthentifizierung an. Verwenden Sie eine neue Buildvariable, deren Sperre auf der Registerkarte \"Variablen\" aktiviert ist, um diesen Wert zu verschlüsseln.", + "loc.input.label.url": "URL", + "loc.input.help.url": "Geben Sie die URL an, zu der die Dateien hochgeladen werden. Das Verzeichnis muss mit einem nachgestellten Schrägstrich enden. Mögliche URL-Protokolle: DICT, FILE, FTP, FTPS, GOPHER, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMTP, SMTPS, TELNET und TFTP.", + "loc.input.label.remotePath": "Remoteverzeichnis", + "loc.input.help.remotePath": "Falls angegeben ist dies der Unterordner auf dem Remoteserver für die URL, die in den Anmeldeinformationen festgelegt ist.", + "loc.input.label.options": "Optionale Argumente", + "loc.input.help.options": "Zusätzliche Argumente, die an cURL übergeben werden.", + "loc.input.label.redirectStderr": "Standardfehler an Standardausgabe umleiten", + "loc.input.help.redirectStderr": "Fügt cURL \"--stderr -\" als Argument hinzu. Standardmäßig schreibt cURL die Statusleiste in stderr. Dies wird vom Build als Fehlerausgabe interpretiert. Wenn Sie dieses Kontrollkästchen aktivieren, wird dieses Verhalten unterdrückt.", + "loc.messages.CurlReturnCode": "curl wurde mit dem folgenden Rückgabecode beendet: %d", + "loc.messages.CurlFailed": "curl-Fehler: %s", + "loc.messages.NoMatchingFilesFound": "Keine mit dem Suchmuster übereinstimmenden Dateien gefunden: %s", + "loc.messages.UploadingFiles": "Datei(en) werden hochgeladen: %s", + "loc.messages.CurlNotFound": "curl wurde nicht in PATH gefunden.", + "loc.messages.NotAllFilesUploaded": "Nicht alle Dateien wurden hochgeladen; hochgeladen: %d; gesamt: %d", + "loc.messages.IncompleteEndpoint": "Die Dienstverbindung enthält nicht alle erforderlichen Felder." +} \ No newline at end of file diff --git a/_generated/CUrlUploaderV2_Node20/Strings/resources.resjson/en-US/resources.resjson b/_generated/CUrlUploaderV2_Node20/Strings/resources.resjson/en-US/resources.resjson new file mode 100644 index 000000000000..cb23543aceca --- /dev/null +++ b/_generated/CUrlUploaderV2_Node20/Strings/resources.resjson/en-US/resources.resjson @@ -0,0 +1,31 @@ +{ + "loc.friendlyName": "cURL upload files", + "loc.helpMarkDown": "[Learn more about this task](https://go.microsoft.com/fwlink/?LinkID=627418)", + "loc.description": "Use cURL's supported protocols to upload files", + "loc.instanceNameFormat": "Upload $(files) with cURL", + "loc.group.displayName.advanced": "Advanced", + "loc.input.label.files": "Files", + "loc.input.help.files": "File(s) to be uploaded. Wildcards can be used. For example, `**/*.zip` for all ZIP files in all subfolders.", + "loc.input.label.authType": "Authentication Method", + "loc.input.label.serviceEndpoint": "Service Connection", + "loc.input.help.serviceEndpoint": "The service connection with the credentials for the server authentication. Use the Generic service connection type for the service connection.", + "loc.input.label.username": "Username", + "loc.input.help.username": "Specify the username for server authentication.", + "loc.input.label.password": "Password", + "loc.input.help.password": "Specify the password for server authentication. Use a new build variable with its lock enabled on the Variables tab to encrypt this value.", + "loc.input.label.url": "URL", + "loc.input.help.url": "Specify the URL to where the file(s) will be uploaded. The directory should end with a trailing slash. Possible URL protocols include `DICT://`, `FILE://`, `FTP://`, `FTPS://`, `GOPHER://`, `HTTP://`, `HTTPS://`, `IMAP://`, `IMAPS://`, `LDAP://`, `LDAPS://`, `POP3://`, `POP3S://`, `RTMP://`, `RTSP://`, `SCP://`, `SFTP://`, `SMTP://`, `SMTPS://`, `TELNET://` and `TFTP://`.", + "loc.input.label.remotePath": "Remote Directory", + "loc.input.help.remotePath": "If supplied, this is the sub-folder on the remote server for the URL supplied in the credentials.", + "loc.input.label.options": "Optional Arguments", + "loc.input.help.options": "Additional arguments that will be passed to cURL.", + "loc.input.label.redirectStderr": "Redirect Standard Error to Standard Out", + "loc.input.help.redirectStderr": "Adds '--stderr -' as an argument to cURL. By default, cURL writes its progress bar to stderr, which is interpreted by the build as error output. Enabling this checkbox suppresses that behavior.", + "loc.messages.CurlReturnCode": "curl exited with return code: %d", + "loc.messages.CurlFailed": "curl failed with error: %s", + "loc.messages.NoMatchingFilesFound": "No matching files were found with search pattern: %s", + "loc.messages.UploadingFiles": "Uploading file(s): %s", + "loc.messages.CurlNotFound": "curl was not found in the PATH.", + "loc.messages.NotAllFilesUploaded": "Not all files were uploaded; Uploaded: %d; Total: %d", + "loc.messages.IncompleteEndpoint": "The service connection does not contain all required fields." +} \ No newline at end of file diff --git a/_generated/CUrlUploaderV2_Node20/Strings/resources.resjson/es-ES/resources.resjson b/_generated/CUrlUploaderV2_Node20/Strings/resources.resjson/es-ES/resources.resjson new file mode 100644 index 000000000000..8a43a8c5bf0a --- /dev/null +++ b/_generated/CUrlUploaderV2_Node20/Strings/resources.resjson/es-ES/resources.resjson @@ -0,0 +1,31 @@ +{ + "loc.friendlyName": "Cargar archivos con cURL", + "loc.helpMarkDown": "[Obtener más información acerca de esta tarea](https://go.microsoft.com/fwlink/?LinkID=627418)", + "loc.description": "Usa los protocolos compatibles con cURL para cargar archivos.", + "loc.instanceNameFormat": "Upload $(files) with cURL", + "loc.group.displayName.advanced": "Avanzado", + "loc.input.label.files": "Archivos", + "loc.input.help.files": "Archivos que se van a cargar. Se pueden usar caracteres comodín. Por ejemplo: \"**/*.zip\" para todos los archivos ZIP de todas las subcarpetas.", + "loc.input.label.authType": "Método de autenticación", + "loc.input.label.serviceEndpoint": "Conexión de servicio", + "loc.input.help.serviceEndpoint": "La conexión de servicio con las credenciales para la autenticación del servidor. Use el tipo de conexión de servicio genérico para la conexión del servicio.", + "loc.input.label.username": "Nombre de usuario", + "loc.input.help.username": "Especifique el nombre de usuario para la autenticación de servidor.", + "loc.input.label.password": "Contraseña", + "loc.input.help.password": "Especifique la contraseña para la autenticación de servidor. Use una nueva variable de compilación con el bloqueo habilitado en la pestaña Variables para cifrar este valor.", + "loc.input.label.url": "URL", + "loc.input.help.url": "Especifique la dirección URL en la que se van a cargar los archivos. El directorio debe finalizar con una barra diagonal. Entre los protocolos de URL posibles se incluyen \"DICT://\", \"FILE://\", \"FTP://\", \"FTPS://\", \"GOPHER://\", \"HTTP://\", \"HTTPS://\", \"IMAP://\", \"IMAPS://\", \"LDAP://\", \"LDAPS://\", \"POP3://\", \"POP3S://\", \"RTMP://\", \"RTSP://\", \"SCP://\", \"SFTP://\", \"SMTP://\", \"SMTPS://\", \"TELNET://\" y \"TFTP://\".", + "loc.input.label.remotePath": "Directorio remoto", + "loc.input.help.remotePath": "Si se proporciona, esta es la subcarpeta en el servidor remoto para la dirección URL especificada en las credenciales.", + "loc.input.label.options": "Argumentos opcionales", + "loc.input.help.options": "Argumentos adicionales que se van a pasar a cURL.", + "loc.input.label.redirectStderr": "Redirigir error estándar a salida estándar", + "loc.input.help.redirectStderr": "Agrega \"--stderr -\" como un argumento a cURL. De manera predeterminada, cURL escribe su barra de progreso en stderr, cosa que la compilación considerará un resultado erróneo. Al habilitar esta casilla, se suprime ese comportamiento.", + "loc.messages.CurlReturnCode": "Se cerró curl con el código de devolución: %d", + "loc.messages.CurlFailed": "Error de curl con el mensaje: %s", + "loc.messages.NoMatchingFilesFound": "No se encontraron archivos coincidentes con el patrón de búsqueda: %s", + "loc.messages.UploadingFiles": "Cargando archivos(s): %s", + "loc.messages.CurlNotFound": "No se ha encontrado curl en la RUTA DE ACCESO.", + "loc.messages.NotAllFilesUploaded": "No se han cargado todos los archivos. Cargados: %d; total: %d", + "loc.messages.IncompleteEndpoint": "La conexión de servicio no contiene todos los campos obligatorios." +} \ No newline at end of file diff --git a/_generated/CUrlUploaderV2_Node20/Strings/resources.resjson/fr-FR/resources.resjson b/_generated/CUrlUploaderV2_Node20/Strings/resources.resjson/fr-FR/resources.resjson new file mode 100644 index 000000000000..5efdd057e787 --- /dev/null +++ b/_generated/CUrlUploaderV2_Node20/Strings/resources.resjson/fr-FR/resources.resjson @@ -0,0 +1,31 @@ +{ + "loc.friendlyName": "Chargement de fichiers via cURL", + "loc.helpMarkDown": "[En savoir plus sur cette tâche](https://go.microsoft.com/fwlink/?LinkID=627418)", + "loc.description": "Utiliser les protocoles pris en charge par cURL pour charger des fichiers", + "loc.instanceNameFormat": "Télécharger $(files) avec cURL", + "loc.group.displayName.advanced": "Avancé", + "loc.input.label.files": "Fichiers", + "loc.input.help.files": "Fichier(s) à charger. Vous pouvez utiliser des caractères génériques. Par exemple, '**/*.zip' pour tous les fichiers ZIP de tous les sous-dossiers.", + "loc.input.label.authType": "Méthode d'authentification", + "loc.input.label.serviceEndpoint": "Connexion de service", + "loc.input.help.serviceEndpoint": "Connexion de service avec les informations d'identification pour l'authentification serveur. Utilisez le type de connexion de service Générique pour la connexion de service.", + "loc.input.label.username": "Nom d'utilisateur", + "loc.input.help.username": "Spécifiez le nom d'utilisateur pour l'authentification du serveur.", + "loc.input.label.password": "Mot de passe", + "loc.input.help.password": "Spécifiez le mot de passe pour l'authentification du serveur. Pour chiffrer cette valeur, utilisez une nouvelle variable de build avec le verrou activé sous l'onglet Variables.", + "loc.input.label.url": "URL", + "loc.input.help.url": "Spécifiez l'URL à utiliser pour charger le ou les fichiers. Le répertoire doit se terminer par une barre oblique finale. Les protocoles d'URL sont notamment 'DICT://', 'FILE://', 'FTP://', 'FTPS://', 'GOPHER://', 'HTTP://', 'HTTPS://', 'IMAP://', 'IMAPS://', 'LDAP://', 'LDAPS://', 'POP3://', 'POP3S://', 'RTMP://', 'RTSP://', 'SCP://', 'SFTP://', 'SMTP://', 'SMTPS://', 'TELNET://' et 'TFTP://'.", + "loc.input.label.remotePath": "Répertoire distant", + "loc.input.help.remotePath": "S'il est fourni, il s'agit du sous-dossier du serveur distant correspondant à l'URL fournie dans les informations d'identification.", + "loc.input.label.options": "Arguments facultatifs", + "loc.input.help.options": "Arguments supplémentaires qui seront passés à cURL.", + "loc.input.label.redirectStderr": "Rediriger une erreur standard vers une sortie standard", + "loc.input.help.redirectStderr": "Ajoute '--stderr -' comme argument à cURL. Par défaut, cURL écrit sa barre de progression dans stderr, que la build interprète comme une sortie d'erreur. Si vous cochez cette case, ce comportement est supprimé.", + "loc.messages.CurlReturnCode": "Sortie de curl avec le code de retour : %d", + "loc.messages.CurlFailed": "Échec de curl avec l'erreur : %s", + "loc.messages.NoMatchingFilesFound": "Aucun fichier correspondant n'a été trouvé avec le modèle de recherche : %s", + "loc.messages.UploadingFiles": "Téléchargement du ou des fichiers : %s", + "loc.messages.CurlNotFound": "curl introuvable dans le CHEMIN.", + "loc.messages.NotAllFilesUploaded": "Tous les fichiers n'ont pas été chargés. Fichiers chargés : %d. Total : %d", + "loc.messages.IncompleteEndpoint": "La connexion de service ne contient pas tous les champs obligatoires." +} \ No newline at end of file diff --git a/_generated/CUrlUploaderV2_Node20/Strings/resources.resjson/it-IT/resources.resjson b/_generated/CUrlUploaderV2_Node20/Strings/resources.resjson/it-IT/resources.resjson new file mode 100644 index 000000000000..c806de85e807 --- /dev/null +++ b/_generated/CUrlUploaderV2_Node20/Strings/resources.resjson/it-IT/resources.resjson @@ -0,0 +1,31 @@ +{ + "loc.friendlyName": "Caricamento file con cURL", + "loc.helpMarkDown": "[Altre informazioni su questa attività](https://go.microsoft.com/fwlink/?LinkID=627418)", + "loc.description": "Usa i protocolli supportati da cURL per caricare i file", + "loc.instanceNameFormat": "Carica $(files) con cURL", + "loc.group.displayName.advanced": "Avanzate", + "loc.input.label.files": "File", + "loc.input.help.files": "File da caricare. È possibile usare i caratteri jolly. Usare ad esempio `**/*.zip` per indicare tutti i file ZIP in tutte le sottocartelle.", + "loc.input.label.authType": "Metodo di autenticazione", + "loc.input.label.serviceEndpoint": "Connessione al servizio", + "loc.input.help.serviceEndpoint": "Connessione al servizio con le credenziali per l'autenticazione del server. Usare il tipo di connessione al servizio generica per la connessione al servizio.", + "loc.input.label.username": "Nome utente", + "loc.input.help.username": "Consente di specificare il nome utente per l'autenticazione server.", + "loc.input.label.password": "Password", + "loc.input.help.password": "Consente di specificare la password per l'autenticazione server. Per crittografare questo valore, usare una nuova variabile di compilazione con il relativo blocco abilitato nella scheda Variabili.", + "loc.input.label.url": "URL", + "loc.input.help.url": "Consente di specificare l'URL in cui verranno caricati i file. La directory deve terminare con una barra finale. I protocolli URL possibili includono: `DICT://`, `FILE://`, `FTP://`, `FTPS://`, `GOPHER://`, `HTTP://`, `HTTPS://`, `IMAP://`, `IMAPS://`, `LDAP://`, `LDAPS://`, `POP3://`, `POP3S://`, `RTMP://`, `RTSP://`, `SCP://`, `SFTP://`, `SMTP://`, `SMTPS://`, `TELNET://` e `TFTP://`.", + "loc.input.label.remotePath": "Directory remota", + "loc.input.help.remotePath": "Se specificata, si tratta della sottocartella nel server remoto per l'URL fornito nelle credenziali.", + "loc.input.label.options": "Argomenti facoltativi", + "loc.input.help.options": "Argomenti aggiuntivi che verranno passati a cURL.", + "loc.input.label.redirectStderr": "Reindirizza errore standard a output standard", + "loc.input.help.redirectStderr": "Consente di aggiungere '--stderr -' come argomento di cURL. Per impostazione predefinita, cURL scrive l'indicatore di stato in stderr e questo viene interpretato da dalla compilazione come un output di errore. Per evitare tale comportamento, abilitare questa casella di controllo.", + "loc.messages.CurlReturnCode": "Il comando curl è stato terminato. Codice restituito: %d", + "loc.messages.CurlFailed": "Il comando curl non è riuscito. Errore: %s", + "loc.messages.NoMatchingFilesFound": "Non sono stati trovati file corrispondenti con il criterio di ricerca: %s", + "loc.messages.UploadingFiles": "Caricamento dei file: %s", + "loc.messages.CurlNotFound": "Il comando curl non è stato trovato in PATH.", + "loc.messages.NotAllFilesUploaded": "Non sono stati caricati tutti i file. File caricati: %d; file totali: %d", + "loc.messages.IncompleteEndpoint": "La connessione al servizio non contiene tutti i campi obbligatori." +} \ No newline at end of file diff --git a/_generated/CUrlUploaderV2_Node20/Strings/resources.resjson/ja-JP/resources.resjson b/_generated/CUrlUploaderV2_Node20/Strings/resources.resjson/ja-JP/resources.resjson new file mode 100644 index 000000000000..c7831dfe5a9b --- /dev/null +++ b/_generated/CUrlUploaderV2_Node20/Strings/resources.resjson/ja-JP/resources.resjson @@ -0,0 +1,31 @@ +{ + "loc.friendlyName": "ファイルを cURL でアップロード", + "loc.helpMarkDown": "[このタスクの詳細を表示](https://go.microsoft.com/fwlink/?LinkID=627418)", + "loc.description": "cURL のサポートされているプロトコルを使用してファイルをアップロードします", + "loc.instanceNameFormat": "cURL で $(files) をアップロード", + "loc.group.displayName.advanced": "詳細設定", + "loc.input.label.files": "ファイル", + "loc.input.help.files": "アップロードするファイル。ワイルドカードを使用できます。たとえば、全サブフォルダー内のすべての ZIP ファイルの場合は `**/*.zip` です。", + "loc.input.label.authType": "認証方法", + "loc.input.label.serviceEndpoint": "サービス接続", + "loc.input.help.serviceEndpoint": "サーバー認証の資格情報を使用したサービス接続です。サービス接続には汎用サービス接続の種類を使用します。", + "loc.input.label.username": "ユーザー名", + "loc.input.help.username": "サーバー認証のユーザー名を指定します。", + "loc.input.label.password": "パスワード", + "loc.input.help.password": "サーバー認証のパスワードを指定します。[変数] タブでロックが有効になっている新しいビルド変数を使用して、この値を暗号化します。", + "loc.input.label.url": "URL", + "loc.input.help.url": "ファイルのアップロード先の URL を指定します。ディレクトリの末尾はスラッシュで終わる必要があります。使用可能な URL プロトコルは、`DICT://`、`FILE://`、`FTP://`、`FTPS://`、`GOPHER://`、`HTTP://`、`HTTPS://`、`IMAP://`、`IMAPS://`、`LDAP://`、`LDAPS://`、`POP3://`、`POP3S://`、`RTMP://`、`RTSP://`、`SCP://`、`SFTP://`、`SMTP://`、`SMTPS://`、`TELNET://`、`TFTP://` などです。", + "loc.input.label.remotePath": "リモート ディレクトリ", + "loc.input.help.remotePath": "指定する場合、これは資格情報で提供された URL のリモート サーバー上のサブフォルダーです。", + "loc.input.label.options": "オプションの引数", + "loc.input.help.options": "cURL に渡す追加の引数。", + "loc.input.label.redirectStderr": "標準エラーを標準出力にリダイレクトします", + "loc.input.help.redirectStderr": "引数として '--stderr -' を cURL に追加します。既定では、cURL は stderr に進行状況バーを書き込み、ビルドはそれをエラー出力と見なします。このチェックボックスをオンにするとその動作が抑制されます。", + "loc.messages.CurlReturnCode": "curl が次のリターン コードで終了しました: %d", + "loc.messages.CurlFailed": "curl に失敗し、次のエラーが発生しました: %s", + "loc.messages.NoMatchingFilesFound": "次の検索パターンと一致するファイルが見つかりませんでした: %s", + "loc.messages.UploadingFiles": "ファイルをアップロードしています: %s", + "loc.messages.CurlNotFound": "curl がパスにありませんでした。", + "loc.messages.NotAllFilesUploaded": "一部のファイルがアップロードされませんでした。アップロード数: %d、合計数: %d", + "loc.messages.IncompleteEndpoint": "サービス接続にはすべての必要なフィールドが含まれていません。" +} \ No newline at end of file diff --git a/_generated/CUrlUploaderV2_Node20/Strings/resources.resjson/ko-KR/resources.resjson b/_generated/CUrlUploaderV2_Node20/Strings/resources.resjson/ko-KR/resources.resjson new file mode 100644 index 000000000000..a733c3d8c83b --- /dev/null +++ b/_generated/CUrlUploaderV2_Node20/Strings/resources.resjson/ko-KR/resources.resjson @@ -0,0 +1,31 @@ +{ + "loc.friendlyName": "cURL 파일 업로드", + "loc.helpMarkDown": "[이 작업에 대한 자세한 정보](https://go.microsoft.com/fwlink/?LinkID=627418)", + "loc.description": "cURL에서 지원되는 프로토콜을 사용하여 파일을 업로드합니다.", + "loc.instanceNameFormat": "cURL로 $(files) 업로드", + "loc.group.displayName.advanced": "고급", + "loc.input.label.files": "파일", + "loc.input.help.files": "업로드할 파일입니다. 와일드카드를 사용할 수 있습니다. 예를 들어 모든 하위 폴더에 있는 ZIP 파일을 모두 표시하려면 '**/*.zip'을 사용합니다.", + "loc.input.label.authType": "인증 방법", + "loc.input.label.serviceEndpoint": "서비스 연결", + "loc.input.help.serviceEndpoint": "서버 인증을 위한 자격 증명이 포함된 서비스 연결입니다. 서비스 연결에는 일반 서비스 연결 형식을 사용하세요.", + "loc.input.label.username": "사용자 이름", + "loc.input.help.username": "서버 인증을 위한 사용자 이름을 지정하세요.", + "loc.input.label.password": "암호", + "loc.input.help.password": "서버 인증을 위한 암호를 지정하세요. 이 값을 암호화하려면 [변수] 탭에서 해당 잠금을 사용하도록 설정한 상태로 새 빌드 변수를 사용하세요.", + "loc.input.label.url": "URL", + "loc.input.help.url": "파일을 업로드할 URL을 지정하세요. 디렉터리는 후행 슬래시로 끝나야 합니다. `DICT://`, `FILE://`, `FTP://`, `FTPS://`, `GOPHER://`, `HTTP://`, `HTTPS://`, `IMAP://`, `IMAPS://`, `LDAP://`, `LDAPS://`, `POP3://`, `POP3S://`, `RTMP://`, `RTSP://`, `SCP://`, `SFTP://`, `SMTP://`, `SMTPS://`, `TELNET://`, `TFTP://`와 같은 URL 프로토콜을 사용할 수 있습니다.", + "loc.input.label.remotePath": "원격 디렉터리", + "loc.input.help.remotePath": "지정된 경우 자격 증명에 제공된 URL에 대한 원격 서버의 하위 폴더입니다.", + "loc.input.label.options": "선택적 인수", + "loc.input.help.options": "cURL에 전달할 추가 인수입니다.", + "loc.input.label.redirectStderr": "표준 오류를 표준 출력으로 리디렉션", + "loc.input.help.redirectStderr": "'--stderr -'을 cURL에 인수로 추가합니다. 기본적으로 cURL은 진행률 표시줄을 stderr에 쓰고 이는 빌드에 의해 오류 출력으로 해석됩니다. 이 확인란을 사용하면 해당 동작이 표시되지 않습니다.", + "loc.messages.CurlReturnCode": "cURL이 종료되었습니다(반환 코드: %d).", + "loc.messages.CurlFailed": "cURL이 실패했습니다(오류: %s).", + "loc.messages.NoMatchingFilesFound": "다음 검색 패턴과 일치하는 파일을 찾을 수 없습니다. %s", + "loc.messages.UploadingFiles": "%s 파일을 업로드하는 중입니다.", + "loc.messages.CurlNotFound": "PATH에서 cURL을 찾을 수 없습니다.", + "loc.messages.NotAllFilesUploaded": "일부 파일이 업로드되지 않았습니다. 업로드됨: %d. 전체: %d", + "loc.messages.IncompleteEndpoint": "서비스 연결에 필수 필드 중 일부가 포함되어 있지 않습니다." +} \ No newline at end of file diff --git a/_generated/CUrlUploaderV2_Node20/Strings/resources.resjson/ru-RU/resources.resjson b/_generated/CUrlUploaderV2_Node20/Strings/resources.resjson/ru-RU/resources.resjson new file mode 100644 index 000000000000..bd36a3cb8e59 --- /dev/null +++ b/_generated/CUrlUploaderV2_Node20/Strings/resources.resjson/ru-RU/resources.resjson @@ -0,0 +1,31 @@ +{ + "loc.friendlyName": "Отправка файлов с помощью cURL", + "loc.helpMarkDown": "[См. дополнительные сведения об этой задаче](https://go.microsoft.com/fwlink/?LinkID=627418)", + "loc.description": "Использовать поддерживаемые протоколы cURL для отправки файлов", + "loc.instanceNameFormat": "Отправить $(files) с помощью cURL", + "loc.group.displayName.advanced": "Дополнительно", + "loc.input.label.files": "Файлы", + "loc.input.help.files": "Файлы, которые нужно отправить. Можно использовать подстановочные знаки. Например: \"**\\*.zip\" для всех ZIP-файлов во всех вложенных папках.", + "loc.input.label.authType": "Способ проверки подлинности", + "loc.input.label.serviceEndpoint": "Подключение к службе", + "loc.input.help.serviceEndpoint": "Подключение к службе с использованием учетных данных для проверки подлинности сервера. Используйте универсальный тип подключения к службе.", + "loc.input.label.username": "Имя пользователя", + "loc.input.help.username": "Укажите имя пользователя для проверки подлинности сервера.", + "loc.input.label.password": "Пароль", + "loc.input.help.password": "Укажите пароль, используемый для проверки подлинности сервера. Чтобы зашифровать это значение, используйте новую переменную сборки с включенной блокировкой на вкладке \"Переменные\".", + "loc.input.label.url": "URL-адрес", + "loc.input.help.url": "Укажите URL-адрес, по которому будут отправлены файлы. Каталог должен завершаться косой чертой. Возможные протоколы: \"DICT://\", \"FILE://\", \"FTP://\", \"FTPS://\", \"GOPHER://\", \"HTTP://\", \"HTTPS://\", \"IMAP://\", \"IMAPS://\", \"LDAP://\", \"LDAPS://\", \"POP3://\", \"POP3S://\", \"RTMP://\", \"RTSP://\", \"SCP://\", \"SFTP://\", \"SMTP://\", \"SMTPS://\", \"TELNET://\" и \"TFTP://\".", + "loc.input.label.remotePath": "Удаленный каталог", + "loc.input.help.remotePath": "Если задано, это вложенная папка на удаленном сервере для URL-адреса, указанного в учетных данных.", + "loc.input.label.options": "Дополнительные аргументы", + "loc.input.help.options": "Дополнительные аргументы, которые будут переданы в cURL.", + "loc.input.label.redirectStderr": "Перенаправление стандартной ошибки на стандартный выход", + "loc.input.help.redirectStderr": "Добавьте параметр \"--stderr -\" в cURL. По умолчанию cURL записывает данные индикатора выполнения в stderr. Сборка интерпретирует эти данные как выходные данные ошибки. Если установить этот флажок, данное поведение будет переопределено.", + "loc.messages.CurlReturnCode": "curl завершила работу с кодом возврата: %d", + "loc.messages.CurlFailed": "Сбой curl с ошибкой %s", + "loc.messages.NoMatchingFilesFound": "Не найдены файлы, соответствующие шаблону поиска: %s.", + "loc.messages.UploadingFiles": "Отправка файлов: %s", + "loc.messages.CurlNotFound": "curl не найдена в переменной среды PATH.", + "loc.messages.NotAllFilesUploaded": "Отправлены не все файлы. Отправлено: %d; всего: %d", + "loc.messages.IncompleteEndpoint": "Подключение к службе содержит не все обязательные поля." +} \ No newline at end of file diff --git a/_generated/CUrlUploaderV2_Node20/Strings/resources.resjson/zh-CN/resources.resjson b/_generated/CUrlUploaderV2_Node20/Strings/resources.resjson/zh-CN/resources.resjson new file mode 100644 index 000000000000..c2c8687e4e0b --- /dev/null +++ b/_generated/CUrlUploaderV2_Node20/Strings/resources.resjson/zh-CN/resources.resjson @@ -0,0 +1,31 @@ +{ + "loc.friendlyName": "cURL 上传文件", + "loc.helpMarkDown": "[详细了解此任务](https://go.microsoft.com/fwlink/?LinkID=627418)", + "loc.description": "使用 cURL 的受支持协议上传文件", + "loc.instanceNameFormat": "使用 cURL 上载 $(files)", + "loc.group.displayName.advanced": "高级", + "loc.input.label.files": "文件", + "loc.input.help.files": "要上传的文件。可以使用通配符。例如,\"**/*.zip\" 表示所有子文件夹中的所有 ZIP 文件。", + "loc.input.label.authType": "身份验证方法", + "loc.input.label.serviceEndpoint": "服务连接", + "loc.input.help.serviceEndpoint": "使用凭据进行服务器身份验证的服务连接。使用通用服务连接类型来实现服务连接。", + "loc.input.label.username": "用户名", + "loc.input.help.username": "指定要用于服务器身份验证的用户名。", + "loc.input.label.password": "密码", + "loc.input.help.password": "指定要用于服务器身份验证的密码。使用在“变量”选项卡上启用了锁定的新的生成变量来加密该值。", + "loc.input.label.url": "URL", + "loc.input.help.url": "指定文件将上传到的 URL。目录应以尾部反斜杠结尾。可能的 URL 协议包括 \"DICT://\"、\"FILE://\"、\"FTP://\"、\"FTPS://\"、\"GOPHER://\"、\"HTTP://\"、\"HTTPS://\"、\"IMAP://\"、\"IMAPS://\"、\"LDAP://\"、\"LDAPS://\"、\"POP3://\"、\"POP3S://\"、\"RTMP://\"、\"RTSP://\"、\"SCP://\"、\"SFTP://\"、\"SMTP://\"、\"SMTPS://\"、\"TELNET://\" 和 \"TFTP://\"。", + "loc.input.label.remotePath": "远程目录", + "loc.input.help.remotePath": "如果提供,则此为凭据中提供的 URL 的远程服务器上的子文件夹。", + "loc.input.label.options": "可选参数", + "loc.input.help.options": "将传递给 cURL 的其他参数。", + "loc.input.label.redirectStderr": "将标准错误重定向到标准输出", + "loc.input.help.redirectStderr": "将 \"--stderr -\" 作为参数添加到 cURL。默认情况下,cURL 将其进度条写入 stderr,生成将此过程解释为错误输出。启用此复选框可阻止该行为。", + "loc.messages.CurlReturnCode": "curl 已退出,返回代码为: %d", + "loc.messages.CurlFailed": "curl 失败,出现错误: %s", + "loc.messages.NoMatchingFilesFound": "使用搜索模式 %s 未找到匹配的文件", + "loc.messages.UploadingFiles": "正在上传文件: %s", + "loc.messages.CurlNotFound": "路径中未找到 curl。", + "loc.messages.NotAllFilesUploaded": "并非所有文件都已上传。已上传: %d;总计: %d", + "loc.messages.IncompleteEndpoint": "服务连接未包含所有必填字段。" +} \ No newline at end of file diff --git a/_generated/CUrlUploaderV2_Node20/Strings/resources.resjson/zh-TW/resources.resjson b/_generated/CUrlUploaderV2_Node20/Strings/resources.resjson/zh-TW/resources.resjson new file mode 100644 index 000000000000..900d13eced8c --- /dev/null +++ b/_generated/CUrlUploaderV2_Node20/Strings/resources.resjson/zh-TW/resources.resjson @@ -0,0 +1,31 @@ +{ + "loc.friendlyName": "cURL 上傳檔案", + "loc.helpMarkDown": "[深入了解此工作](https://go.microsoft.com/fwlink/?LinkID=627418)", + "loc.description": "使用 cURL 的支援通訊協定來上傳檔案", + "loc.instanceNameFormat": "使用 cURL 上傳 $(files) ", + "loc.group.displayName.advanced": "進階", + "loc.input.label.files": "檔案", + "loc.input.help.files": "要上傳的檔案。可使用萬用字元。例如,`**/*.zip` 即適用於所有子資料夾中的所有 ZIP 檔案。", + "loc.input.label.authType": "驗證方法", + "loc.input.label.serviceEndpoint": "服務連線", + "loc.input.help.serviceEndpoint": "用於進行伺服器驗證的具認證服務連線。請為服務連線使用一般服務連線類型。", + "loc.input.label.username": "使用者名稱", + "loc.input.help.username": "指定進行伺服器驗證的使用者名稱。", + "loc.input.label.password": "密碼", + "loc.input.help.password": "指定進行伺服器驗證的密碼。請使用已在 [變數] 索引標籤上啟用其鎖定的新組建變數來加密這個值。", + "loc.input.label.url": "URL", + "loc.input.help.url": "指定要將檔案上傳至其中的 URL。目錄的結尾應該是正斜線結尾。可能的 URL 通訊協定包括 `DICT://`、`FILE://`、`FTP://`、`FTPS://`、`GOPHER://`、`HTTP://`、`HTTPS://`、`IMAP://`、`IMAPS://`、`LDAP://`、`LDAPS://`、`POP3://`、`POP3S://`、`RTMP://`、`RTSP://`、`SCP://`、`SFTP://`、`SMTP://`、`SMTPS://`、`TELNET://` 和 `TFTP://`。", + "loc.input.label.remotePath": "遠端目錄", + "loc.input.help.remotePath": "若有提供,這會是認證中所提供之 URL 的遠端伺服器上之子資料夾。", + "loc.input.label.options": "選擇性引數", + "loc.input.help.options": "即將傳遞至 cURL 的額外引數。", + "loc.input.label.redirectStderr": "將標準錯誤重新導向至標準輸出", + "loc.input.help.redirectStderr": "將 '--stderr -' 以引數形式加入 cURL。cURL 預設會將其進度列寫入 stderr,而組建會將之解譯為錯誤輸出。啟用這個核取方塊會隱藏該行為。", + "loc.messages.CurlReturnCode": "curl 結束,傳回碼為: %d", + "loc.messages.CurlFailed": "curl 失敗,發生錯誤: %s", + "loc.messages.NoMatchingFilesFound": "使用下列搜尋模式找不到任何相符檔案: %s", + "loc.messages.UploadingFiles": "正在上傳檔案: %s", + "loc.messages.CurlNotFound": "在 PATH 中找不到 curl。", + "loc.messages.NotAllFilesUploaded": "並未上傳所有檔案; 已上傳: %d; 總計: %d", + "loc.messages.IncompleteEndpoint": "此服務連線並未包含所有必要欄位。" +} \ No newline at end of file diff --git a/_generated/CUrlUploaderV2_Node20/Tests/L0.ts b/_generated/CUrlUploaderV2_Node20/Tests/L0.ts new file mode 100644 index 000000000000..fe251c7a447e --- /dev/null +++ b/_generated/CUrlUploaderV2_Node20/Tests/L0.ts @@ -0,0 +1,60 @@ +import fs = require('fs'); +import assert = require('assert'); +import path = require('path'); +import * as ttm from 'azure-pipelines-task-lib/mock-test'; + +describe('CUrlUploaderV2 Suite', function () { + this.timeout(parseInt(process.env.TASK_TEST_TIMEOUT) || 20000); + + it('runs a curl with single file', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0CurlGoodSingleFile.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.invokedToolCount == 1, 'should have only run curl'); + assert(tr.stderr.length == 0, 'should not have written to stderr'); + assert(tr.succeeded, 'task should have succeeded'); + + done(); + }); + + it('fails if url (req) input not set', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0NoUrl.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.stdOutContained('Input required: url'), 'Should have printed: Input required: url'); + assert(tr.failed, 'task should have failed'); + assert(tr.invokedToolCount == 0, 'should exit before running curl'); + + done(); + }); + + it('fails if files (req) input not set', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0NoFiles.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.stdOutContained('Input required: files'), 'Should have printed: Input required: files'); + assert(tr.failed, 'task should have failed'); + assert(tr.invokedToolCount == 0, 'should exit before running curl'); + + done(); + }); + + it('run curl with multiple files', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0CurlGoodMultiFiles.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.invokedToolCount == 1, 'should have only run curl'); + assert(tr.stderr.length == 0, 'should not have written to stderr'); + assert(tr.succeeded, 'task should have succeeded'); + + done(); + }); +}); diff --git a/_generated/CUrlUploaderV2_Node20/Tests/L0CurlGoodMultiFiles.ts b/_generated/CUrlUploaderV2_Node20/Tests/L0CurlGoodMultiFiles.ts new file mode 100644 index 000000000000..af1336d4be35 --- /dev/null +++ b/_generated/CUrlUploaderV2_Node20/Tests/L0CurlGoodMultiFiles.ts @@ -0,0 +1,41 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'curluploader.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('files', '/some/path/file*'); +tr.setInput('username', 'user'); +tr.setInput('password', 'pass'); +tr.setInput('url', 'ftp://some.ftp.com/'); +tr.setInput('redirectStderr', 'true'); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "curl": "/usr/local/bin/curl", + "node": "/usr/local/bin/node" + }, + "exec": { + "curl -T {/some/path/file1,/some/path/file2} ftp://some.ftp.com/ --stderr - -u user:pass": { + "code": 0, + "stdout": "curl output here" + } + }, + "find": { + "/some/path": [ + "/some/path/file1", + "/some/path/file2" + ] + }, + "match": { + "/some/path/file*": [ + "/some/path/file1", + "/some/path/file2" + ] + }, +}; +tr.setAnswers(a); + +tr.run(); \ No newline at end of file diff --git a/_generated/CUrlUploaderV2_Node20/Tests/L0CurlGoodSingleFile.ts b/_generated/CUrlUploaderV2_Node20/Tests/L0CurlGoodSingleFile.ts new file mode 100644 index 000000000000..606f510be939 --- /dev/null +++ b/_generated/CUrlUploaderV2_Node20/Tests/L0CurlGoodSingleFile.ts @@ -0,0 +1,32 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'curluploader.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('files', '/some/path/one'); +tr.setInput('username', 'user'); +tr.setInput('password', 'pass'); +tr.setInput('url', 'ftp://some.ftp.com/'); +tr.setInput('redirectStderr', 'true'); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "curl": "/usr/local/bin/curl", + "node": "/usr/local/bin/node" + }, + "exec": { + "curl -T /some/path/one ftp://some.ftp.com/ --stderr - -u user:pass": { + "code": 0, + "stdout": "curl output here" + } + }, + "checkPath": { + "/some/path/one": true + } +}; +tr.setAnswers(a); + +tr.run(); \ No newline at end of file diff --git a/_generated/CUrlUploaderV2_Node20/Tests/L0NoFiles.ts b/_generated/CUrlUploaderV2_Node20/Tests/L0NoFiles.ts new file mode 100644 index 000000000000..f09097203978 --- /dev/null +++ b/_generated/CUrlUploaderV2_Node20/Tests/L0NoFiles.ts @@ -0,0 +1,28 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'curluploader.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('url', 'ftp://some.ftp.com/'); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "curl": "/usr/local/bin/curl", + "node": "/usr/local/bin/node" + }, + "exec": { + "curl -T /some/path/one ftp://some.ftp.com/ --stderr - -u user:pass": { + "code": 0, + "stdout": "curl output here" + } + }, + "checkPath": { + "/some/path/one": true + } +}; +tr.setAnswers(a); + +tr.run(); \ No newline at end of file diff --git a/_generated/CUrlUploaderV2_Node20/Tests/L0NoUrl.ts b/_generated/CUrlUploaderV2_Node20/Tests/L0NoUrl.ts new file mode 100644 index 000000000000..2e00a3762337 --- /dev/null +++ b/_generated/CUrlUploaderV2_Node20/Tests/L0NoUrl.ts @@ -0,0 +1,28 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'curluploader.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('files', '/some/path/one'); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "curl": "/usr/local/bin/curl", + "node": "/usr/local/bin/node" + }, + "exec": { + "curl -T /some/path/one ftp://some.ftp.com/ --stderr - -u user:pass": { + "code": 0, + "stdout": "curl output here" + } + }, + "checkPath": { + "/some/path/one": true + } +}; +tr.setAnswers(a); + +tr.run(); \ No newline at end of file diff --git a/_generated/CUrlUploaderV2_Node20/Tests/package-lock.json b/_generated/CUrlUploaderV2_Node20/Tests/package-lock.json new file mode 100644 index 000000000000..2249be616e7d --- /dev/null +++ b/_generated/CUrlUploaderV2_Node20/Tests/package-lock.json @@ -0,0 +1,14 @@ +{ + "name": "curl-uploader-tests", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/mocha": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", + "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==", + "dev": true + } + } +} diff --git a/_generated/CUrlUploaderV2_Node20/Tests/package.json b/_generated/CUrlUploaderV2_Node20/Tests/package.json new file mode 100644 index 000000000000..c2e3f9a1554e --- /dev/null +++ b/_generated/CUrlUploaderV2_Node20/Tests/package.json @@ -0,0 +1,22 @@ +{ + "name": "curl-uploader-tests", + "version": "1.0.0", + "description": "Azure Pipelines Curl Uploader V2 Task Tests", + "main": "L0.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/Microsoft/azure-pipelines-tasks.git" + }, + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Microsoft/azure-pipelines-tasks/issues" + }, + "homepage": "https://github.com/Microsoft/azure-pipelines-tasks#readme", + "devDependencies": { + "@types/mocha": "^5.2.0" + } +} diff --git a/_generated/CUrlUploaderV2_Node20/curluploader.ts b/_generated/CUrlUploaderV2_Node20/curluploader.ts new file mode 100644 index 000000000000..200bf818a2dd --- /dev/null +++ b/_generated/CUrlUploaderV2_Node20/curluploader.ts @@ -0,0 +1,167 @@ +import path = require('path'); +import tl = require('azure-pipelines-task-lib/task'); +import os = require('os'); +import trm = require('azure-pipelines-task-lib/toolrunner'); +import URL = require('url'); + +var firstWildcardIndex = function (str) { + var idx = str.indexOf('*'); + + var idxOfWildcard = str.indexOf('?'); + if (idxOfWildcard > -1) { + if (idx > -1) { + idx = Math.min(idx, idxOfWildcard); + } else { + idx = idxOfWildcard; + } + } + + return idx; +} + +async function run() { + try { + tl.setResourcePath(path.join( __dirname, 'task.json')); + + var isWin = os.type().match(/^Win/); + + var filesPattern: string = tl.getInput('files', true); + var redirectStderr: boolean = tl.getBoolInput('redirectStderr', false); + var options: string = tl.getInput('options', false); + + let url: string = ''; + let username: string = ''; + let password: string = ''; + let authType: string = tl.getInput('authType', false); + if (authType === 'ServiceEndpoint') { + let serviceEndpointID: string = tl.getInput('serviceEndpoint', true); + let serviceEndpoint: tl.EndpointAuthorization = tl.getEndpointAuthorization(serviceEndpointID, false); + username = serviceEndpoint.parameters['username']; + password = serviceEndpoint.parameters['password']; + url = URL.format(URL.parse(tl.getEndpointUrl(serviceEndpointID, false))); // url has a / at the end + if (!username || !password || !url) { + throw new Error(tl.loc('IncompleteEndpoint')); + } + } else { + username = tl.getInput('username', false); + password = tl.getInput('password', false); + url = tl.getInput('url', true); + } + url = url.trim(); + + let remotePath: string = tl.getInput('remotePath', false); + if (remotePath) { + if(authType === 'UserAndPass'){ + // slash should only be added when authType is UserAndPass + // when authType is ServiceEndpoint there already is a slash + url = url + "/"; + } + url = url + remotePath.replace(/\\/gi, "/").trim(); + } + + // Find location of curl + var curlPath: string = tl.which('curl'); + if (!curlPath) { + throw new Error(tl.loc('CurlNotFound')); + } + + // Prepare curl upload command line + var curlRunner: trm.ToolRunner = tl.tool('curl'); + + // Resolve files for the specified value or pattern + let uploadCount = 1; + if (filesPattern.indexOf('*') == -1 && filesPattern.indexOf('?') == -1) { + // No pattern found, check literal path to a single file + tl.checkPath(filesPattern, "filesPattern"); + + // Use the specified single file + var uploadFiles = filesPattern; + } + else { + // Find app files matching the specified pattern + tl.debug('Matching glob pattern: ' + filesPattern); + + // First find the most complete path without any matching patterns + var idx = firstWildcardIndex(filesPattern); + tl.debug('Index of first wildcard: ' + idx); + + var findPathRoot = path.dirname(filesPattern.slice(0, idx)); + tl.debug('find root dir: ' + findPathRoot); + + // Now we get a list of all files under this root + var allFiles = tl.find(findPathRoot); + + // Now matching the pattern against all files + var uploadFilesList = tl.match(allFiles, filesPattern, undefined, {matchBase: true}).map( (s) => { + // If running on Windows agent, normalize the Windows style file paths to use '/' rather than '\'. + // If running on Linux or macOS, escape any '\' in filenames. This is necessary as curl.exe treats + // '\' in filenames as escape characters, preventing it from finding those files. + return isWin ? s.replace(/\\/g, '/') : s.replace(/\\/g, '\\\\'); + }); + + // Fail if no matching app files were found + if (!uploadFilesList || uploadFilesList.length == 0) { + throw new Error(tl.loc('NoMatchingFilesFound', filesPattern)); + } + + uploadCount = uploadFilesList.length; + var uploadFiles = '{' + uploadFilesList.join(',') + '}' + } + tl.debug(tl.loc('UploadingFiles', uploadFiles)); + + curlRunner.arg('-T') + // arrayify the arg so vsts-task-lib does not try to break args at space + // this is required for any file input that could potentially contain spaces + curlRunner.arg([uploadFiles]); + + curlRunner.arg(url); + + if (redirectStderr) { + curlRunner.arg('--stderr'); + curlRunner.arg('-'); + } + + if (options) { + curlRunner.line(options); + } + + if (username || password) { + var userPassCombo = ""; + if (username) { + userPassCombo += username; + } + + userPassCombo += ":"; + + if (password) { + userPassCombo += password; + } + + curlRunner.arg('-u'); + curlRunner.arg(userPassCombo); + } + + let output:string = ''; + curlRunner.on('stdout', (buffer: Buffer) => { + process.stdout.write(buffer); + output = output.concat(buffer ? buffer.toString() : ''); + }); + + var code: number = await curlRunner.exec(); + tl.setResult(tl.TaskResult.Succeeded, tl.loc('CurlReturnCode', code)); + + let outputMatch:RegExpMatchArray = output.match(/[\n\r]100\s/g); + let completed: number = outputMatch ? outputMatch.length : 0; + tl.debug('Successfully uploaded: ' + completed); + if (completed < uploadCount) { + tl.debug('Tested output [' + output + ']'); + tl.warning(tl.loc('NotAllFilesUploaded', completed, uploadCount)); + } + } + catch(err) { + tl.error(err.message); + tl.setResult(tl.TaskResult.Failed, tl.loc('CurlFailed', err.message)); + } +} + +run(); diff --git a/_generated/CUrlUploaderV2_Node20/icon.png b/_generated/CUrlUploaderV2_Node20/icon.png new file mode 100644 index 000000000000..8890ca55715d Binary files /dev/null and b/_generated/CUrlUploaderV2_Node20/icon.png differ diff --git a/_generated/CUrlUploaderV2_Node20/icon.svg b/_generated/CUrlUploaderV2_Node20/icon.svg new file mode 100644 index 000000000000..ae658e11c76a --- /dev/null +++ b/_generated/CUrlUploaderV2_Node20/icon.svg @@ -0,0 +1,4 @@ + + + + diff --git a/_generated/CUrlUploaderV2_Node20/package-lock.json b/_generated/CUrlUploaderV2_Node20/package-lock.json new file mode 100644 index 000000000000..911c254ddd31 --- /dev/null +++ b/_generated/CUrlUploaderV2_Node20/package-lock.json @@ -0,0 +1,488 @@ +{ + "name": "vsts-curluploader-task", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/concat-stream": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz", + "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==", + "requires": { + "@types/node": "*" + } + }, + "@types/form-data": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", + "integrity": "sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==", + "requires": { + "@types/node": "*" + } + }, + "@types/mocha": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.1.1.tgz", + "integrity": "sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==" + }, + "@types/node": { + "version": "20.7.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.7.0.tgz", + "integrity": "sha512-zI22/pJW2wUZOVyguFaUL1HABdmSVxpXrzIqkjsHmyUjNhPoWM1CKfvVuXfetHhIok4RY573cqS0mZ1SJEnoTg==" + }, + "@types/q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.1.tgz", + "integrity": "sha512-eqz8c/0kwNi/OEHQfvIuJVLTst3in0e7uTKeuY+WL/zfKn0xVujOTp42bS/vUUokhK5P2BppLd9JXMOMHcgbjA==" + }, + "@types/qs": { + "version": "6.9.8", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.8.tgz", + "integrity": "sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg==" + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "azure-pipelines-task-lib": { + "version": "5.0.0-preview.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-5.0.0-preview.0.tgz", + "integrity": "sha512-uQJEv+q3/7RD7kgphFd33uXijaPwA1ePYoNkAgZpUhbZUtc2u4JL4ujTT/JJfgXBNW/QQNAiDQ2OC7vOQG/0tg==", + "requires": { + "minimatch": "3.0.5", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "sync-request": "6.1.0", + "uuid": "^3.0.1" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, + "form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + } + }, + "get-port": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", + "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==" + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "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" + }, + "dependencies": { + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==" + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "http-basic": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", + "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", + "requires": { + "caseless": "^0.12.0", + "concat-stream": "^1.6.2", + "http-response-object": "^3.0.1", + "parse-cache-control": "^1.0.1" + } + }, + "http-response-object": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", + "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", + "requires": { + "@types/node": "^10.0.3" + }, + "dependencies": { + "@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + } + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" + }, + "is-core-module": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "requires": { + "has": "^1.0.3" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, + "parse-cache-control": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", + "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "promise": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", + "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", + "requires": { + "asap": "~2.0.6" + } + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==" + }, + "qs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "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" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "requires": { + "resolve": "^1.1.6" + } + }, + "resolve": { + "version": "1.22.6", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.6.tgz", + "integrity": "sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==", + "requires": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" + }, + "shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, + "sync-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", + "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==", + "requires": { + "http-response-object": "^3.0.1", + "sync-rpc": "^1.2.1", + "then-request": "^6.0.0" + } + }, + "sync-rpc": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz", + "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==", + "requires": { + "get-port": "^3.1.0" + } + }, + "then-request": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", + "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", + "requires": { + "@types/concat-stream": "^1.6.0", + "@types/form-data": "0.0.33", + "@types/node": "^8.0.0", + "@types/qs": "^6.2.31", + "caseless": "~0.12.0", + "concat-stream": "^1.6.0", + "form-data": "^2.2.0", + "http-basic": "^8.1.1", + "http-response-object": "^3.0.1", + "promise": "^8.0.0", + "qs": "^6.4.0" + }, + "dependencies": { + "@types/node": { + "version": "8.10.66", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", + "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==" + } + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, + "typescript": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + } + } +} diff --git a/_generated/CUrlUploaderV2_Node20/package.json b/_generated/CUrlUploaderV2_Node20/package.json new file mode 100644 index 000000000000..ed612a049813 --- /dev/null +++ b/_generated/CUrlUploaderV2_Node20/package.json @@ -0,0 +1,28 @@ +{ + "name": "vsts-curluploader-task", + "version": "1.0.0", + "description": "Azure Pipelines Curl Uploader Task", + "main": "curluploader.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/Microsoft/azure-pipelines-tasks.git" + }, + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Microsoft/azure-pipelines-tasks/issues" + }, + "homepage": "https://github.com/Microsoft/azure-pipelines-tasks#readme", + "dependencies": { + "@types/node": "^20.3.1", + "@types/mocha": "^9.1.1", + "@types/q": "^1.0.7", + "azure-pipelines-task-lib": "^5.0.0-preview.0" + }, + "devDependencies": { + "typescript": "5.1.6" + } +} diff --git a/_generated/CUrlUploaderV2_Node20/task.json b/_generated/CUrlUploaderV2_Node20/task.json new file mode 100644 index 000000000000..a3f4644d4939 --- /dev/null +++ b/_generated/CUrlUploaderV2_Node20/task.json @@ -0,0 +1,146 @@ +{ + "id": "AD8974D8-DE11-11E4-B2FE-7FB898A745F3", + "name": "cURLUploader", + "friendlyName": "cURL upload files", + "description": "Use cURL's supported protocols to upload files", + "helpUrl": "https://docs.microsoft.com/azure/devops/pipelines/tasks/utility/curl-upload-files", + "helpMarkDown": "[Learn more about this task](https://go.microsoft.com/fwlink/?LinkID=627418)", + "category": "Utility", + "author": "Microsoft Corporation", + "version": { + "Major": 2, + "Minor": 229, + "Patch": 1 + }, + "runsOn": [ + "Agent", + "DeploymentGroup" + ], + "demands": [], + "minimumAgentVersion": "2.182.1", + "groups": [ + { + "name": "advanced", + "displayName": "Advanced", + "isExpanded": false + } + ], + "inputs": [ + { + "name": "files", + "type": "filePath", + "label": "Files", + "defaultValue": "", + "required": true, + "helpMarkDown": "File(s) to be uploaded. Wildcards can be used. For example, `**/*.zip` for all ZIP files in all subfolders." + }, + { + "name": "authType", + "type": "pickList", + "label": "Authentication Method", + "defaultValue": "ServiceEndpoint", + "helpMarkDown": "", + "options": { + "ServiceEndpoint": "Service connection", + "UserAndPass": "Username and password" + } + }, + { + "name": "serviceEndpoint", + "type": "connectedService:Generic", + "label": "Service Connection", + "defaultValue": "", + "required": true, + "helpMarkDown": "The service connection with the credentials for the server authentication. Use the Generic service connection type for the service connection.", + "visibleRule": "authType = ServiceEndpoint" + }, + { + "name": "username", + "type": "string", + "label": "Username", + "defaultValue": "", + "required": false, + "helpMarkDown": "Specify the username for server authentication.", + "visibleRule": "authType = UserAndPass" + }, + { + "name": "password", + "type": "string", + "label": "Password", + "defaultValue": "", + "required": false, + "helpMarkDown": "Specify the password for server authentication. Use a new build variable with its lock enabled on the Variables tab to encrypt this value.", + "visibleRule": "authType = UserAndPass" + }, + { + "name": "url", + "type": "string", + "label": "URL", + "defaultValue": "", + "required": true, + "helpMarkDown": "Specify the URL to where the file(s) will be uploaded. The directory should end with a trailing slash. Possible URL protocols include `DICT://`, `FILE://`, `FTP://`, `FTPS://`, `GOPHER://`, `HTTP://`, `HTTPS://`, `IMAP://`, `IMAPS://`, `LDAP://`, `LDAPS://`, `POP3://`, `POP3S://`, `RTMP://`, `RTSP://`, `SCP://`, `SFTP://`, `SMTP://`, `SMTPS://`, `TELNET://` and `TFTP://`.", + "visibleRule": "authType = UserAndPass" + }, + { + "name": "remotePath", + "type": "string", + "label": "Remote Directory", + "defaultValue": "upload/$(Build.BuildId)/", + "required": false, + "helpMarkDown": "If supplied, this is the sub-folder on the remote server for the URL supplied in the credentials." + }, + { + "name": "options", + "type": "string", + "label": "Optional Arguments", + "defaultValue": "", + "required": false, + "helpMarkDown": "Additional arguments that will be passed to cURL." + }, + { + "name": "redirectStderr", + "type": "boolean", + "label": "Redirect Standard Error to Standard Out", + "defaultValue": "true", + "required": false, + "groupName": "advanced", + "helpMarkDown": "Adds '--stderr -' as an argument to cURL. By default, cURL writes its progress bar to stderr, which is interpreted by the build as error output. Enabling this checkbox suppresses that behavior." + } + ], + "instanceNameFormat": "Upload $(files) with cURL", + "execution": { + "Node10": { + "target": "curluploader.js", + "argumentFormat": "" + }, + "Node16": { + "target": "curluploader.js", + "argumentFormat": "" + }, + "Node20": { + "target": "curluploader.js", + "argumentFormat": "" + } + }, + "restrictions": { + "commands": { + "mode": "restricted" + }, + "settableVariables": { + "allowed": [] + } + }, + "messages": { + "CurlReturnCode": "curl exited with return code: %d", + "CurlFailed": "curl failed with error: %s", + "NoMatchingFilesFound": "No matching files were found with search pattern: %s", + "UploadingFiles": "Uploading file(s): %s", + "CurlNotFound": "curl was not found in the PATH.", + "NotAllFilesUploaded": "Not all files were uploaded; Uploaded: %d; Total: %d", + "IncompleteEndpoint": "The service connection does not contain all required fields." + }, + "_buildConfigMapping": { + "Default": "2.229.0", + "Node20-225": "2.229.1" + } +} \ No newline at end of file diff --git a/_generated/CUrlUploaderV2_Node20/task.loc.json b/_generated/CUrlUploaderV2_Node20/task.loc.json new file mode 100644 index 000000000000..21a5becd6116 --- /dev/null +++ b/_generated/CUrlUploaderV2_Node20/task.loc.json @@ -0,0 +1,146 @@ +{ + "id": "AD8974D8-DE11-11E4-B2FE-7FB898A745F3", + "name": "cURLUploader", + "friendlyName": "ms-resource:loc.friendlyName", + "description": "ms-resource:loc.description", + "helpUrl": "https://docs.microsoft.com/azure/devops/pipelines/tasks/utility/curl-upload-files", + "helpMarkDown": "ms-resource:loc.helpMarkDown", + "category": "Utility", + "author": "Microsoft Corporation", + "version": { + "Major": 2, + "Minor": 229, + "Patch": 1 + }, + "runsOn": [ + "Agent", + "DeploymentGroup" + ], + "demands": [], + "minimumAgentVersion": "2.182.1", + "groups": [ + { + "name": "advanced", + "displayName": "ms-resource:loc.group.displayName.advanced", + "isExpanded": false + } + ], + "inputs": [ + { + "name": "files", + "type": "filePath", + "label": "ms-resource:loc.input.label.files", + "defaultValue": "", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.files" + }, + { + "name": "authType", + "type": "pickList", + "label": "ms-resource:loc.input.label.authType", + "defaultValue": "ServiceEndpoint", + "helpMarkDown": "", + "options": { + "ServiceEndpoint": "Service connection", + "UserAndPass": "Username and password" + } + }, + { + "name": "serviceEndpoint", + "type": "connectedService:Generic", + "label": "ms-resource:loc.input.label.serviceEndpoint", + "defaultValue": "", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.serviceEndpoint", + "visibleRule": "authType = ServiceEndpoint" + }, + { + "name": "username", + "type": "string", + "label": "ms-resource:loc.input.label.username", + "defaultValue": "", + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.username", + "visibleRule": "authType = UserAndPass" + }, + { + "name": "password", + "type": "string", + "label": "ms-resource:loc.input.label.password", + "defaultValue": "", + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.password", + "visibleRule": "authType = UserAndPass" + }, + { + "name": "url", + "type": "string", + "label": "ms-resource:loc.input.label.url", + "defaultValue": "", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.url", + "visibleRule": "authType = UserAndPass" + }, + { + "name": "remotePath", + "type": "string", + "label": "ms-resource:loc.input.label.remotePath", + "defaultValue": "upload/$(Build.BuildId)/", + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.remotePath" + }, + { + "name": "options", + "type": "string", + "label": "ms-resource:loc.input.label.options", + "defaultValue": "", + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.options" + }, + { + "name": "redirectStderr", + "type": "boolean", + "label": "ms-resource:loc.input.label.redirectStderr", + "defaultValue": "true", + "required": false, + "groupName": "advanced", + "helpMarkDown": "ms-resource:loc.input.help.redirectStderr" + } + ], + "instanceNameFormat": "ms-resource:loc.instanceNameFormat", + "execution": { + "Node10": { + "target": "curluploader.js", + "argumentFormat": "" + }, + "Node16": { + "target": "curluploader.js", + "argumentFormat": "" + }, + "Node20": { + "target": "curluploader.js", + "argumentFormat": "" + } + }, + "restrictions": { + "commands": { + "mode": "restricted" + }, + "settableVariables": { + "allowed": [] + } + }, + "messages": { + "CurlReturnCode": "ms-resource:loc.messages.CurlReturnCode", + "CurlFailed": "ms-resource:loc.messages.CurlFailed", + "NoMatchingFilesFound": "ms-resource:loc.messages.NoMatchingFilesFound", + "UploadingFiles": "ms-resource:loc.messages.UploadingFiles", + "CurlNotFound": "ms-resource:loc.messages.CurlNotFound", + "NotAllFilesUploaded": "ms-resource:loc.messages.NotAllFilesUploaded", + "IncompleteEndpoint": "ms-resource:loc.messages.IncompleteEndpoint" + }, + "_buildConfigMapping": { + "Default": "2.229.0", + "Node20-225": "2.229.1" + } +} \ No newline at end of file diff --git a/_generated/CUrlUploaderV2_Node20/tsconfig.json b/_generated/CUrlUploaderV2_Node20/tsconfig.json new file mode 100644 index 000000000000..0438b79f69ac --- /dev/null +++ b/_generated/CUrlUploaderV2_Node20/tsconfig.json @@ -0,0 +1,6 @@ +{ + "compilerOptions": { + "target": "ES6", + "module": "commonjs" + } +} \ No newline at end of file diff --git a/_generated/CmdLineV2.versionmap.txt b/_generated/CmdLineV2.versionmap.txt new file mode 100644 index 000000000000..22bfac82ab29 --- /dev/null +++ b/_generated/CmdLineV2.versionmap.txt @@ -0,0 +1,2 @@ +Default|2.229.0 +Node20-225|2.229.1 diff --git a/_generated/CmdLineV2/Strings/resources.resjson/de-DE/resources.resjson b/_generated/CmdLineV2/Strings/resources.resjson/de-DE/resources.resjson new file mode 100644 index 000000000000..3f178d5590a1 --- /dev/null +++ b/_generated/CmdLineV2/Strings/resources.resjson/de-DE/resources.resjson @@ -0,0 +1,18 @@ +{ + "loc.friendlyName": "Befehlszeile", + "loc.helpMarkDown": "[Weitere Informationen zu dieser Aufgabe](https://go.microsoft.com/fwlink/?LinkID=613735)", + "loc.description": "Hiermit wird ein Befehlszeilenskript unter Verwendung von Bash unter Linux und MacOS und \"cmd.exe\" unter Windows ausgeführt.", + "loc.instanceNameFormat": "Befehlszeilenskript", + "loc.releaseNotes": "Skripttaskkonsistenz. Es wurde Unterstützung für mehrere Zeilen hinzugefügt.", + "loc.group.displayName.advanced": "Erweitert", + "loc.input.label.script": "Skript", + "loc.input.label.workingDirectory": "Arbeitsverzeichnis", + "loc.input.label.failOnStderr": "Fehler aufgrund von Standardfehler.", + "loc.input.help.failOnStderr": "Wenn dies TRUE ist, tritt bei dieser Aufgabe ein Fehler auf, wenn Fehler in den StandardError-Stream geschrieben werden.", + "loc.messages.GeneratingScript": "Skript wird erstellt.", + "loc.messages.JS_ExitCode": "Bash wurde mit dem Code \"%s\" beendet.", + "loc.messages.JS_Stderr": "Bash hat mindestens eine Zeile in den Standardfehlerstream geschrieben.", + "loc.messages.PS_ExitCode": "\"Cmd.exe\" wurde mit dem Code \"{0}\" beendet.", + "loc.messages.PS_UnableToDetermineExitCode": "Unerwartete Ausnahme. Der Exitcode konnte aus \"cmd.exe\" nicht bestimmt werden.", + "loc.messages.ScriptContents": "Skriptinhalte:" +} \ No newline at end of file diff --git a/_generated/CmdLineV2/Strings/resources.resjson/en-US/resources.resjson b/_generated/CmdLineV2/Strings/resources.resjson/en-US/resources.resjson new file mode 100644 index 000000000000..6b5bae8d3f78 --- /dev/null +++ b/_generated/CmdLineV2/Strings/resources.resjson/en-US/resources.resjson @@ -0,0 +1,18 @@ +{ + "loc.friendlyName": "Command line", + "loc.helpMarkDown": "[Learn more about this task](https://go.microsoft.com/fwlink/?LinkID=613735)", + "loc.description": "Run a command line script using Bash on Linux and macOS and cmd.exe on Windows", + "loc.instanceNameFormat": "Command Line Script", + "loc.releaseNotes": "Script task consistency. Added support for multiple lines.", + "loc.group.displayName.advanced": "Advanced", + "loc.input.label.script": "Script", + "loc.input.label.workingDirectory": "Working Directory", + "loc.input.label.failOnStderr": "Fail on Standard Error", + "loc.input.help.failOnStderr": "If this is true, this task will fail if any errors are written to the StandardError stream.", + "loc.messages.GeneratingScript": "Generating script.", + "loc.messages.JS_ExitCode": "Bash exited with code '%s'.", + "loc.messages.JS_Stderr": "Bash wrote one or more lines to the standard error stream.", + "loc.messages.PS_ExitCode": "Cmd.exe exited with code '{0}'.", + "loc.messages.PS_UnableToDetermineExitCode": "Unexpected exception. Unable to determine the exit code from cmd.exe.", + "loc.messages.ScriptContents": "Script contents:" +} \ No newline at end of file diff --git a/_generated/CmdLineV2/Strings/resources.resjson/es-ES/resources.resjson b/_generated/CmdLineV2/Strings/resources.resjson/es-ES/resources.resjson new file mode 100644 index 000000000000..39f27cf7775f --- /dev/null +++ b/_generated/CmdLineV2/Strings/resources.resjson/es-ES/resources.resjson @@ -0,0 +1,18 @@ +{ + "loc.friendlyName": "Línea de comandos", + "loc.helpMarkDown": "[Obtener más información acerca de esta tarea](https://go.microsoft.com/fwlink/?LinkID=613735)", + "loc.description": "Ejecute un script de la línea de comandos con Bash en Linux y con macOS y cmd.exe en Windows.", + "loc.instanceNameFormat": "Script de la línea de comandos", + "loc.releaseNotes": "Coherencia de la tarea de script. Se ha agregado compatibilidad con varias líneas.", + "loc.group.displayName.advanced": "Avanzado", + "loc.input.label.script": "Script", + "loc.input.label.workingDirectory": "Directorio de trabajo", + "loc.input.label.failOnStderr": "Error si se produce un error estándar", + "loc.input.help.failOnStderr": "Si es true, esta tarea no se realizará cuando se registre algún error en la secuencia de error estándar.", + "loc.messages.GeneratingScript": "Generando script.", + "loc.messages.JS_ExitCode": "Bash se cerró con el código \"%s\".", + "loc.messages.JS_Stderr": "Bash escribió una o varias líneas en la secuencia de error estándar.", + "loc.messages.PS_ExitCode": "Cmd.exe se cerró con el código \"{0}\".", + "loc.messages.PS_UnableToDetermineExitCode": "Excepción inesperada. No se puede determinar el código de salida de cmd.exe.", + "loc.messages.ScriptContents": "Contenido del script:" +} \ No newline at end of file diff --git a/_generated/CmdLineV2/Strings/resources.resjson/fr-FR/resources.resjson b/_generated/CmdLineV2/Strings/resources.resjson/fr-FR/resources.resjson new file mode 100644 index 000000000000..8df9c3ad3e42 --- /dev/null +++ b/_generated/CmdLineV2/Strings/resources.resjson/fr-FR/resources.resjson @@ -0,0 +1,18 @@ +{ + "loc.friendlyName": "Ligne de commande", + "loc.helpMarkDown": "[En savoir plus sur cette tâche](https://go.microsoft.com/fwlink/?LinkID=613735)", + "loc.description": "Exécuter un script de ligne de commande via Bash sur Linux et macOS, et cmd.exe sur Windows", + "loc.instanceNameFormat": "Script de ligne de commande", + "loc.releaseNotes": "Cohérence de la tâche de script. Ajout de la prise en charge de plusieurs lignes.", + "loc.group.displayName.advanced": "Avancé", + "loc.input.label.script": "Script", + "loc.input.label.workingDirectory": "Répertoire de travail", + "loc.input.label.failOnStderr": "Échec sur une erreur standard", + "loc.input.help.failOnStderr": "Si la valeur est true, cette tâche se solde par un échec si des erreurs sont écrites dans le flux de données StandardError.", + "loc.messages.GeneratingScript": "Génération du script.", + "loc.messages.JS_ExitCode": "Arrêt de Bash. Code de sortie : '%s'.", + "loc.messages.JS_Stderr": "Bash a écrit une ou plusieurs lignes dans le flux d'erreurs standard.", + "loc.messages.PS_ExitCode": "Cmd.exe s'est arrêté. Code de sortie : '{0}'.", + "loc.messages.PS_UnableToDetermineExitCode": "Exception inattendue. Impossible de déterminer le code de sortie de cmd.exe.", + "loc.messages.ScriptContents": "Contenu du script :" +} \ No newline at end of file diff --git a/_generated/CmdLineV2/Strings/resources.resjson/it-IT/resources.resjson b/_generated/CmdLineV2/Strings/resources.resjson/it-IT/resources.resjson new file mode 100644 index 000000000000..81ba7876163e --- /dev/null +++ b/_generated/CmdLineV2/Strings/resources.resjson/it-IT/resources.resjson @@ -0,0 +1,18 @@ +{ + "loc.friendlyName": "Riga di comando", + "loc.helpMarkDown": "[Altre informazioni su questa attività](https://go.microsoft.com/fwlink/?LinkID=613735)", + "loc.description": "Consente di eseguire uno script da riga di comando usando Bash in Linux in macOS e cmd.exe in Windows", + "loc.instanceNameFormat": "Script da riga di comando", + "loc.releaseNotes": "Coerenza delle attività per gli script. Aggiunta del supporto per più righe.", + "loc.group.displayName.advanced": "Avanzate", + "loc.input.label.script": "Script", + "loc.input.label.workingDirectory": "Directory di lavoro", + "loc.input.label.failOnStderr": "Interrompi in caso di errore standard", + "loc.input.help.failOnStderr": "Se è impostato su true, questa attività non riuscirà nel caso in cui vengano scritti errori nel flusso StandardError.", + "loc.messages.GeneratingScript": "Generazione dello script.", + "loc.messages.JS_ExitCode": "Bash terminato con codice '%s'.", + "loc.messages.JS_Stderr": "Bash ha scritto una o più righe nel flusso di errore standard.", + "loc.messages.PS_ExitCode": "Cmd.exe terminato con codice '{0}'.", + "loc.messages.PS_UnableToDetermineExitCode": "Eccezione imprevista. Non è possibile determinare il codice di uscita da cmd.exe.", + "loc.messages.ScriptContents": "Contenuto dello script:" +} \ No newline at end of file diff --git a/_generated/CmdLineV2/Strings/resources.resjson/ja-JP/resources.resjson b/_generated/CmdLineV2/Strings/resources.resjson/ja-JP/resources.resjson new file mode 100644 index 000000000000..562ac778b77e --- /dev/null +++ b/_generated/CmdLineV2/Strings/resources.resjson/ja-JP/resources.resjson @@ -0,0 +1,18 @@ +{ + "loc.friendlyName": "コマンド ライン", + "loc.helpMarkDown": "[このタスクの詳細を表示](https://go.microsoft.com/fwlink/?LinkID=613735)", + "loc.description": "bash (macOS と Linux の場合) や cmd.exe (Windows の場合) を使用してコマンド ライン スクリプトを実行します", + "loc.instanceNameFormat": "コマンド ライン スクリプト", + "loc.releaseNotes": "スクリプト タスクの一貫性。複数行のサポートが追加されました。", + "loc.group.displayName.advanced": "詳細設定", + "loc.input.label.script": "スクリプト", + "loc.input.label.workingDirectory": "作業ディレクトリ", + "loc.input.label.failOnStderr": "標準エラーで失敗", + "loc.input.help.failOnStderr": "true の場合、StandardError ストリームにエラーが書き込まれると、このタスクは失敗します。", + "loc.messages.GeneratingScript": "スクリプトを生成しています。", + "loc.messages.JS_ExitCode": "bash がコード '%s' で終了しました。", + "loc.messages.JS_Stderr": "bash が標準エラー ストリームに 1 行以上を書き込みました。", + "loc.messages.PS_ExitCode": "cmd.exe がコード '{0}' で終了しました。", + "loc.messages.PS_UnableToDetermineExitCode": "予期しない例外が発生しました。cmd.exe からの終了コードを判別できません。", + "loc.messages.ScriptContents": "スクリプト コンテンツ:" +} \ No newline at end of file diff --git a/_generated/CmdLineV2/Strings/resources.resjson/ko-KR/resources.resjson b/_generated/CmdLineV2/Strings/resources.resjson/ko-KR/resources.resjson new file mode 100644 index 000000000000..e2ea1e3cf798 --- /dev/null +++ b/_generated/CmdLineV2/Strings/resources.resjson/ko-KR/resources.resjson @@ -0,0 +1,18 @@ +{ + "loc.friendlyName": "명령줄", + "loc.helpMarkDown": "[이 작업에 대한 자세한 정보](https://go.microsoft.com/fwlink/?LinkID=613735)", + "loc.description": "Linux 및 macOS에서는 Bash, Windows에서는 cmd.exe를 사용하여 명령줄 스크립트를 실행합니다.", + "loc.instanceNameFormat": "명령줄 스크립트", + "loc.releaseNotes": "스크립트 작업 일관성입니다. 여러 줄에 대한 지원이 추가되었습니다.", + "loc.group.displayName.advanced": "고급", + "loc.input.label.script": "스크립트", + "loc.input.label.workingDirectory": "작업 디렉터리", + "loc.input.label.failOnStderr": "표준 오류 시 실패", + "loc.input.help.failOnStderr": "true일 경우 StandardError 스트림에 오류가 작성되면 이 작업은 실패하게 됩니다.", + "loc.messages.GeneratingScript": "스크립트를 생성 중입니다.", + "loc.messages.JS_ExitCode": "Bash가 코드 '%s'(으)로 종료되었습니다.", + "loc.messages.JS_Stderr": "Bash가 표준 오류 스트림에 하나 이상의 줄을 썼습니다.", + "loc.messages.PS_ExitCode": "cmd.exe가 코드 '{0}'(으)로 종료되었습니다.", + "loc.messages.PS_UnableToDetermineExitCode": "예기치 않은 예외가 발생했습니다. cmd.exe의 종료 코드를 확인할 수 없습니다.", + "loc.messages.ScriptContents": "스크립트 내용:" +} \ No newline at end of file diff --git a/_generated/CmdLineV2/Strings/resources.resjson/ru-RU/resources.resjson b/_generated/CmdLineV2/Strings/resources.resjson/ru-RU/resources.resjson new file mode 100644 index 000000000000..96e724fbe5ff --- /dev/null +++ b/_generated/CmdLineV2/Strings/resources.resjson/ru-RU/resources.resjson @@ -0,0 +1,18 @@ +{ + "loc.friendlyName": "Командная строка", + "loc.helpMarkDown": "[См. дополнительные сведения об этой задаче](https://go.microsoft.com/fwlink/?LinkID=613735)", + "loc.description": "Запуск скрипта командной строки с помощью Bash в Linux и macOS и cmd.exe в Windows", + "loc.instanceNameFormat": "Скрипт командной строки", + "loc.releaseNotes": "Создавайте скрипты для обеспечения согласованности задач. Добавлена поддержка нескольких строк.", + "loc.group.displayName.advanced": "Дополнительно", + "loc.input.label.script": "Скрипт", + "loc.input.label.workingDirectory": "Рабочий каталог", + "loc.input.label.failOnStderr": "Сбой со стандартной ошибкой", + "loc.input.help.failOnStderr": "Если задано значение True, задача завершится сбоем при записи любых ошибок в поток StandardError.", + "loc.messages.GeneratingScript": "Формируется скрипт.", + "loc.messages.JS_ExitCode": "Завершение работы Bash с кодом \"%s\".", + "loc.messages.JS_Stderr": "Оболочка Bash записала одну или несколько строк в стандартный поток ошибок.", + "loc.messages.PS_ExitCode": "Программа Cmd.exe завершила работу с кодом \"{0}\".", + "loc.messages.PS_UnableToDetermineExitCode": "Непредвиденное исключение. Не удается определить код выхода из cmd.exe.", + "loc.messages.ScriptContents": "Содержимое скрипта:" +} \ No newline at end of file diff --git a/_generated/CmdLineV2/Strings/resources.resjson/zh-CN/resources.resjson b/_generated/CmdLineV2/Strings/resources.resjson/zh-CN/resources.resjson new file mode 100644 index 000000000000..1423010c1f9b --- /dev/null +++ b/_generated/CmdLineV2/Strings/resources.resjson/zh-CN/resources.resjson @@ -0,0 +1,18 @@ +{ + "loc.friendlyName": "命令行", + "loc.helpMarkDown": "[详细了解此任务](https://go.microsoft.com/fwlink/?LinkID=613735)", + "loc.description": "在 Linux 和 macOS 上使用 Bash、在 Windows 上使用 cmd.exe 运行命令行脚本", + "loc.instanceNameFormat": "命令行脚本", + "loc.releaseNotes": "脚本任务一致性。添加了对多个行的支持。", + "loc.group.displayName.advanced": "高级", + "loc.input.label.script": "脚本", + "loc.input.label.workingDirectory": "工作目录", + "loc.input.label.failOnStderr": "因标准错误而失败", + "loc.input.help.failOnStderr": "如果为 true,则在向 StandardError 流写入任何错误时,此任务都会失败。", + "loc.messages.GeneratingScript": "正在生成脚本。", + "loc.messages.JS_ExitCode": "Bash 已退出,代码为“%s”。", + "loc.messages.JS_Stderr": "Bash 向标准错误流写入一个或多个行。", + "loc.messages.PS_ExitCode": "Cmd.exe 已退出,代码为“{0}”。", + "loc.messages.PS_UnableToDetermineExitCode": "出现意外异常。无法确定 cmd.exe 的退出代码。", + "loc.messages.ScriptContents": "脚本内容:" +} \ No newline at end of file diff --git a/_generated/CmdLineV2/Strings/resources.resjson/zh-TW/resources.resjson b/_generated/CmdLineV2/Strings/resources.resjson/zh-TW/resources.resjson new file mode 100644 index 000000000000..3615d2a05b94 --- /dev/null +++ b/_generated/CmdLineV2/Strings/resources.resjson/zh-TW/resources.resjson @@ -0,0 +1,18 @@ +{ + "loc.friendlyName": "命令列", + "loc.helpMarkDown": "[深入了解此工作](https://go.microsoft.com/fwlink/?LinkID=613735)", + "loc.description": "在 Linux 和 macOS 上使用 Bash; 在 Windows 上使用 cmd.exe 來執行命令列指令碼", + "loc.instanceNameFormat": "命令列指令碼", + "loc.releaseNotes": "指令碼工作一致性。新增了多行支援。", + "loc.group.displayName.advanced": "進階", + "loc.input.label.script": "指令碼", + "loc.input.label.workingDirectory": "工作目錄", + "loc.input.label.failOnStderr": "發生標準錯誤的失敗", + "loc.input.help.failOnStderr": "若此為 true,則任何錯誤寫入 StandardError 資料流時,此工作便會失敗。", + "loc.messages.GeneratingScript": "正在產生指令碼。", + "loc.messages.JS_ExitCode": "Bash 已結束,代碼為 '%s'。", + "loc.messages.JS_Stderr": "Bash 已將一或多行寫入標準錯誤資料流。", + "loc.messages.PS_ExitCode": "Cmd.exe 已結束,代碼為 '{0}'。", + "loc.messages.PS_UnableToDetermineExitCode": "未預期的例外狀況。無法從 cmd.exe 判斷結束代碼。", + "loc.messages.ScriptContents": "指令碼內容:" +} \ No newline at end of file diff --git a/_generated/CmdLineV2/Tests/L0.ts b/_generated/CmdLineV2/Tests/L0.ts new file mode 100644 index 000000000000..3c6b79dd8529 --- /dev/null +++ b/_generated/CmdLineV2/Tests/L0.ts @@ -0,0 +1,64 @@ +import assert = require('assert'); +import path = require('path'); +import * as ttm from 'azure-pipelines-task-lib/mock-test'; +import { Done } from 'mocha'; + +describe('Cmd Suite', function () { + this.timeout(60000); + + function runValidations(validator: () => void, tr, done) { + try { + validator(); + done(); + } + catch (error) { + console.log("STDERR", tr.stderr); + console.log("STDOUT", tr.stdout); + done(error); + } + } + + // Just need inline case since external scripts not allowed. + it('Runs an inline script correctly', (done: Done) => { + this.timeout(5000); + + let tp: string = path.join(__dirname, 'L0Inline.js'); + let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + runValidations(() => { + assert(tr.succeeded, 'Cmd should have succeeded.'); + assert(tr.stderr.length === 0, 'Cmd should not have written to stderr'); + assert(tr.stdout.indexOf('my script output') > 0,'Cmd should have correctly run the script'); + }, tr, done); + }); + + it('Reports stderr correctly', (done: Done) => { + this.timeout(5000); + + let tp: string = path.join(__dirname, 'L0StdErr.js'); + let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + runValidations(() => { + assert(tr.failed, 'Bash should have failed'); + assert(tr.stdout.indexOf('##vso[task.issue type=error;]myErrorTest') > 0, 'Bash should have correctly written myErrorTest'); + assert(tr.stdout.length > 1000, 'Bash stderr output is not truncated'); + }, tr, done); + }); + + it('Fails on null exit code', (done: Done) => { + this.timeout(5000); + + let tp: string = path.join(__dirname, 'L0FailOnExitCodeNull.js'); + let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + runValidations(() => { + assert(tr.failed, 'Bash should have failed when the script exits with null code'); + }, tr, done); + }); +}); diff --git a/_generated/CmdLineV2/Tests/L0FailOnExitCodeNull.ts b/_generated/CmdLineV2/Tests/L0FailOnExitCodeNull.ts new file mode 100644 index 000000000000..0f5deae48282 --- /dev/null +++ b/_generated/CmdLineV2/Tests/L0FailOnExitCodeNull.ts @@ -0,0 +1,62 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'cmdline.js'); +let tmr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tmr.setInput('workingDirectory', '/fakecwd'); +tmr.setInput('script', `echo 'Hello world'\necho 'Goodbye world'`); + +//Create assertAgent and getVariable mocks, support not added in this version of task-lib +const tl = require('azure-pipelines-task-lib/mock-task'); +const tlClone = Object.assign({}, tl); +tlClone.getVariable = function(variable: string) { + if (variable.toLowerCase() == 'agent.tempdirectory') { + return 'temp/path'; + } + return null; +}; +tlClone.assertAgent = function(variable: string) { + return; +}; +tmr.registerMock('azure-pipelines-task-lib/mock-task', tlClone); + +// Mock task-lib +let a: ma.TaskLibAnswers = { + 'checkPath' : { + '/fakecwd' : true, + 'path/to/bash': true, + 'temp/path': true + }, + 'which': { + 'bash': 'path/to/bash' + }, + 'assertAgent': { + '2.115.0': true + }, + 'exec': { + 'path/to/bash --noprofile --norc temp\\path\\fileName.sh': { + "code": null + }, + 'path/to/bash --noprofile --norc temp/path/fileName.sh': { + "code": null + } + } +}; +tmr.setAnswers(a); + +// Mock fs +const fs = require('fs'); +const fsClone = Object.assign({}, fs); +fsClone.writeFileSync = function(filePath, contents, options) { + console.log(`Writing ${contents} to ${filePath}`); +} +tmr.registerMock('fs', fsClone); + +// Mock uuidv4 +tmr.registerMock('uuid', {v4: function () { + return 'fileName'; +}}); + +tmr.run(); \ No newline at end of file diff --git a/_generated/CmdLineV2/Tests/L0Inline.ts b/_generated/CmdLineV2/Tests/L0Inline.ts new file mode 100644 index 000000000000..fc640941eb93 --- /dev/null +++ b/_generated/CmdLineV2/Tests/L0Inline.ts @@ -0,0 +1,66 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'cmdline.js'); +let tmr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tmr.setInput('targetType', 'inline'); +tmr.setInput('workingDirectory', '/fakecwd'); +tmr.setInput('script', `echo 'Hello world'\necho 'Goodbye world'`); + +//Create assertAgent and getVariable mocks, support not added in this version of task-lib +const tl = require('azure-pipelines-task-lib/mock-task'); +const tlClone = Object.assign({}, tl); +tlClone.getVariable = function(variable: string) { + if (variable.toLowerCase() == 'agent.tempdirectory') { + return 'temp/path'; + } + return null; +}; +tlClone.assertAgent = function(variable: string) { + return; +}; +tmr.registerMock('azure-pipelines-task-lib/mock-task', tlClone); +tmr.setInput('script2', `echo 'Hello world'\necho 'Goodbye world'`); + +// Mock task-lib +let a: ma.TaskLibAnswers = { + 'checkPath' : { + '/fakecwd' : true, + 'path/to/bash': true, + 'temp/path': true + }, + 'which': { + 'bash': 'path/to/bash' + }, + 'assertAgent': { + '2.115.0': true + }, + 'exec': { + 'path/to/bash --noprofile --norc temp\\path\\fileName.sh': { + "code": 0, + "stdout": "my script output" + }, + 'path/to/bash --noprofile --norc temp/path/fileName.sh': { + "code": 0, + "stdout": "my script output" + } + } +}; +tmr.setAnswers(a); + +// Mock fs +const fs = require('fs'); +const fsClone = Object.assign({}, fs); +fsClone.writeFileSync = function(filePath, contents, options) { + console.log(`Writing ${contents} to ${filePath}`); +} +tmr.registerMock('fs', fsClone); + +// Mock uuidv4 +tmr.registerMock('uuid', {v4: function () { + return 'fileName'; +}}); + +tmr.run(); \ No newline at end of file diff --git a/_generated/CmdLineV2/Tests/L0StdErr.ts b/_generated/CmdLineV2/Tests/L0StdErr.ts new file mode 100644 index 000000000000..f907498dfa12 --- /dev/null +++ b/_generated/CmdLineV2/Tests/L0StdErr.ts @@ -0,0 +1,77 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'cmdline.js'); +let tmr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tmr.setInput('targetType', 'inline'); +tmr.setInput('workingDirectory', '/fakecwd'); +tmr.setInput('script', `echo 'Hello world'\necho 'Goodbye world'`); +tmr.setInput('failOnStderr', 'true'); + +//Create assertAgent and getVariable mocks, support not added in this version of task-lib +const tl = require('azure-pipelines-task-lib/mock-task'); +const tlClone = Object.assign({}, tl); +tlClone.getVariable = function(variable: string) { + if (variable.toLowerCase() == 'agent.tempdirectory') { + return 'temp/path'; + } + return null; +}; +tlClone.assertAgent = function(variable: string) { + return; +}; +tmr.registerMock('azure-pipelines-task-lib/mock-task', tlClone); +tmr.setInput('script2', `echo 'Hello world'\necho 'Goodbye world'`); + +function generateBigString(size: number) { + let result:string = ''; + while (result.length < size) { + result += 'a'; + } + return result; +} + +// Mock task-lib +let a: ma.TaskLibAnswers = { + 'checkPath' : { + '/fakecwd' : true, + 'path/to/bash': true, + 'temp/path': true + }, + 'which': { + 'bash': 'path/to/bash' + }, + 'assertAgent': { + '2.115.0': true + }, + 'exec': { + 'path/to/bash --noprofile --norc temp\\path\\fileName.sh': { + "code": 0, + "stdout": "", + "stderr": "myErrorTest" + generateBigString(1000) + }, + 'path/to/bash --noprofile --norc temp/path/fileName.sh': { + "code": 0, + "stdout": "", + "stderr": "myErrorTest" + generateBigString(1000) + } + } +}; +tmr.setAnswers(a); + +// Mock fs +const fs = require('fs'); +const fsClone = Object.assign({}, fs); +fsClone.writeFileSync = function(filePath, contents, options) { + console.log(`Writing ${contents} to ${filePath}`); +} +tmr.registerMock('fs', fsClone); + +// Mock uuidv4 +tmr.registerMock('uuid', {v4: function () { + return 'fileName'; +}}); + +tmr.run(); \ No newline at end of file diff --git a/_generated/CmdLineV2/cmdline.ps1 b/_generated/CmdLineV2/cmdline.ps1 new file mode 100644 index 000000000000..54ca2248379a --- /dev/null +++ b/_generated/CmdLineV2/cmdline.ps1 @@ -0,0 +1,138 @@ +[CmdletBinding()] +param() + +BEGIN { + function Mask-Percents{ + param ( + $Contents + ) + + return $Contents.Replace("%", "%%") + } +} + +PROCESS { + Trace-VstsEnteringInvocation $MyInvocation + try { + Import-VstsLocStrings "$PSScriptRoot\task.json" + + # Get inputs. + $input_failOnStderr = Get-VstsInput -Name 'failOnStderr' -AsBool + $input_script = Get-VstsInput -Name 'script' + $input_workingDirectory = Get-VstsInput -Name 'workingDirectory' -Require + Assert-VstsPath -LiteralPath $input_workingDirectory -PathType 'Container' + + # Generate the script contents. + Write-Host (Get-VstsLocString -Key 'GeneratingScript') + $contents = "$input_script".Replace("`r`n", "`n").Replace("`n", "`r`n") + + if ($contents.IndexOf("`n") -lt 0 -and $contents.IndexOf("##vso[", ([System.StringComparison]::OrdinalIgnoreCase)) -lt 0) { + # Print one-liner scripts. + Write-Host (Get-VstsLocString -Key 'ScriptContents')shell + Write-Host $contents + } + # Prepend @echo off instead of using the /Q command line switch. When /Q is used, echo can't be turned on. + $contents = "@echo off`r`n$contents" + + # Write the script to disk. + Assert-VstsAgent -Minimum '2.115.0' + $tempDirectory = Get-VstsTaskVariable -Name 'agent.tempDirectory' -Require + Assert-VstsPath -LiteralPath $tempDirectory -PathType 'Container' + $filePath = [System.IO.Path]::Combine($tempDirectory, "$([System.Guid]::NewGuid()).cmd") + $fileEncoding = [System.Console]::OutputEncoding + if ($fileEncoding.CodePage -eq 65001) { + # If UTF8, write without BOM + $fileEncoding = New-Object System.Text.UTF8Encoding $False + } + $null = [System.IO.File]::WriteAllText( + $filePath, + $contents.ToString(), + $fileEncoding) + + # Prepare the external command values. + $cmdPath = $env:ComSpec + Assert-VstsPath -LiteralPath $cmdPath -PathType Leaf + # Command line switches: + # /D Disable execution of AutoRun commands from registry. + # /E:ON Enable command extensions. Note, command extensions are enabled + # by default, unless disabled via registry. + # /V:OFF Disable delayed environment expansion. Note, delayed environment + # expansion is disabled by default, unless enabled via registry. + # /S Will cause first and last quote after /C to be stripped. + # + # Note, use CALL otherwise if a script ends with "goto :eof" the errorlevel + # will not bubble as the exit code of cmd.exe. + $arguments = "/D /E:ON /V:OFF /S /C `"CALL `"$filePath`"`"" + $splat = @{ + 'FileName' = $cmdPath + 'Arguments' = $arguments + 'WorkingDirectory' = $input_workingDirectory + } + + # Switch to "Continue". + $global:ErrorActionPreference = 'Continue' + $failed = $false + + # Run the script. + Write-Host '========================== Starting Command Output ===========================' + if (!$input_failOnStderr) { + Invoke-VstsTool @splat + } else { + $inError = $false + $errorLines = New-Object System.Text.StringBuilder + Invoke-VstsTool @splat 2>&1 | + ForEach-Object { + if ($_ -is [System.Management.Automation.ErrorRecord]) { + # Buffer the error lines. + $failed = $true + $inError = $true + $null = $errorLines.AppendLine("$($_.Exception.Message)") + + # Write to verbose to mitigate if the process hangs. + Write-Verbose "STDERR: $($_.Exception.Message)" + } else { + # Flush the error buffer. + if ($inError) { + $inError = $false + $message = $errorLines.ToString().Trim() + $null = $errorLines.Clear() + if ($message) { + Write-VstsTaskError -Message $message + } + } + + Write-Host "$_" + } + } + + # Flush the error buffer one last time. + if ($inError) { + $inError = $false + $message = $errorLines.ToString().Trim() + $null = $errorLines.Clear() + if ($message) { + Write-VstsTaskError -Message $message + } + } + } + + # Fail on $LASTEXITCODE + if (!(Test-Path -LiteralPath 'variable:\LASTEXITCODE')) { + $failed = $true + Write-Verbose "Unable to determine exit code" + Write-VstsTaskError -Message (Get-VstsLocString -Key 'PS_UnableToDetermineExitCode') + } else { + if ($LASTEXITCODE -ne 0) { + $failed = $true + Write-VstsTaskError -Message (Get-VstsLocString -Key 'PS_ExitCode' -ArgumentList $LASTEXITCODE) + } + } + + # Fail if any errors. + if ($failed) { + Write-VstsSetResult -Result 'Failed' -Message "Error detected" -DoNotThrow + } + } finally { + Trace-VstsLeavingInvocation $MyInvocation + } +} \ No newline at end of file diff --git a/_generated/CmdLineV2/cmdline.ts b/_generated/CmdLineV2/cmdline.ts new file mode 100644 index 000000000000..4fe0a2b038c1 --- /dev/null +++ b/_generated/CmdLineV2/cmdline.ts @@ -0,0 +1,93 @@ +import fs = require('fs'); +import path = require('path'); +import tl = require('azure-pipelines-task-lib/task'); +import tr = require('azure-pipelines-task-lib/toolrunner'); +import { v4 as uuidV4 } from 'uuid'; + +async function run() { + try { + tl.setResourcePath(path.join(__dirname, 'task.json')); + + // Get inputs. + let failOnStderr = tl.getBoolInput('failOnStderr', false); + let script: string = tl.getInput('script', false) || ''; + let workingDirectory = tl.getPathInput('workingDirectory', /*required*/ true, /*check*/ true); + + if (fs.existsSync(script)) { + script = `exec ${script}`; + } + + // Write the script to disk. + console.log(tl.loc('GeneratingScript')); + tl.assertAgent('2.115.0'); + let tempDirectory = tl.getVariable('agent.tempDirectory'); + tl.checkPath(tempDirectory, `${tempDirectory} (agent.tempDirectory)`); + let filePath = path.join(tempDirectory, uuidV4() + '.sh'); + fs.writeFileSync( + filePath, + script, // Don't add a BOM. It causes the script to fail on some operating systems (e.g. on Ubuntu 14). + { encoding: 'utf8' }); + + // Print one-liner scripts. + if (script.indexOf('\n') < 0 && script.toUpperCase().indexOf('##VSO[') < 0) { + console.log(tl.loc('ScriptContents')); + console.log(script); + } + + // Create the tool runner. + console.log('========================== Starting Command Output ==========================='); + let bash = tl.tool(tl.which('bash', true)) + .arg('--noprofile') + .arg(`--norc`) + .arg(filePath); + let options: tr.IExecOptions = { + cwd: workingDirectory, + failOnStdErr: false, + errStream: process.stdout, // Direct all output to STDOUT, otherwise the output may appear out + outStream: process.stdout, // of order since Node buffers it's own STDOUT but not STDERR. + ignoreReturnCode: true + }; + + // Listen for stderr. + let stderrFailure = false; + const aggregatedStderr: string[] = []; + if (failOnStderr) { + bash.on('stderr', (data: Buffer) => { + stderrFailure = true; + aggregatedStderr.push(data.toString('utf8')); + }); + } + + process.on("SIGINT", () => { + tl.debug('Started cancellation of executing script'); + bash.killChildProcess(); + }); + + // Run bash. + let exitCode: number = await bash.exec(options); + + let result = tl.TaskResult.Succeeded; + + // Fail on exit code. + if (exitCode !== 0) { + tl.error(tl.loc('JS_ExitCode', exitCode)); + result = tl.TaskResult.Failed; + } + + // Fail on stderr. + if (stderrFailure) { + tl.error(tl.loc('JS_Stderr')); + aggregatedStderr.forEach((err: string) => { + tl.error(err); + }); + result = tl.TaskResult.Failed; + } + + tl.setResult(result, null, true); + } + catch (err) { + tl.setResult(tl.TaskResult.Failed, err.message || 'run() failed', true); + } +} + +run(); diff --git a/_generated/CmdLineV2/icon.png b/_generated/CmdLineV2/icon.png new file mode 100644 index 000000000000..ef7694815710 Binary files /dev/null and b/_generated/CmdLineV2/icon.png differ diff --git a/_generated/CmdLineV2/icon.svg b/_generated/CmdLineV2/icon.svg new file mode 100644 index 000000000000..a632564df243 --- /dev/null +++ b/_generated/CmdLineV2/icon.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/_generated/CmdLineV2/make.json b/_generated/CmdLineV2/make.json new file mode 100644 index 000000000000..39946a694a6e --- /dev/null +++ b/_generated/CmdLineV2/make.json @@ -0,0 +1,25 @@ +{ + "externals": { + "nugetv2": [ + { + "name": "VstsTaskSdk", + "version": "0.9.0", + "repository": "https://www.powershellgallery.com/api/v2/", + "cp": [ + { + "source": [ + "*.dll", + "*.ps1", + "*.psd1", + "*.psm1", + "lib.json", + "Strings" + ], + "dest": "ps_modules/VstsTaskSdk/", + "options": "-R" + } + ] + } + ] + } +} diff --git a/_generated/CmdLineV2/package-lock.json b/_generated/CmdLineV2/package-lock.json new file mode 100644 index 000000000000..76450290bc79 --- /dev/null +++ b/_generated/CmdLineV2/package-lock.json @@ -0,0 +1,495 @@ +{ + "name": "vsts-cmdline-task", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/concat-stream": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz", + "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==", + "requires": { + "@types/node": "*" + } + }, + "@types/form-data": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", + "integrity": "sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==", + "requires": { + "@types/node": "*" + } + }, + "@types/mocha": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-8.0.3.tgz", + "integrity": "sha512-vyxR57nv8NfcU0GZu8EUXZLTbCMupIUwy95LJ6lllN+JRPG25CwMHoB1q5xKh8YKhQnHYRAn4yW2yuHbf/5xgg==" + }, + "@types/node": { + "version": "16.11.62", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.62.tgz", + "integrity": "sha512-K/ggecSdwAAy2NUW4WKmF4Rc03GKbsfP+k326UWgckoS+Rzd2PaWbjk76dSmqdLQvLTJAO9axiTUJ6488mFsYQ==" + }, + "@types/qs": { + "version": "6.9.8", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.8.tgz", + "integrity": "sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg==" + }, + "@types/uuid": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.0.tgz", + "integrity": "sha512-eQ9qFW/fhfGJF8WKHGEHZEyVWfZxrT+6CLIJGBcZPfxUh/+BnEj+UCGYMlr9qZuX/2AltsvwrGqp0LhEW8D0zQ==" + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "azure-pipelines-task-lib": { + "version": "5.0.0-preview.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-5.0.0-preview.0.tgz", + "integrity": "sha512-uQJEv+q3/7RD7kgphFd33uXijaPwA1ePYoNkAgZpUhbZUtc2u4JL4ujTT/JJfgXBNW/QQNAiDQ2OC7vOQG/0tg==", + "requires": { + "minimatch": "3.0.5", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "sync-request": "6.1.0", + "uuid": "^3.0.1" + }, + "dependencies": { + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + } + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, + "form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + } + }, + "get-port": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", + "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==" + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "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" + }, + "dependencies": { + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==" + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "http-basic": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", + "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", + "requires": { + "caseless": "^0.12.0", + "concat-stream": "^1.6.2", + "http-response-object": "^3.0.1", + "parse-cache-control": "^1.0.1" + } + }, + "http-response-object": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", + "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", + "requires": { + "@types/node": "^10.0.3" + }, + "dependencies": { + "@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + } + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" + }, + "is-core-module": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "requires": { + "has": "^1.0.3" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, + "parse-cache-control": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", + "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "promise": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", + "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", + "requires": { + "asap": "~2.0.6" + } + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==" + }, + "qs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "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" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "requires": { + "resolve": "^1.1.6" + } + }, + "resolve": { + "version": "1.22.6", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.6.tgz", + "integrity": "sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==", + "requires": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" + }, + "shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, + "sync-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", + "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==", + "requires": { + "http-response-object": "^3.0.1", + "sync-rpc": "^1.2.1", + "then-request": "^6.0.0" + } + }, + "sync-rpc": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz", + "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==", + "requires": { + "get-port": "^3.1.0" + } + }, + "then-request": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", + "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", + "requires": { + "@types/concat-stream": "^1.6.0", + "@types/form-data": "0.0.33", + "@types/node": "^8.0.0", + "@types/qs": "^6.2.31", + "caseless": "~0.12.0", + "concat-stream": "^1.6.0", + "form-data": "^2.2.0", + "http-basic": "^8.1.1", + "http-response-object": "^3.0.1", + "promise": "^8.0.0", + "qs": "^6.4.0" + }, + "dependencies": { + "@types/node": { + "version": "8.10.66", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", + "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==" + } + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, + "typescript": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.2.tgz", + "integrity": "sha512-e4ERvRV2wb+rRZ/IQeb3jm2VxBsirQLpQhdxplZ2MEzGvDkkMmPglecnNDfSUBivMjP93vRbngYYDQqQ/78bcQ==", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "uuid": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.0.tgz", + "integrity": "sha512-fX6Z5o4m6XsXBdli9g7DtWgAx+osMsRRZFKma1mIUsLCz6vRvv+pz5VNbyu9UEDzpMWulZfvpgb/cmDXVulYFQ==" + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + } + } +} diff --git a/_generated/CmdLineV2/package.json b/_generated/CmdLineV2/package.json new file mode 100644 index 000000000000..1c74805d7481 --- /dev/null +++ b/_generated/CmdLineV2/package.json @@ -0,0 +1,29 @@ +{ + "name": "vsts-cmdline-task", + "version": "1.0.0", + "description": "Azure Pipelines Command Line Task", + "main": "cmdline.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/Microsoft/azure-pipelines-tasks.git" + }, + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Microsoft/azure-pipelines-tasks/issues" + }, + "homepage": "https://github.com/Microsoft/azure-pipelines-tasks#readme", + "dependencies": { + "@types/uuid": "^8.3.0", + "@types/mocha": "^8.0.3", + "@types/node": "^16.11.39", + "uuid": "^8.3.0", + "azure-pipelines-task-lib": "^5.0.0-preview.0" + }, + "devDependencies": { + "typescript": "4.0.2" + } +} diff --git a/_generated/CmdLineV2/task.json b/_generated/CmdLineV2/task.json new file mode 100644 index 000000000000..e777d996936a --- /dev/null +++ b/_generated/CmdLineV2/task.json @@ -0,0 +1,93 @@ +{ + "id": "D9BAFED4-0B18-4F58-968D-86655B4D2CE9", + "name": "CmdLine", + "friendlyName": "Command line", + "description": "Run a command line script using Bash on Linux and macOS and cmd.exe on Windows", + "helpUrl": "https://docs.microsoft.com/azure/devops/pipelines/tasks/utility/command-line", + "helpMarkDown": "[Learn more about this task](https://go.microsoft.com/fwlink/?LinkID=613735)", + "category": "Utility", + "visibility": [ + "Build", + "Release" + ], + "runsOn": [ + "Agent", + "DeploymentGroup" + ], + "author": "Microsoft Corporation", + "version": { + "Major": 2, + "Minor": 229, + "Patch": 0 + }, + "releaseNotes": "Script task consistency. Added support for multiple lines.", + "showEnvironmentVariables": true, + "groups": [ + { + "name": "advanced", + "displayName": "Advanced", + "isExpanded": false + } + ], + "inputs": [ + { + "name": "script", + "type": "multiLine", + "label": "Script", + "required": true, + "defaultValue": "echo Write your commands here\n\necho Hello world\n", + "properties": { + "resizable": "true", + "rows": "10", + "maxLength": "5000" + }, + "helpMarkDown": "" + }, + { + "name": "workingDirectory", + "type": "filePath", + "label": "Working Directory", + "defaultValue": "", + "required": false, + "groupName": "advanced" + }, + { + "name": "failOnStderr", + "type": "boolean", + "label": "Fail on Standard Error", + "defaultValue": "false", + "required": false, + "helpMarkDown": "If this is true, this task will fail if any errors are written to the StandardError stream.", + "groupName": "advanced" + } + ], + "instanceNameFormat": "Command Line Script", + "execution": { + "PowerShell3": { + "target": "cmdline.ps1", + "platforms": [ + "windows" + ] + }, + "Node10": { + "target": "cmdline.js", + "argumentFormat": "" + }, + "Node16": { + "target": "cmdline.js", + "argumentFormat": "" + } + }, + "messages": { + "GeneratingScript": "Generating script.", + "JS_ExitCode": "Bash exited with code '%s'.", + "JS_Stderr": "Bash wrote one or more lines to the standard error stream.", + "PS_ExitCode": "Cmd.exe exited with code '{0}'.", + "PS_UnableToDetermineExitCode": "Unexpected exception. Unable to determine the exit code from cmd.exe.", + "ScriptContents": "Script contents:" + }, + "_buildConfigMapping": { + "Default": "2.229.0", + "Node20-225": "2.229.1" + } +} \ No newline at end of file diff --git a/_generated/CmdLineV2/task.loc.json b/_generated/CmdLineV2/task.loc.json new file mode 100644 index 000000000000..28b8535b0944 --- /dev/null +++ b/_generated/CmdLineV2/task.loc.json @@ -0,0 +1,93 @@ +{ + "id": "D9BAFED4-0B18-4F58-968D-86655B4D2CE9", + "name": "CmdLine", + "friendlyName": "ms-resource:loc.friendlyName", + "description": "ms-resource:loc.description", + "helpUrl": "https://docs.microsoft.com/azure/devops/pipelines/tasks/utility/command-line", + "helpMarkDown": "ms-resource:loc.helpMarkDown", + "category": "Utility", + "visibility": [ + "Build", + "Release" + ], + "runsOn": [ + "Agent", + "DeploymentGroup" + ], + "author": "Microsoft Corporation", + "version": { + "Major": 2, + "Minor": 229, + "Patch": 0 + }, + "releaseNotes": "ms-resource:loc.releaseNotes", + "showEnvironmentVariables": true, + "groups": [ + { + "name": "advanced", + "displayName": "ms-resource:loc.group.displayName.advanced", + "isExpanded": false + } + ], + "inputs": [ + { + "name": "script", + "type": "multiLine", + "label": "ms-resource:loc.input.label.script", + "required": true, + "defaultValue": "echo Write your commands here\n\necho Hello world\n", + "properties": { + "resizable": "true", + "rows": "10", + "maxLength": "5000" + }, + "helpMarkDown": "" + }, + { + "name": "workingDirectory", + "type": "filePath", + "label": "ms-resource:loc.input.label.workingDirectory", + "defaultValue": "", + "required": false, + "groupName": "advanced" + }, + { + "name": "failOnStderr", + "type": "boolean", + "label": "ms-resource:loc.input.label.failOnStderr", + "defaultValue": "false", + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.failOnStderr", + "groupName": "advanced" + } + ], + "instanceNameFormat": "ms-resource:loc.instanceNameFormat", + "execution": { + "PowerShell3": { + "target": "cmdline.ps1", + "platforms": [ + "windows" + ] + }, + "Node10": { + "target": "cmdline.js", + "argumentFormat": "" + }, + "Node16": { + "target": "cmdline.js", + "argumentFormat": "" + } + }, + "messages": { + "GeneratingScript": "ms-resource:loc.messages.GeneratingScript", + "JS_ExitCode": "ms-resource:loc.messages.JS_ExitCode", + "JS_Stderr": "ms-resource:loc.messages.JS_Stderr", + "PS_ExitCode": "ms-resource:loc.messages.PS_ExitCode", + "PS_UnableToDetermineExitCode": "ms-resource:loc.messages.PS_UnableToDetermineExitCode", + "ScriptContents": "ms-resource:loc.messages.ScriptContents" + }, + "_buildConfigMapping": { + "Default": "2.229.0", + "Node20-225": "2.229.1" + } +} \ No newline at end of file diff --git a/_generated/CmdLineV2/tsconfig.json b/_generated/CmdLineV2/tsconfig.json new file mode 100644 index 000000000000..0438b79f69ac --- /dev/null +++ b/_generated/CmdLineV2/tsconfig.json @@ -0,0 +1,6 @@ +{ + "compilerOptions": { + "target": "ES6", + "module": "commonjs" + } +} \ No newline at end of file diff --git a/_generated/CmdLineV2_Node20/.npmrc b/_generated/CmdLineV2_Node20/.npmrc new file mode 100644 index 000000000000..5fca0d518be7 --- /dev/null +++ b/_generated/CmdLineV2_Node20/.npmrc @@ -0,0 +1 @@ +scripts-prepend-node-path=true diff --git a/_generated/CmdLineV2_Node20/Strings/resources.resjson/de-DE/resources.resjson b/_generated/CmdLineV2_Node20/Strings/resources.resjson/de-DE/resources.resjson new file mode 100644 index 000000000000..3f178d5590a1 --- /dev/null +++ b/_generated/CmdLineV2_Node20/Strings/resources.resjson/de-DE/resources.resjson @@ -0,0 +1,18 @@ +{ + "loc.friendlyName": "Befehlszeile", + "loc.helpMarkDown": "[Weitere Informationen zu dieser Aufgabe](https://go.microsoft.com/fwlink/?LinkID=613735)", + "loc.description": "Hiermit wird ein Befehlszeilenskript unter Verwendung von Bash unter Linux und MacOS und \"cmd.exe\" unter Windows ausgeführt.", + "loc.instanceNameFormat": "Befehlszeilenskript", + "loc.releaseNotes": "Skripttaskkonsistenz. Es wurde Unterstützung für mehrere Zeilen hinzugefügt.", + "loc.group.displayName.advanced": "Erweitert", + "loc.input.label.script": "Skript", + "loc.input.label.workingDirectory": "Arbeitsverzeichnis", + "loc.input.label.failOnStderr": "Fehler aufgrund von Standardfehler.", + "loc.input.help.failOnStderr": "Wenn dies TRUE ist, tritt bei dieser Aufgabe ein Fehler auf, wenn Fehler in den StandardError-Stream geschrieben werden.", + "loc.messages.GeneratingScript": "Skript wird erstellt.", + "loc.messages.JS_ExitCode": "Bash wurde mit dem Code \"%s\" beendet.", + "loc.messages.JS_Stderr": "Bash hat mindestens eine Zeile in den Standardfehlerstream geschrieben.", + "loc.messages.PS_ExitCode": "\"Cmd.exe\" wurde mit dem Code \"{0}\" beendet.", + "loc.messages.PS_UnableToDetermineExitCode": "Unerwartete Ausnahme. Der Exitcode konnte aus \"cmd.exe\" nicht bestimmt werden.", + "loc.messages.ScriptContents": "Skriptinhalte:" +} \ No newline at end of file diff --git a/_generated/CmdLineV2_Node20/Strings/resources.resjson/en-US/resources.resjson b/_generated/CmdLineV2_Node20/Strings/resources.resjson/en-US/resources.resjson new file mode 100644 index 000000000000..6b5bae8d3f78 --- /dev/null +++ b/_generated/CmdLineV2_Node20/Strings/resources.resjson/en-US/resources.resjson @@ -0,0 +1,18 @@ +{ + "loc.friendlyName": "Command line", + "loc.helpMarkDown": "[Learn more about this task](https://go.microsoft.com/fwlink/?LinkID=613735)", + "loc.description": "Run a command line script using Bash on Linux and macOS and cmd.exe on Windows", + "loc.instanceNameFormat": "Command Line Script", + "loc.releaseNotes": "Script task consistency. Added support for multiple lines.", + "loc.group.displayName.advanced": "Advanced", + "loc.input.label.script": "Script", + "loc.input.label.workingDirectory": "Working Directory", + "loc.input.label.failOnStderr": "Fail on Standard Error", + "loc.input.help.failOnStderr": "If this is true, this task will fail if any errors are written to the StandardError stream.", + "loc.messages.GeneratingScript": "Generating script.", + "loc.messages.JS_ExitCode": "Bash exited with code '%s'.", + "loc.messages.JS_Stderr": "Bash wrote one or more lines to the standard error stream.", + "loc.messages.PS_ExitCode": "Cmd.exe exited with code '{0}'.", + "loc.messages.PS_UnableToDetermineExitCode": "Unexpected exception. Unable to determine the exit code from cmd.exe.", + "loc.messages.ScriptContents": "Script contents:" +} \ No newline at end of file diff --git a/_generated/CmdLineV2_Node20/Strings/resources.resjson/es-ES/resources.resjson b/_generated/CmdLineV2_Node20/Strings/resources.resjson/es-ES/resources.resjson new file mode 100644 index 000000000000..39f27cf7775f --- /dev/null +++ b/_generated/CmdLineV2_Node20/Strings/resources.resjson/es-ES/resources.resjson @@ -0,0 +1,18 @@ +{ + "loc.friendlyName": "Línea de comandos", + "loc.helpMarkDown": "[Obtener más información acerca de esta tarea](https://go.microsoft.com/fwlink/?LinkID=613735)", + "loc.description": "Ejecute un script de la línea de comandos con Bash en Linux y con macOS y cmd.exe en Windows.", + "loc.instanceNameFormat": "Script de la línea de comandos", + "loc.releaseNotes": "Coherencia de la tarea de script. Se ha agregado compatibilidad con varias líneas.", + "loc.group.displayName.advanced": "Avanzado", + "loc.input.label.script": "Script", + "loc.input.label.workingDirectory": "Directorio de trabajo", + "loc.input.label.failOnStderr": "Error si se produce un error estándar", + "loc.input.help.failOnStderr": "Si es true, esta tarea no se realizará cuando se registre algún error en la secuencia de error estándar.", + "loc.messages.GeneratingScript": "Generando script.", + "loc.messages.JS_ExitCode": "Bash se cerró con el código \"%s\".", + "loc.messages.JS_Stderr": "Bash escribió una o varias líneas en la secuencia de error estándar.", + "loc.messages.PS_ExitCode": "Cmd.exe se cerró con el código \"{0}\".", + "loc.messages.PS_UnableToDetermineExitCode": "Excepción inesperada. No se puede determinar el código de salida de cmd.exe.", + "loc.messages.ScriptContents": "Contenido del script:" +} \ No newline at end of file diff --git a/_generated/CmdLineV2_Node20/Strings/resources.resjson/fr-FR/resources.resjson b/_generated/CmdLineV2_Node20/Strings/resources.resjson/fr-FR/resources.resjson new file mode 100644 index 000000000000..8df9c3ad3e42 --- /dev/null +++ b/_generated/CmdLineV2_Node20/Strings/resources.resjson/fr-FR/resources.resjson @@ -0,0 +1,18 @@ +{ + "loc.friendlyName": "Ligne de commande", + "loc.helpMarkDown": "[En savoir plus sur cette tâche](https://go.microsoft.com/fwlink/?LinkID=613735)", + "loc.description": "Exécuter un script de ligne de commande via Bash sur Linux et macOS, et cmd.exe sur Windows", + "loc.instanceNameFormat": "Script de ligne de commande", + "loc.releaseNotes": "Cohérence de la tâche de script. Ajout de la prise en charge de plusieurs lignes.", + "loc.group.displayName.advanced": "Avancé", + "loc.input.label.script": "Script", + "loc.input.label.workingDirectory": "Répertoire de travail", + "loc.input.label.failOnStderr": "Échec sur une erreur standard", + "loc.input.help.failOnStderr": "Si la valeur est true, cette tâche se solde par un échec si des erreurs sont écrites dans le flux de données StandardError.", + "loc.messages.GeneratingScript": "Génération du script.", + "loc.messages.JS_ExitCode": "Arrêt de Bash. Code de sortie : '%s'.", + "loc.messages.JS_Stderr": "Bash a écrit une ou plusieurs lignes dans le flux d'erreurs standard.", + "loc.messages.PS_ExitCode": "Cmd.exe s'est arrêté. Code de sortie : '{0}'.", + "loc.messages.PS_UnableToDetermineExitCode": "Exception inattendue. Impossible de déterminer le code de sortie de cmd.exe.", + "loc.messages.ScriptContents": "Contenu du script :" +} \ No newline at end of file diff --git a/_generated/CmdLineV2_Node20/Strings/resources.resjson/it-IT/resources.resjson b/_generated/CmdLineV2_Node20/Strings/resources.resjson/it-IT/resources.resjson new file mode 100644 index 000000000000..81ba7876163e --- /dev/null +++ b/_generated/CmdLineV2_Node20/Strings/resources.resjson/it-IT/resources.resjson @@ -0,0 +1,18 @@ +{ + "loc.friendlyName": "Riga di comando", + "loc.helpMarkDown": "[Altre informazioni su questa attività](https://go.microsoft.com/fwlink/?LinkID=613735)", + "loc.description": "Consente di eseguire uno script da riga di comando usando Bash in Linux in macOS e cmd.exe in Windows", + "loc.instanceNameFormat": "Script da riga di comando", + "loc.releaseNotes": "Coerenza delle attività per gli script. Aggiunta del supporto per più righe.", + "loc.group.displayName.advanced": "Avanzate", + "loc.input.label.script": "Script", + "loc.input.label.workingDirectory": "Directory di lavoro", + "loc.input.label.failOnStderr": "Interrompi in caso di errore standard", + "loc.input.help.failOnStderr": "Se è impostato su true, questa attività non riuscirà nel caso in cui vengano scritti errori nel flusso StandardError.", + "loc.messages.GeneratingScript": "Generazione dello script.", + "loc.messages.JS_ExitCode": "Bash terminato con codice '%s'.", + "loc.messages.JS_Stderr": "Bash ha scritto una o più righe nel flusso di errore standard.", + "loc.messages.PS_ExitCode": "Cmd.exe terminato con codice '{0}'.", + "loc.messages.PS_UnableToDetermineExitCode": "Eccezione imprevista. Non è possibile determinare il codice di uscita da cmd.exe.", + "loc.messages.ScriptContents": "Contenuto dello script:" +} \ No newline at end of file diff --git a/_generated/CmdLineV2_Node20/Strings/resources.resjson/ja-JP/resources.resjson b/_generated/CmdLineV2_Node20/Strings/resources.resjson/ja-JP/resources.resjson new file mode 100644 index 000000000000..562ac778b77e --- /dev/null +++ b/_generated/CmdLineV2_Node20/Strings/resources.resjson/ja-JP/resources.resjson @@ -0,0 +1,18 @@ +{ + "loc.friendlyName": "コマンド ライン", + "loc.helpMarkDown": "[このタスクの詳細を表示](https://go.microsoft.com/fwlink/?LinkID=613735)", + "loc.description": "bash (macOS と Linux の場合) や cmd.exe (Windows の場合) を使用してコマンド ライン スクリプトを実行します", + "loc.instanceNameFormat": "コマンド ライン スクリプト", + "loc.releaseNotes": "スクリプト タスクの一貫性。複数行のサポートが追加されました。", + "loc.group.displayName.advanced": "詳細設定", + "loc.input.label.script": "スクリプト", + "loc.input.label.workingDirectory": "作業ディレクトリ", + "loc.input.label.failOnStderr": "標準エラーで失敗", + "loc.input.help.failOnStderr": "true の場合、StandardError ストリームにエラーが書き込まれると、このタスクは失敗します。", + "loc.messages.GeneratingScript": "スクリプトを生成しています。", + "loc.messages.JS_ExitCode": "bash がコード '%s' で終了しました。", + "loc.messages.JS_Stderr": "bash が標準エラー ストリームに 1 行以上を書き込みました。", + "loc.messages.PS_ExitCode": "cmd.exe がコード '{0}' で終了しました。", + "loc.messages.PS_UnableToDetermineExitCode": "予期しない例外が発生しました。cmd.exe からの終了コードを判別できません。", + "loc.messages.ScriptContents": "スクリプト コンテンツ:" +} \ No newline at end of file diff --git a/_generated/CmdLineV2_Node20/Strings/resources.resjson/ko-KR/resources.resjson b/_generated/CmdLineV2_Node20/Strings/resources.resjson/ko-KR/resources.resjson new file mode 100644 index 000000000000..e2ea1e3cf798 --- /dev/null +++ b/_generated/CmdLineV2_Node20/Strings/resources.resjson/ko-KR/resources.resjson @@ -0,0 +1,18 @@ +{ + "loc.friendlyName": "명령줄", + "loc.helpMarkDown": "[이 작업에 대한 자세한 정보](https://go.microsoft.com/fwlink/?LinkID=613735)", + "loc.description": "Linux 및 macOS에서는 Bash, Windows에서는 cmd.exe를 사용하여 명령줄 스크립트를 실행합니다.", + "loc.instanceNameFormat": "명령줄 스크립트", + "loc.releaseNotes": "스크립트 작업 일관성입니다. 여러 줄에 대한 지원이 추가되었습니다.", + "loc.group.displayName.advanced": "고급", + "loc.input.label.script": "스크립트", + "loc.input.label.workingDirectory": "작업 디렉터리", + "loc.input.label.failOnStderr": "표준 오류 시 실패", + "loc.input.help.failOnStderr": "true일 경우 StandardError 스트림에 오류가 작성되면 이 작업은 실패하게 됩니다.", + "loc.messages.GeneratingScript": "스크립트를 생성 중입니다.", + "loc.messages.JS_ExitCode": "Bash가 코드 '%s'(으)로 종료되었습니다.", + "loc.messages.JS_Stderr": "Bash가 표준 오류 스트림에 하나 이상의 줄을 썼습니다.", + "loc.messages.PS_ExitCode": "cmd.exe가 코드 '{0}'(으)로 종료되었습니다.", + "loc.messages.PS_UnableToDetermineExitCode": "예기치 않은 예외가 발생했습니다. cmd.exe의 종료 코드를 확인할 수 없습니다.", + "loc.messages.ScriptContents": "스크립트 내용:" +} \ No newline at end of file diff --git a/_generated/CmdLineV2_Node20/Strings/resources.resjson/ru-RU/resources.resjson b/_generated/CmdLineV2_Node20/Strings/resources.resjson/ru-RU/resources.resjson new file mode 100644 index 000000000000..96e724fbe5ff --- /dev/null +++ b/_generated/CmdLineV2_Node20/Strings/resources.resjson/ru-RU/resources.resjson @@ -0,0 +1,18 @@ +{ + "loc.friendlyName": "Командная строка", + "loc.helpMarkDown": "[См. дополнительные сведения об этой задаче](https://go.microsoft.com/fwlink/?LinkID=613735)", + "loc.description": "Запуск скрипта командной строки с помощью Bash в Linux и macOS и cmd.exe в Windows", + "loc.instanceNameFormat": "Скрипт командной строки", + "loc.releaseNotes": "Создавайте скрипты для обеспечения согласованности задач. Добавлена поддержка нескольких строк.", + "loc.group.displayName.advanced": "Дополнительно", + "loc.input.label.script": "Скрипт", + "loc.input.label.workingDirectory": "Рабочий каталог", + "loc.input.label.failOnStderr": "Сбой со стандартной ошибкой", + "loc.input.help.failOnStderr": "Если задано значение True, задача завершится сбоем при записи любых ошибок в поток StandardError.", + "loc.messages.GeneratingScript": "Формируется скрипт.", + "loc.messages.JS_ExitCode": "Завершение работы Bash с кодом \"%s\".", + "loc.messages.JS_Stderr": "Оболочка Bash записала одну или несколько строк в стандартный поток ошибок.", + "loc.messages.PS_ExitCode": "Программа Cmd.exe завершила работу с кодом \"{0}\".", + "loc.messages.PS_UnableToDetermineExitCode": "Непредвиденное исключение. Не удается определить код выхода из cmd.exe.", + "loc.messages.ScriptContents": "Содержимое скрипта:" +} \ No newline at end of file diff --git a/_generated/CmdLineV2_Node20/Strings/resources.resjson/zh-CN/resources.resjson b/_generated/CmdLineV2_Node20/Strings/resources.resjson/zh-CN/resources.resjson new file mode 100644 index 000000000000..1423010c1f9b --- /dev/null +++ b/_generated/CmdLineV2_Node20/Strings/resources.resjson/zh-CN/resources.resjson @@ -0,0 +1,18 @@ +{ + "loc.friendlyName": "命令行", + "loc.helpMarkDown": "[详细了解此任务](https://go.microsoft.com/fwlink/?LinkID=613735)", + "loc.description": "在 Linux 和 macOS 上使用 Bash、在 Windows 上使用 cmd.exe 运行命令行脚本", + "loc.instanceNameFormat": "命令行脚本", + "loc.releaseNotes": "脚本任务一致性。添加了对多个行的支持。", + "loc.group.displayName.advanced": "高级", + "loc.input.label.script": "脚本", + "loc.input.label.workingDirectory": "工作目录", + "loc.input.label.failOnStderr": "因标准错误而失败", + "loc.input.help.failOnStderr": "如果为 true,则在向 StandardError 流写入任何错误时,此任务都会失败。", + "loc.messages.GeneratingScript": "正在生成脚本。", + "loc.messages.JS_ExitCode": "Bash 已退出,代码为“%s”。", + "loc.messages.JS_Stderr": "Bash 向标准错误流写入一个或多个行。", + "loc.messages.PS_ExitCode": "Cmd.exe 已退出,代码为“{0}”。", + "loc.messages.PS_UnableToDetermineExitCode": "出现意外异常。无法确定 cmd.exe 的退出代码。", + "loc.messages.ScriptContents": "脚本内容:" +} \ No newline at end of file diff --git a/_generated/CmdLineV2_Node20/Strings/resources.resjson/zh-TW/resources.resjson b/_generated/CmdLineV2_Node20/Strings/resources.resjson/zh-TW/resources.resjson new file mode 100644 index 000000000000..3615d2a05b94 --- /dev/null +++ b/_generated/CmdLineV2_Node20/Strings/resources.resjson/zh-TW/resources.resjson @@ -0,0 +1,18 @@ +{ + "loc.friendlyName": "命令列", + "loc.helpMarkDown": "[深入了解此工作](https://go.microsoft.com/fwlink/?LinkID=613735)", + "loc.description": "在 Linux 和 macOS 上使用 Bash; 在 Windows 上使用 cmd.exe 來執行命令列指令碼", + "loc.instanceNameFormat": "命令列指令碼", + "loc.releaseNotes": "指令碼工作一致性。新增了多行支援。", + "loc.group.displayName.advanced": "進階", + "loc.input.label.script": "指令碼", + "loc.input.label.workingDirectory": "工作目錄", + "loc.input.label.failOnStderr": "發生標準錯誤的失敗", + "loc.input.help.failOnStderr": "若此為 true,則任何錯誤寫入 StandardError 資料流時,此工作便會失敗。", + "loc.messages.GeneratingScript": "正在產生指令碼。", + "loc.messages.JS_ExitCode": "Bash 已結束,代碼為 '%s'。", + "loc.messages.JS_Stderr": "Bash 已將一或多行寫入標準錯誤資料流。", + "loc.messages.PS_ExitCode": "Cmd.exe 已結束,代碼為 '{0}'。", + "loc.messages.PS_UnableToDetermineExitCode": "未預期的例外狀況。無法從 cmd.exe 判斷結束代碼。", + "loc.messages.ScriptContents": "指令碼內容:" +} \ No newline at end of file diff --git a/_generated/CmdLineV2_Node20/Tests/L0.ts b/_generated/CmdLineV2_Node20/Tests/L0.ts new file mode 100644 index 000000000000..3c6b79dd8529 --- /dev/null +++ b/_generated/CmdLineV2_Node20/Tests/L0.ts @@ -0,0 +1,64 @@ +import assert = require('assert'); +import path = require('path'); +import * as ttm from 'azure-pipelines-task-lib/mock-test'; +import { Done } from 'mocha'; + +describe('Cmd Suite', function () { + this.timeout(60000); + + function runValidations(validator: () => void, tr, done) { + try { + validator(); + done(); + } + catch (error) { + console.log("STDERR", tr.stderr); + console.log("STDOUT", tr.stdout); + done(error); + } + } + + // Just need inline case since external scripts not allowed. + it('Runs an inline script correctly', (done: Done) => { + this.timeout(5000); + + let tp: string = path.join(__dirname, 'L0Inline.js'); + let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + runValidations(() => { + assert(tr.succeeded, 'Cmd should have succeeded.'); + assert(tr.stderr.length === 0, 'Cmd should not have written to stderr'); + assert(tr.stdout.indexOf('my script output') > 0,'Cmd should have correctly run the script'); + }, tr, done); + }); + + it('Reports stderr correctly', (done: Done) => { + this.timeout(5000); + + let tp: string = path.join(__dirname, 'L0StdErr.js'); + let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + runValidations(() => { + assert(tr.failed, 'Bash should have failed'); + assert(tr.stdout.indexOf('##vso[task.issue type=error;]myErrorTest') > 0, 'Bash should have correctly written myErrorTest'); + assert(tr.stdout.length > 1000, 'Bash stderr output is not truncated'); + }, tr, done); + }); + + it('Fails on null exit code', (done: Done) => { + this.timeout(5000); + + let tp: string = path.join(__dirname, 'L0FailOnExitCodeNull.js'); + let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + runValidations(() => { + assert(tr.failed, 'Bash should have failed when the script exits with null code'); + }, tr, done); + }); +}); diff --git a/_generated/CmdLineV2_Node20/Tests/L0FailOnExitCodeNull.ts b/_generated/CmdLineV2_Node20/Tests/L0FailOnExitCodeNull.ts new file mode 100644 index 000000000000..0f5deae48282 --- /dev/null +++ b/_generated/CmdLineV2_Node20/Tests/L0FailOnExitCodeNull.ts @@ -0,0 +1,62 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'cmdline.js'); +let tmr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tmr.setInput('workingDirectory', '/fakecwd'); +tmr.setInput('script', `echo 'Hello world'\necho 'Goodbye world'`); + +//Create assertAgent and getVariable mocks, support not added in this version of task-lib +const tl = require('azure-pipelines-task-lib/mock-task'); +const tlClone = Object.assign({}, tl); +tlClone.getVariable = function(variable: string) { + if (variable.toLowerCase() == 'agent.tempdirectory') { + return 'temp/path'; + } + return null; +}; +tlClone.assertAgent = function(variable: string) { + return; +}; +tmr.registerMock('azure-pipelines-task-lib/mock-task', tlClone); + +// Mock task-lib +let a: ma.TaskLibAnswers = { + 'checkPath' : { + '/fakecwd' : true, + 'path/to/bash': true, + 'temp/path': true + }, + 'which': { + 'bash': 'path/to/bash' + }, + 'assertAgent': { + '2.115.0': true + }, + 'exec': { + 'path/to/bash --noprofile --norc temp\\path\\fileName.sh': { + "code": null + }, + 'path/to/bash --noprofile --norc temp/path/fileName.sh': { + "code": null + } + } +}; +tmr.setAnswers(a); + +// Mock fs +const fs = require('fs'); +const fsClone = Object.assign({}, fs); +fsClone.writeFileSync = function(filePath, contents, options) { + console.log(`Writing ${contents} to ${filePath}`); +} +tmr.registerMock('fs', fsClone); + +// Mock uuidv4 +tmr.registerMock('uuid', {v4: function () { + return 'fileName'; +}}); + +tmr.run(); \ No newline at end of file diff --git a/_generated/CmdLineV2_Node20/Tests/L0Inline.ts b/_generated/CmdLineV2_Node20/Tests/L0Inline.ts new file mode 100644 index 000000000000..fc640941eb93 --- /dev/null +++ b/_generated/CmdLineV2_Node20/Tests/L0Inline.ts @@ -0,0 +1,66 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'cmdline.js'); +let tmr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tmr.setInput('targetType', 'inline'); +tmr.setInput('workingDirectory', '/fakecwd'); +tmr.setInput('script', `echo 'Hello world'\necho 'Goodbye world'`); + +//Create assertAgent and getVariable mocks, support not added in this version of task-lib +const tl = require('azure-pipelines-task-lib/mock-task'); +const tlClone = Object.assign({}, tl); +tlClone.getVariable = function(variable: string) { + if (variable.toLowerCase() == 'agent.tempdirectory') { + return 'temp/path'; + } + return null; +}; +tlClone.assertAgent = function(variable: string) { + return; +}; +tmr.registerMock('azure-pipelines-task-lib/mock-task', tlClone); +tmr.setInput('script2', `echo 'Hello world'\necho 'Goodbye world'`); + +// Mock task-lib +let a: ma.TaskLibAnswers = { + 'checkPath' : { + '/fakecwd' : true, + 'path/to/bash': true, + 'temp/path': true + }, + 'which': { + 'bash': 'path/to/bash' + }, + 'assertAgent': { + '2.115.0': true + }, + 'exec': { + 'path/to/bash --noprofile --norc temp\\path\\fileName.sh': { + "code": 0, + "stdout": "my script output" + }, + 'path/to/bash --noprofile --norc temp/path/fileName.sh': { + "code": 0, + "stdout": "my script output" + } + } +}; +tmr.setAnswers(a); + +// Mock fs +const fs = require('fs'); +const fsClone = Object.assign({}, fs); +fsClone.writeFileSync = function(filePath, contents, options) { + console.log(`Writing ${contents} to ${filePath}`); +} +tmr.registerMock('fs', fsClone); + +// Mock uuidv4 +tmr.registerMock('uuid', {v4: function () { + return 'fileName'; +}}); + +tmr.run(); \ No newline at end of file diff --git a/_generated/CmdLineV2_Node20/Tests/L0StdErr.ts b/_generated/CmdLineV2_Node20/Tests/L0StdErr.ts new file mode 100644 index 000000000000..f907498dfa12 --- /dev/null +++ b/_generated/CmdLineV2_Node20/Tests/L0StdErr.ts @@ -0,0 +1,77 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'cmdline.js'); +let tmr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tmr.setInput('targetType', 'inline'); +tmr.setInput('workingDirectory', '/fakecwd'); +tmr.setInput('script', `echo 'Hello world'\necho 'Goodbye world'`); +tmr.setInput('failOnStderr', 'true'); + +//Create assertAgent and getVariable mocks, support not added in this version of task-lib +const tl = require('azure-pipelines-task-lib/mock-task'); +const tlClone = Object.assign({}, tl); +tlClone.getVariable = function(variable: string) { + if (variable.toLowerCase() == 'agent.tempdirectory') { + return 'temp/path'; + } + return null; +}; +tlClone.assertAgent = function(variable: string) { + return; +}; +tmr.registerMock('azure-pipelines-task-lib/mock-task', tlClone); +tmr.setInput('script2', `echo 'Hello world'\necho 'Goodbye world'`); + +function generateBigString(size: number) { + let result:string = ''; + while (result.length < size) { + result += 'a'; + } + return result; +} + +// Mock task-lib +let a: ma.TaskLibAnswers = { + 'checkPath' : { + '/fakecwd' : true, + 'path/to/bash': true, + 'temp/path': true + }, + 'which': { + 'bash': 'path/to/bash' + }, + 'assertAgent': { + '2.115.0': true + }, + 'exec': { + 'path/to/bash --noprofile --norc temp\\path\\fileName.sh': { + "code": 0, + "stdout": "", + "stderr": "myErrorTest" + generateBigString(1000) + }, + 'path/to/bash --noprofile --norc temp/path/fileName.sh': { + "code": 0, + "stdout": "", + "stderr": "myErrorTest" + generateBigString(1000) + } + } +}; +tmr.setAnswers(a); + +// Mock fs +const fs = require('fs'); +const fsClone = Object.assign({}, fs); +fsClone.writeFileSync = function(filePath, contents, options) { + console.log(`Writing ${contents} to ${filePath}`); +} +tmr.registerMock('fs', fsClone); + +// Mock uuidv4 +tmr.registerMock('uuid', {v4: function () { + return 'fileName'; +}}); + +tmr.run(); \ No newline at end of file diff --git a/_generated/CmdLineV2_Node20/cmdline.ps1 b/_generated/CmdLineV2_Node20/cmdline.ps1 new file mode 100644 index 000000000000..54ca2248379a --- /dev/null +++ b/_generated/CmdLineV2_Node20/cmdline.ps1 @@ -0,0 +1,138 @@ +[CmdletBinding()] +param() + +BEGIN { + function Mask-Percents{ + param ( + $Contents + ) + + return $Contents.Replace("%", "%%") + } +} + +PROCESS { + Trace-VstsEnteringInvocation $MyInvocation + try { + Import-VstsLocStrings "$PSScriptRoot\task.json" + + # Get inputs. + $input_failOnStderr = Get-VstsInput -Name 'failOnStderr' -AsBool + $input_script = Get-VstsInput -Name 'script' + $input_workingDirectory = Get-VstsInput -Name 'workingDirectory' -Require + Assert-VstsPath -LiteralPath $input_workingDirectory -PathType 'Container' + + # Generate the script contents. + Write-Host (Get-VstsLocString -Key 'GeneratingScript') + $contents = "$input_script".Replace("`r`n", "`n").Replace("`n", "`r`n") + + if ($contents.IndexOf("`n") -lt 0 -and $contents.IndexOf("##vso[", ([System.StringComparison]::OrdinalIgnoreCase)) -lt 0) { + # Print one-liner scripts. + Write-Host (Get-VstsLocString -Key 'ScriptContents')shell + Write-Host $contents + } + # Prepend @echo off instead of using the /Q command line switch. When /Q is used, echo can't be turned on. + $contents = "@echo off`r`n$contents" + + # Write the script to disk. + Assert-VstsAgent -Minimum '2.115.0' + $tempDirectory = Get-VstsTaskVariable -Name 'agent.tempDirectory' -Require + Assert-VstsPath -LiteralPath $tempDirectory -PathType 'Container' + $filePath = [System.IO.Path]::Combine($tempDirectory, "$([System.Guid]::NewGuid()).cmd") + $fileEncoding = [System.Console]::OutputEncoding + if ($fileEncoding.CodePage -eq 65001) { + # If UTF8, write without BOM + $fileEncoding = New-Object System.Text.UTF8Encoding $False + } + $null = [System.IO.File]::WriteAllText( + $filePath, + $contents.ToString(), + $fileEncoding) + + # Prepare the external command values. + $cmdPath = $env:ComSpec + Assert-VstsPath -LiteralPath $cmdPath -PathType Leaf + # Command line switches: + # /D Disable execution of AutoRun commands from registry. + # /E:ON Enable command extensions. Note, command extensions are enabled + # by default, unless disabled via registry. + # /V:OFF Disable delayed environment expansion. Note, delayed environment + # expansion is disabled by default, unless enabled via registry. + # /S Will cause first and last quote after /C to be stripped. + # + # Note, use CALL otherwise if a script ends with "goto :eof" the errorlevel + # will not bubble as the exit code of cmd.exe. + $arguments = "/D /E:ON /V:OFF /S /C `"CALL `"$filePath`"`"" + $splat = @{ + 'FileName' = $cmdPath + 'Arguments' = $arguments + 'WorkingDirectory' = $input_workingDirectory + } + + # Switch to "Continue". + $global:ErrorActionPreference = 'Continue' + $failed = $false + + # Run the script. + Write-Host '========================== Starting Command Output ===========================' + if (!$input_failOnStderr) { + Invoke-VstsTool @splat + } else { + $inError = $false + $errorLines = New-Object System.Text.StringBuilder + Invoke-VstsTool @splat 2>&1 | + ForEach-Object { + if ($_ -is [System.Management.Automation.ErrorRecord]) { + # Buffer the error lines. + $failed = $true + $inError = $true + $null = $errorLines.AppendLine("$($_.Exception.Message)") + + # Write to verbose to mitigate if the process hangs. + Write-Verbose "STDERR: $($_.Exception.Message)" + } else { + # Flush the error buffer. + if ($inError) { + $inError = $false + $message = $errorLines.ToString().Trim() + $null = $errorLines.Clear() + if ($message) { + Write-VstsTaskError -Message $message + } + } + + Write-Host "$_" + } + } + + # Flush the error buffer one last time. + if ($inError) { + $inError = $false + $message = $errorLines.ToString().Trim() + $null = $errorLines.Clear() + if ($message) { + Write-VstsTaskError -Message $message + } + } + } + + # Fail on $LASTEXITCODE + if (!(Test-Path -LiteralPath 'variable:\LASTEXITCODE')) { + $failed = $true + Write-Verbose "Unable to determine exit code" + Write-VstsTaskError -Message (Get-VstsLocString -Key 'PS_UnableToDetermineExitCode') + } else { + if ($LASTEXITCODE -ne 0) { + $failed = $true + Write-VstsTaskError -Message (Get-VstsLocString -Key 'PS_ExitCode' -ArgumentList $LASTEXITCODE) + } + } + + # Fail if any errors. + if ($failed) { + Write-VstsSetResult -Result 'Failed' -Message "Error detected" -DoNotThrow + } + } finally { + Trace-VstsLeavingInvocation $MyInvocation + } +} \ No newline at end of file diff --git a/_generated/CmdLineV2_Node20/cmdline.ts b/_generated/CmdLineV2_Node20/cmdline.ts new file mode 100644 index 000000000000..4fe0a2b038c1 --- /dev/null +++ b/_generated/CmdLineV2_Node20/cmdline.ts @@ -0,0 +1,93 @@ +import fs = require('fs'); +import path = require('path'); +import tl = require('azure-pipelines-task-lib/task'); +import tr = require('azure-pipelines-task-lib/toolrunner'); +import { v4 as uuidV4 } from 'uuid'; + +async function run() { + try { + tl.setResourcePath(path.join(__dirname, 'task.json')); + + // Get inputs. + let failOnStderr = tl.getBoolInput('failOnStderr', false); + let script: string = tl.getInput('script', false) || ''; + let workingDirectory = tl.getPathInput('workingDirectory', /*required*/ true, /*check*/ true); + + if (fs.existsSync(script)) { + script = `exec ${script}`; + } + + // Write the script to disk. + console.log(tl.loc('GeneratingScript')); + tl.assertAgent('2.115.0'); + let tempDirectory = tl.getVariable('agent.tempDirectory'); + tl.checkPath(tempDirectory, `${tempDirectory} (agent.tempDirectory)`); + let filePath = path.join(tempDirectory, uuidV4() + '.sh'); + fs.writeFileSync( + filePath, + script, // Don't add a BOM. It causes the script to fail on some operating systems (e.g. on Ubuntu 14). + { encoding: 'utf8' }); + + // Print one-liner scripts. + if (script.indexOf('\n') < 0 && script.toUpperCase().indexOf('##VSO[') < 0) { + console.log(tl.loc('ScriptContents')); + console.log(script); + } + + // Create the tool runner. + console.log('========================== Starting Command Output ==========================='); + let bash = tl.tool(tl.which('bash', true)) + .arg('--noprofile') + .arg(`--norc`) + .arg(filePath); + let options: tr.IExecOptions = { + cwd: workingDirectory, + failOnStdErr: false, + errStream: process.stdout, // Direct all output to STDOUT, otherwise the output may appear out + outStream: process.stdout, // of order since Node buffers it's own STDOUT but not STDERR. + ignoreReturnCode: true + }; + + // Listen for stderr. + let stderrFailure = false; + const aggregatedStderr: string[] = []; + if (failOnStderr) { + bash.on('stderr', (data: Buffer) => { + stderrFailure = true; + aggregatedStderr.push(data.toString('utf8')); + }); + } + + process.on("SIGINT", () => { + tl.debug('Started cancellation of executing script'); + bash.killChildProcess(); + }); + + // Run bash. + let exitCode: number = await bash.exec(options); + + let result = tl.TaskResult.Succeeded; + + // Fail on exit code. + if (exitCode !== 0) { + tl.error(tl.loc('JS_ExitCode', exitCode)); + result = tl.TaskResult.Failed; + } + + // Fail on stderr. + if (stderrFailure) { + tl.error(tl.loc('JS_Stderr')); + aggregatedStderr.forEach((err: string) => { + tl.error(err); + }); + result = tl.TaskResult.Failed; + } + + tl.setResult(result, null, true); + } + catch (err) { + tl.setResult(tl.TaskResult.Failed, err.message || 'run() failed', true); + } +} + +run(); diff --git a/_generated/CmdLineV2_Node20/icon.png b/_generated/CmdLineV2_Node20/icon.png new file mode 100644 index 000000000000..ef7694815710 Binary files /dev/null and b/_generated/CmdLineV2_Node20/icon.png differ diff --git a/_generated/CmdLineV2_Node20/icon.svg b/_generated/CmdLineV2_Node20/icon.svg new file mode 100644 index 000000000000..a632564df243 --- /dev/null +++ b/_generated/CmdLineV2_Node20/icon.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/_generated/CmdLineV2_Node20/make.json b/_generated/CmdLineV2_Node20/make.json new file mode 100644 index 000000000000..39946a694a6e --- /dev/null +++ b/_generated/CmdLineV2_Node20/make.json @@ -0,0 +1,25 @@ +{ + "externals": { + "nugetv2": [ + { + "name": "VstsTaskSdk", + "version": "0.9.0", + "repository": "https://www.powershellgallery.com/api/v2/", + "cp": [ + { + "source": [ + "*.dll", + "*.ps1", + "*.psd1", + "*.psm1", + "lib.json", + "Strings" + ], + "dest": "ps_modules/VstsTaskSdk/", + "options": "-R" + } + ] + } + ] + } +} diff --git a/_generated/CmdLineV2_Node20/package-lock.json b/_generated/CmdLineV2_Node20/package-lock.json new file mode 100644 index 000000000000..7fe8adbb0b71 --- /dev/null +++ b/_generated/CmdLineV2_Node20/package-lock.json @@ -0,0 +1,495 @@ +{ + "name": "vsts-cmdline-task", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/concat-stream": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz", + "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==", + "requires": { + "@types/node": "*" + } + }, + "@types/form-data": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", + "integrity": "sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==", + "requires": { + "@types/node": "*" + } + }, + "@types/mocha": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-8.0.3.tgz", + "integrity": "sha512-vyxR57nv8NfcU0GZu8EUXZLTbCMupIUwy95LJ6lllN+JRPG25CwMHoB1q5xKh8YKhQnHYRAn4yW2yuHbf/5xgg==" + }, + "@types/node": { + "version": "20.7.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.7.0.tgz", + "integrity": "sha512-zI22/pJW2wUZOVyguFaUL1HABdmSVxpXrzIqkjsHmyUjNhPoWM1CKfvVuXfetHhIok4RY573cqS0mZ1SJEnoTg==" + }, + "@types/qs": { + "version": "6.9.8", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.8.tgz", + "integrity": "sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg==" + }, + "@types/uuid": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.0.tgz", + "integrity": "sha512-eQ9qFW/fhfGJF8WKHGEHZEyVWfZxrT+6CLIJGBcZPfxUh/+BnEj+UCGYMlr9qZuX/2AltsvwrGqp0LhEW8D0zQ==" + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "azure-pipelines-task-lib": { + "version": "5.0.0-preview.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-5.0.0-preview.0.tgz", + "integrity": "sha512-uQJEv+q3/7RD7kgphFd33uXijaPwA1ePYoNkAgZpUhbZUtc2u4JL4ujTT/JJfgXBNW/QQNAiDQ2OC7vOQG/0tg==", + "requires": { + "minimatch": "3.0.5", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "sync-request": "6.1.0", + "uuid": "^3.0.1" + }, + "dependencies": { + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + } + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, + "form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + } + }, + "get-port": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", + "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==" + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "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" + }, + "dependencies": { + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==" + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "http-basic": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", + "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", + "requires": { + "caseless": "^0.12.0", + "concat-stream": "^1.6.2", + "http-response-object": "^3.0.1", + "parse-cache-control": "^1.0.1" + } + }, + "http-response-object": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", + "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", + "requires": { + "@types/node": "^10.0.3" + }, + "dependencies": { + "@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + } + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" + }, + "is-core-module": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "requires": { + "has": "^1.0.3" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, + "parse-cache-control": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", + "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "promise": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", + "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", + "requires": { + "asap": "~2.0.6" + } + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==" + }, + "qs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "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" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "requires": { + "resolve": "^1.1.6" + } + }, + "resolve": { + "version": "1.22.6", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.6.tgz", + "integrity": "sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==", + "requires": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" + }, + "shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, + "sync-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", + "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==", + "requires": { + "http-response-object": "^3.0.1", + "sync-rpc": "^1.2.1", + "then-request": "^6.0.0" + } + }, + "sync-rpc": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz", + "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==", + "requires": { + "get-port": "^3.1.0" + } + }, + "then-request": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", + "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", + "requires": { + "@types/concat-stream": "^1.6.0", + "@types/form-data": "0.0.33", + "@types/node": "^8.0.0", + "@types/qs": "^6.2.31", + "caseless": "~0.12.0", + "concat-stream": "^1.6.0", + "form-data": "^2.2.0", + "http-basic": "^8.1.1", + "http-response-object": "^3.0.1", + "promise": "^8.0.0", + "qs": "^6.4.0" + }, + "dependencies": { + "@types/node": { + "version": "8.10.66", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", + "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==" + } + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, + "typescript": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "uuid": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.0.tgz", + "integrity": "sha512-fX6Z5o4m6XsXBdli9g7DtWgAx+osMsRRZFKma1mIUsLCz6vRvv+pz5VNbyu9UEDzpMWulZfvpgb/cmDXVulYFQ==" + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + } + } +} diff --git a/_generated/CmdLineV2_Node20/package.json b/_generated/CmdLineV2_Node20/package.json new file mode 100644 index 000000000000..ddb23fec7a43 --- /dev/null +++ b/_generated/CmdLineV2_Node20/package.json @@ -0,0 +1,29 @@ +{ + "name": "vsts-cmdline-task", + "version": "1.0.0", + "description": "Azure Pipelines Command Line Task", + "main": "cmdline.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/Microsoft/azure-pipelines-tasks.git" + }, + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Microsoft/azure-pipelines-tasks/issues" + }, + "homepage": "https://github.com/Microsoft/azure-pipelines-tasks#readme", + "dependencies": { + "@types/uuid": "^8.3.0", + "@types/mocha": "^8.0.3", + "@types/node": "^20.3.1", + "uuid": "^8.3.0", + "azure-pipelines-task-lib": "^5.0.0-preview.0" + }, + "devDependencies": { + "typescript": "5.1.6" + } +} diff --git a/_generated/CmdLineV2_Node20/task.json b/_generated/CmdLineV2_Node20/task.json new file mode 100644 index 000000000000..dcd4a20bbf8a --- /dev/null +++ b/_generated/CmdLineV2_Node20/task.json @@ -0,0 +1,97 @@ +{ + "id": "D9BAFED4-0B18-4F58-968D-86655B4D2CE9", + "name": "CmdLine", + "friendlyName": "Command line", + "description": "Run a command line script using Bash on Linux and macOS and cmd.exe on Windows", + "helpUrl": "https://docs.microsoft.com/azure/devops/pipelines/tasks/utility/command-line", + "helpMarkDown": "[Learn more about this task](https://go.microsoft.com/fwlink/?LinkID=613735)", + "category": "Utility", + "visibility": [ + "Build", + "Release" + ], + "runsOn": [ + "Agent", + "DeploymentGroup" + ], + "author": "Microsoft Corporation", + "version": { + "Major": 2, + "Minor": 229, + "Patch": 1 + }, + "releaseNotes": "Script task consistency. Added support for multiple lines.", + "showEnvironmentVariables": true, + "groups": [ + { + "name": "advanced", + "displayName": "Advanced", + "isExpanded": false + } + ], + "inputs": [ + { + "name": "script", + "type": "multiLine", + "label": "Script", + "required": true, + "defaultValue": "echo Write your commands here\n\necho Hello world\n", + "properties": { + "resizable": "true", + "rows": "10", + "maxLength": "5000" + }, + "helpMarkDown": "" + }, + { + "name": "workingDirectory", + "type": "filePath", + "label": "Working Directory", + "defaultValue": "", + "required": false, + "groupName": "advanced" + }, + { + "name": "failOnStderr", + "type": "boolean", + "label": "Fail on Standard Error", + "defaultValue": "false", + "required": false, + "helpMarkDown": "If this is true, this task will fail if any errors are written to the StandardError stream.", + "groupName": "advanced" + } + ], + "instanceNameFormat": "Command Line Script", + "execution": { + "PowerShell3": { + "target": "cmdline.ps1", + "platforms": [ + "windows" + ] + }, + "Node10": { + "target": "cmdline.js", + "argumentFormat": "" + }, + "Node16": { + "target": "cmdline.js", + "argumentFormat": "" + }, + "Node20": { + "target": "cmdline.js", + "argumentFormat": "" + } + }, + "messages": { + "GeneratingScript": "Generating script.", + "JS_ExitCode": "Bash exited with code '%s'.", + "JS_Stderr": "Bash wrote one or more lines to the standard error stream.", + "PS_ExitCode": "Cmd.exe exited with code '{0}'.", + "PS_UnableToDetermineExitCode": "Unexpected exception. Unable to determine the exit code from cmd.exe.", + "ScriptContents": "Script contents:" + }, + "_buildConfigMapping": { + "Default": "2.229.0", + "Node20-225": "2.229.1" + } +} \ No newline at end of file diff --git a/_generated/CmdLineV2_Node20/task.loc.json b/_generated/CmdLineV2_Node20/task.loc.json new file mode 100644 index 000000000000..afbc5e943aba --- /dev/null +++ b/_generated/CmdLineV2_Node20/task.loc.json @@ -0,0 +1,97 @@ +{ + "id": "D9BAFED4-0B18-4F58-968D-86655B4D2CE9", + "name": "CmdLine", + "friendlyName": "ms-resource:loc.friendlyName", + "description": "ms-resource:loc.description", + "helpUrl": "https://docs.microsoft.com/azure/devops/pipelines/tasks/utility/command-line", + "helpMarkDown": "ms-resource:loc.helpMarkDown", + "category": "Utility", + "visibility": [ + "Build", + "Release" + ], + "runsOn": [ + "Agent", + "DeploymentGroup" + ], + "author": "Microsoft Corporation", + "version": { + "Major": 2, + "Minor": 229, + "Patch": 1 + }, + "releaseNotes": "ms-resource:loc.releaseNotes", + "showEnvironmentVariables": true, + "groups": [ + { + "name": "advanced", + "displayName": "ms-resource:loc.group.displayName.advanced", + "isExpanded": false + } + ], + "inputs": [ + { + "name": "script", + "type": "multiLine", + "label": "ms-resource:loc.input.label.script", + "required": true, + "defaultValue": "echo Write your commands here\n\necho Hello world\n", + "properties": { + "resizable": "true", + "rows": "10", + "maxLength": "5000" + }, + "helpMarkDown": "" + }, + { + "name": "workingDirectory", + "type": "filePath", + "label": "ms-resource:loc.input.label.workingDirectory", + "defaultValue": "", + "required": false, + "groupName": "advanced" + }, + { + "name": "failOnStderr", + "type": "boolean", + "label": "ms-resource:loc.input.label.failOnStderr", + "defaultValue": "false", + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.failOnStderr", + "groupName": "advanced" + } + ], + "instanceNameFormat": "ms-resource:loc.instanceNameFormat", + "execution": { + "PowerShell3": { + "target": "cmdline.ps1", + "platforms": [ + "windows" + ] + }, + "Node10": { + "target": "cmdline.js", + "argumentFormat": "" + }, + "Node16": { + "target": "cmdline.js", + "argumentFormat": "" + }, + "Node20": { + "target": "cmdline.js", + "argumentFormat": "" + } + }, + "messages": { + "GeneratingScript": "ms-resource:loc.messages.GeneratingScript", + "JS_ExitCode": "ms-resource:loc.messages.JS_ExitCode", + "JS_Stderr": "ms-resource:loc.messages.JS_Stderr", + "PS_ExitCode": "ms-resource:loc.messages.PS_ExitCode", + "PS_UnableToDetermineExitCode": "ms-resource:loc.messages.PS_UnableToDetermineExitCode", + "ScriptContents": "ms-resource:loc.messages.ScriptContents" + }, + "_buildConfigMapping": { + "Default": "2.229.0", + "Node20-225": "2.229.1" + } +} \ No newline at end of file diff --git a/_generated/CmdLineV2_Node20/tsconfig.json b/_generated/CmdLineV2_Node20/tsconfig.json new file mode 100644 index 000000000000..0438b79f69ac --- /dev/null +++ b/_generated/CmdLineV2_Node20/tsconfig.json @@ -0,0 +1,6 @@ +{ + "compilerOptions": { + "target": "ES6", + "module": "commonjs" + } +} \ No newline at end of file diff --git a/_generated/CocoaPodsV0.versionmap.txt b/_generated/CocoaPodsV0.versionmap.txt new file mode 100644 index 000000000000..378f4c63ee24 --- /dev/null +++ b/_generated/CocoaPodsV0.versionmap.txt @@ -0,0 +1,2 @@ +Default|0.229.0 +Node20-225|0.229.1 diff --git a/_generated/CocoaPodsV0/Strings/resources.resjson/de-DE/resources.resjson b/_generated/CocoaPodsV0/Strings/resources.resjson/de-DE/resources.resjson new file mode 100644 index 000000000000..e584a79e2b60 --- /dev/null +++ b/_generated/CocoaPodsV0/Strings/resources.resjson/de-DE/resources.resjson @@ -0,0 +1,17 @@ +{ + "loc.friendlyName": "CocoaPods", + "loc.helpMarkDown": "[Weitere Informationen zu dieser Aufgabe](https://go.microsoft.com/fwlink/?LinkID=613745)", + "loc.description": "Hiermit werden CocoaPods-Abhängigkeiten für Swift- und Objective-C-Cocoa-Projekte installiert.", + "loc.instanceNameFormat": "Pod-Installation", + "loc.group.displayName.advanced": "Erweitert", + "loc.input.label.cwd": "Arbeitsverzeichnis", + "loc.input.help.cwd": "Geben Sie das Arbeitsverzeichnis an, in dem diese Aufgabe ausgeführt werden soll. Wenn Sie nichts angeben, wird das Repositoryverzeichnis verwendet.", + "loc.input.label.forceRepoUpdate": "Repositoryupdate erzwingen", + "loc.input.help.forceRepoUpdate": "Wenn Sie diese Option auswählen, wird vor der Installation die Ausführung von \"pod repo update\" erzwungen.", + "loc.input.label.projectDirectory": "Projektverzeichnis", + "loc.input.help.projectDirectory": "Legen Sie optional den Pfad auf den Stamm des Projektverzeichnisses fest. Erfolgt hier keine Eingabe, wird das in der Podfile-Datei festgelegte Projekt verwendet. Wenn kein Projekt angegeben ist, wird eine Suche nach einem Xcode-Projekt ausgeführt. Wenn mehr als ein Xcode-Projekt gefunden wird, tritt ein Fehler auf.", + "loc.messages.PodReturnCode": "Der Befehl \"pod\" wurde mit folgendem Rückgabecode beendet: %d", + "loc.messages.PodFailed": "Fehler beim Befehl \"pod\": %s", + "loc.messages.CocoaPodsNotFound": "Der Befehl \"pod\" wurde nicht gefunden. Installieren Sie CocoaPods auf dem Agentcomputer (https://cocoapods.org/).", + "loc.messages.ProxyConfig": "Proxykonfiguration erkannt. Proxyhost wird verwendet: %s" +} \ No newline at end of file diff --git a/_generated/CocoaPodsV0/Strings/resources.resjson/en-US/resources.resjson b/_generated/CocoaPodsV0/Strings/resources.resjson/en-US/resources.resjson new file mode 100644 index 000000000000..4e3e9ae9a7b8 --- /dev/null +++ b/_generated/CocoaPodsV0/Strings/resources.resjson/en-US/resources.resjson @@ -0,0 +1,17 @@ +{ + "loc.friendlyName": "CocoaPods", + "loc.helpMarkDown": "[Learn more about this task](https://go.microsoft.com/fwlink/?LinkID=613745)", + "loc.description": "Install CocoaPods dependencies for Swift and Objective-C Cocoa projects", + "loc.instanceNameFormat": "pod install", + "loc.group.displayName.advanced": "Advanced", + "loc.input.label.cwd": "Working directory", + "loc.input.help.cwd": "Specify the working directory in which to execute this task. If left empty, the repository directory will be used.", + "loc.input.label.forceRepoUpdate": "Force repo update", + "loc.input.help.forceRepoUpdate": "Selecting this option will force running 'pod repo update' before install.", + "loc.input.label.projectDirectory": "Project directory", + "loc.input.help.projectDirectory": "Optionally specify the path to the root of the project directory. If left empty, the project specified in the Podfile will be used. If no project is specified, then a search for an Xcode project will be made. If more than one Xcode project is found, an error will occur.", + "loc.messages.PodReturnCode": "The 'pod' command exited with return code: %d", + "loc.messages.PodFailed": "The 'pod' command failed with error: %s", + "loc.messages.CocoaPodsNotFound": "The 'pod' command was not found. Please install CocoaPods on the agent machine (https://cocoapods.org/).", + "loc.messages.ProxyConfig": "Proxy configuration detected. Using proxy host: %s" +} \ No newline at end of file diff --git a/_generated/CocoaPodsV0/Strings/resources.resjson/es-ES/resources.resjson b/_generated/CocoaPodsV0/Strings/resources.resjson/es-ES/resources.resjson new file mode 100644 index 000000000000..50092f548a01 --- /dev/null +++ b/_generated/CocoaPodsV0/Strings/resources.resjson/es-ES/resources.resjson @@ -0,0 +1,17 @@ +{ + "loc.friendlyName": "CocoaPods", + "loc.helpMarkDown": "[Obtener más información acerca de esta tarea](https://go.microsoft.com/fwlink/?LinkID=613745)", + "loc.description": "Instala dependencias de CocoaPods para proyectos Swift y Objective-C de Cocoa.", + "loc.instanceNameFormat": "instalación de pod", + "loc.group.displayName.advanced": "Avanzado", + "loc.input.label.cwd": "Directorio de trabajo", + "loc.input.help.cwd": "Especifique el directorio de trabajo en el cual ejecutar esta tarea. Si se deja en blanco, se usará el directorio de repositorio.", + "loc.input.label.forceRepoUpdate": "Forzar actualización del repositorio", + "loc.input.help.forceRepoUpdate": "Al seleccionar esta opción, se fuerza la ejecución de \"pod repo update\" antes de instalar.", + "loc.input.label.projectDirectory": "Directorio del proyecto", + "loc.input.help.projectDirectory": "Opcionalmente, puede especificar la ruta de acceso a la raíz del directorio del proyecto. Si se deja en blanco, se usará el proyecto especificado en el archivo Podfile. Si no se especifica ningún proyecto, se buscará un proyecto Xcode. Si se encuentra más de un proyecto Xcode, se producirá un error.", + "loc.messages.PodReturnCode": "El comando \"pod\" se cerró con el código de devolución: %d", + "loc.messages.PodFailed": "Error en el comando \"pod\": %s", + "loc.messages.CocoaPodsNotFound": "No se encontró el comando \"pod\". Instale Cocoapods en la máquina del agente (https://cocoapods.org).", + "loc.messages.ProxyConfig": "Se detectó una configuración de proxy. Usando host proxy: %s" +} \ No newline at end of file diff --git a/_generated/CocoaPodsV0/Strings/resources.resjson/fr-FR/resources.resjson b/_generated/CocoaPodsV0/Strings/resources.resjson/fr-FR/resources.resjson new file mode 100644 index 000000000000..f5a9c6af87d1 --- /dev/null +++ b/_generated/CocoaPodsV0/Strings/resources.resjson/fr-FR/resources.resjson @@ -0,0 +1,17 @@ +{ + "loc.friendlyName": "CocoaPods", + "loc.helpMarkDown": "[En savoir plus sur cette tâche](https://go.microsoft.com/fwlink/?LinkID=613745)", + "loc.description": "Installer les dépendances CocoaPods pour les projets Cocoa Swift and Objective-C", + "loc.instanceNameFormat": "installation de pod", + "loc.group.displayName.advanced": "Avancé", + "loc.input.label.cwd": "Répertoire de travail", + "loc.input.help.cwd": "Spécifiez le répertoire de travail dans lequel exécuter cette tâche. Si vous n'indiquez rien, le répertoire du dépôt est utilisé.", + "loc.input.label.forceRepoUpdate": "Forcer la mise à jour du dépôt", + "loc.input.help.forceRepoUpdate": "Si cette option est sélectionnée, la commande 'pod repo update' est obligatoirement exécutée avant l'installation.", + "loc.input.label.projectDirectory": "Répertoire du projet", + "loc.input.help.projectDirectory": "Vous pouvez éventuellement spécifier le chemin de la racine du répertoire du projet. Si rien n'est indiqué, le projet spécifié dans le fichier Podfile est utilisé. Si aucun projet n'est spécifié, la recherche d'un projet Xcode est effectuée. Si plusieurs projets Xcode sont trouvés, une erreur se produit.", + "loc.messages.PodReturnCode": "Sortie de la commande 'pod' avec le code de retour : %d", + "loc.messages.PodFailed": "Échec de la commande 'pod' avec l'erreur : %s", + "loc.messages.CocoaPodsNotFound": "La commande 'pod' est introuvable. Installez CocoaPods sur la machine agent (https://cocoapods.org/).", + "loc.messages.ProxyConfig": "Configuration du proxy détectée. Utilisation de l’hôte proxy : %s" +} \ No newline at end of file diff --git a/_generated/CocoaPodsV0/Strings/resources.resjson/it-IT/resources.resjson b/_generated/CocoaPodsV0/Strings/resources.resjson/it-IT/resources.resjson new file mode 100644 index 000000000000..ccd97ee1eb55 --- /dev/null +++ b/_generated/CocoaPodsV0/Strings/resources.resjson/it-IT/resources.resjson @@ -0,0 +1,17 @@ +{ + "loc.friendlyName": "CocoaPods", + "loc.helpMarkDown": "[Altre informazioni su questa attività](https://go.microsoft.com/fwlink/?LinkID=613745)", + "loc.description": "Installa le dipendenze CocoaPods per progetti Cocoa Swift e Objective-C", + "loc.instanceNameFormat": "pod install", + "loc.group.displayName.advanced": "Avanzate", + "loc.input.label.cwd": "Directory di lavoro", + "loc.input.help.cwd": "Consente di specificare la directory di lavoro in cui eseguire questa attività. Se viene lasciato vuoto, verrà usata la directory del repository.", + "loc.input.label.forceRepoUpdate": "Forza aggiornamento del repository", + "loc.input.help.forceRepoUpdate": "Se si seleziona questa opzione, 'pod repo update' verrà eseguito forzatamente prima dell'installazione.", + "loc.input.label.projectDirectory": "Directory del progetto", + "loc.input.help.projectDirectory": "Consente facoltativamente di specificare il percorso della radice della directory del progetto. Se viene lasciato vuoto, verrà usato il progetto specificato nel podfile. Se non si specifica alcun progetto, verrà eseguita la ricerca di un progetto Xcode. Se vengono trovati più progetti Xcode, si verificherà un errore.", + "loc.messages.PodReturnCode": "Il comando 'pod' è stato terminato. Codice restituito: %d", + "loc.messages.PodFailed": "Il comando 'pod' non è riuscito. Errore: %s", + "loc.messages.CocoaPodsNotFound": "Il comando 'pod' non è stato trovato. Installare CocoaPods nel computer agente (https://cocoapods.org/).", + "loc.messages.ProxyConfig": "È stata rilevata la configurazione del proxy. Uso dell'host proxy: %s" +} \ No newline at end of file diff --git a/_generated/CocoaPodsV0/Strings/resources.resjson/ja-JP/resources.resjson b/_generated/CocoaPodsV0/Strings/resources.resjson/ja-JP/resources.resjson new file mode 100644 index 000000000000..735cb64e0943 --- /dev/null +++ b/_generated/CocoaPodsV0/Strings/resources.resjson/ja-JP/resources.resjson @@ -0,0 +1,17 @@ +{ + "loc.friendlyName": "CocoaPods", + "loc.helpMarkDown": "[このタスクの詳細を表示](https://go.microsoft.com/fwlink/?LinkID=613745)", + "loc.description": "Swift および Objective-C Cocoa プロジェクトのための CocoaPods の依存関係をインストールします", + "loc.instanceNameFormat": "pod install", + "loc.group.displayName.advanced": "詳細設定", + "loc.input.label.cwd": "作業ディレクトリ", + "loc.input.help.cwd": "このタスクを実行する作業ディレクトリを指定します。空にすると、リポジトリのディレクトリが使用されます。", + "loc.input.label.forceRepoUpdate": "リポジトリの更新を強制する", + "loc.input.help.forceRepoUpdate": "このオプションを選択すると、インストール前に強制的に 'pod repo update' が実行されます。", + "loc.input.label.projectDirectory": "プロジェクト ディレクトリ", + "loc.input.help.projectDirectory": "(省略可能) プロジェクト ディレクトリのルートへのパスを指定します。空のままにすると、Podfile で指定されたプロジェクトが使用されます。プロジェクトを指定しないと、Xcode プロジェクトが検索されます。複数の Xcode プロジェクトが見つかった場合は、エラーが発生します。", + "loc.messages.PodReturnCode": "'pod' コマンドが次のリターン コードで終了しました: %d", + "loc.messages.PodFailed": "'pod' コマンドが失敗し、次のエラーが発生しました: %s", + "loc.messages.CocoaPodsNotFound": "'pod' コマンドが見つかりません。CocoaPods をエージェント コンピューター上にインストールしてください (https://cocoapods.org)。", + "loc.messages.ProxyConfig": "プロキシ構成が検出されました。プロキシ ホスト: %s を使用しています" +} \ No newline at end of file diff --git a/_generated/CocoaPodsV0/Strings/resources.resjson/ko-KR/resources.resjson b/_generated/CocoaPodsV0/Strings/resources.resjson/ko-KR/resources.resjson new file mode 100644 index 000000000000..d565aafa6d98 --- /dev/null +++ b/_generated/CocoaPodsV0/Strings/resources.resjson/ko-KR/resources.resjson @@ -0,0 +1,17 @@ +{ + "loc.friendlyName": "CocoaPods", + "loc.helpMarkDown": "[이 작업에 대한 자세한 정보](https://go.microsoft.com/fwlink/?LinkID=613745)", + "loc.description": "Swift 및 Objective-C Cocoa 프로젝트를 위한 CocoaPods 종속성을 설치합니다.", + "loc.instanceNameFormat": "pod install", + "loc.group.displayName.advanced": "고급", + "loc.input.label.cwd": "작업 디렉터리", + "loc.input.help.cwd": "이 작업을 실행할 작업 디렉터리를 지정합니다. 비워 두는 경우 리포지토리 디렉터리가 사용됩니다.", + "loc.input.label.forceRepoUpdate": "강제 리포 업데이트", + "loc.input.help.forceRepoUpdate": "이 옵션을 선택하면 설치 전에 'pod repo update'가 강제 실행됩니다.", + "loc.input.label.projectDirectory": "프로젝트 디렉터리", + "loc.input.help.projectDirectory": "선택적으로 프로젝트 디렉터리의 루트에 대한 경로를 지정합니다. 비워 두는 경우 Podfile에 지정된 프로젝트가 사용됩니다. 프로젝트를 지정하지 않으면 Xcode 프로젝트를 검색합니다. Xcode 프로젝트가 두 개 이상 있는 경우 오류가 발생합니다.", + "loc.messages.PodReturnCode": "'pod' 명령이 종료되었습니다(반환 코드: %d).", + "loc.messages.PodFailed": "'pod' 명령이 실패했습니다(오류: %s).", + "loc.messages.CocoaPodsNotFound": "'pod' 명령을 찾을 수 없습니다. 에이전트 컴퓨터에 CocoaPods를 설치하세요(https://cocoapods.org/).", + "loc.messages.ProxyConfig": "프록시 구성이 감지되었습니다. 프록시 호스트 사용: %s" +} \ No newline at end of file diff --git a/_generated/CocoaPodsV0/Strings/resources.resjson/ru-RU/resources.resjson b/_generated/CocoaPodsV0/Strings/resources.resjson/ru-RU/resources.resjson new file mode 100644 index 000000000000..788748b49892 --- /dev/null +++ b/_generated/CocoaPodsV0/Strings/resources.resjson/ru-RU/resources.resjson @@ -0,0 +1,17 @@ +{ + "loc.friendlyName": "CocoaPods", + "loc.helpMarkDown": "[См. дополнительные сведения об этой задаче](https://go.microsoft.com/fwlink/?LinkID=613745)", + "loc.description": "Установить зависимости CocoaPods для проектов Cocoa Swift и Objective-C", + "loc.instanceNameFormat": "установка pod", + "loc.group.displayName.advanced": "Дополнительно", + "loc.input.label.cwd": "Рабочий каталог", + "loc.input.help.cwd": "Укажите рабочий каталог для выполнения этой задачи. Если значение пусто, используется каталог репозитория.", + "loc.input.label.forceRepoUpdate": "Принудительное обновление репозитория", + "loc.input.help.forceRepoUpdate": "Выбор этого параметра приведет к принудительному запуску команды \"pod repo update\" перед установкой.", + "loc.input.label.projectDirectory": "Каталог проекта", + "loc.input.help.projectDirectory": "При необходимости укажите путь к корневой папке проекта. Если оставить пустым, будет использоваться проект, указанный в Podfile. Если проект не указан, будут вестись поиск проекта Xcode. Если найдено более одного проекта Xcode, произойдет ошибка.", + "loc.messages.PodReturnCode": "Команда \"pod\" завершила работу с кодом возврата: %d", + "loc.messages.PodFailed": "Команда \"pod\" завершилась сбоем с ошибкой: %s", + "loc.messages.CocoaPodsNotFound": "Команда \"pod\" не найдена. Установите CocoaPods (https://cocoapods.org/) на компьютере агента.", + "loc.messages.ProxyConfig": "Обнаружена конфигурация прокси-сервера. Использование прокси-узла: %s" +} \ No newline at end of file diff --git a/_generated/CocoaPodsV0/Strings/resources.resjson/zh-CN/resources.resjson b/_generated/CocoaPodsV0/Strings/resources.resjson/zh-CN/resources.resjson new file mode 100644 index 000000000000..a8474206dc4e --- /dev/null +++ b/_generated/CocoaPodsV0/Strings/resources.resjson/zh-CN/resources.resjson @@ -0,0 +1,17 @@ +{ + "loc.friendlyName": "CocoaPods", + "loc.helpMarkDown": "[详细了解此任务](https://go.microsoft.com/fwlink/?LinkID=613745)", + "loc.description": "安装 Swift 和 Objective-C Cocoa 项目的 CocoaPod 依赖项", + "loc.instanceNameFormat": "pod 安装", + "loc.group.displayName.advanced": "高级", + "loc.input.label.cwd": "工作目录", + "loc.input.help.cwd": "指定要执行此任务的工作目录。如果留空,将使用存储库目录。", + "loc.input.label.forceRepoUpdate": "强制存储库更新", + "loc.input.help.forceRepoUpdate": "选择此选项会在安装前强制运行 \"pod repo update\"。", + "loc.input.label.projectDirectory": "项目目录", + "loc.input.help.projectDirectory": "可以选择指定项目目录的根路径。如果留空,将使用 Podfile 中指定的项目。如果未指定项目,则将搜索 Xcode 项目。如果找到多个 Xcode 项目,则会出现错误。", + "loc.messages.PodReturnCode": "已退出\"pod\" 命令,返回代码为: %d", + "loc.messages.PodFailed": "\"pod\" 命令失败,出现错误: %s", + "loc.messages.CocoaPodsNotFound": "找不到 \"pod\" 命令。请在代理计算机上安装 CocoaPods (https://cocoapods.org/)。", + "loc.messages.ProxyConfig": "检测到代理配置。使用代理主机: %s" +} \ No newline at end of file diff --git a/_generated/CocoaPodsV0/Strings/resources.resjson/zh-TW/resources.resjson b/_generated/CocoaPodsV0/Strings/resources.resjson/zh-TW/resources.resjson new file mode 100644 index 000000000000..6b9729f131e7 --- /dev/null +++ b/_generated/CocoaPodsV0/Strings/resources.resjson/zh-TW/resources.resjson @@ -0,0 +1,17 @@ +{ + "loc.friendlyName": "CocoaPods", + "loc.helpMarkDown": "[深入了解此工作](https://go.microsoft.com/fwlink/?LinkID=613745)", + "loc.description": "安裝 Swift 和 Objective-C Cocoa 專案的 CocoaPods 相依性", + "loc.instanceNameFormat": "pod 安裝", + "loc.group.displayName.advanced": "進階", + "loc.input.label.cwd": "工作目錄", + "loc.input.help.cwd": "請指定要在其中執行此工作的工作目錄。若為空白,則會使用存放庫目錄。", + "loc.input.label.forceRepoUpdate": "強制執行 repo update", + "loc.input.help.forceRepoUpdate": "選取此選項會在安裝前強制執行 'pod repo update'。", + "loc.input.label.projectDirectory": "專案目錄", + "loc.input.help.projectDirectory": "您可以視情況選擇指定專案目錄的根目錄路徑。如果保留空白,就會使用 Podfile 中指定的專案。如果未指定任何專案,則會搜尋 Xcode 專案。如果找到多個 Xcode 專案,將會發生錯誤。", + "loc.messages.PodReturnCode": "'pod' 命令結束,傳回碼為: %d", + "loc.messages.PodFailed": "'pod' 命令失敗,發生錯誤: %s", + "loc.messages.CocoaPodsNotFound": "找不到 'pod' 命令。請在代理程式電腦上安裝 CocoaPods (https://cocoapods.org/)。", + "loc.messages.ProxyConfig": "已偵測到 Proxy 設定。使用 Proxy 主機: %s" +} \ No newline at end of file diff --git a/_generated/CocoaPodsV0/Tests/L0.ts b/_generated/CocoaPodsV0/Tests/L0.ts new file mode 100644 index 000000000000..ef0b0acb465b --- /dev/null +++ b/_generated/CocoaPodsV0/Tests/L0.ts @@ -0,0 +1,22 @@ +import fs = require('fs'); +import assert = require('assert'); +import path = require('path'); +import * as ttm from 'azure-pipelines-task-lib/mock-test'; + +describe('CocoaPodsV0 Suite', function () { + before(() => { + }); + + after(() => { + }); + + it('run pod', function(done: Mocha.Done) { + this.timeout(parseInt(process.env.TASK_TEST_TIMEOUT) || 8000); + let tp: string = path.join(__dirname, 'L0DefaultRunner.js'); + let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + tr.run(); + assert(tr.ran('pod --version'), 'it should run pod --version'); + assert(tr.ran('pod install --project-directory=testdir'), 'it should run pod install'); + done(); + }); +}); diff --git a/_generated/CocoaPodsV0/Tests/L0DefaultRunner.ts b/_generated/CocoaPodsV0/Tests/L0DefaultRunner.ts new file mode 100644 index 000000000000..cea867611d15 --- /dev/null +++ b/_generated/CocoaPodsV0/Tests/L0DefaultRunner.ts @@ -0,0 +1,40 @@ +import * as ma from 'azure-pipelines-task-lib/mock-answer'; +import * as tmrm from 'azure-pipelines-task-lib/mock-run'; +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'cocoapods.js'); + + + +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); +tr.setInput('cwd', '/home/repo/src'); +tr.setInput('forceRepoUpdate', 'false'); +tr.setInput('projectDirectory', 'testdir'); + +let a: ma.TaskLibAnswers = { + 'checkPath': { + 'pod': true, + '/home/repo/src': true, + 'testdir': true + }, + 'which': { + 'pod': 'pod' + }, + 'exec': { + 'pod --version': { + 'code': 0, + 'stdout': '1.0.0' + }, + 'pod install': { + 'code': 0, + 'stdout': 'install packages' + }, + 'pod install --repo-update': { + 'code': 0, + 'stdout': 'install packages' + } + }, +} +tr.setAnswers(a); +tr.run(); + diff --git a/_generated/CocoaPodsV0/Tests/package-lock.json b/_generated/CocoaPodsV0/Tests/package-lock.json new file mode 100644 index 000000000000..25b7cb983955 --- /dev/null +++ b/_generated/CocoaPodsV0/Tests/package-lock.json @@ -0,0 +1,14 @@ +{ + "name": "cocoa-pods-tests", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/mocha": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", + "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==", + "dev": true + } + } +} diff --git a/_generated/CocoaPodsV0/Tests/package.json b/_generated/CocoaPodsV0/Tests/package.json new file mode 100644 index 000000000000..b31852dd557c --- /dev/null +++ b/_generated/CocoaPodsV0/Tests/package.json @@ -0,0 +1,22 @@ +{ + "name": "cocoa-pods-tests", + "version": "1.0.0", + "description": "Azure Pipelines Cocoa Pods V0 Task Tests", + "main": "L0.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/Microsoft/azure-pipelines-tasks.git" + }, + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Microsoft/azure-pipelines-tasks/issues" + }, + "homepage": "https://github.com/Microsoft/azure-pipelines-tasks#readme", + "devDependencies": { + "@types/mocha": "^5.2.0" + } +} diff --git a/_generated/CocoaPodsV0/cocoapods.ts b/_generated/CocoaPodsV0/cocoapods.ts new file mode 100644 index 000000000000..0966e2ed9ca2 --- /dev/null +++ b/_generated/CocoaPodsV0/cocoapods.ts @@ -0,0 +1,68 @@ +import path = require('path'); +import tl = require('azure-pipelines-task-lib/task'); +import trm = require('azure-pipelines-task-lib/toolrunner'); + +// The CocoaPods install command is documented here: +// https://guides.cocoapods.org/terminal/commands.html#pod_install + +async function run() { + try { + // Set path to resource strings + tl.setResourcePath(path.join(__dirname, 'task.json')); + + // Change to configured working directory + tl.cd(tl.getPathInput('cwd', true, true)); + + // Set locale to UTF-8 + tl.debug('Setting locale to UTF8 as required by CocoaPods'); + process.env['LC_ALL'] = 'en_US.UTF-8'; + + const proxyConfig: tl.ProxyConfiguration | null = tl.getHttpProxyConfiguration(); + if (proxyConfig) { + + process.env['http_proxy'] = proxyConfig.proxyFormattedUrl; + process.env['https_proxy'] = proxyConfig.proxyFormattedUrl; + + tl.debug(tl.loc('ProxyConfig', proxyConfig.proxyUrl)); + } + + // Locate the CocoaPods 'pod' command + var podPath: string = tl.which('pod'); + if (!podPath) { + throw new Error(tl.loc('CocoaPodsNotFound')); + } + + // Run `pod --version` to make diagnosing build breaks easier. + var podv: trm.ToolRunner = tl.tool(podPath); + podv.arg('--version'); + await podv.exec(); + + // Prepare to run `pod install` + var pod: trm.ToolRunner = tl.tool(podPath); + pod.arg('install'); + + // Force updating the pod repo before install? + if (tl.getBoolInput('forceRepoUpdate', true)) { + pod.arg('--repo-update'); + } + + // Explicitly specify a project directory? + if (tl.filePathSupplied('projectDirectory')) { + var projectDirectory: string = tl.getPathInput('projectDirectory', false, true); + pod.arg('--project-directory=' + projectDirectory); + } + + // Execute + var returnCode: number = await pod.exec(); + + // Get the result code and set the task result accordingly + tl.setResult(tl.TaskResult.Succeeded, tl.loc('PodReturnCode', returnCode)); + } + catch(err) { + // Report failure + tl.error(err.message); + tl.setResult(tl.TaskResult.Failed, tl.loc('PodFailed', err.message)); + } +} + +run(); diff --git a/_generated/CocoaPodsV0/icon.png b/_generated/CocoaPodsV0/icon.png new file mode 100644 index 000000000000..aeca63568dfd Binary files /dev/null and b/_generated/CocoaPodsV0/icon.png differ diff --git a/_generated/CocoaPodsV0/icon.svg b/_generated/CocoaPodsV0/icon.svg new file mode 100644 index 000000000000..26d2222a6023 --- /dev/null +++ b/_generated/CocoaPodsV0/icon.svg @@ -0,0 +1,4 @@ + + + + diff --git a/_generated/CocoaPodsV0/package-lock.json b/_generated/CocoaPodsV0/package-lock.json new file mode 100644 index 000000000000..a65aa6bdf705 --- /dev/null +++ b/_generated/CocoaPodsV0/package-lock.json @@ -0,0 +1,483 @@ +{ + "name": "vsts-cocoapods-task", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/concat-stream": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz", + "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==", + "requires": { + "@types/node": "*" + } + }, + "@types/form-data": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", + "integrity": "sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==", + "requires": { + "@types/node": "*" + } + }, + "@types/mocha": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", + "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==" + }, + "@types/node": { + "version": "16.11.62", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.62.tgz", + "integrity": "sha512-K/ggecSdwAAy2NUW4WKmF4Rc03GKbsfP+k326UWgckoS+Rzd2PaWbjk76dSmqdLQvLTJAO9axiTUJ6488mFsYQ==" + }, + "@types/qs": { + "version": "6.9.8", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.8.tgz", + "integrity": "sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg==" + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "azure-pipelines-task-lib": { + "version": "5.0.0-preview.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-5.0.0-preview.0.tgz", + "integrity": "sha512-uQJEv+q3/7RD7kgphFd33uXijaPwA1ePYoNkAgZpUhbZUtc2u4JL4ujTT/JJfgXBNW/QQNAiDQ2OC7vOQG/0tg==", + "requires": { + "minimatch": "3.0.5", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "sync-request": "6.1.0", + "uuid": "^3.0.1" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, + "form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + } + }, + "get-port": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", + "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==" + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "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" + }, + "dependencies": { + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==" + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "http-basic": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", + "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", + "requires": { + "caseless": "^0.12.0", + "concat-stream": "^1.6.2", + "http-response-object": "^3.0.1", + "parse-cache-control": "^1.0.1" + } + }, + "http-response-object": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", + "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", + "requires": { + "@types/node": "^10.0.3" + }, + "dependencies": { + "@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + } + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" + }, + "is-core-module": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "requires": { + "has": "^1.0.3" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, + "parse-cache-control": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", + "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "promise": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", + "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", + "requires": { + "asap": "~2.0.6" + } + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==" + }, + "qs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "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" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "requires": { + "resolve": "^1.1.6" + } + }, + "resolve": { + "version": "1.22.6", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.6.tgz", + "integrity": "sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==", + "requires": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" + }, + "shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, + "sync-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", + "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==", + "requires": { + "http-response-object": "^3.0.1", + "sync-rpc": "^1.2.1", + "then-request": "^6.0.0" + } + }, + "sync-rpc": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz", + "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==", + "requires": { + "get-port": "^3.1.0" + } + }, + "then-request": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", + "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", + "requires": { + "@types/concat-stream": "^1.6.0", + "@types/form-data": "0.0.33", + "@types/node": "^8.0.0", + "@types/qs": "^6.2.31", + "caseless": "~0.12.0", + "concat-stream": "^1.6.0", + "form-data": "^2.2.0", + "http-basic": "^8.1.1", + "http-response-object": "^3.0.1", + "promise": "^8.0.0", + "qs": "^6.4.0" + }, + "dependencies": { + "@types/node": { + "version": "8.10.66", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", + "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==" + } + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, + "typescript": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.2.tgz", + "integrity": "sha512-e4ERvRV2wb+rRZ/IQeb3jm2VxBsirQLpQhdxplZ2MEzGvDkkMmPglecnNDfSUBivMjP93vRbngYYDQqQ/78bcQ==", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + } + } +} diff --git a/_generated/CocoaPodsV0/package.json b/_generated/CocoaPodsV0/package.json new file mode 100644 index 000000000000..38e9324e2c60 --- /dev/null +++ b/_generated/CocoaPodsV0/package.json @@ -0,0 +1,27 @@ +{ + "name": "vsts-cocoapods-task", + "version": "1.0.0", + "description": "Azure Pipelines Cocoa Pods Task", + "main": "cocoapods.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/Microsoft/azure-pipelines-tasks.git" + }, + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Microsoft/azure-pipelines-tasks/issues" + }, + "homepage": "https://github.com/Microsoft/azure-pipelines-tasks#readme", + "dependencies": { + "@types/mocha": "^5.2.7", + "@types/node": "^16.11.39", + "azure-pipelines-task-lib": "^5.0.0-preview.0" + }, + "devDependencies": { + "typescript": "4.0.2" + } +} diff --git a/_generated/CocoaPodsV0/task.json b/_generated/CocoaPodsV0/task.json new file mode 100644 index 000000000000..df474c19087e --- /dev/null +++ b/_generated/CocoaPodsV0/task.json @@ -0,0 +1,90 @@ +{ + "id": "BFC05E0D-839C-42CD-89C7-0F9FBFCAB965", + "name": "CocoaPods", + "friendlyName": "CocoaPods", + "description": "Install CocoaPods dependencies for Swift and Objective-C Cocoa projects", + "helpUrl": "https://docs.microsoft.com/azure/devops/pipelines/tasks/package/cocoapods", + "helpMarkDown": "[Learn more about this task](https://go.microsoft.com/fwlink/?LinkID=613745)", + "category": "Package", + "visibility": [ + "Build" + ], + "runsOn": [ + "Agent", + "DeploymentGroup" + ], + "author": "Microsoft Corporation", + "minimumAgentVersion": "2.182.1", + "version": { + "Major": 0, + "Minor": 229, + "Patch": 0 + }, + "groups": [ + { + "name": "advanced", + "displayName": "Advanced", + "isExpanded": true + } + ], + "instanceNameFormat": "pod install", + "inputs": [ + { + "name": "cwd", + "aliases": [ + "workingDirectory" + ], + "type": "filePath", + "label": "Working directory", + "defaultValue": "", + "required": false, + "helpMarkDown": "Specify the working directory in which to execute this task. If left empty, the repository directory will be used." + }, + { + "name": "forceRepoUpdate", + "type": "boolean", + "label": "Force repo update", + "defaultValue": false, + "required": true, + "helpMarkDown": "Selecting this option will force running 'pod repo update' before install.", + "groupName": "advanced" + }, + { + "name": "projectDirectory", + "type": "filePath", + "label": "Project directory", + "defaultValue": "", + "required": false, + "helpMarkDown": "Optionally specify the path to the root of the project directory. If left empty, the project specified in the Podfile will be used. If no project is specified, then a search for an Xcode project will be made. If more than one Xcode project is found, an error will occur.", + "groupName": "advanced" + } + ], + "execution": { + "Node10": { + "target": "cocoapods.js", + "argumentFormat": "" + }, + "Node16": { + "target": "cocoapods.js", + "argumentFormat": "" + } + }, + "restrictions": { + "commands": { + "mode": "restricted" + }, + "settableVariables": { + "allowed": [] + } + }, + "messages": { + "PodReturnCode": "The 'pod' command exited with return code: %d", + "PodFailed": "The 'pod' command failed with error: %s", + "CocoaPodsNotFound": "The 'pod' command was not found. Please install CocoaPods on the agent machine (https://cocoapods.org/).", + "ProxyConfig": "Proxy configuration detected. Using proxy host: %s" + }, + "_buildConfigMapping": { + "Default": "0.229.0", + "Node20-225": "0.229.1" + } +} \ No newline at end of file diff --git a/_generated/CocoaPodsV0/task.loc.json b/_generated/CocoaPodsV0/task.loc.json new file mode 100644 index 000000000000..869af1a92399 --- /dev/null +++ b/_generated/CocoaPodsV0/task.loc.json @@ -0,0 +1,90 @@ +{ + "id": "BFC05E0D-839C-42CD-89C7-0F9FBFCAB965", + "name": "CocoaPods", + "friendlyName": "ms-resource:loc.friendlyName", + "description": "ms-resource:loc.description", + "helpUrl": "https://docs.microsoft.com/azure/devops/pipelines/tasks/package/cocoapods", + "helpMarkDown": "ms-resource:loc.helpMarkDown", + "category": "Package", + "visibility": [ + "Build" + ], + "runsOn": [ + "Agent", + "DeploymentGroup" + ], + "author": "Microsoft Corporation", + "minimumAgentVersion": "2.182.1", + "version": { + "Major": 0, + "Minor": 229, + "Patch": 0 + }, + "groups": [ + { + "name": "advanced", + "displayName": "ms-resource:loc.group.displayName.advanced", + "isExpanded": true + } + ], + "instanceNameFormat": "ms-resource:loc.instanceNameFormat", + "inputs": [ + { + "name": "cwd", + "aliases": [ + "workingDirectory" + ], + "type": "filePath", + "label": "ms-resource:loc.input.label.cwd", + "defaultValue": "", + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.cwd" + }, + { + "name": "forceRepoUpdate", + "type": "boolean", + "label": "ms-resource:loc.input.label.forceRepoUpdate", + "defaultValue": false, + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.forceRepoUpdate", + "groupName": "advanced" + }, + { + "name": "projectDirectory", + "type": "filePath", + "label": "ms-resource:loc.input.label.projectDirectory", + "defaultValue": "", + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.projectDirectory", + "groupName": "advanced" + } + ], + "execution": { + "Node10": { + "target": "cocoapods.js", + "argumentFormat": "" + }, + "Node16": { + "target": "cocoapods.js", + "argumentFormat": "" + } + }, + "restrictions": { + "commands": { + "mode": "restricted" + }, + "settableVariables": { + "allowed": [] + } + }, + "messages": { + "PodReturnCode": "ms-resource:loc.messages.PodReturnCode", + "PodFailed": "ms-resource:loc.messages.PodFailed", + "CocoaPodsNotFound": "ms-resource:loc.messages.CocoaPodsNotFound", + "ProxyConfig": "ms-resource:loc.messages.ProxyConfig" + }, + "_buildConfigMapping": { + "Default": "0.229.0", + "Node20-225": "0.229.1" + } +} \ No newline at end of file diff --git a/_generated/CocoaPodsV0/tsconfig.json b/_generated/CocoaPodsV0/tsconfig.json new file mode 100644 index 000000000000..0438b79f69ac --- /dev/null +++ b/_generated/CocoaPodsV0/tsconfig.json @@ -0,0 +1,6 @@ +{ + "compilerOptions": { + "target": "ES6", + "module": "commonjs" + } +} \ No newline at end of file diff --git a/_generated/CocoaPodsV0_Node20/.npmrc b/_generated/CocoaPodsV0_Node20/.npmrc new file mode 100644 index 000000000000..5fca0d518be7 --- /dev/null +++ b/_generated/CocoaPodsV0_Node20/.npmrc @@ -0,0 +1 @@ +scripts-prepend-node-path=true diff --git a/_generated/CocoaPodsV0_Node20/Strings/resources.resjson/de-DE/resources.resjson b/_generated/CocoaPodsV0_Node20/Strings/resources.resjson/de-DE/resources.resjson new file mode 100644 index 000000000000..e584a79e2b60 --- /dev/null +++ b/_generated/CocoaPodsV0_Node20/Strings/resources.resjson/de-DE/resources.resjson @@ -0,0 +1,17 @@ +{ + "loc.friendlyName": "CocoaPods", + "loc.helpMarkDown": "[Weitere Informationen zu dieser Aufgabe](https://go.microsoft.com/fwlink/?LinkID=613745)", + "loc.description": "Hiermit werden CocoaPods-Abhängigkeiten für Swift- und Objective-C-Cocoa-Projekte installiert.", + "loc.instanceNameFormat": "Pod-Installation", + "loc.group.displayName.advanced": "Erweitert", + "loc.input.label.cwd": "Arbeitsverzeichnis", + "loc.input.help.cwd": "Geben Sie das Arbeitsverzeichnis an, in dem diese Aufgabe ausgeführt werden soll. Wenn Sie nichts angeben, wird das Repositoryverzeichnis verwendet.", + "loc.input.label.forceRepoUpdate": "Repositoryupdate erzwingen", + "loc.input.help.forceRepoUpdate": "Wenn Sie diese Option auswählen, wird vor der Installation die Ausführung von \"pod repo update\" erzwungen.", + "loc.input.label.projectDirectory": "Projektverzeichnis", + "loc.input.help.projectDirectory": "Legen Sie optional den Pfad auf den Stamm des Projektverzeichnisses fest. Erfolgt hier keine Eingabe, wird das in der Podfile-Datei festgelegte Projekt verwendet. Wenn kein Projekt angegeben ist, wird eine Suche nach einem Xcode-Projekt ausgeführt. Wenn mehr als ein Xcode-Projekt gefunden wird, tritt ein Fehler auf.", + "loc.messages.PodReturnCode": "Der Befehl \"pod\" wurde mit folgendem Rückgabecode beendet: %d", + "loc.messages.PodFailed": "Fehler beim Befehl \"pod\": %s", + "loc.messages.CocoaPodsNotFound": "Der Befehl \"pod\" wurde nicht gefunden. Installieren Sie CocoaPods auf dem Agentcomputer (https://cocoapods.org/).", + "loc.messages.ProxyConfig": "Proxykonfiguration erkannt. Proxyhost wird verwendet: %s" +} \ No newline at end of file diff --git a/_generated/CocoaPodsV0_Node20/Strings/resources.resjson/en-US/resources.resjson b/_generated/CocoaPodsV0_Node20/Strings/resources.resjson/en-US/resources.resjson new file mode 100644 index 000000000000..4e3e9ae9a7b8 --- /dev/null +++ b/_generated/CocoaPodsV0_Node20/Strings/resources.resjson/en-US/resources.resjson @@ -0,0 +1,17 @@ +{ + "loc.friendlyName": "CocoaPods", + "loc.helpMarkDown": "[Learn more about this task](https://go.microsoft.com/fwlink/?LinkID=613745)", + "loc.description": "Install CocoaPods dependencies for Swift and Objective-C Cocoa projects", + "loc.instanceNameFormat": "pod install", + "loc.group.displayName.advanced": "Advanced", + "loc.input.label.cwd": "Working directory", + "loc.input.help.cwd": "Specify the working directory in which to execute this task. If left empty, the repository directory will be used.", + "loc.input.label.forceRepoUpdate": "Force repo update", + "loc.input.help.forceRepoUpdate": "Selecting this option will force running 'pod repo update' before install.", + "loc.input.label.projectDirectory": "Project directory", + "loc.input.help.projectDirectory": "Optionally specify the path to the root of the project directory. If left empty, the project specified in the Podfile will be used. If no project is specified, then a search for an Xcode project will be made. If more than one Xcode project is found, an error will occur.", + "loc.messages.PodReturnCode": "The 'pod' command exited with return code: %d", + "loc.messages.PodFailed": "The 'pod' command failed with error: %s", + "loc.messages.CocoaPodsNotFound": "The 'pod' command was not found. Please install CocoaPods on the agent machine (https://cocoapods.org/).", + "loc.messages.ProxyConfig": "Proxy configuration detected. Using proxy host: %s" +} \ No newline at end of file diff --git a/_generated/CocoaPodsV0_Node20/Strings/resources.resjson/es-ES/resources.resjson b/_generated/CocoaPodsV0_Node20/Strings/resources.resjson/es-ES/resources.resjson new file mode 100644 index 000000000000..50092f548a01 --- /dev/null +++ b/_generated/CocoaPodsV0_Node20/Strings/resources.resjson/es-ES/resources.resjson @@ -0,0 +1,17 @@ +{ + "loc.friendlyName": "CocoaPods", + "loc.helpMarkDown": "[Obtener más información acerca de esta tarea](https://go.microsoft.com/fwlink/?LinkID=613745)", + "loc.description": "Instala dependencias de CocoaPods para proyectos Swift y Objective-C de Cocoa.", + "loc.instanceNameFormat": "instalación de pod", + "loc.group.displayName.advanced": "Avanzado", + "loc.input.label.cwd": "Directorio de trabajo", + "loc.input.help.cwd": "Especifique el directorio de trabajo en el cual ejecutar esta tarea. Si se deja en blanco, se usará el directorio de repositorio.", + "loc.input.label.forceRepoUpdate": "Forzar actualización del repositorio", + "loc.input.help.forceRepoUpdate": "Al seleccionar esta opción, se fuerza la ejecución de \"pod repo update\" antes de instalar.", + "loc.input.label.projectDirectory": "Directorio del proyecto", + "loc.input.help.projectDirectory": "Opcionalmente, puede especificar la ruta de acceso a la raíz del directorio del proyecto. Si se deja en blanco, se usará el proyecto especificado en el archivo Podfile. Si no se especifica ningún proyecto, se buscará un proyecto Xcode. Si se encuentra más de un proyecto Xcode, se producirá un error.", + "loc.messages.PodReturnCode": "El comando \"pod\" se cerró con el código de devolución: %d", + "loc.messages.PodFailed": "Error en el comando \"pod\": %s", + "loc.messages.CocoaPodsNotFound": "No se encontró el comando \"pod\". Instale Cocoapods en la máquina del agente (https://cocoapods.org).", + "loc.messages.ProxyConfig": "Se detectó una configuración de proxy. Usando host proxy: %s" +} \ No newline at end of file diff --git a/_generated/CocoaPodsV0_Node20/Strings/resources.resjson/fr-FR/resources.resjson b/_generated/CocoaPodsV0_Node20/Strings/resources.resjson/fr-FR/resources.resjson new file mode 100644 index 000000000000..f5a9c6af87d1 --- /dev/null +++ b/_generated/CocoaPodsV0_Node20/Strings/resources.resjson/fr-FR/resources.resjson @@ -0,0 +1,17 @@ +{ + "loc.friendlyName": "CocoaPods", + "loc.helpMarkDown": "[En savoir plus sur cette tâche](https://go.microsoft.com/fwlink/?LinkID=613745)", + "loc.description": "Installer les dépendances CocoaPods pour les projets Cocoa Swift and Objective-C", + "loc.instanceNameFormat": "installation de pod", + "loc.group.displayName.advanced": "Avancé", + "loc.input.label.cwd": "Répertoire de travail", + "loc.input.help.cwd": "Spécifiez le répertoire de travail dans lequel exécuter cette tâche. Si vous n'indiquez rien, le répertoire du dépôt est utilisé.", + "loc.input.label.forceRepoUpdate": "Forcer la mise à jour du dépôt", + "loc.input.help.forceRepoUpdate": "Si cette option est sélectionnée, la commande 'pod repo update' est obligatoirement exécutée avant l'installation.", + "loc.input.label.projectDirectory": "Répertoire du projet", + "loc.input.help.projectDirectory": "Vous pouvez éventuellement spécifier le chemin de la racine du répertoire du projet. Si rien n'est indiqué, le projet spécifié dans le fichier Podfile est utilisé. Si aucun projet n'est spécifié, la recherche d'un projet Xcode est effectuée. Si plusieurs projets Xcode sont trouvés, une erreur se produit.", + "loc.messages.PodReturnCode": "Sortie de la commande 'pod' avec le code de retour : %d", + "loc.messages.PodFailed": "Échec de la commande 'pod' avec l'erreur : %s", + "loc.messages.CocoaPodsNotFound": "La commande 'pod' est introuvable. Installez CocoaPods sur la machine agent (https://cocoapods.org/).", + "loc.messages.ProxyConfig": "Configuration du proxy détectée. Utilisation de l’hôte proxy : %s" +} \ No newline at end of file diff --git a/_generated/CocoaPodsV0_Node20/Strings/resources.resjson/it-IT/resources.resjson b/_generated/CocoaPodsV0_Node20/Strings/resources.resjson/it-IT/resources.resjson new file mode 100644 index 000000000000..ccd97ee1eb55 --- /dev/null +++ b/_generated/CocoaPodsV0_Node20/Strings/resources.resjson/it-IT/resources.resjson @@ -0,0 +1,17 @@ +{ + "loc.friendlyName": "CocoaPods", + "loc.helpMarkDown": "[Altre informazioni su questa attività](https://go.microsoft.com/fwlink/?LinkID=613745)", + "loc.description": "Installa le dipendenze CocoaPods per progetti Cocoa Swift e Objective-C", + "loc.instanceNameFormat": "pod install", + "loc.group.displayName.advanced": "Avanzate", + "loc.input.label.cwd": "Directory di lavoro", + "loc.input.help.cwd": "Consente di specificare la directory di lavoro in cui eseguire questa attività. Se viene lasciato vuoto, verrà usata la directory del repository.", + "loc.input.label.forceRepoUpdate": "Forza aggiornamento del repository", + "loc.input.help.forceRepoUpdate": "Se si seleziona questa opzione, 'pod repo update' verrà eseguito forzatamente prima dell'installazione.", + "loc.input.label.projectDirectory": "Directory del progetto", + "loc.input.help.projectDirectory": "Consente facoltativamente di specificare il percorso della radice della directory del progetto. Se viene lasciato vuoto, verrà usato il progetto specificato nel podfile. Se non si specifica alcun progetto, verrà eseguita la ricerca di un progetto Xcode. Se vengono trovati più progetti Xcode, si verificherà un errore.", + "loc.messages.PodReturnCode": "Il comando 'pod' è stato terminato. Codice restituito: %d", + "loc.messages.PodFailed": "Il comando 'pod' non è riuscito. Errore: %s", + "loc.messages.CocoaPodsNotFound": "Il comando 'pod' non è stato trovato. Installare CocoaPods nel computer agente (https://cocoapods.org/).", + "loc.messages.ProxyConfig": "È stata rilevata la configurazione del proxy. Uso dell'host proxy: %s" +} \ No newline at end of file diff --git a/_generated/CocoaPodsV0_Node20/Strings/resources.resjson/ja-JP/resources.resjson b/_generated/CocoaPodsV0_Node20/Strings/resources.resjson/ja-JP/resources.resjson new file mode 100644 index 000000000000..735cb64e0943 --- /dev/null +++ b/_generated/CocoaPodsV0_Node20/Strings/resources.resjson/ja-JP/resources.resjson @@ -0,0 +1,17 @@ +{ + "loc.friendlyName": "CocoaPods", + "loc.helpMarkDown": "[このタスクの詳細を表示](https://go.microsoft.com/fwlink/?LinkID=613745)", + "loc.description": "Swift および Objective-C Cocoa プロジェクトのための CocoaPods の依存関係をインストールします", + "loc.instanceNameFormat": "pod install", + "loc.group.displayName.advanced": "詳細設定", + "loc.input.label.cwd": "作業ディレクトリ", + "loc.input.help.cwd": "このタスクを実行する作業ディレクトリを指定します。空にすると、リポジトリのディレクトリが使用されます。", + "loc.input.label.forceRepoUpdate": "リポジトリの更新を強制する", + "loc.input.help.forceRepoUpdate": "このオプションを選択すると、インストール前に強制的に 'pod repo update' が実行されます。", + "loc.input.label.projectDirectory": "プロジェクト ディレクトリ", + "loc.input.help.projectDirectory": "(省略可能) プロジェクト ディレクトリのルートへのパスを指定します。空のままにすると、Podfile で指定されたプロジェクトが使用されます。プロジェクトを指定しないと、Xcode プロジェクトが検索されます。複数の Xcode プロジェクトが見つかった場合は、エラーが発生します。", + "loc.messages.PodReturnCode": "'pod' コマンドが次のリターン コードで終了しました: %d", + "loc.messages.PodFailed": "'pod' コマンドが失敗し、次のエラーが発生しました: %s", + "loc.messages.CocoaPodsNotFound": "'pod' コマンドが見つかりません。CocoaPods をエージェント コンピューター上にインストールしてください (https://cocoapods.org)。", + "loc.messages.ProxyConfig": "プロキシ構成が検出されました。プロキシ ホスト: %s を使用しています" +} \ No newline at end of file diff --git a/_generated/CocoaPodsV0_Node20/Strings/resources.resjson/ko-KR/resources.resjson b/_generated/CocoaPodsV0_Node20/Strings/resources.resjson/ko-KR/resources.resjson new file mode 100644 index 000000000000..d565aafa6d98 --- /dev/null +++ b/_generated/CocoaPodsV0_Node20/Strings/resources.resjson/ko-KR/resources.resjson @@ -0,0 +1,17 @@ +{ + "loc.friendlyName": "CocoaPods", + "loc.helpMarkDown": "[이 작업에 대한 자세한 정보](https://go.microsoft.com/fwlink/?LinkID=613745)", + "loc.description": "Swift 및 Objective-C Cocoa 프로젝트를 위한 CocoaPods 종속성을 설치합니다.", + "loc.instanceNameFormat": "pod install", + "loc.group.displayName.advanced": "고급", + "loc.input.label.cwd": "작업 디렉터리", + "loc.input.help.cwd": "이 작업을 실행할 작업 디렉터리를 지정합니다. 비워 두는 경우 리포지토리 디렉터리가 사용됩니다.", + "loc.input.label.forceRepoUpdate": "강제 리포 업데이트", + "loc.input.help.forceRepoUpdate": "이 옵션을 선택하면 설치 전에 'pod repo update'가 강제 실행됩니다.", + "loc.input.label.projectDirectory": "프로젝트 디렉터리", + "loc.input.help.projectDirectory": "선택적으로 프로젝트 디렉터리의 루트에 대한 경로를 지정합니다. 비워 두는 경우 Podfile에 지정된 프로젝트가 사용됩니다. 프로젝트를 지정하지 않으면 Xcode 프로젝트를 검색합니다. Xcode 프로젝트가 두 개 이상 있는 경우 오류가 발생합니다.", + "loc.messages.PodReturnCode": "'pod' 명령이 종료되었습니다(반환 코드: %d).", + "loc.messages.PodFailed": "'pod' 명령이 실패했습니다(오류: %s).", + "loc.messages.CocoaPodsNotFound": "'pod' 명령을 찾을 수 없습니다. 에이전트 컴퓨터에 CocoaPods를 설치하세요(https://cocoapods.org/).", + "loc.messages.ProxyConfig": "프록시 구성이 감지되었습니다. 프록시 호스트 사용: %s" +} \ No newline at end of file diff --git a/_generated/CocoaPodsV0_Node20/Strings/resources.resjson/ru-RU/resources.resjson b/_generated/CocoaPodsV0_Node20/Strings/resources.resjson/ru-RU/resources.resjson new file mode 100644 index 000000000000..788748b49892 --- /dev/null +++ b/_generated/CocoaPodsV0_Node20/Strings/resources.resjson/ru-RU/resources.resjson @@ -0,0 +1,17 @@ +{ + "loc.friendlyName": "CocoaPods", + "loc.helpMarkDown": "[См. дополнительные сведения об этой задаче](https://go.microsoft.com/fwlink/?LinkID=613745)", + "loc.description": "Установить зависимости CocoaPods для проектов Cocoa Swift и Objective-C", + "loc.instanceNameFormat": "установка pod", + "loc.group.displayName.advanced": "Дополнительно", + "loc.input.label.cwd": "Рабочий каталог", + "loc.input.help.cwd": "Укажите рабочий каталог для выполнения этой задачи. Если значение пусто, используется каталог репозитория.", + "loc.input.label.forceRepoUpdate": "Принудительное обновление репозитория", + "loc.input.help.forceRepoUpdate": "Выбор этого параметра приведет к принудительному запуску команды \"pod repo update\" перед установкой.", + "loc.input.label.projectDirectory": "Каталог проекта", + "loc.input.help.projectDirectory": "При необходимости укажите путь к корневой папке проекта. Если оставить пустым, будет использоваться проект, указанный в Podfile. Если проект не указан, будут вестись поиск проекта Xcode. Если найдено более одного проекта Xcode, произойдет ошибка.", + "loc.messages.PodReturnCode": "Команда \"pod\" завершила работу с кодом возврата: %d", + "loc.messages.PodFailed": "Команда \"pod\" завершилась сбоем с ошибкой: %s", + "loc.messages.CocoaPodsNotFound": "Команда \"pod\" не найдена. Установите CocoaPods (https://cocoapods.org/) на компьютере агента.", + "loc.messages.ProxyConfig": "Обнаружена конфигурация прокси-сервера. Использование прокси-узла: %s" +} \ No newline at end of file diff --git a/_generated/CocoaPodsV0_Node20/Strings/resources.resjson/zh-CN/resources.resjson b/_generated/CocoaPodsV0_Node20/Strings/resources.resjson/zh-CN/resources.resjson new file mode 100644 index 000000000000..a8474206dc4e --- /dev/null +++ b/_generated/CocoaPodsV0_Node20/Strings/resources.resjson/zh-CN/resources.resjson @@ -0,0 +1,17 @@ +{ + "loc.friendlyName": "CocoaPods", + "loc.helpMarkDown": "[详细了解此任务](https://go.microsoft.com/fwlink/?LinkID=613745)", + "loc.description": "安装 Swift 和 Objective-C Cocoa 项目的 CocoaPod 依赖项", + "loc.instanceNameFormat": "pod 安装", + "loc.group.displayName.advanced": "高级", + "loc.input.label.cwd": "工作目录", + "loc.input.help.cwd": "指定要执行此任务的工作目录。如果留空,将使用存储库目录。", + "loc.input.label.forceRepoUpdate": "强制存储库更新", + "loc.input.help.forceRepoUpdate": "选择此选项会在安装前强制运行 \"pod repo update\"。", + "loc.input.label.projectDirectory": "项目目录", + "loc.input.help.projectDirectory": "可以选择指定项目目录的根路径。如果留空,将使用 Podfile 中指定的项目。如果未指定项目,则将搜索 Xcode 项目。如果找到多个 Xcode 项目,则会出现错误。", + "loc.messages.PodReturnCode": "已退出\"pod\" 命令,返回代码为: %d", + "loc.messages.PodFailed": "\"pod\" 命令失败,出现错误: %s", + "loc.messages.CocoaPodsNotFound": "找不到 \"pod\" 命令。请在代理计算机上安装 CocoaPods (https://cocoapods.org/)。", + "loc.messages.ProxyConfig": "检测到代理配置。使用代理主机: %s" +} \ No newline at end of file diff --git a/_generated/CocoaPodsV0_Node20/Strings/resources.resjson/zh-TW/resources.resjson b/_generated/CocoaPodsV0_Node20/Strings/resources.resjson/zh-TW/resources.resjson new file mode 100644 index 000000000000..6b9729f131e7 --- /dev/null +++ b/_generated/CocoaPodsV0_Node20/Strings/resources.resjson/zh-TW/resources.resjson @@ -0,0 +1,17 @@ +{ + "loc.friendlyName": "CocoaPods", + "loc.helpMarkDown": "[深入了解此工作](https://go.microsoft.com/fwlink/?LinkID=613745)", + "loc.description": "安裝 Swift 和 Objective-C Cocoa 專案的 CocoaPods 相依性", + "loc.instanceNameFormat": "pod 安裝", + "loc.group.displayName.advanced": "進階", + "loc.input.label.cwd": "工作目錄", + "loc.input.help.cwd": "請指定要在其中執行此工作的工作目錄。若為空白,則會使用存放庫目錄。", + "loc.input.label.forceRepoUpdate": "強制執行 repo update", + "loc.input.help.forceRepoUpdate": "選取此選項會在安裝前強制執行 'pod repo update'。", + "loc.input.label.projectDirectory": "專案目錄", + "loc.input.help.projectDirectory": "您可以視情況選擇指定專案目錄的根目錄路徑。如果保留空白,就會使用 Podfile 中指定的專案。如果未指定任何專案,則會搜尋 Xcode 專案。如果找到多個 Xcode 專案,將會發生錯誤。", + "loc.messages.PodReturnCode": "'pod' 命令結束,傳回碼為: %d", + "loc.messages.PodFailed": "'pod' 命令失敗,發生錯誤: %s", + "loc.messages.CocoaPodsNotFound": "找不到 'pod' 命令。請在代理程式電腦上安裝 CocoaPods (https://cocoapods.org/)。", + "loc.messages.ProxyConfig": "已偵測到 Proxy 設定。使用 Proxy 主機: %s" +} \ No newline at end of file diff --git a/_generated/CocoaPodsV0_Node20/Tests/L0.ts b/_generated/CocoaPodsV0_Node20/Tests/L0.ts new file mode 100644 index 000000000000..ef0b0acb465b --- /dev/null +++ b/_generated/CocoaPodsV0_Node20/Tests/L0.ts @@ -0,0 +1,22 @@ +import fs = require('fs'); +import assert = require('assert'); +import path = require('path'); +import * as ttm from 'azure-pipelines-task-lib/mock-test'; + +describe('CocoaPodsV0 Suite', function () { + before(() => { + }); + + after(() => { + }); + + it('run pod', function(done: Mocha.Done) { + this.timeout(parseInt(process.env.TASK_TEST_TIMEOUT) || 8000); + let tp: string = path.join(__dirname, 'L0DefaultRunner.js'); + let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + tr.run(); + assert(tr.ran('pod --version'), 'it should run pod --version'); + assert(tr.ran('pod install --project-directory=testdir'), 'it should run pod install'); + done(); + }); +}); diff --git a/_generated/CocoaPodsV0_Node20/Tests/L0DefaultRunner.ts b/_generated/CocoaPodsV0_Node20/Tests/L0DefaultRunner.ts new file mode 100644 index 000000000000..cea867611d15 --- /dev/null +++ b/_generated/CocoaPodsV0_Node20/Tests/L0DefaultRunner.ts @@ -0,0 +1,40 @@ +import * as ma from 'azure-pipelines-task-lib/mock-answer'; +import * as tmrm from 'azure-pipelines-task-lib/mock-run'; +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'cocoapods.js'); + + + +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); +tr.setInput('cwd', '/home/repo/src'); +tr.setInput('forceRepoUpdate', 'false'); +tr.setInput('projectDirectory', 'testdir'); + +let a: ma.TaskLibAnswers = { + 'checkPath': { + 'pod': true, + '/home/repo/src': true, + 'testdir': true + }, + 'which': { + 'pod': 'pod' + }, + 'exec': { + 'pod --version': { + 'code': 0, + 'stdout': '1.0.0' + }, + 'pod install': { + 'code': 0, + 'stdout': 'install packages' + }, + 'pod install --repo-update': { + 'code': 0, + 'stdout': 'install packages' + } + }, +} +tr.setAnswers(a); +tr.run(); + diff --git a/_generated/CocoaPodsV0_Node20/Tests/package-lock.json b/_generated/CocoaPodsV0_Node20/Tests/package-lock.json new file mode 100644 index 000000000000..25b7cb983955 --- /dev/null +++ b/_generated/CocoaPodsV0_Node20/Tests/package-lock.json @@ -0,0 +1,14 @@ +{ + "name": "cocoa-pods-tests", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/mocha": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", + "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==", + "dev": true + } + } +} diff --git a/_generated/CocoaPodsV0_Node20/Tests/package.json b/_generated/CocoaPodsV0_Node20/Tests/package.json new file mode 100644 index 000000000000..b31852dd557c --- /dev/null +++ b/_generated/CocoaPodsV0_Node20/Tests/package.json @@ -0,0 +1,22 @@ +{ + "name": "cocoa-pods-tests", + "version": "1.0.0", + "description": "Azure Pipelines Cocoa Pods V0 Task Tests", + "main": "L0.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/Microsoft/azure-pipelines-tasks.git" + }, + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Microsoft/azure-pipelines-tasks/issues" + }, + "homepage": "https://github.com/Microsoft/azure-pipelines-tasks#readme", + "devDependencies": { + "@types/mocha": "^5.2.0" + } +} diff --git a/_generated/CocoaPodsV0_Node20/cocoapods.ts b/_generated/CocoaPodsV0_Node20/cocoapods.ts new file mode 100644 index 000000000000..0966e2ed9ca2 --- /dev/null +++ b/_generated/CocoaPodsV0_Node20/cocoapods.ts @@ -0,0 +1,68 @@ +import path = require('path'); +import tl = require('azure-pipelines-task-lib/task'); +import trm = require('azure-pipelines-task-lib/toolrunner'); + +// The CocoaPods install command is documented here: +// https://guides.cocoapods.org/terminal/commands.html#pod_install + +async function run() { + try { + // Set path to resource strings + tl.setResourcePath(path.join(__dirname, 'task.json')); + + // Change to configured working directory + tl.cd(tl.getPathInput('cwd', true, true)); + + // Set locale to UTF-8 + tl.debug('Setting locale to UTF8 as required by CocoaPods'); + process.env['LC_ALL'] = 'en_US.UTF-8'; + + const proxyConfig: tl.ProxyConfiguration | null = tl.getHttpProxyConfiguration(); + if (proxyConfig) { + + process.env['http_proxy'] = proxyConfig.proxyFormattedUrl; + process.env['https_proxy'] = proxyConfig.proxyFormattedUrl; + + tl.debug(tl.loc('ProxyConfig', proxyConfig.proxyUrl)); + } + + // Locate the CocoaPods 'pod' command + var podPath: string = tl.which('pod'); + if (!podPath) { + throw new Error(tl.loc('CocoaPodsNotFound')); + } + + // Run `pod --version` to make diagnosing build breaks easier. + var podv: trm.ToolRunner = tl.tool(podPath); + podv.arg('--version'); + await podv.exec(); + + // Prepare to run `pod install` + var pod: trm.ToolRunner = tl.tool(podPath); + pod.arg('install'); + + // Force updating the pod repo before install? + if (tl.getBoolInput('forceRepoUpdate', true)) { + pod.arg('--repo-update'); + } + + // Explicitly specify a project directory? + if (tl.filePathSupplied('projectDirectory')) { + var projectDirectory: string = tl.getPathInput('projectDirectory', false, true); + pod.arg('--project-directory=' + projectDirectory); + } + + // Execute + var returnCode: number = await pod.exec(); + + // Get the result code and set the task result accordingly + tl.setResult(tl.TaskResult.Succeeded, tl.loc('PodReturnCode', returnCode)); + } + catch(err) { + // Report failure + tl.error(err.message); + tl.setResult(tl.TaskResult.Failed, tl.loc('PodFailed', err.message)); + } +} + +run(); diff --git a/_generated/CocoaPodsV0_Node20/icon.png b/_generated/CocoaPodsV0_Node20/icon.png new file mode 100644 index 000000000000..aeca63568dfd Binary files /dev/null and b/_generated/CocoaPodsV0_Node20/icon.png differ diff --git a/_generated/CocoaPodsV0_Node20/icon.svg b/_generated/CocoaPodsV0_Node20/icon.svg new file mode 100644 index 000000000000..26d2222a6023 --- /dev/null +++ b/_generated/CocoaPodsV0_Node20/icon.svg @@ -0,0 +1,4 @@ + + + + diff --git a/_generated/CocoaPodsV0_Node20/package-lock.json b/_generated/CocoaPodsV0_Node20/package-lock.json new file mode 100644 index 000000000000..a105f3c9686c --- /dev/null +++ b/_generated/CocoaPodsV0_Node20/package-lock.json @@ -0,0 +1,483 @@ +{ + "name": "vsts-cocoapods-task", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/concat-stream": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz", + "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==", + "requires": { + "@types/node": "*" + } + }, + "@types/form-data": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", + "integrity": "sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==", + "requires": { + "@types/node": "*" + } + }, + "@types/mocha": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", + "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==" + }, + "@types/node": { + "version": "20.7.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.7.0.tgz", + "integrity": "sha512-zI22/pJW2wUZOVyguFaUL1HABdmSVxpXrzIqkjsHmyUjNhPoWM1CKfvVuXfetHhIok4RY573cqS0mZ1SJEnoTg==" + }, + "@types/qs": { + "version": "6.9.8", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.8.tgz", + "integrity": "sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg==" + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "azure-pipelines-task-lib": { + "version": "5.0.0-preview.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-5.0.0-preview.0.tgz", + "integrity": "sha512-uQJEv+q3/7RD7kgphFd33uXijaPwA1ePYoNkAgZpUhbZUtc2u4JL4ujTT/JJfgXBNW/QQNAiDQ2OC7vOQG/0tg==", + "requires": { + "minimatch": "3.0.5", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "sync-request": "6.1.0", + "uuid": "^3.0.1" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, + "form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + } + }, + "get-port": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", + "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==" + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "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" + }, + "dependencies": { + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==" + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "http-basic": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", + "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", + "requires": { + "caseless": "^0.12.0", + "concat-stream": "^1.6.2", + "http-response-object": "^3.0.1", + "parse-cache-control": "^1.0.1" + } + }, + "http-response-object": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", + "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", + "requires": { + "@types/node": "^10.0.3" + }, + "dependencies": { + "@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + } + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" + }, + "is-core-module": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "requires": { + "has": "^1.0.3" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, + "parse-cache-control": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", + "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "promise": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", + "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", + "requires": { + "asap": "~2.0.6" + } + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==" + }, + "qs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "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" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "requires": { + "resolve": "^1.1.6" + } + }, + "resolve": { + "version": "1.22.6", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.6.tgz", + "integrity": "sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==", + "requires": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" + }, + "shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, + "sync-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", + "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==", + "requires": { + "http-response-object": "^3.0.1", + "sync-rpc": "^1.2.1", + "then-request": "^6.0.0" + } + }, + "sync-rpc": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz", + "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==", + "requires": { + "get-port": "^3.1.0" + } + }, + "then-request": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", + "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", + "requires": { + "@types/concat-stream": "^1.6.0", + "@types/form-data": "0.0.33", + "@types/node": "^8.0.0", + "@types/qs": "^6.2.31", + "caseless": "~0.12.0", + "concat-stream": "^1.6.0", + "form-data": "^2.2.0", + "http-basic": "^8.1.1", + "http-response-object": "^3.0.1", + "promise": "^8.0.0", + "qs": "^6.4.0" + }, + "dependencies": { + "@types/node": { + "version": "8.10.66", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", + "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==" + } + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, + "typescript": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + } + } +} diff --git a/_generated/CocoaPodsV0_Node20/package.json b/_generated/CocoaPodsV0_Node20/package.json new file mode 100644 index 000000000000..84fd78e15050 --- /dev/null +++ b/_generated/CocoaPodsV0_Node20/package.json @@ -0,0 +1,27 @@ +{ + "name": "vsts-cocoapods-task", + "version": "1.0.0", + "description": "Azure Pipelines Cocoa Pods Task", + "main": "cocoapods.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/Microsoft/azure-pipelines-tasks.git" + }, + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Microsoft/azure-pipelines-tasks/issues" + }, + "homepage": "https://github.com/Microsoft/azure-pipelines-tasks#readme", + "dependencies": { + "@types/mocha": "^5.2.7", + "@types/node": "^20.3.1", + "azure-pipelines-task-lib": "^5.0.0-preview.0" + }, + "devDependencies": { + "typescript": "5.1.6" + } +} diff --git a/_generated/CocoaPodsV0_Node20/task.json b/_generated/CocoaPodsV0_Node20/task.json new file mode 100644 index 000000000000..7b0b27d0a840 --- /dev/null +++ b/_generated/CocoaPodsV0_Node20/task.json @@ -0,0 +1,94 @@ +{ + "id": "BFC05E0D-839C-42CD-89C7-0F9FBFCAB965", + "name": "CocoaPods", + "friendlyName": "CocoaPods", + "description": "Install CocoaPods dependencies for Swift and Objective-C Cocoa projects", + "helpUrl": "https://docs.microsoft.com/azure/devops/pipelines/tasks/package/cocoapods", + "helpMarkDown": "[Learn more about this task](https://go.microsoft.com/fwlink/?LinkID=613745)", + "category": "Package", + "visibility": [ + "Build" + ], + "runsOn": [ + "Agent", + "DeploymentGroup" + ], + "author": "Microsoft Corporation", + "minimumAgentVersion": "2.182.1", + "version": { + "Major": 0, + "Minor": 229, + "Patch": 1 + }, + "groups": [ + { + "name": "advanced", + "displayName": "Advanced", + "isExpanded": true + } + ], + "instanceNameFormat": "pod install", + "inputs": [ + { + "name": "cwd", + "aliases": [ + "workingDirectory" + ], + "type": "filePath", + "label": "Working directory", + "defaultValue": "", + "required": false, + "helpMarkDown": "Specify the working directory in which to execute this task. If left empty, the repository directory will be used." + }, + { + "name": "forceRepoUpdate", + "type": "boolean", + "label": "Force repo update", + "defaultValue": false, + "required": true, + "helpMarkDown": "Selecting this option will force running 'pod repo update' before install.", + "groupName": "advanced" + }, + { + "name": "projectDirectory", + "type": "filePath", + "label": "Project directory", + "defaultValue": "", + "required": false, + "helpMarkDown": "Optionally specify the path to the root of the project directory. If left empty, the project specified in the Podfile will be used. If no project is specified, then a search for an Xcode project will be made. If more than one Xcode project is found, an error will occur.", + "groupName": "advanced" + } + ], + "execution": { + "Node10": { + "target": "cocoapods.js", + "argumentFormat": "" + }, + "Node16": { + "target": "cocoapods.js", + "argumentFormat": "" + }, + "Node20": { + "target": "cocoapods.js", + "argumentFormat": "" + } + }, + "restrictions": { + "commands": { + "mode": "restricted" + }, + "settableVariables": { + "allowed": [] + } + }, + "messages": { + "PodReturnCode": "The 'pod' command exited with return code: %d", + "PodFailed": "The 'pod' command failed with error: %s", + "CocoaPodsNotFound": "The 'pod' command was not found. Please install CocoaPods on the agent machine (https://cocoapods.org/).", + "ProxyConfig": "Proxy configuration detected. Using proxy host: %s" + }, + "_buildConfigMapping": { + "Default": "0.229.0", + "Node20-225": "0.229.1" + } +} \ No newline at end of file diff --git a/_generated/CocoaPodsV0_Node20/task.loc.json b/_generated/CocoaPodsV0_Node20/task.loc.json new file mode 100644 index 000000000000..2d6bae1b7740 --- /dev/null +++ b/_generated/CocoaPodsV0_Node20/task.loc.json @@ -0,0 +1,94 @@ +{ + "id": "BFC05E0D-839C-42CD-89C7-0F9FBFCAB965", + "name": "CocoaPods", + "friendlyName": "ms-resource:loc.friendlyName", + "description": "ms-resource:loc.description", + "helpUrl": "https://docs.microsoft.com/azure/devops/pipelines/tasks/package/cocoapods", + "helpMarkDown": "ms-resource:loc.helpMarkDown", + "category": "Package", + "visibility": [ + "Build" + ], + "runsOn": [ + "Agent", + "DeploymentGroup" + ], + "author": "Microsoft Corporation", + "minimumAgentVersion": "2.182.1", + "version": { + "Major": 0, + "Minor": 229, + "Patch": 1 + }, + "groups": [ + { + "name": "advanced", + "displayName": "ms-resource:loc.group.displayName.advanced", + "isExpanded": true + } + ], + "instanceNameFormat": "ms-resource:loc.instanceNameFormat", + "inputs": [ + { + "name": "cwd", + "aliases": [ + "workingDirectory" + ], + "type": "filePath", + "label": "ms-resource:loc.input.label.cwd", + "defaultValue": "", + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.cwd" + }, + { + "name": "forceRepoUpdate", + "type": "boolean", + "label": "ms-resource:loc.input.label.forceRepoUpdate", + "defaultValue": false, + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.forceRepoUpdate", + "groupName": "advanced" + }, + { + "name": "projectDirectory", + "type": "filePath", + "label": "ms-resource:loc.input.label.projectDirectory", + "defaultValue": "", + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.projectDirectory", + "groupName": "advanced" + } + ], + "execution": { + "Node10": { + "target": "cocoapods.js", + "argumentFormat": "" + }, + "Node16": { + "target": "cocoapods.js", + "argumentFormat": "" + }, + "Node20": { + "target": "cocoapods.js", + "argumentFormat": "" + } + }, + "restrictions": { + "commands": { + "mode": "restricted" + }, + "settableVariables": { + "allowed": [] + } + }, + "messages": { + "PodReturnCode": "ms-resource:loc.messages.PodReturnCode", + "PodFailed": "ms-resource:loc.messages.PodFailed", + "CocoaPodsNotFound": "ms-resource:loc.messages.CocoaPodsNotFound", + "ProxyConfig": "ms-resource:loc.messages.ProxyConfig" + }, + "_buildConfigMapping": { + "Default": "0.229.0", + "Node20-225": "0.229.1" + } +} \ No newline at end of file diff --git a/_generated/CocoaPodsV0_Node20/tsconfig.json b/_generated/CocoaPodsV0_Node20/tsconfig.json new file mode 100644 index 000000000000..0438b79f69ac --- /dev/null +++ b/_generated/CocoaPodsV0_Node20/tsconfig.json @@ -0,0 +1,6 @@ +{ + "compilerOptions": { + "target": "ES6", + "module": "commonjs" + } +} \ No newline at end of file diff --git a/_generated/CopyFilesOverSSHV0.versionmap.txt b/_generated/CopyFilesOverSSHV0.versionmap.txt new file mode 100644 index 000000000000..378f4c63ee24 --- /dev/null +++ b/_generated/CopyFilesOverSSHV0.versionmap.txt @@ -0,0 +1,2 @@ +Default|0.229.0 +Node20-225|0.229.1 diff --git a/_generated/CopyFilesOverSSHV0/Strings/resources.resjson/de-DE/resources.resjson b/_generated/CopyFilesOverSSHV0/Strings/resources.resjson/de-DE/resources.resjson new file mode 100644 index 000000000000..a04ccb51a625 --- /dev/null +++ b/_generated/CopyFilesOverSSHV0/Strings/resources.resjson/de-DE/resources.resjson @@ -0,0 +1,51 @@ +{ + "loc.friendlyName": "Dateien über SSH kopieren", + "loc.helpMarkDown": "[Weitere Informationen zu dieser Aufgabe](https://go.microsoft.com/fwlink/?LinkId=821894)", + "loc.description": "Dateien oder Buildartefakte auf einen Remotecomputer über SSH kopieren", + "loc.instanceNameFormat": "Dateien sicher auf den Remotecomputer kopieren", + "loc.group.displayName.advanced": "Erweitert", + "loc.input.label.sshEndpoint": "SSH-Dienstverbindung", + "loc.input.help.sshEndpoint": "Die SSH-Dienstverbindung mit Verbindungsdetails für den Remotecomputer.", + "loc.input.label.sourceFolder": "Quellordner", + "loc.input.help.sourceFolder": "Der Quellordner für die auf den Remotecomputer zu kopierenden Dateien. Wenn das Feld leer bleibt, wird der Stamm des Repositorys (Build) oder des Artefakteverzeichnisses (Release) verwendet. Dies ist $(System.DefaultWorkingDirectory). Verwenden Sie [Variablen](https://go.microsoft.com/fwlink/?LinkID=550988), wenn im Repository keine Dateien vorhanden sind. Beispiel: $(Agent.BuildDirectory)", + "loc.input.label.contents": "Inhalte", + "loc.input.help.contents": "Dateipfade, die als Teil der Kopie eingeschlossen werden sollen. Unterstützt mehrere Zeilen von Minimatchmustern. [Weitere Informationen](https://go.microsoft.com/fwlink/?LinkId=821894)", + "loc.input.label.targetFolder": "Zielordner", + "loc.input.help.targetFolder": "Der Zielordner auf dem Remotecomputer, in den die Dateien kopiert werden. Beispiel: \"/home/user/MySite\".", + "loc.input.label.isWindowsOnTarget": "Zielcomputer führt Windows aus", + "loc.input.help.isWindowsOnTarget": "Zielcomputer führt Windows aus", + "loc.input.label.cleanTargetFolder": "Zielordner bereinigen", + "loc.input.help.cleanTargetFolder": "Alle vorhandenen Dateien und Unterordner im Zielordner vor dem Kopieren löschen.", + "loc.input.label.cleanHiddenFilesInTarget": "Ausgeblendete Dateien im Zielordner entfernen", + "loc.input.help.cleanHiddenFilesInTarget": "Ausgeblendete Dateien im Zielordner entfernen.", + "loc.input.label.readyTimeout": "Timeout für SSH-Handshake", + "loc.input.help.readyTimeout": "Gibt an, wie lange (in Millisekunden) auf den Abschluss des SSH-Handshakes gewartet wird.", + "loc.input.label.overwrite": "Überschreiben", + "loc.input.help.overwrite": "Vorhandene Dateien im Zielordner sowie unterhalb des Zielordners ersetzen.", + "loc.input.label.failOnEmptySource": "Ein Fehler tritt auf, wenn keine zu kopierenden Dateien gefunden werden.", + "loc.input.help.failOnEmptySource": "Ein Fehler tritt auf, wenn keine zu kopierenden übereinstimmenden Dateien im Quellordner gefunden wurden.", + "loc.input.label.flattenFolders": "Ordner vereinfachen", + "loc.input.help.flattenFolders": "Vereinfacht die Ordnerstruktur und kopiert alle Dateien in den angegebenen Zielordner auf dem Remotecomputer.", + "loc.messages.CheckLogForStdErr": "Überprüfen Sie das Buildprotokoll auf Ausgabe an STDERR vom Befehl.", + "loc.messages.CleanTargetFolder": "Der Zielordner \"%s\" wird auf dem Remotecomputer bereinigt.", + "loc.messages.CleanTargetFolderFailed": "Fehler beim Bereinigen des Zielordners auf dem Remotecomputer. %s", + "loc.messages.ConnectionFailed": "Fehler beim Herstellen einer Verbindung mit dem Remotecomputer. Überprüfen Sie die SSH-Dienstverbindungsdetails. %s.", + "loc.messages.ConnectionNotSetup": "Die SSH-Dienstverbindung ist nicht eingerichtet.", + "loc.messages.CopyCompleted": "Das Kopieren von %s Dateien auf den Remotecomputer wurde abgeschlossen.", + "loc.messages.CopyingFiles": "Es wurden %s Dateien zum Kopieren auf den Remotecomputer gefunden.", + "loc.messages.FailedOnFile": "Fehler beim Kopieren von \"%s\". %s", + "loc.messages.FileExists": "Die Datei \"%s\" kann nicht auf den Remotecomputer kopiert werden, weil sie bereits vorhanden und die Option \"Überschreiben\" deaktiviert ist.", + "loc.messages.NothingToCopy": "Es wurden keine Dateien gefunden, die mit den auf den Remotecomputer zu kopierenden Mustern übereinstimmen.", + "loc.messages.NumberFailed": "Fehler beim Kopieren von %d Dateien.", + "loc.messages.RemoteCmdExecutionErr": "Fehler des Befehls \"%s\" auf dem Remotecomputer. %s.", + "loc.messages.RemoteCmdNonZeroExitCode": "Der Befehl \"%s\" wurde mit dem Code %s beendet.", + "loc.messages.SettingUpSSHConnection": "Die SSH-Dienstverbindung mit dem Remotehost \"%s\" wird eingerichtet.", + "loc.messages.SourceNotFolder": "Der Quellordner muss ein gültiger Ordnerpfad sein.", + "loc.messages.StartedFileCopy": "Die Datei \"%s\" wird in \"%s\" auf dem Remotecomputer kopiert.", + "loc.messages.UploadFileFailed": "Fehler beim Hochladen von %s auf %s auf dem Remotecomputer. %s", + "loc.messages.UseDefaultPort": "Port 22 wird als Standardeinstellung für SSH verwendet, da kein Port angegeben wurde.", + "loc.messages.TargetNotCreated": "Der Zielordner \"%s\" kann nicht erstellt werden.", + "loc.messages.CheckingPathExistance": "Es wird überprüft, ob \"%s\" auf dem Remotecomputer vorhanden ist.", + "loc.messages.PathExists": "\"%s\" ist auf dem Remotecomputer vorhanden.", + "loc.messages.PathNotExists": "\"%s\" ist auf dem Remotecomputer nicht vorhanden." +} \ No newline at end of file diff --git a/_generated/CopyFilesOverSSHV0/Strings/resources.resjson/en-US/resources.resjson b/_generated/CopyFilesOverSSHV0/Strings/resources.resjson/en-US/resources.resjson new file mode 100644 index 000000000000..56323de2ea28 --- /dev/null +++ b/_generated/CopyFilesOverSSHV0/Strings/resources.resjson/en-US/resources.resjson @@ -0,0 +1,51 @@ +{ + "loc.friendlyName": "Copy files over SSH", + "loc.helpMarkDown": "[Learn more about this task](https://go.microsoft.com/fwlink/?LinkId=821894)", + "loc.description": "Copy files or build artifacts to a remote machine over SSH", + "loc.instanceNameFormat": "Securely copy files to the remote machine", + "loc.group.displayName.advanced": "Advanced", + "loc.input.label.sshEndpoint": "SSH service connection", + "loc.input.help.sshEndpoint": "SSH service connection with connection details for the remote machine.", + "loc.input.label.sourceFolder": "Source folder", + "loc.input.help.sourceFolder": "The source folder of the files to copy to the remote machine. When empty, the root of the repository (build) or artifacts directory (release) is used, which is $(System.DefaultWorkingDirectory). Use [variables](https://go.microsoft.com/fwlink/?LinkID=550988) if files are not in the repository. Example: $(Agent.BuildDirectory)", + "loc.input.label.contents": "Contents", + "loc.input.help.contents": "File paths to include as part of the copy. Supports multiple lines of minimatch patterns. [More Information](https://go.microsoft.com/fwlink/?LinkId=821894)", + "loc.input.label.targetFolder": "Target folder", + "loc.input.help.targetFolder": "Target folder on the remote machine to where files will be copied. Example: /home/user/MySite.", + "loc.input.label.isWindowsOnTarget": "Target machine running Windows", + "loc.input.help.isWindowsOnTarget": "Target machine running Windows", + "loc.input.label.cleanTargetFolder": "Clean target folder", + "loc.input.help.cleanTargetFolder": "Delete all existing files and subfolders in the target folder before copying.", + "loc.input.label.cleanHiddenFilesInTarget": "Remove hidden files in target folder", + "loc.input.help.cleanHiddenFilesInTarget": "Remove hidden files in the target folder.", + "loc.input.label.readyTimeout": "SSH handshake timeout", + "loc.input.help.readyTimeout": "How long (in milliseconds) to wait for the SSH handshake to complete.", + "loc.input.label.overwrite": "Overwrite", + "loc.input.help.overwrite": "Replace existing files in and beneath the target folder.", + "loc.input.label.failOnEmptySource": "Fail if no files found to copy", + "loc.input.help.failOnEmptySource": "Fail if no matching files to be copied are found under the source folder.", + "loc.input.label.flattenFolders": "Flatten folders", + "loc.input.help.flattenFolders": "Flatten the folder structure and copy all files into the specified target folder on the remote machine.", + "loc.messages.CheckLogForStdErr": "Check the build log for STDERR from the command.", + "loc.messages.CleanTargetFolder": "Cleaning target folder %s on the remote machine", + "loc.messages.CleanTargetFolderFailed": "Failed to clean the target folder on the remote machine. %s", + "loc.messages.ConnectionFailed": "Failed to connect to remote machine. Verify the SSH service connection details. %s.", + "loc.messages.ConnectionNotSetup": "SSH service connection is not set up.", + "loc.messages.CopyCompleted": "Completed copying %s files to the remote machine.", + "loc.messages.CopyingFiles": "Found %s files to copy to the remote machine.", + "loc.messages.FailedOnFile": "Failed to copy %s. %s", + "loc.messages.FileExists": "File %s cannot be copied to the remote machine because it already exists and the 'Overwrite' option is disabled.", + "loc.messages.NothingToCopy": "No files were found matching the patterns specified to copy to the remote machine.", + "loc.messages.NumberFailed": "Failed to copy %d files", + "loc.messages.RemoteCmdExecutionErr": "Command %s failed with errors on remote machine. %s.", + "loc.messages.RemoteCmdNonZeroExitCode": "Command %s exited with code %s.", + "loc.messages.SettingUpSSHConnection": "Setting up SSH service connection to remote host %s.", + "loc.messages.SourceNotFolder": "Source folder has to be a valid folder path.", + "loc.messages.StartedFileCopy": "Copying file %s to %s on remote machine.", + "loc.messages.UploadFileFailed": "Failed to upload %s to %s on remote machine. %s.", + "loc.messages.UseDefaultPort": "Using port 22 which is the default for SSH since no port was specified.", + "loc.messages.TargetNotCreated": "Unable to create target folder %s.", + "loc.messages.CheckingPathExistance": "Checking if %s on the remote machine exists.", + "loc.messages.PathExists": "%s exists on the remote machine", + "loc.messages.PathNotExists": "%s doesn't exist on the remote machine" +} \ No newline at end of file diff --git a/_generated/CopyFilesOverSSHV0/Strings/resources.resjson/es-ES/resources.resjson b/_generated/CopyFilesOverSSHV0/Strings/resources.resjson/es-ES/resources.resjson new file mode 100644 index 000000000000..1157485cf0be --- /dev/null +++ b/_generated/CopyFilesOverSSHV0/Strings/resources.resjson/es-ES/resources.resjson @@ -0,0 +1,51 @@ +{ + "loc.friendlyName": "Copiar archivos a través de SSH", + "loc.helpMarkDown": "[Obtener más información acerca de esta tarea](https://go.microsoft.com/fwlink/?LinkId=821894)", + "loc.description": "Copia los archivos o artefactos de compilación en una máquina remota a través de SSH", + "loc.instanceNameFormat": "Copiar los archivos de forma segura en la máquina remota", + "loc.group.displayName.advanced": "Avanzado", + "loc.input.label.sshEndpoint": "Conexión de servicio SSH", + "loc.input.help.sshEndpoint": "Conexión de servicio SSH con los detalles de conexión para la máquina remota.", + "loc.input.label.sourceFolder": "Carpeta de origen", + "loc.input.help.sourceFolder": "Carpeta de origen de los archivos que se van a copiar en la máquina remota. Si se deja vacío, se usa la raíz del repositorio (compilación) o el directorio de artefactos (versión), que es $(System.DefaultWorkingDirectory). Use [variables](https://go.microsoft.com/fwlink/?LinkID=550988) si los archivos no están en el repositorio. Ejemplo: $(Agent.BuildDirectory)", + "loc.input.label.contents": "Contenido", + "loc.input.help.contents": "Rutas de acceso de archivo que deben incluirse como parte de la copia. Se admiten varias líneas de patrones de minimatch. [Más información](https://go.microsoft.com/fwlink/?LinkId=821894)", + "loc.input.label.targetFolder": "Carpeta de destino", + "loc.input.help.targetFolder": "Carpeta de destino de la máquina remota donde se copiarán los archivos. Ejemplo: /home/user/MiSitio.", + "loc.input.label.isWindowsOnTarget": "Máquina de destino que ejecuta Windows", + "loc.input.help.isWindowsOnTarget": "Máquina de destino que ejecuta Windows", + "loc.input.label.cleanTargetFolder": "Borrar carpeta de destino", + "loc.input.help.cleanTargetFolder": "Elimina todos los archivos y subcarpetas que haya en la carpeta de destino antes de la copia.", + "loc.input.label.cleanHiddenFilesInTarget": "Quitar archivos ocultos en carpetas de destino", + "loc.input.help.cleanHiddenFilesInTarget": "Quitar archivos ocultos en la carpeta de destino", + "loc.input.label.readyTimeout": "Tiempo de expiración del protocolo de enlace SSH", + "loc.input.help.readyTimeout": "Tiempo (en milisegundos) que debe esperarse para que se complete el protocolo de enlace SSH.", + "loc.input.label.overwrite": "Sobrescribir", + "loc.input.help.overwrite": "Reemplaza los archivos existentes en la carpeta de destino y sus subcarpetas.", + "loc.input.label.failOnEmptySource": "Da error si no se encuentran archivos para copiar", + "loc.input.help.failOnEmptySource": "Da error si no se encuentran archivos coincidentes para copiar en la carpeta de origen.", + "loc.input.label.flattenFolders": "Aplanar carpetas", + "loc.input.help.flattenFolders": "Aplana la estructura de carpetas y copia todos los archivos en la carpeta de destino especificada en la máquina remota.", + "loc.messages.CheckLogForStdErr": "Compruebe el registro de compilación para ver si el comando devolvió STDERR.", + "loc.messages.CleanTargetFolder": "Se está limpiando la carpeta de destino %s en la máquina remota", + "loc.messages.CleanTargetFolderFailed": "No se pudo limpiar la carpeta de destino en la máquina remota. %s", + "loc.messages.ConnectionFailed": "No se pudo conectar a la máquina remota. Compruebe los detalles de la conexión de servicio SSH. %s.", + "loc.messages.ConnectionNotSetup": "La conexión de servicio SSH no está configurada.", + "loc.messages.CopyCompleted": "Se completó la copia de %s archivos en la máquina remota.", + "loc.messages.CopyingFiles": "Se encontraron %s archivos para copiar en la máquina remota.", + "loc.messages.FailedOnFile": "No se pudo copiar %s. %s", + "loc.messages.FileExists": "El archivo %s no se puede copiar en la máquina remota porque ya existe y la opción 'Sobrescribir' está deshabilitada.", + "loc.messages.NothingToCopy": "No se encontraron archivos con los patrones especificados para copiarlos en la máquina remota.", + "loc.messages.NumberFailed": "No se pudieron copiar %d archivos", + "loc.messages.RemoteCmdExecutionErr": "No se pudo ejecutar el comando %s debido a errores en la máquina remota. %s.", + "loc.messages.RemoteCmdNonZeroExitCode": "El comando %s finalizó con el código %s.", + "loc.messages.SettingUpSSHConnection": "Configurando la conexión de servicio SSH con el host remoto %s.", + "loc.messages.SourceNotFolder": "La carpeta de origen debe ser una ruta de acceso de carpeta válida.", + "loc.messages.StartedFileCopy": "Copiando el archivo %s en %s en la máquina remota.", + "loc.messages.UploadFileFailed": "No se pudo cargar %s en %s en la máquina remota. %s.", + "loc.messages.UseDefaultPort": "Usando el puerto 22, que es el predeterminado para SSH, porque no se especificó ningún puerto.", + "loc.messages.TargetNotCreated": "No se puede crear la carpeta de destino %s.", + "loc.messages.CheckingPathExistance": "Comprobando si existe %s en la máquina remota.", + "loc.messages.PathExists": "El elemento %s existe en la máquina remota", + "loc.messages.PathNotExists": "El elemento %s no existe en la máquina remota" +} \ No newline at end of file diff --git a/_generated/CopyFilesOverSSHV0/Strings/resources.resjson/fr-FR/resources.resjson b/_generated/CopyFilesOverSSHV0/Strings/resources.resjson/fr-FR/resources.resjson new file mode 100644 index 000000000000..80892c889eed --- /dev/null +++ b/_generated/CopyFilesOverSSHV0/Strings/resources.resjson/fr-FR/resources.resjson @@ -0,0 +1,51 @@ +{ + "loc.friendlyName": "Copier des fichiers via SSH", + "loc.helpMarkDown": "[En savoir plus sur cette tâche](https://go.microsoft.com/fwlink/?LinkId=821894)", + "loc.description": "Copier des fichiers ou des artefacts de build vers une machine distante via SSH", + "loc.instanceNameFormat": "Copier les fichiers de manière sécurisée sur la machine distante", + "loc.group.displayName.advanced": "Avancé", + "loc.input.label.sshEndpoint": "Connexion de service SSH", + "loc.input.help.sshEndpoint": "Connexion de service SSH avec les détails de connexion pour la machine distante.", + "loc.input.label.sourceFolder": "Dossier source", + "loc.input.help.sourceFolder": "Dossier source des fichiers à copier vers la machine distante. Quand aucune valeur n'est spécifiée, la racine du répertoire de dépôt (build) ou du répertoire d'artefacts (mise en production) est utilisée, c'est-à-dire $(System.DefaultWorkingDirectory). Utilisez des [variables](https://go.microsoft.com/fwlink/?LinkID=550988), si les fichiers ne sont pas dans le dépôt. Exemple : $(Agent.BuildDirectory)", + "loc.input.label.contents": "Contenu", + "loc.input.help.contents": "Chemins de fichiers à inclure dans le cadre de la copie. Prend en charge plusieurs lignes de modèles minimatch. [Plus d'informations](https://go.microsoft.com/fwlink/?LinkId=821894)", + "loc.input.label.targetFolder": "Dossier cible", + "loc.input.help.targetFolder": "Dossier cible de la machine distante, où les fichiers doivent être copiés. Exemple : /home/user/MySite.", + "loc.input.label.isWindowsOnTarget": "Machine cible exécutant Windows", + "loc.input.help.isWindowsOnTarget": "Machine cible exécutant Windows", + "loc.input.label.cleanTargetFolder": "Effacer le dossier cible", + "loc.input.help.cleanTargetFolder": "Supprimez tous les fichiers et sous-dossiers existants dans le dossier cible avant la copie.", + "loc.input.label.cleanHiddenFilesInTarget": "Supprimer les fichiers masqués dans le dossier cible", + "loc.input.help.cleanHiddenFilesInTarget": "Supprimez les fichiers masqués dans le dossier cible.", + "loc.input.label.readyTimeout": "Délai d'expiration de l'établissement d'une liaison SSH", + "loc.input.help.readyTimeout": "Durée (en millisecondes) d'attente de la fin de l'établissement d'une liaison SSH.", + "loc.input.label.overwrite": "Remplacer", + "loc.input.help.overwrite": "Remplacez les fichiers existants dans le dossier cible et ses sous-dossiers.", + "loc.input.label.failOnEmptySource": "Échec si les fichiers à copier sont introuvables", + "loc.input.help.failOnEmptySource": "Échec si les fichiers correspondants à copier sont introuvables dans le dossier source.", + "loc.input.label.flattenFolders": "Aplatir les dossiers", + "loc.input.help.flattenFolders": "Aplatit la structure du dossier et copie tous les fichiers dans le dossier cible spécifié sur la machine distante.", + "loc.messages.CheckLogForStdErr": "Recherchez dans le journal de génération un STDERR de la commande.", + "loc.messages.CleanTargetFolder": "Nettoyage du dossier cible %s sur la machine distante", + "loc.messages.CleanTargetFolderFailed": "Échec du nettoyage du dossier cible sur la machine distante. %s", + "loc.messages.ConnectionFailed": "Échec de la connexion à la machine distante. Vérifiez les détails de la connexion de service SSH. %s.", + "loc.messages.ConnectionNotSetup": "La connexion de service SSH n'est pas configurée.", + "loc.messages.CopyCompleted": "Fin de la copie de %s fichiers sur la machine distante.", + "loc.messages.CopyingFiles": "Détection de %s fichiers à copier sur la machine distante.", + "loc.messages.FailedOnFile": "Échec de la copie de %s. %s", + "loc.messages.FileExists": "Impossible de copier le fichier %s sur la machine distante, car il existe déjà et l'option 'Remplacer' est désactivée.", + "loc.messages.NothingToCopy": "Les fichiers qui correspondent aux modèles spécifiés et qui sont à copier vers la machine distante sont introuvables.", + "loc.messages.NumberFailed": "Échec de la copie de %d fichiers", + "loc.messages.RemoteCmdExecutionErr": "La commande %s a échoué avec des erreurs sur la machine distante. %s.", + "loc.messages.RemoteCmdNonZeroExitCode": "Arrêt de la commande %s. Code %s.", + "loc.messages.SettingUpSSHConnection": "Configuration de la connexion de service SSH à l'hôte distant %s.", + "loc.messages.SourceNotFolder": "Le dossier source doit être un chemin de dossier valide.", + "loc.messages.StartedFileCopy": "Copie du fichier %s vers %s sur la machine distante.", + "loc.messages.UploadFileFailed": "Échec du chargement de %s vers %s sur la machine distante. %s.", + "loc.messages.UseDefaultPort": "Utilisation du port 22, qui représente la valeur par défaut pour SSH, car aucun port n'a été spécifié.", + "loc.messages.TargetNotCreated": "Impossible de créer le dossier cible %s.", + "loc.messages.CheckingPathExistance": "Vérification de l'existence de %s sur la machine distante.", + "loc.messages.PathExists": "%s existe sur la machine distante", + "loc.messages.PathNotExists": "%s n'existe pas sur la machine distante" +} \ No newline at end of file diff --git a/_generated/CopyFilesOverSSHV0/Strings/resources.resjson/it-IT/resources.resjson b/_generated/CopyFilesOverSSHV0/Strings/resources.resjson/it-IT/resources.resjson new file mode 100644 index 000000000000..d92c9d81e2e8 --- /dev/null +++ b/_generated/CopyFilesOverSSHV0/Strings/resources.resjson/it-IT/resources.resjson @@ -0,0 +1,51 @@ +{ + "loc.friendlyName": "Copia file tramite SSH", + "loc.helpMarkDown": "[Altre informazioni su questa attività](https://go.microsoft.com/fwlink/?LinkId=821894)", + "loc.description": "Copia i file o gli artefatti di compilazione in un computer remoto tramite SSH", + "loc.instanceNameFormat": "Copia i file in modo sicuro nel computer remoto", + "loc.group.displayName.advanced": "Avanzate", + "loc.input.label.sshEndpoint": "Connessione al servizio SSH", + "loc.input.help.sshEndpoint": "Connessione al servizio SSH con i dettagli della connessione per il computer remoto.", + "loc.input.label.sourceFolder": "Cartella di origine", + "loc.input.help.sourceFolder": "Cartella di origine dei file da copiare nel computer remoto. Se si lascia vuoto il campo, verrà usata la radice del repository (compilazione) o la directory degli artefatti (versione), che è $(System.DefaultWorkingDirectory). Usare le [variabili](https://go.microsoft.com/fwlink/?LinkID=550988) se i file non sono presenti nel repository. Esempio: $(Agent.BuildDirectory)", + "loc.input.label.contents": "Contenuti", + "loc.input.help.contents": "Percorsi di file da includere nella copia. Sono supportate più righe di criteri di corrispondenza minima. [Altre informazioni](https://go.microsoft.com/fwlink/?LinkId=821894)", + "loc.input.label.targetFolder": "Cartella di destinazione", + "loc.input.help.targetFolder": "Cartella di destinazione nel computer remoto in cui verranno copiati i file. Esempio: /home/user/MySite.", + "loc.input.label.isWindowsOnTarget": "Computer di destinazione che esegue Windows", + "loc.input.help.isWindowsOnTarget": "Computer di destinazione che esegue Windows", + "loc.input.label.cleanTargetFolder": "Pulisci cartella di destinazione", + "loc.input.help.cleanTargetFolder": "Elimina tutti i file e le sottocartelle esistenti nella cartella di destinazione prima della copia.", + "loc.input.label.cleanHiddenFilesInTarget": "Rimuovi i file nascosti nella cartella di destinazione", + "loc.input.help.cleanHiddenFilesInTarget": "Consente di rimuovere i file nascosti nella cartella di destinazione.", + "loc.input.label.readyTimeout": "Timeout per handshake SSH", + "loc.input.help.readyTimeout": "Indica per quanto tempo (in millisecondi) attendere il completamento dell'handshake SSH.", + "loc.input.label.overwrite": "Sovrascrivi", + "loc.input.help.overwrite": "Sostituisce i file esistenti nella cartella di destinazione e al di sotto di essa.", + "loc.input.label.failOnEmptySource": "Non riesce se non vengono trovati file da copiare", + "loc.input.help.failOnEmptySource": "Non riesce se nella cartella di origine non vengono trovati file corrispondenti da copiare.", + "loc.input.label.flattenFolders": "Rendi flat le cartelle", + "loc.input.help.flattenFolders": "Rende flat la struttura di cartelle e copia tutti i file nella cartella di destinazione specificata nel computer remoto.", + "loc.messages.CheckLogForStdErr": "Per gli errori STDERR restituiti dal comando, vedere il log di compilazione.", + "loc.messages.CleanTargetFolder": "Pulizia della cartella di destinazione %s nel computer remoto", + "loc.messages.CleanTargetFolderFailed": "Non è stato possibile pulire la cartella di destinazione nel computer remoto. %s", + "loc.messages.ConnectionFailed": "Non è stato possibile connettersi al computer remoto. Verificare i dettagli della connessione al servizio SSH. %s.", + "loc.messages.ConnectionNotSetup": "La connessione al servizio SSH non è configurata.", + "loc.messages.CopyCompleted": "La copia di %s file nel computer remoto è stata completata.", + "loc.messages.CopyingFiles": "Sono stati trovati %s file da copiare nel computer remoto.", + "loc.messages.FailedOnFile": "Non è stato possibile copiare %s. %s", + "loc.messages.FileExists": "Non è possibile copiare il file %s nel computer remoto perché esiste già e l'opzione 'Sovrascrivi' è disabilitata.", + "loc.messages.NothingToCopy": "Non sono stati trovati file da copiare nel computer remoto corrispondenti ai criteri specificati.", + "loc.messages.NumberFailed": "Non è stato possibile copiare %d file", + "loc.messages.RemoteCmdExecutionErr": "Il comando %s non è riuscito e si sono verificati errori nel computer remoto. %s.", + "loc.messages.RemoteCmdNonZeroExitCode": "Il comando %s è stato terminato. Codice: %s.", + "loc.messages.SettingUpSSHConnection": "Configurazione della connessione al servizio SSH per l'host remoto %s.", + "loc.messages.SourceNotFolder": "La cartella di origine deve essere un percorso di cartella valido.", + "loc.messages.StartedFileCopy": "Copia del file %s in %s nel computer remoto.", + "loc.messages.UploadFileFailed": "Non è stato possibile caricare %s in %s nel computer remoto. %s.", + "loc.messages.UseDefaultPort": "Verrà usata la porta 22 che corrisponde a quella predefinita per SSH perché non è stata specificata alcuna porta.", + "loc.messages.TargetNotCreated": "Non è possibile creare la cartella di destinazione %s.", + "loc.messages.CheckingPathExistance": "Verifica dell'esistenza di %s nel computer remoto.", + "loc.messages.PathExists": "%s è presente nel computer remoto", + "loc.messages.PathNotExists": "%s non è presente nel computer remoto" +} \ No newline at end of file diff --git a/_generated/CopyFilesOverSSHV0/Strings/resources.resjson/ja-JP/resources.resjson b/_generated/CopyFilesOverSSHV0/Strings/resources.resjson/ja-JP/resources.resjson new file mode 100644 index 000000000000..7a3a4d3585e6 --- /dev/null +++ b/_generated/CopyFilesOverSSHV0/Strings/resources.resjson/ja-JP/resources.resjson @@ -0,0 +1,51 @@ +{ + "loc.friendlyName": "SSH によるファイルのコピー", + "loc.helpMarkDown": "[このタスクの詳細を表示](https://go.microsoft.com/fwlink/?LinkId=821894)", + "loc.description": "SSH を使用してリモート コンピューターにファイルをコピーするか、成果物を作成します", + "loc.instanceNameFormat": "リモート コンピューターにファイルを安全にコピーする", + "loc.group.displayName.advanced": "詳細設定", + "loc.input.label.sshEndpoint": "SSH サービス接続", + "loc.input.help.sshEndpoint": "リモート マシンの接続詳細が設定された SSH サービス接続。", + "loc.input.label.sourceFolder": "ソース フォルダー", + "loc.input.help.sourceFolder": "リモート マシンにコピーするファイルのソース フォルダーです。空にすると、リポジトリ (ビルド) または成果物ディレクトリ (リリース) のルートが使用されます (これは $(System.DefaultWorkingDirectory) です)。ファイルがリポジトリにない場合は、[変数](https://go.microsoft.com/fwlink/?LinkID=550988)を使用します。例: $(Agent.BuildDirectory)", + "loc.input.label.contents": "コンテンツ", + "loc.input.help.contents": "コピーの一部として含めるファイル パス。複数行の minimatch パターンをサポートします。[詳細情報](https://go.microsoft.com/fwlink/?LinkId=821894)", + "loc.input.label.targetFolder": "ターゲット フォルダー", + "loc.input.help.targetFolder": "ファイルのコピー先となるリモート コンピューター上のターゲット フォルダー。例: /home/user/MySite。", + "loc.input.label.isWindowsOnTarget": "Windows を実行しているターゲット マシン", + "loc.input.help.isWindowsOnTarget": "Windows を実行しているターゲット マシン", + "loc.input.label.cleanTargetFolder": "ターゲット フォルダーを空にする", + "loc.input.help.cleanTargetFolder": "コピーする前に、ターゲット フォルダーにあるすべての既存のファイルとサブフォルダーを削除します。", + "loc.input.label.cleanHiddenFilesInTarget": "ターゲット フォルダー内の隠しファイルを削除する", + "loc.input.help.cleanHiddenFilesInTarget": "ターゲット フォルダー内の隠しファイルを削除します。", + "loc.input.label.readyTimeout": "SSH ハンドシェイクのタイムアウト", + "loc.input.help.readyTimeout": "SSH ハンドシェイクの完了を待機する時間 (ミリ秒)。", + "loc.input.label.overwrite": "上書き", + "loc.input.help.overwrite": "ターゲット フォルダーとその下のフォルダーにある既存のファイルを置換します。", + "loc.input.label.failOnEmptySource": "コピーするファイルが見つからない場合に、失敗します", + "loc.input.help.failOnEmptySource": "ソース フォルダーの下に一致するコピー対象のファイルが見つからない場合に、失敗します。", + "loc.input.label.flattenFolders": "フォルダーのフラット化", + "loc.input.help.flattenFolders": "フォルダー構造をフラットにし、すべてのファイルを、リモート コンピューター上にある指定のターゲット フォルダーにコピーします。", + "loc.messages.CheckLogForStdErr": "コマンドからの STDERR がないかビルド ログをご確認ください。", + "loc.messages.CleanTargetFolder": "リモート コンピューター上のターゲット フォルダー %s を空にしています", + "loc.messages.CleanTargetFolderFailed": "リモート コンピューター上のターゲット フォルダーを空にできませんでした。%s", + "loc.messages.ConnectionFailed": "リモート マシンに接続できませんでした。SSH サービス接続の詳細を確認してください。%s。", + "loc.messages.ConnectionNotSetup": "SSH サービス接続が設定されていません。", + "loc.messages.CopyCompleted": "リモート マシンへの %s 個のファイルのコピーが完了しました。", + "loc.messages.CopyingFiles": "リモート マシンにコピーする %s 個のファイルが見つかりました。", + "loc.messages.FailedOnFile": "%s のコピーに失敗しました。%s", + "loc.messages.FileExists": "ファイル %s はリモート コンピューターにコピーできません。このファイルは既に存在し、'上書き' オプションが無効です。", + "loc.messages.NothingToCopy": "リモート コンピューターにコピーするために指定したパターンと一致するファイルが見つかりませんでした。", + "loc.messages.NumberFailed": "%d 個のファイルのコピーに失敗しました", + "loc.messages.RemoteCmdExecutionErr": "コマンド %s がリモート コンピューター上のエラーで失敗しました。%s。", + "loc.messages.RemoteCmdNonZeroExitCode": "コマンド %s がコード %s で終了しました。", + "loc.messages.SettingUpSSHConnection": "リモート ホスト %s への SSH サービス接続を設定しています。", + "loc.messages.SourceNotFolder": "ソース フォルダーには有効なフォルダー パスを指定する必要があります。", + "loc.messages.StartedFileCopy": "ファイル %s をリモート コンピューター上の %s にコピーしています。", + "loc.messages.UploadFileFailed": "%s をリモート コンピューター上の %s にアップロードできませんでした。%s。", + "loc.messages.UseDefaultPort": "ポートが指定されなかったため、SSH で既定のポート 22 を使用しています。", + "loc.messages.TargetNotCreated": "ターゲット フォルダー %s を作成できません。", + "loc.messages.CheckingPathExistance": "リモート マシン上に %s が存在するかどうかを確認しています。", + "loc.messages.PathExists": "リモート マシンに %s が存在します", + "loc.messages.PathNotExists": "リモート マシンに %s が存在しません" +} \ No newline at end of file diff --git a/_generated/CopyFilesOverSSHV0/Strings/resources.resjson/ko-KR/resources.resjson b/_generated/CopyFilesOverSSHV0/Strings/resources.resjson/ko-KR/resources.resjson new file mode 100644 index 000000000000..72917d80624f --- /dev/null +++ b/_generated/CopyFilesOverSSHV0/Strings/resources.resjson/ko-KR/resources.resjson @@ -0,0 +1,51 @@ +{ + "loc.friendlyName": "SSH를 통해 파일 복사", + "loc.helpMarkDown": "[이 작업에 대한 자세한 정보](https://go.microsoft.com/fwlink/?LinkId=821894)", + "loc.description": "SSH를 통해 파일 또는 빌드 아티팩트를 원격 컴퓨터에 복사합니다.", + "loc.instanceNameFormat": "파일을 원격 컴퓨터에 안전하게 복사", + "loc.group.displayName.advanced": "고급", + "loc.input.label.sshEndpoint": "SSH 서비스 연결", + "loc.input.help.sshEndpoint": "원격 머신의 연결 정보가 있는 SSH 서비스 연결입니다.", + "loc.input.label.sourceFolder": "소스 폴더", + "loc.input.help.sourceFolder": "원격 컴퓨터에 복사할 파일의 소스 폴더입니다. 비어 있으면 리포지토리(빌드) 또는 아티팩트 디렉터리(릴리스)의 루트인 $(System.DefaultWorkingDirectory)이(가) 사용됩니다. 파일이 리포지토리에 없으면 [변수](https://go.microsoft.com/fwlink/?LinkID=550988)를 사용하세요. 예: $(Agent.BuildDirectory)", + "loc.input.label.contents": "콘텐츠", + "loc.input.help.contents": "복사의 일부로 포함할 파일 경로입니다. 여러 줄로 된 minimatch 패턴을 지원합니다. [자세한 정보](https://go.microsoft.com/fwlink/?LinkId=821894)", + "loc.input.label.targetFolder": "대상 폴더", + "loc.input.help.targetFolder": "파일을 복사할 원격 컴퓨터의 대상 폴더입니다. 예: /home/user/MySite.", + "loc.input.label.isWindowsOnTarget": "Windows를 실행하는 대상 컴퓨터", + "loc.input.help.isWindowsOnTarget": "Windows를 실행하는 대상 컴퓨터", + "loc.input.label.cleanTargetFolder": "대상 폴더 정리", + "loc.input.help.cleanTargetFolder": "복사하기 전에 대상 폴더의 모든 기존 파일과 하위 폴더를 삭제합니다.", + "loc.input.label.cleanHiddenFilesInTarget": "대상 폴더에서 숨김 파일 제거", + "loc.input.help.cleanHiddenFilesInTarget": "대상 폴더에서 숨김 파일을 제거합니다.", + "loc.input.label.readyTimeout": "SSH 핸드셰이크 시간 제한", + "loc.input.help.readyTimeout": "SSH 핸드셰이크가 완료될 때까지 대기하는 시간(밀리초)입니다.", + "loc.input.label.overwrite": "덮어쓰기", + "loc.input.help.overwrite": "대상 폴더의 기존 파일을 바꿉니다.", + "loc.input.label.failOnEmptySource": "복사할 파일이 없는 경우 실패", + "loc.input.help.failOnEmptySource": "소스 폴더에서 일치하는 복사 대상 파일을 찾을 수 없는 경우 실패합니다.", + "loc.input.label.flattenFolders": "폴더 평면화", + "loc.input.help.flattenFolders": "폴더 구조를 평면화하고 모든 파일을 원격 컴퓨터의 지정된 대상 폴더에 복사합니다.", + "loc.messages.CheckLogForStdErr": "명령에서 STDERR에 대한 빌드 로그를 확인하세요.", + "loc.messages.CleanTargetFolder": "원격 컴퓨터에서 대상 폴더 %s을(를) 정리하는 중", + "loc.messages.CleanTargetFolderFailed": "원격 컴퓨터에서 대상 폴더를 정리하지 못했습니다. %s", + "loc.messages.ConnectionFailed": "원격 머신에 연결하지 못했습니다. SSH 서비스 연결 정보를 확인하세요. %s.", + "loc.messages.ConnectionNotSetup": "SSH 서비스 연결이 설정되지 않았습니다.", + "loc.messages.CopyCompleted": "원격 컴퓨터에 %s개 파일 복사를 완료했습니다.", + "loc.messages.CopyingFiles": "원격 컴퓨터에 복사할 파일 %s개를 찾았습니다.", + "loc.messages.FailedOnFile": "%s을(를) 복사하지 못했습니다. %s", + "loc.messages.FileExists": "%s 파일이 이미 있고 '덮어쓰기' 옵션이 사용하지 않도록 설정되어 있으므로 해당 파일을 원격 컴퓨터에 복사할 수 없습니다.", + "loc.messages.NothingToCopy": "원격 컴퓨터에 복사할 지정된 패턴과 일치하는 파일을 찾을 수 없습니다.", + "loc.messages.NumberFailed": "%d개 파일을 복사하지 못했습니다.", + "loc.messages.RemoteCmdExecutionErr": "원격 컴퓨터에서 오류가 발생하여 %s 명령이 실패했습니다. %s.", + "loc.messages.RemoteCmdNonZeroExitCode": "%s 명령이 종료되었습니다(코드: %s).", + "loc.messages.SettingUpSSHConnection": "원격 호스트 %s에 대한 SSH 서비스 연결을 설정하는 중입니다.", + "loc.messages.SourceNotFolder": "소스 폴더는 유효한 폴더 경로여야 합니다.", + "loc.messages.StartedFileCopy": "%s 파일을 원격 컴퓨터의 %s에 복사하는 중입니다.", + "loc.messages.UploadFileFailed": "%s을(를) 원격 컴퓨터에 있는 %s에 업로드하지 못했습니다. %s.", + "loc.messages.UseDefaultPort": "포트가 지정되지 않았으므로 SSH에 대한 기본값인 포트 22를 사용합니다.", + "loc.messages.TargetNotCreated": "대상 폴더 %s을(를) 만들 수 없습니다.", + "loc.messages.CheckingPathExistance": "원격 머신에 %s이(가) 있는지 확인하는 중입니다.", + "loc.messages.PathExists": "%s이(가) 원격 머신에 있습니다.", + "loc.messages.PathNotExists": "%s이(가) 원격 머신에 없습니다." +} \ No newline at end of file diff --git a/_generated/CopyFilesOverSSHV0/Strings/resources.resjson/ru-RU/resources.resjson b/_generated/CopyFilesOverSSHV0/Strings/resources.resjson/ru-RU/resources.resjson new file mode 100644 index 000000000000..4beaf135d34f --- /dev/null +++ b/_generated/CopyFilesOverSSHV0/Strings/resources.resjson/ru-RU/resources.resjson @@ -0,0 +1,51 @@ +{ + "loc.friendlyName": "Копировать файлы по SSH", + "loc.helpMarkDown": "[См. дополнительные сведения об этой задаче](https://go.microsoft.com/fwlink/?LinkId=821894)", + "loc.description": "Копирование файлов или создание артефактов на удаленном компьютере через SSH-подключение", + "loc.instanceNameFormat": "Безопасное копирование файлов на удаленный компьютер", + "loc.group.displayName.advanced": "Дополнительно", + "loc.input.label.sshEndpoint": "Подключение к службе SSH", + "loc.input.help.sshEndpoint": "Подключение к службе SSH со сведениями о подключении для удаленного компьютера.", + "loc.input.label.sourceFolder": "Исходная папка", + "loc.input.help.sourceFolder": "Исходная папка для файлов, копируемых на удаленный компьютер. Если эта папка пуста, используется корневой каталог репозитория (сборка) или каталог артефактов (выпуск) (по умолчанию это каталог $(System.DefaultWorkingDirectory)). Если файлы отсутствуют в репозитории, используйте [переменные](https://go.microsoft.com/fwlink/?LinkID=550988). Пример: $(Agent.BuildDirectory)", + "loc.input.label.contents": "Содержимое", + "loc.input.help.contents": "Пути к файлам для включения в состав копии. Поддерживает несколько строк шаблонов minimatch. [Подробнее...](https://go.microsoft.com/fwlink/?LinkId=821894)", + "loc.input.label.targetFolder": "Целевая папка", + "loc.input.help.targetFolder": "Целевая папка на удаленном компьютере, в которую будут скопированы файлы. Пример: /home/user/MySite.", + "loc.input.label.isWindowsOnTarget": "Целевой компьютер под управлением Windows", + "loc.input.help.isWindowsOnTarget": "Целевой компьютер под управлением Windows", + "loc.input.label.cleanTargetFolder": "Очистить целевую папку", + "loc.input.help.cleanTargetFolder": "Удалите все существующие файлы и вложенные папки в целевой папке перед копированием.", + "loc.input.label.cleanHiddenFilesInTarget": "Удалить скрытые файлы в целевой папке", + "loc.input.help.cleanHiddenFilesInTarget": "Удалить скрытые файлы в целевой папке.", + "loc.input.label.readyTimeout": "Время ожидания подтверждения SSH", + "loc.input.help.readyTimeout": "Время (в миллисекундах) для ожидания завершения подтверждения SSH.", + "loc.input.label.overwrite": "Перезаписать", + "loc.input.help.overwrite": "Замените существующие файлы в целевой папке и во вложенных в нее папках.", + "loc.input.label.failOnEmptySource": "Если в исходной папке отсутствуют файлы для копирования, операция завершится сбоем.", + "loc.input.help.failOnEmptySource": "Если в исходной папке отсутствуют соответствующие файлы для копирования, операция завершится сбоем.", + "loc.input.label.flattenFolders": "Выполнить сведение папок", + "loc.input.help.flattenFolders": "Выполнение сведения структуры папок и копирование всех файлов в указанную целевую папку на удаленном компьютере.", + "loc.messages.CheckLogForStdErr": "Проверьте наличие в журнале сборки сообщений из потока STDERR от команды.", + "loc.messages.CleanTargetFolder": "Очистка целевой папки %s на удаленном компьютере", + "loc.messages.CleanTargetFolderFailed": "Не удалось очистить целевую папку на удаленном компьютере. %s", + "loc.messages.ConnectionFailed": "Не удалось подключиться к удаленному компьютеру. Проверьте сведения о подключении к службе SSH. %s.", + "loc.messages.ConnectionNotSetup": "Подключение к службе SSH не настроено.", + "loc.messages.CopyCompleted": "Завершено копирование файлов на удаленный компьютер (скопировано файлов: %s).", + "loc.messages.CopyingFiles": "Найдены файлы для копирования на удаленный компьютер: %s.", + "loc.messages.FailedOnFile": "Не удалось скопировать %s. %s", + "loc.messages.FileExists": "Файл %s невозможно копировать на удаленный компьютер, так как он уже существует, а параметр \"Перезаписать\" отключен.", + "loc.messages.NothingToCopy": "Не найдены файлы, соответствующие шаблону, указанному для копирования на удаленный компьютер.", + "loc.messages.NumberFailed": "Не удалось скопировать файлы: %d", + "loc.messages.RemoteCmdExecutionErr": "Сбой команды %s с ошибками на удаленном компьютере. %s.", + "loc.messages.RemoteCmdNonZeroExitCode": "Выход из команды %s с кодом %s.", + "loc.messages.SettingUpSSHConnection": "Настройка подключения службы SSH к удаленному узлу %s.", + "loc.messages.SourceNotFolder": "Исходная папка должна быть допустимым путем к папке.", + "loc.messages.StartedFileCopy": "Копирование файла %s в %s на удаленном компьютере.", + "loc.messages.UploadFileFailed": "Не удалось отправить %s в %s на удаленном компьютере. %s.", + "loc.messages.UseDefaultPort": "Используется порт 22, который является портом по умолчанию для SSH, так как порт не указан.", + "loc.messages.TargetNotCreated": "Не удалось создать целевую папку %s.", + "loc.messages.CheckingPathExistance": "Проверка наличия %s на удаленном компьютере.", + "loc.messages.PathExists": "%s существует на удаленном компьютере.", + "loc.messages.PathNotExists": "%s не существует на удаленном компьютере." +} \ No newline at end of file diff --git a/_generated/CopyFilesOverSSHV0/Strings/resources.resjson/zh-CN/resources.resjson b/_generated/CopyFilesOverSSHV0/Strings/resources.resjson/zh-CN/resources.resjson new file mode 100644 index 000000000000..c9ef76f5886c --- /dev/null +++ b/_generated/CopyFilesOverSSHV0/Strings/resources.resjson/zh-CN/resources.resjson @@ -0,0 +1,51 @@ +{ + "loc.friendlyName": "通过 SSH 复制文件", + "loc.helpMarkDown": "[详细了解此任务](https://go.microsoft.com/fwlink/?LinkId=821894)", + "loc.description": "通过 SSH 将文件或生成项目复制到远程计算机", + "loc.instanceNameFormat": "将文件安全复制到远程计算机", + "loc.group.displayName.advanced": "高级", + "loc.input.label.sshEndpoint": "SSH 服务连接", + "loc.input.help.sshEndpoint": "含远程计算机连接详细信息的 SSH 服务连接。", + "loc.input.label.sourceFolder": "源文件夹", + "loc.input.help.sourceFolder": "要复制到远程计算机的文件的源文件夹。文件夹为空时,将使用存储库(生成)的根目录或项目目录(发布),即 $(System.DefaultWorkingDirectory)。如果存储库中没有文件,请使用[变量](https://go.microsoft.com/fwlink/?LinkID=550988) 。示例: $(Agent.BuildDirectory)", + "loc.input.label.contents": "内容", + "loc.input.help.contents": "要包含在副本中的文件路径。支持多行最小匹配模式。[详细信息](https://go.microsoft.com/fwlink/?LinkId=821894)", + "loc.input.label.targetFolder": "目标文件夹", + "loc.input.help.targetFolder": "要将文件复制到其中的远程计算机上的目标文件夹。例如: /home/user/MySite。", + "loc.input.label.isWindowsOnTarget": "运行 Windows 的目标计算机", + "loc.input.help.isWindowsOnTarget": "运行 Windows 的目标计算机", + "loc.input.label.cleanTargetFolder": "清理目标文件夹", + "loc.input.help.cleanTargetFolder": "删除目标文件夹中所有现有文件和子文件夹,然后再复制。", + "loc.input.label.cleanHiddenFilesInTarget": "移除目标文件夹中的隐藏文件", + "loc.input.help.cleanHiddenFilesInTarget": "移除目标文件夹中的隐藏文件。", + "loc.input.label.readyTimeout": "SSH 握手超时", + "loc.input.help.readyTimeout": "等待 SSH 握手完成的时间(毫秒)。", + "loc.input.label.overwrite": "覆盖", + "loc.input.help.overwrite": "替换目标文件夹中及其子级文件夹中的现有文件。", + "loc.input.label.failOnEmptySource": "如果找不到要复制的文件,则失败", + "loc.input.help.failOnEmptySource": "如果在源文件夹下找不到要复制的匹配文件,则失败。", + "loc.input.label.flattenFolders": "精简文件夹", + "loc.input.help.flattenFolders": "精简文件夹结构,并将所有文件复制到远程计算机上的指定目标文件夹。", + "loc.messages.CheckLogForStdErr": "从命令检查 STDERR 生成日志。", + "loc.messages.CleanTargetFolder": "正在清理远程计算机上的目标文件夹 %s", + "loc.messages.CleanTargetFolderFailed": "未能清理远程计算机上的目标文件夹。%s", + "loc.messages.ConnectionFailed": "无法连接到远程计算机。验证 SSH 服务连接详细信息。%s。", + "loc.messages.ConnectionNotSetup": "未设置 SSH 服务连接。", + "loc.messages.CopyCompleted": "已将 %s 个文件复制到远程计算机。", + "loc.messages.CopyingFiles": "找到要复制到远程计算机的 %s 个文件。", + "loc.messages.FailedOnFile": "无法复制 %s。%s", + "loc.messages.FileExists": "无法将文件 %s 复制到远程计算机,因为它已经存在,并且禁用了“覆盖”选项。", + "loc.messages.NothingToCopy": "找不到与指定要复制到远程计算机的模式匹配的文件。", + "loc.messages.NumberFailed": "无法复制 %d 文件", + "loc.messages.RemoteCmdExecutionErr": "命令 %s 因远程计算机上的错误失败。%s。", + "loc.messages.RemoteCmdNonZeroExitCode": "命令 %s 已退出,代码为 %s。", + "loc.messages.SettingUpSSHConnection": "设置远程主机 %s 与 SSH 服务的连接。", + "loc.messages.SourceNotFolder": "源文件夹必须是有效文件夹路径。", + "loc.messages.StartedFileCopy": "正在将文件 %s 复制到远程计算机上的 %s。", + "loc.messages.UploadFileFailed": "未能将 %s 上传到远程计算机上的 %s。%s。", + "loc.messages.UseDefaultPort": "由于未指定端口,将使用SSH 的默认端口 22。", + "loc.messages.TargetNotCreated": "无法创建目标文件夹 %s。", + "loc.messages.CheckingPathExistance": "正在检查远程计算机上是否存在 %s。", + "loc.messages.PathExists": "远程计算机上仍存在 %s", + "loc.messages.PathNotExists": "远程计算机上不存在 %s" +} \ No newline at end of file diff --git a/_generated/CopyFilesOverSSHV0/Strings/resources.resjson/zh-TW/resources.resjson b/_generated/CopyFilesOverSSHV0/Strings/resources.resjson/zh-TW/resources.resjson new file mode 100644 index 000000000000..68e29db7861b --- /dev/null +++ b/_generated/CopyFilesOverSSHV0/Strings/resources.resjson/zh-TW/resources.resjson @@ -0,0 +1,51 @@ +{ + "loc.friendlyName": "透過 SSH 複製檔案", + "loc.helpMarkDown": "[深入了解此工作](https://go.microsoft.com/fwlink/?LinkId=821894)", + "loc.description": "透過 SSH 將檔案複製到遠端電或將成品建置到遠端電腦上", + "loc.instanceNameFormat": "安全地將檔案複製到遠端電腦", + "loc.group.displayName.advanced": "進階", + "loc.input.label.sshEndpoint": "SSH 服務連線", + "loc.input.help.sshEndpoint": "具有遠端電腦連線詳細資料的 SSH 服務連線。", + "loc.input.label.sourceFolder": "來源資料夾", + "loc.input.help.sourceFolder": "要複製到遠端電腦之檔案所在的來源資料夾。若為空白,將會使用存放庫 (組建) 或成品目錄 (發行) 的根資料夾,亦即 $(System.DefaultWorkingDirectory)。若檔案不在存放庫中,請使用 [變數](https://go.microsoft.com/fwlink/?LinkID=550988)。例如: $(Agent.BuildDirectory)", + "loc.input.label.contents": "內容", + "loc.input.help.contents": "要一併複製的檔案路徑。支援多行的 minimatch 樣式。[詳細資訊](https://go.microsoft.com/fwlink/?LinkId=821894)", + "loc.input.label.targetFolder": "目標資料夾", + "loc.input.help.targetFolder": "遠端電腦上要用以存放所複製之檔案的目標資料夾。例如: /home/user/MySite。", + "loc.input.label.isWindowsOnTarget": "執行 Windows 的目標電腦", + "loc.input.help.isWindowsOnTarget": "執行 Windows 的目標電腦", + "loc.input.label.cleanTargetFolder": "清理目標資料夾", + "loc.input.help.cleanTargetFolder": "複製前,請先刪除目標資料夾中現有的檔案與子資料夾。", + "loc.input.label.cleanHiddenFilesInTarget": "移除目標檔案夾中的隱藏檔案", + "loc.input.help.cleanHiddenFilesInTarget": "移除目標檔案夾中的隱藏檔案。", + "loc.input.label.readyTimeout": "SSH 交握逾時", + "loc.input.help.readyTimeout": "等候 SSH 交握完成所需的時間 (毫秒)。", + "loc.input.label.overwrite": "覆寫", + "loc.input.help.overwrite": "取代目標資料夾中及其下現有的檔案。", + "loc.input.label.failOnEmptySource": "若找不到要複製的檔案便會失敗", + "loc.input.help.failOnEmptySource": "若在來源資料夾中找不到要複製的檔案,作業便會失敗。", + "loc.input.label.flattenFolders": "壓平合併資料夾", + "loc.input.help.flattenFolders": "壓平合併資料夾結構,並將所有檔案複製到遠端電腦上指定的目標資料夾中。", + "loc.messages.CheckLogForStdErr": "請查看建置記錄中的命令有無 STDERR。", + "loc.messages.CleanTargetFolder": "清理遠端電腦上的目標資料夾 %s", + "loc.messages.CleanTargetFolderFailed": "無法清理遠端電腦上的目標資料夾。%s", + "loc.messages.ConnectionFailed": "無法連線到遠端電腦。請驗證 SSH 服務連線的詳細資料。%s。", + "loc.messages.ConnectionNotSetup": "SSH 服務連線未設定。", + "loc.messages.CopyCompleted": "已完成將 %s 個檔案複製到遠端電腦。", + "loc.messages.CopyingFiles": "共找到 %s 檔案可複製到遠端電腦。", + "loc.messages.FailedOnFile": "無法複製%s。%s", + "loc.messages.FileExists": "因為檔案 %s 已存在,且 [覆寫] 選項為停用,所以無法將該檔案複製到遠端電腦。", + "loc.messages.NothingToCopy": "找不到任何檔案符合指定樣式可以複製到遠端電腦。", + "loc.messages.NumberFailed": "無法複製 %d 個檔案", + "loc.messages.RemoteCmdExecutionErr": "遠端電腦發生錯誤,導致命令 %s 失敗。%s。", + "loc.messages.RemoteCmdNonZeroExitCode": "命令 %s 在程式碼 %s 結束。", + "loc.messages.SettingUpSSHConnection": "正在對遠端主機 %s 設定 SSH 服務連線。", + "loc.messages.SourceNotFolder": "來源資料夾必須是有效的資料夾路徑。", + "loc.messages.StartedFileCopy": "正在將檔案 %s 複製到遠端電腦上的 %s。", + "loc.messages.UploadFileFailed": "無法將 %s 上傳到遠端電腦上的 %s。%s。", + "loc.messages.UseDefaultPort": "因為未指定任何連接埠,所以將使用 SSH 的預設連接埠 22。", + "loc.messages.TargetNotCreated": "無法建立目標資料夾 %s。", + "loc.messages.CheckingPathExistance": "檢查遠端電腦上是否有 %s。", + "loc.messages.PathExists": "遠端電腦上有 %s", + "loc.messages.PathNotExists": "遠端電腦上沒有 %s" +} \ No newline at end of file diff --git a/_generated/CopyFilesOverSSHV0/Tests/L0.ts b/_generated/CopyFilesOverSSHV0/Tests/L0.ts new file mode 100644 index 000000000000..84a2fe6e3dcb --- /dev/null +++ b/_generated/CopyFilesOverSSHV0/Tests/L0.ts @@ -0,0 +1,11 @@ +import * as utilsTests from './L0UtilsTests'; + +describe('CopyFilesOverSSHV0 Suite', function () { + before(() => { + }); + + after(() => { + }); + + utilsTests.run(); +}); diff --git a/_generated/CopyFilesOverSSHV0/Tests/L0UtilsTests.ts b/_generated/CopyFilesOverSSHV0/Tests/L0UtilsTests.ts new file mode 100644 index 000000000000..496d3e996a94 --- /dev/null +++ b/_generated/CopyFilesOverSSHV0/Tests/L0UtilsTests.ts @@ -0,0 +1,33 @@ +import assert = require('assert'); +import * as utils from '../utils'; + +export function run() { + context('Utils tests: ', function () { + it('Should recognize UNC paths', function (done: MochaDone) { + const paths: string[] = [ + '\\\\host\\one\\two', + '\\\\host\\one\\two\\', + '\\\\host\\one\\two/file', + '\\\\host/one/two/file' + ]; + for (const path of paths) { + assert(utils.pathIsUNC(path), `Should be recognized as UNC path: ${path}`); + } + done(); + }); + + it('Should not recognize strings as UNC paths', function (done: MochaDone) { + const paths: string[] = [ + '//host\\one\\two', + '//host\\one\\two\\', + '//host\\one\\two/file', + '//host/one/two/file', + '\\host\\one\\two', + ]; + for (const path of paths) { + assert(!utils.pathIsUNC(path), `Should not be recognized as UNC path: ${path}`); + } + done(); + }); + }); +} \ No newline at end of file diff --git a/_generated/CopyFilesOverSSHV0/Tests/package-lock.json b/_generated/CopyFilesOverSSHV0/Tests/package-lock.json new file mode 100644 index 000000000000..ba6519c9013a --- /dev/null +++ b/_generated/CopyFilesOverSSHV0/Tests/package-lock.json @@ -0,0 +1,14 @@ +{ + "name": "copy-files-over-ssh-tests", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/mocha": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", + "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==", + "dev": true + } + } +} diff --git a/_generated/CopyFilesOverSSHV0/Tests/package.json b/_generated/CopyFilesOverSSHV0/Tests/package.json new file mode 100644 index 000000000000..0e2ac431ff28 --- /dev/null +++ b/_generated/CopyFilesOverSSHV0/Tests/package.json @@ -0,0 +1,22 @@ +{ + "name": "copy-files-over-ssh-tests", + "version": "1.0.0", + "description": "Azure Pipelines Copy Files Over SSH V0 Task Tests", + "main": "L0.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/Microsoft/azure-pipelines-tasks.git" + }, + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Microsoft/azure-pipelines-tasks/issues" + }, + "homepage": "https://github.com/Microsoft/azure-pipelines-tasks#readme", + "devDependencies": { + "@types/mocha": "^5.2.7" + } +} diff --git a/_generated/CopyFilesOverSSHV0/ThirdPartyNotice.txt b/_generated/CopyFilesOverSSHV0/ThirdPartyNotice.txt new file mode 100644 index 000000000000..4eba1e4e41c0 --- /dev/null +++ b/_generated/CopyFilesOverSSHV0/ThirdPartyNotice.txt @@ -0,0 +1,774 @@ + +THIRD-PARTY SOFTWARE NOTICES AND INFORMATION +Do Not Translate or Localize + +This Azure DevOps extension (CopyFilesOverSSHV0) is based on or incorporates material from the projects listed below (Third Party IP). The original copyright notice and the license under which Microsoft received such Third Party IP, are set forth below. Such licenses and notices are provided for informational purposes only. Microsoft licenses the Third Party IP to you under the licensing terms for the Azure DevOps extension. Microsoft reserves all other rights not expressly granted under this agreement, whether by implication, estoppel or otherwise. + +1. asn1 (git://github.com/mcavage/node-asn1.git) +2. async (git+https://github.com/caolan/async.git) +3. balanced-match (git://github.com/juliangruber/balanced-match.git) +4. brace-expansion (git://github.com/juliangruber/brace-expansion.git) +5. concat-map (git://github.com/substack/node-concat-map.git) +6. core-util-is (git://github.com/isaacs/core-util-is.git) +7. fs.realpath (git+https://github.com/isaacs/fs.realpath.git) +8. glob (git://github.com/isaacs/node-glob.git) +9. glob (git://github.com/isaacs/node-glob.git) +10. inflight (git+https://github.com/npm/inflight.git) +11. inherits (git://github.com/isaacs/inherits.git) +12. isarray (git://github.com/juliangruber/isarray.git) +13. lodash (git+https://github.com/lodash/lodash.git) +14. minimatch (git://github.com/isaacs/minimatch.git) +15. mockery (git://github.com/mfncooper/mockery.git) +16. node-uuid (git+https://github.com/broofa/node-uuid.git) +17. once (git://github.com/isaacs/once.git) +18. path-is-absolute (git+https://github.com/sindresorhus/path-is-absolute.git) +19. q (git://github.com/kriskowal/q.git) +20. readable-stream (git://github.com/isaacs/readable-stream.git) +21. ssh2-sftp-client (git+https://github.com/theophilusx/ssh2-sftp-client.git) +22. semver (git+https://github.com/npm/node-semver.git) +23. shelljs (git://github.com/arturadib/shelljs.git) +24. ssh2 (git+ssh://git@github.com/mscdex/ssh2.git) +25. ssh2 (git+ssh://git@github.com/mscdex/ssh2.git) +26. ssh2-streams (git+ssh://git@github.com/mscdex/ssh2-streams.git) +27. ssh2-streams (git+ssh://git@github.com/mscdex/ssh2-streams.git) +28. streamsearch (git+ssh://git@github.com/mscdex/streamsearch.git) +29. string_decoder (git://github.com/rvagg/string_decoder.git) +30. vso-node-api (git+https://github.com/Microsoft/vso-node-api.git) +31. vsts-task-lib (git+https://github.com/Microsoft/vsts-task-lib.git) +32. wrappy (git+https://github.com/npm/wrappy.git) + + +%% asn1 NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) 2011 Mark Cavage, All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE +========================================= +END OF asn1 NOTICES, INFORMATION, AND LICENSE + +%% async NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) 2010-2014 Caolan McMahon + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF async NOTICES, INFORMATION, AND LICENSE + +%% balanced-match NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +(MIT) + +Copyright (c) 2013 Julian Gruber <julian@juliangruber.com> + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +========================================= +END OF balanced-match NOTICES, INFORMATION, AND LICENSE + +%% brace-expansion NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +NO LICENSE FOUND +========================================= +END OF brace-expansion NOTICES, INFORMATION, AND LICENSE + +%% concat-map NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +This software is released under the MIT license: + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF concat-map NOTICES, INFORMATION, AND LICENSE + +%% core-util-is NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright Node.js contributors. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. +========================================= +END OF core-util-is NOTICES, INFORMATION, AND LICENSE + +%% fs.realpath NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +---- + +This library bundles a version of the `fs.realpath` and `fs.realpathSync` +methods from Node.js v0.10 under the terms of the Node.js MIT license. + +Node's license follows, also included at the header of `old.js` which contains +the licensed code: + + Copyright Joyent, Inc. and other Node contributors. + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. +========================================= +END OF fs.realpath NOTICES, INFORMATION, AND LICENSE + +%% glob NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF glob NOTICES, INFORMATION, AND LICENSE + +%% glob NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF glob NOTICES, INFORMATION, AND LICENSE + +%% inflight NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF inflight NOTICES, INFORMATION, AND LICENSE + +%% inherits NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF inherits NOTICES, INFORMATION, AND LICENSE + +%% isarray NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +NO LICENSE FOUND +========================================= +END OF isarray NOTICES, INFORMATION, AND LICENSE + +%% lodash NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright jQuery Foundation and other contributors + +Based on Underscore.js, copyright Jeremy Ashkenas, +DocumentCloud and Investigative Reporters & Editors + +This software consists of voluntary contributions made by many +individuals. For exact contribution history, see the revision history +available at https://github.com/lodash/lodash + +The following license applies to all parts of this software except as +documented below: + +==== + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +==== + +Copyright and related rights for sample code are waived via CC0. Sample +code is defined as all source code displayed within the prose of the +documentation. + +CC0: http://creativecommons.org/publicdomain/zero/1.0/ + +==== + +Files located in the node_modules and vendor directories are externally +maintained libraries used by this software which have their own +licenses; we recommend you read them, as their terms may differ from the +terms above. +========================================= +END OF lodash NOTICES, INFORMATION, AND LICENSE + +%% minimatch NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF minimatch NOTICES, INFORMATION, AND LICENSE + +%% mockery NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyrights for code authored by Yahoo! Inc. is licensed under the following + terms: + + MIT License + + Copyright (c) 2011 Yahoo! Inc. All Rights Reserved. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to + deal in the Software without restriction, including without limitation the + rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. +========================================= +END OF mockery NOTICES, INFORMATION, AND LICENSE + +%% node-uuid NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) 2010-2012 Robert Kieffer + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +========================================= +END OF node-uuid NOTICES, INFORMATION, AND LICENSE + +%% once NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF once NOTICES, INFORMATION, AND LICENSE + +%% path-is-absolute NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF path-is-absolute NOTICES, INFORMATION, AND LICENSE + +%% q NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright 2009–2017 Kristopher Michael Kowal. All rights reserved. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. +========================================= +END OF q NOTICES, INFORMATION, AND LICENSE + +%% readable-stream NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright Joyent, Inc. and other Node contributors. All rights reserved. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. +========================================= +END OF readable-stream NOTICES, INFORMATION, AND LICENSE + +%% scp2 NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +NO LICENSE FOUND +========================================= +END OF scp2 NOTICES, INFORMATION, AND LICENSE + +%% semver NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF semver NOTICES, INFORMATION, AND LICENSE + +%% shelljs NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) 2012, Artur Adib +All rights reserved. + +You may use this project under the terms of the New BSD license as follows: + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of Artur Adib nor the + names of the contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL ARTUR ADIB BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +========================================= +END OF shelljs NOTICES, INFORMATION, AND LICENSE + +%% ssh2 NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright Brian White. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. +========================================= +END OF ssh2 NOTICES, INFORMATION, AND LICENSE + +%% ssh2 NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright Brian White. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. +========================================= +END OF ssh2 NOTICES, INFORMATION, AND LICENSE + +%% ssh2-streams NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright 2014 Brian White. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. +========================================= +END OF ssh2-streams NOTICES, INFORMATION, AND LICENSE + +%% ssh2-streams NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright 2014 Brian White. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. +========================================= +END OF ssh2-streams NOTICES, INFORMATION, AND LICENSE + +%% streamsearch NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright Brian White. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. +========================================= +END OF streamsearch NOTICES, INFORMATION, AND LICENSE + +%% string_decoder NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright Joyent, Inc. and other Node contributors. + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to permit +persons to whom the Software is furnished to do so, subject to the +following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF string_decoder NOTICES, INFORMATION, AND LICENSE + +%% vso-node-api NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +NO LICENSE FOUND +========================================= +END OF vso-node-api NOTICES, INFORMATION, AND LICENSE + +%% vsts-task-lib NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) Microsoft Corporation. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +========================================= +END OF vsts-task-lib NOTICES, INFORMATION, AND LICENSE + +%% wrappy NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF wrappy NOTICES, INFORMATION, AND LICENSE + diff --git a/_generated/CopyFilesOverSSHV0/copyfilesoverssh.ts b/_generated/CopyFilesOverSSHV0/copyfilesoverssh.ts new file mode 100644 index 000000000000..e33a1d9f6923 --- /dev/null +++ b/_generated/CopyFilesOverSSHV0/copyfilesoverssh.ts @@ -0,0 +1,263 @@ +import * as os from 'os'; +import * as path from 'path'; +import * as tl from 'azure-pipelines-task-lib/task'; +import * as minimatch from 'minimatch'; +import * as utils from './utils'; +import { SshHelper } from './sshhelper'; + +// This method will find the list of matching files for the specified contents +// This logic is the same as the one used by CopyFiles task except for allowing dot folders to be copied +// This will be useful to put in the task-lib +function getFilesToCopy(sourceFolder: string, contents: string[]): string[] { + // include filter + const includeContents: string[] = []; + // exclude filter + const excludeContents: string[] = []; + + // evaluate leading negations `!` on the pattern + for (const pattern of contents.map(x => x.trim())) { + let negate: boolean = false; + let numberOfNegations: number = 0; + for (const c of pattern) { + if (c === '!') { + negate = !negate; + numberOfNegations++; + } else { + break; + } + } + + if (negate) { + tl.debug('exclude content pattern: ' + pattern); + const realPattern = pattern.substring(0, numberOfNegations) + path.join(sourceFolder, pattern.substring(numberOfNegations)); + excludeContents.push(realPattern); + } else { + tl.debug('include content pattern: ' + pattern); + const realPattern = path.join(sourceFolder, pattern); + includeContents.push(realPattern); + } + } + + // enumerate all files + let files: string[] = []; + const allPaths: string[] = tl.find(sourceFolder); + const allFiles: string[] = []; + + // remove folder path + for (const p of allPaths) { + if (!tl.stats(p).isDirectory()) { + allFiles.push(p); + } + } + + // if we only have exclude filters, we need add a include all filter, so we can have something to exclude. + if (includeContents.length === 0 && excludeContents.length > 0) { + includeContents.push('**'); + } + + tl.debug("counted " + allFiles.length + " files in the source tree"); + + // a map to eliminate duplicates + const pathsSeen = {}; + + // minimatch options + const matchOptions: tl.MatchOptions = { matchBase: true, dot: true }; + if (os.platform() === 'win32') { + matchOptions.nocase = true; + } + + // apply include filter + for (const pattern of includeContents) { + tl.debug('Include matching ' + pattern); + + // let minimatch do the actual filtering + const matches: string[] = minimatch.match(allFiles, pattern, matchOptions); + + tl.debug('Include matched ' + matches.length + ' files'); + for (const matchPath of matches) { + if (!pathsSeen.hasOwnProperty(matchPath)) { + pathsSeen[matchPath] = true; + files.push(matchPath); + } + } + } + + // apply exclude filter + for (const pattern of excludeContents) { + tl.debug('Exclude matching ' + pattern); + + // let minimatch do the actual filtering + const matches: string[] = minimatch.match(files, pattern, matchOptions); + + tl.debug('Exclude matched ' + matches.length + ' files'); + files = []; + for (const matchPath of matches) { + files.push(matchPath); + } + } + + return files; +} + +async function run() { + let sshHelper: SshHelper; + try { + tl.setResourcePath(path.join(__dirname, 'task.json')); + + // read SSH endpoint input + const sshEndpoint = tl.getInput('sshEndpoint', true); + const username: string = tl.getEndpointAuthorizationParameter(sshEndpoint, 'username', false); + const password: string = tl.getEndpointAuthorizationParameter(sshEndpoint, 'password', true); //passphrase is optional + const privateKey: string = process.env['ENDPOINT_DATA_' + sshEndpoint + '_PRIVATEKEY']; //private key is optional, password can be used for connecting + const hostname: string = tl.getEndpointDataParameter(sshEndpoint, 'host', false); + let port: string = tl.getEndpointDataParameter(sshEndpoint, 'port', true); //port is optional, will use 22 as default port if not specified + if (!port) { + console.log(tl.loc('UseDefaultPort')); + port = '22'; + } + + const readyTimeout = getReadyTimeoutVariable(); + const useFastPut: boolean = !(process.env['USE_FAST_PUT'] === 'false'); + + // set up the SSH connection configuration based on endpoint details + let sshConfig; + if (privateKey) { + tl.debug('Using private key for ssh connection.'); + sshConfig = { + host: hostname, + port: port, + username: username, + privateKey: privateKey, + passphrase: password, + readyTimeout: readyTimeout, + useFastPut: useFastPut + } + } else { + // use password + tl.debug('Using username and password for ssh connection.'); + sshConfig = { + host: hostname, + port: port, + username: username, + password: password, + readyTimeout: readyTimeout, + useFastPut: useFastPut + } + } + + // contents is a multiline input containing glob patterns + const contents: string[] = tl.getDelimitedInput('contents', '\n', true); + const sourceFolder: string = tl.getPathInput('sourceFolder', true, true); + let targetFolder: string = tl.getInput('targetFolder'); + + if (!targetFolder) { + targetFolder = "./"; + } else { + // '~/' is unsupported + targetFolder = targetFolder.replace(/^~\//, "./"); + } + + // read the copy options + const cleanTargetFolder: boolean = tl.getBoolInput('cleanTargetFolder', false); + const overwrite: boolean = tl.getBoolInput('overwrite', false); + const failOnEmptySource: boolean = tl.getBoolInput('failOnEmptySource', false); + const flattenFolders: boolean = tl.getBoolInput('flattenFolders', false); + + if (!tl.stats(sourceFolder).isDirectory()) { + throw tl.loc('SourceNotFolder'); + } + + // initialize the SSH helpers, set up the connection + sshHelper = new SshHelper(sshConfig); + await sshHelper.setupConnection(); + + if (cleanTargetFolder && await sshHelper.checkRemotePathExists(targetFolder)) { + console.log(tl.loc('CleanTargetFolder', targetFolder)); + const isWindowsOnTarget: boolean = tl.getBoolInput('isWindowsOnTarget', false); + const cleanHiddenFilesInTarget: boolean = tl.getBoolInput('cleanHiddenFilesInTarget', false); + const cleanTargetFolderCmd: string = utils.getCleanTargetFolderCmd(targetFolder, isWindowsOnTarget, cleanHiddenFilesInTarget); + try { + await sshHelper.runCommandOnRemoteMachine(cleanTargetFolderCmd, null); + } catch (err) { + throw tl.loc('CleanTargetFolderFailed', err); + } + } + + // identify the files to copy + const filesToCopy: string[] = getFilesToCopy(sourceFolder, contents); + + // copy files to remote machine + if (filesToCopy) { + tl.debug('Number of files to copy = ' + filesToCopy.length); + tl.debug('filesToCopy = ' + filesToCopy); + + let failureCount = 0; + console.log(tl.loc('CopyingFiles', filesToCopy.length)); + for (const fileToCopy of filesToCopy) { + try { + tl.debug('fileToCopy = ' + fileToCopy); + + let relativePath; + if (flattenFolders) { + relativePath = path.basename(fileToCopy); + } else { + relativePath = fileToCopy.substring(sourceFolder.length) + .replace(/^\\/g, "") + .replace(/^\//g, ""); + } + tl.debug('relativePath = ' + relativePath); + let targetPath = path.posix.join(targetFolder, relativePath); + + if (!path.isAbsolute(targetPath) && !utils.pathIsUNC(targetPath)) { + targetPath = `./${targetPath}`; + } + + console.log(tl.loc('StartedFileCopy', fileToCopy, targetPath)); + if (!overwrite) { + const fileExists: boolean = await sshHelper.checkRemotePathExists(targetPath); + if (fileExists) { + throw tl.loc('FileExists', targetPath); + } + } + + targetPath = utils.unixyPath(targetPath); + // looks like scp can only handle one file at a time reliably + await sshHelper.uploadFile(fileToCopy, targetPath); + } catch (err) { + tl.error(tl.loc('FailedOnFile', fileToCopy, err)); + failureCount++; + } + } + console.log(tl.loc('CopyCompleted', filesToCopy.length)); + if (failureCount) { + tl.setResult(tl.TaskResult.Failed, tl.loc('NumberFailed', failureCount)); + } + } else if (failOnEmptySource) { + throw tl.loc('NothingToCopy'); + } else { + tl.warning(tl.loc('NothingToCopy')); + } + } catch (err) { + tl.setResult(tl.TaskResult.Failed, err); + } finally { + // close the client connection to halt build execution + if (sshHelper) { + tl.debug('Closing the client connection'); + await sshHelper.closeConnection(); + } + } +} + +run().then(() => { + tl.debug('Task successfully accomplished'); + }) + .catch(err => { + tl.debug('Run was unexpectedly failed due to: ' + err); + }); + +function getReadyTimeoutVariable(): number { + let readyTimeoutString: string = tl.getInput('readyTimeout', true); + const readyTimeout: number = parseInt(readyTimeoutString, 10); + + return readyTimeout; +} diff --git a/_generated/CopyFilesOverSSHV0/icon.png b/_generated/CopyFilesOverSSHV0/icon.png new file mode 100644 index 000000000000..667721310bac Binary files /dev/null and b/_generated/CopyFilesOverSSHV0/icon.png differ diff --git a/_generated/CopyFilesOverSSHV0/icon.svg b/_generated/CopyFilesOverSSHV0/icon.svg new file mode 100644 index 000000000000..c40973a54665 --- /dev/null +++ b/_generated/CopyFilesOverSSHV0/icon.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/_generated/CopyFilesOverSSHV0/package-lock.json b/_generated/CopyFilesOverSSHV0/package-lock.json new file mode 100644 index 000000000000..5500eb192e75 --- /dev/null +++ b/_generated/CopyFilesOverSSHV0/package-lock.json @@ -0,0 +1,612 @@ +{ + "name": "vsts-copyssh-task", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/concat-stream": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz", + "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==", + "requires": { + "@types/node": "*" + } + }, + "@types/form-data": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", + "integrity": "sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==", + "requires": { + "@types/node": "*" + } + }, + "@types/mocha": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", + "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==" + }, + "@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + }, + "@types/qs": { + "version": "6.9.8", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.8.tgz", + "integrity": "sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg==" + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "azure-pipelines-task-lib": { + "version": "5.0.0-preview.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-5.0.0-preview.0.tgz", + "integrity": "sha512-uQJEv+q3/7RD7kgphFd33uXijaPwA1ePYoNkAgZpUhbZUtc2u4JL4ujTT/JJfgXBNW/QQNAiDQ2OC7vOQG/0tg==", + "requires": { + "minimatch": "3.0.5", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "sync-request": "6.1.0", + "uuid": "^3.0.1" + }, + "dependencies": { + "minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "brace-expansion": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", + "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", + "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.0.2", + "typedarray": "^0.0.6" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "cpu-features": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/cpu-features/-/cpu-features-0.0.2.tgz", + "integrity": "sha512-/2yieBqvMcRj8McNzkycjW2v3OIUOibBfd2dLEJ0nWts8NobAxwiyw9phVNS6oDL8x8tz9F7uNVFEVpJncQpeA==", + "optional": true, + "requires": { + "nan": "^2.14.1" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, + "err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==" + }, + "form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + } + }, + "get-port": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", + "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==" + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "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" + }, + "dependencies": { + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==" + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "http-basic": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", + "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", + "requires": { + "caseless": "^0.12.0", + "concat-stream": "^1.6.2", + "http-response-object": "^3.0.1", + "parse-cache-control": "^1.0.1" + }, + "dependencies": { + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + } + } + }, + "http-response-object": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", + "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", + "requires": { + "@types/node": "^10.0.3" + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" + }, + "is-core-module": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "requires": { + "has": "^1.0.3" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "nan": { + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz", + "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==", + "optional": true + }, + "object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, + "parse-cache-control": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", + "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "promise": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", + "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", + "requires": { + "asap": "~2.0.6" + } + }, + "promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "requires": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + } + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==" + }, + "qs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "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" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "requires": { + "resolve": "^1.1.6" + } + }, + "resolve": { + "version": "1.22.6", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.6.tgz", + "integrity": "sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==", + "requires": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=" + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" + }, + "shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "ssh2": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ssh2/-/ssh2-1.4.0.tgz", + "integrity": "sha512-XvXwcXKvS452DyQvCa6Ct+chpucwc/UyxgliYz+rWXJ3jDHdtBb9xgmxJdMmnIn5bpgGAEV3KaEsH98ZGPHqwg==", + "requires": { + "asn1": "^0.2.4", + "bcrypt-pbkdf": "^1.0.2", + "cpu-features": "0.0.2", + "nan": "^2.15.0" + }, + "dependencies": { + "asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "requires": { + "safer-buffer": "~2.1.0" + } + } + } + }, + "ssh2-sftp-client": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/ssh2-sftp-client/-/ssh2-sftp-client-7.0.4.tgz", + "integrity": "sha512-4fFSTgoYlzcAtGfEjiXN6N41s1jSUmPlI00f7uD7pQOjt9yK9susminINKTRvPp35dkrATrlNZVhUxNCt3z5+w==", + "requires": { + "concat-stream": "^2.0.0", + "promise-retry": "^2.0.1", + "ssh2": "^1.4.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + } + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, + "sync-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", + "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==", + "requires": { + "http-response-object": "^3.0.1", + "sync-rpc": "^1.2.1", + "then-request": "^6.0.0" + } + }, + "sync-rpc": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz", + "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==", + "requires": { + "get-port": "^3.1.0" + } + }, + "then-request": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", + "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", + "requires": { + "@types/concat-stream": "^1.6.0", + "@types/form-data": "0.0.33", + "@types/node": "^8.0.0", + "@types/qs": "^6.2.31", + "caseless": "~0.12.0", + "concat-stream": "^1.6.0", + "form-data": "^2.2.0", + "http-basic": "^8.1.1", + "http-response-object": "^3.0.1", + "promise": "^8.0.0", + "qs": "^6.4.0" + }, + "dependencies": { + "@types/node": { + "version": "8.10.66", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", + "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + } + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, + "typescript": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.2.tgz", + "integrity": "sha512-e4ERvRV2wb+rRZ/IQeb3jm2VxBsirQLpQhdxplZ2MEzGvDkkMmPglecnNDfSUBivMjP93vRbngYYDQqQ/78bcQ==", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + } + } +} diff --git a/_generated/CopyFilesOverSSHV0/package.json b/_generated/CopyFilesOverSSHV0/package.json new file mode 100644 index 000000000000..33c699117731 --- /dev/null +++ b/_generated/CopyFilesOverSSHV0/package.json @@ -0,0 +1,29 @@ +{ + "name": "vsts-copyssh-task", + "version": "1.0.0", + "description": "Azure Pipelines Copy Files over SSH Tasks", + "main": "copyfilesoverssh.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/Microsoft.com/vsts-tasks.git" + }, + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Microsoft.com/vsts-tasks/issues" + }, + "homepage": "https://github.com/Microsoft.com/vsts-tasks#readme", + "dependencies": { + "ssh2": "^1.4.0", + "ssh2-sftp-client": "^7.0.4", + "minimatch": "^3.0.4", + "azure-pipelines-task-lib": "^5.0.0-preview.0", + "@types/mocha": "^5.2.7" + }, + "devDependencies": { + "typescript": "4.0.2" + } +} diff --git a/_generated/CopyFilesOverSSHV0/sshhelper.ts b/_generated/CopyFilesOverSSHV0/sshhelper.ts new file mode 100644 index 000000000000..0ff955f3db03 --- /dev/null +++ b/_generated/CopyFilesOverSSHV0/sshhelper.ts @@ -0,0 +1,218 @@ +import Q = require('q'); +import tl = require('azure-pipelines-task-lib/task'); +const path = require('path'); +var Ssh2Client = require('ssh2').Client; +var SftpClient = require('ssh2-sftp-client'); + +export class RemoteCommandOptions { + public failOnStdErr : boolean; +} + +export class SshHelper { + private sshConfig: any; + private sshClient: any; + private scpClient: any; + private sftpClient: any; + + /** + * Constructor that takes a configuration object of format + * { + host: hostname, + port: port, + username: username, + privateKey: privateKey, + passphrase: passphrase + } + * @param sshConfig + */ + constructor(sshConfig: any) { + this.sshConfig = sshConfig; + } + + private async setupSshClientConnection() : Promise { + const defer = Q.defer(); + this.sshClient = new Ssh2Client(); + this.sshClient.once('ready', () => { + defer.resolve(); + }).once('error', (err) => { + defer.reject(tl.loc('ConnectionFailed', err)); + }).connect(this.sshConfig); + await defer.promise; + } + + private async setupSftpConnection() : Promise { + const defer = Q.defer(); + try { + this.sftpClient = new SftpClient(); + await this.sftpClient.connect(this.sshConfig); + defer.resolve(); + } catch (err) { + this.sftpClient = null; + defer.reject(tl.loc('ConnectionFailed', err)); + } + await defer.promise; + } + + /** + * Sets up the SSH connection + */ + async setupConnection() { + console.log(tl.loc('SettingUpSSHConnection', this.sshConfig.host)); + try { + await this.setupSshClientConnection(); + await this.setupSftpConnection(); + } catch(err) { + throw new Error(tl.loc('ConnectionFailed', err)); + } + } + + /** + * Close any open client connections for SSH, SCP and SFTP + */ + async closeConnection() { + try { + if (this.sftpClient) { + this.sftpClient.on('error', (err) => { + tl.debug('sftpClient: Ignoring error diconnecting: ' + err); + }); // ignore logout errors; see: https://github.com/mscdex/node-imap/issues/695 + await this.sftpClient.end(); + this.sftpClient = null; + } + } catch(err) { + tl.debug('Failed to close SFTP client: ' + err); + } + try { + if (this.sshClient) { + this.sshClient.on('error', (err) => { + tl.debug('sshClient: Ignoring error diconnecting: ' + err); + }); // ignore logout errors; see: https://github.com/mscdex/node-imap/issues/695 + this.sshClient.end(); + this.sshClient = null; + } + } catch(err) { + tl.debug('Failed to close SSH client: ' + err); + } + } + + /** + * Uploads a file to the remote server + * @param sourceFile + * @param dest, folders will be created if they do not exist on remote server + * @returns {Promise} + */ + async uploadFile(sourceFile: string, dest: string) : Promise { + tl.debug('Upload ' + sourceFile + ' to ' + dest + ' on remote machine.'); + + var defer = Q.defer(); + if(!this.sftpClient) { + defer.reject(tl.loc('ConnectionNotSetup')); + } + + const remotePath = path.dirname(dest); + try { + if (!await this.sftpClient.exists(remotePath)) { + await this.sftpClient.mkdir(remotePath, true); + } + } catch (error) { + defer.reject(tl.loc('TargetNotCreated', remotePath)); + } + + try { + if (this.sshConfig.useFastPut) { + await this.sftpClient.fastPut(sourceFile, dest); + } else { + await this.sftpClient.put(sourceFile, dest); + } + defer.resolve(dest); + } catch (err) { + defer.reject(tl.loc('UploadFileFailed', sourceFile, dest, err)); + } + return defer.promise; + } + + /** + * Returns true if the path exists on remote machine, false if it does not exist + * @param path + * @returns {Promise} + */ + async checkRemotePathExists(path: string) : Promise { + var defer = Q.defer(); + + tl.debug(tl.loc('CheckingPathExistance', path)); + if(!this.sftpClient) { + defer.reject(tl.loc('ConnectionNotSetup')); + } + if (await this.sftpClient.exists(path)) { + //path exists + tl.debug(tl.loc('PathExists', path)); + defer.resolve(true); + } else { + //path does not exist + tl.debug(tl.loc('PathNotExists', path)); + defer.resolve(false); + } + + return defer.promise; + } + + /** + * Runs specified command on remote machine, returns error for non-zero exit code + * @param command + * @param options + * @returns {Promise} + */ + runCommandOnRemoteMachine(command: string, options: RemoteCommandOptions) : Q.Promise { + var defer = Q.defer(); + var stdErrWritten:boolean = false; + + if(!this.sshClient) { + defer.reject(tl.loc('ConnectionNotSetup')); + } + + if(!options) { + tl.debug('Options not passed to runCommandOnRemoteMachine, setting defaults.'); + var options = new RemoteCommandOptions(); + options.failOnStdErr = true; + } + + var cmdToRun = command; + if(cmdToRun.indexOf(';') > 0) { + //multiple commands were passed separated by ; + cmdToRun = cmdToRun.replace(/;/g, '\n'); + } + tl.debug('cmdToRun = ' + cmdToRun); + + this.sshClient.exec(cmdToRun, (err, stream) => { + if(err) { + defer.reject(tl.loc('RemoteCmdExecutionErr', cmdToRun, err)) + } + stream.on('close', (code, signal) => { + tl.debug('code = ' + code + ', signal = ' + signal); + if(code && code != 0) { + //non zero exit code - fail + defer.reject(tl.loc('RemoteCmdNonZeroExitCode', cmdToRun, code)); + } else { + //no exit code or exit code of 0 + + //based on the options decide whether to fail the build or not if data was written to STDERR + if(stdErrWritten === true && options.failOnStdErr === true) { + //stderr written - fail the build + defer.reject(tl.loc('RemoteCmdExecutionErr', cmdToRun, tl.loc('CheckLogForStdErr'))); + } else { + //success + defer.resolve('0'); + } + } + }).on('data', (data) => { + console.log(data); + }).stderr.on('data', (data) => { + stdErrWritten = true; + tl.debug('stderr = ' + data); + if(data && data.toString().trim() !== '') { + tl.error(data); + } + }); + }); + return defer.promise; + } +} diff --git a/_generated/CopyFilesOverSSHV0/task.json b/_generated/CopyFilesOverSSHV0/task.json new file mode 100644 index 000000000000..506ff83226a6 --- /dev/null +++ b/_generated/CopyFilesOverSSHV0/task.json @@ -0,0 +1,181 @@ +{ + "id": "67cec91b-0351-4c2f-8465-d74b3d2a2d96", + "name": "CopyFilesOverSSH", + "friendlyName": "Copy files over SSH", + "description": "Copy files or build artifacts to a remote machine over SSH", + "helpUrl": "https://docs.microsoft.com/azure/devops/pipelines/tasks/deploy/copy-files-over-ssh", + "helpMarkDown": "[Learn more about this task](https://go.microsoft.com/fwlink/?LinkId=821894)", + "category": "Deploy", + "visibility": [ + "Build", + "Release" + ], + "runsOn": [ + "Agent", + "DeploymentGroup" + ], + "author": "Microsoft Corporation", + "version": { + "Major": 0, + "Minor": 229, + "Patch": 0 + }, + "demands": [], + "minimumAgentVersion": "2.182.1", + "instanceNameFormat": "Securely copy files to the remote machine", + "groups": [ + { + "name": "advanced", + "displayName": "Advanced", + "isExpanded": false + } + ], + "inputs": [ + { + "name": "sshEndpoint", + "type": "connectedService:ssh", + "label": "SSH service connection", + "defaultValue": "", + "required": true, + "helpMarkDown": "SSH service connection with connection details for the remote machine." + }, + { + "name": "sourceFolder", + "type": "filePath", + "label": "Source folder", + "defaultValue": "", + "required": false, + "helpMarkDown": "The source folder of the files to copy to the remote machine. When empty, the root of the repository (build) or artifacts directory (release) is used, which is $(System.DefaultWorkingDirectory). Use [variables](https://go.microsoft.com/fwlink/?LinkID=550988) if files are not in the repository. Example: $(Agent.BuildDirectory)" + }, + { + "name": "contents", + "type": "multiLine", + "label": "Contents", + "defaultValue": "**", + "required": true, + "helpMarkDown": "File paths to include as part of the copy. Supports multiple lines of minimatch patterns. [More Information](https://go.microsoft.com/fwlink/?LinkId=821894)" + }, + { + "name": "targetFolder", + "type": "string", + "label": "Target folder", + "defaultValue": "", + "required": false, + "helpMarkDown": "Target folder on the remote machine to where files will be copied. Example: /home/user/MySite." + }, + { + "name": "isWindowsOnTarget", + "type": "boolean", + "label": "Target machine running Windows", + "defaultValue": "false", + "required": false, + "helpMarkDown": "Target machine running Windows", + "groupName": "advanced" + }, + { + "name": "cleanTargetFolder", + "type": "boolean", + "label": "Clean target folder", + "defaultValue": "false", + "required": false, + "helpMarkDown": "Delete all existing files and subfolders in the target folder before copying.", + "groupName": "advanced" + }, + { + "name": "cleanHiddenFilesInTarget", + "type": "boolean", + "label": "Remove hidden files in target folder", + "defaultValue": "false", + "required": false, + "helpMarkDown": "Remove hidden files in the target folder.", + "groupName": "advanced", + "visibleRule": "cleanTargetFolder = true" + }, + { + "name": "readyTimeout", + "type": "string", + "label": "SSH handshake timeout", + "defaultValue": "20000", + "required": true, + "groupName": "advanced", + "helpMarkDown": "How long (in milliseconds) to wait for the SSH handshake to complete.", + "validation": { + "expression": "isMatch(value, '(^\\d*$)','Multiline')", + "message": "Enter a valid value for timeout." + } + }, + { + "name": "overwrite", + "type": "boolean", + "label": "Overwrite", + "defaultValue": "true", + "required": false, + "helpMarkDown": "Replace existing files in and beneath the target folder.", + "groupName": "advanced" + }, + { + "name": "failOnEmptySource", + "type": "boolean", + "label": "Fail if no files found to copy", + "defaultValue": "false", + "required": false, + "helpMarkDown": "Fail if no matching files to be copied are found under the source folder.", + "groupName": "advanced" + }, + { + "name": "flattenFolders", + "type": "boolean", + "label": "Flatten folders", + "defaultValue": "false", + "required": false, + "helpMarkDown": "Flatten the folder structure and copy all files into the specified target folder on the remote machine.", + "groupName": "advanced" + } + ], + "execution": { + "Node10": { + "target": "copyfilesoverssh.js", + "argumentFormat": "" + }, + "Node16": { + "target": "copyfilesoverssh.js", + "argumentFormat": "" + } + }, + "restrictions": { + "commands": { + "mode": "restricted" + }, + "settableVariables": { + "allowed": [] + } + }, + "messages": { + "CheckLogForStdErr": "Check the build log for STDERR from the command.", + "CleanTargetFolder": "Cleaning target folder %s on the remote machine", + "CleanTargetFolderFailed": "Failed to clean the target folder on the remote machine. %s", + "ConnectionFailed": "Failed to connect to remote machine. Verify the SSH service connection details. %s.", + "ConnectionNotSetup": "SSH service connection is not set up.", + "CopyCompleted": "Completed copying %s files to the remote machine.", + "CopyingFiles": "Found %s files to copy to the remote machine.", + "FailedOnFile": "Failed to copy %s. %s", + "FileExists": "File %s cannot be copied to the remote machine because it already exists and the 'Overwrite' option is disabled.", + "NothingToCopy": "No files were found matching the patterns specified to copy to the remote machine.", + "NumberFailed": "Failed to copy %d files", + "RemoteCmdExecutionErr": "Command %s failed with errors on remote machine. %s.", + "RemoteCmdNonZeroExitCode": "Command %s exited with code %s.", + "SettingUpSSHConnection": "Setting up SSH service connection to remote host %s.", + "SourceNotFolder": "Source folder has to be a valid folder path.", + "StartedFileCopy": "Copying file %s to %s on remote machine.", + "UploadFileFailed": "Failed to upload %s to %s on remote machine. %s.", + "UseDefaultPort": "Using port 22 which is the default for SSH since no port was specified.", + "TargetNotCreated": "Unable to create target folder %s.", + "CheckingPathExistance": "Checking if %s on the remote machine exists.", + "PathExists": "%s exists on the remote machine", + "PathNotExists": "%s doesn't exist on the remote machine" + }, + "_buildConfigMapping": { + "Default": "0.229.0", + "Node20-225": "0.229.1" + } +} \ No newline at end of file diff --git a/_generated/CopyFilesOverSSHV0/task.loc.json b/_generated/CopyFilesOverSSHV0/task.loc.json new file mode 100644 index 000000000000..9073298b27af --- /dev/null +++ b/_generated/CopyFilesOverSSHV0/task.loc.json @@ -0,0 +1,181 @@ +{ + "id": "67cec91b-0351-4c2f-8465-d74b3d2a2d96", + "name": "CopyFilesOverSSH", + "friendlyName": "ms-resource:loc.friendlyName", + "description": "ms-resource:loc.description", + "helpUrl": "https://docs.microsoft.com/azure/devops/pipelines/tasks/deploy/copy-files-over-ssh", + "helpMarkDown": "ms-resource:loc.helpMarkDown", + "category": "Deploy", + "visibility": [ + "Build", + "Release" + ], + "runsOn": [ + "Agent", + "DeploymentGroup" + ], + "author": "Microsoft Corporation", + "version": { + "Major": 0, + "Minor": 229, + "Patch": 0 + }, + "demands": [], + "minimumAgentVersion": "2.182.1", + "instanceNameFormat": "ms-resource:loc.instanceNameFormat", + "groups": [ + { + "name": "advanced", + "displayName": "ms-resource:loc.group.displayName.advanced", + "isExpanded": false + } + ], + "inputs": [ + { + "name": "sshEndpoint", + "type": "connectedService:ssh", + "label": "ms-resource:loc.input.label.sshEndpoint", + "defaultValue": "", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.sshEndpoint" + }, + { + "name": "sourceFolder", + "type": "filePath", + "label": "ms-resource:loc.input.label.sourceFolder", + "defaultValue": "", + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.sourceFolder" + }, + { + "name": "contents", + "type": "multiLine", + "label": "ms-resource:loc.input.label.contents", + "defaultValue": "**", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.contents" + }, + { + "name": "targetFolder", + "type": "string", + "label": "ms-resource:loc.input.label.targetFolder", + "defaultValue": "", + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.targetFolder" + }, + { + "name": "isWindowsOnTarget", + "type": "boolean", + "label": "ms-resource:loc.input.label.isWindowsOnTarget", + "defaultValue": "false", + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.isWindowsOnTarget", + "groupName": "advanced" + }, + { + "name": "cleanTargetFolder", + "type": "boolean", + "label": "ms-resource:loc.input.label.cleanTargetFolder", + "defaultValue": "false", + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.cleanTargetFolder", + "groupName": "advanced" + }, + { + "name": "cleanHiddenFilesInTarget", + "type": "boolean", + "label": "ms-resource:loc.input.label.cleanHiddenFilesInTarget", + "defaultValue": "false", + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.cleanHiddenFilesInTarget", + "groupName": "advanced", + "visibleRule": "cleanTargetFolder = true" + }, + { + "name": "readyTimeout", + "type": "string", + "label": "ms-resource:loc.input.label.readyTimeout", + "defaultValue": "20000", + "required": true, + "groupName": "advanced", + "helpMarkDown": "ms-resource:loc.input.help.readyTimeout", + "validation": { + "expression": "isMatch(value, '(^\\d*$)','Multiline')", + "message": "Enter a valid value for timeout." + } + }, + { + "name": "overwrite", + "type": "boolean", + "label": "ms-resource:loc.input.label.overwrite", + "defaultValue": "true", + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.overwrite", + "groupName": "advanced" + }, + { + "name": "failOnEmptySource", + "type": "boolean", + "label": "ms-resource:loc.input.label.failOnEmptySource", + "defaultValue": "false", + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.failOnEmptySource", + "groupName": "advanced" + }, + { + "name": "flattenFolders", + "type": "boolean", + "label": "ms-resource:loc.input.label.flattenFolders", + "defaultValue": "false", + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.flattenFolders", + "groupName": "advanced" + } + ], + "execution": { + "Node10": { + "target": "copyfilesoverssh.js", + "argumentFormat": "" + }, + "Node16": { + "target": "copyfilesoverssh.js", + "argumentFormat": "" + } + }, + "restrictions": { + "commands": { + "mode": "restricted" + }, + "settableVariables": { + "allowed": [] + } + }, + "messages": { + "CheckLogForStdErr": "ms-resource:loc.messages.CheckLogForStdErr", + "CleanTargetFolder": "ms-resource:loc.messages.CleanTargetFolder", + "CleanTargetFolderFailed": "ms-resource:loc.messages.CleanTargetFolderFailed", + "ConnectionFailed": "ms-resource:loc.messages.ConnectionFailed", + "ConnectionNotSetup": "ms-resource:loc.messages.ConnectionNotSetup", + "CopyCompleted": "ms-resource:loc.messages.CopyCompleted", + "CopyingFiles": "ms-resource:loc.messages.CopyingFiles", + "FailedOnFile": "ms-resource:loc.messages.FailedOnFile", + "FileExists": "ms-resource:loc.messages.FileExists", + "NothingToCopy": "ms-resource:loc.messages.NothingToCopy", + "NumberFailed": "ms-resource:loc.messages.NumberFailed", + "RemoteCmdExecutionErr": "ms-resource:loc.messages.RemoteCmdExecutionErr", + "RemoteCmdNonZeroExitCode": "ms-resource:loc.messages.RemoteCmdNonZeroExitCode", + "SettingUpSSHConnection": "ms-resource:loc.messages.SettingUpSSHConnection", + "SourceNotFolder": "ms-resource:loc.messages.SourceNotFolder", + "StartedFileCopy": "ms-resource:loc.messages.StartedFileCopy", + "UploadFileFailed": "ms-resource:loc.messages.UploadFileFailed", + "UseDefaultPort": "ms-resource:loc.messages.UseDefaultPort", + "TargetNotCreated": "ms-resource:loc.messages.TargetNotCreated", + "CheckingPathExistance": "ms-resource:loc.messages.CheckingPathExistance", + "PathExists": "ms-resource:loc.messages.PathExists", + "PathNotExists": "ms-resource:loc.messages.PathNotExists" + }, + "_buildConfigMapping": { + "Default": "0.229.0", + "Node20-225": "0.229.1" + } +} \ No newline at end of file diff --git a/_generated/CopyFilesOverSSHV0/tsconfig.json b/_generated/CopyFilesOverSSHV0/tsconfig.json new file mode 100644 index 000000000000..0438b79f69ac --- /dev/null +++ b/_generated/CopyFilesOverSSHV0/tsconfig.json @@ -0,0 +1,6 @@ +{ + "compilerOptions": { + "target": "ES6", + "module": "commonjs" + } +} \ No newline at end of file diff --git a/_generated/CopyFilesOverSSHV0/utils.ts b/_generated/CopyFilesOverSSHV0/utils.ts new file mode 100644 index 000000000000..0c3627636d6f --- /dev/null +++ b/_generated/CopyFilesOverSSHV0/utils.ts @@ -0,0 +1,47 @@ +import * as tl from 'azure-pipelines-task-lib/task'; + +const UNCPathPattern: RegExp = /^[\\]{2,}[^\\\/]+[\\\/]+[^\\\/]+/; + +/** + * Change path separator for Windows-based platforms + * See https://github.com/spmjs/node-scp2/blob/master/lib/client.js#L319 + * + * @param filePath + */ +export function unixyPath(filePath: string): string { + if (process.platform === 'win32') { + return filePath.replace(/\\/g, '/'); + } + return filePath; +} + +/** + * Determines whether {path} is an UNC path. + * @param path + */ +export function pathIsUNC(path: string): boolean { + return UNCPathPattern.test(path); +} + +/** + * Gets OS specific command to clean folder in specified path. + * @returns {string} OS specific command to clean target folder on the remote machine + * @param {string} targetFolder path to target folder + * @param {boolean} forWindows return command for Windows CMD + * @param {boolean} cleanHiddenFiles clean hidden files in target folder + */ +export function getCleanTargetFolderCmd(targetFolder: string, forWindows: boolean, cleanHiddenFiles: boolean = false ): string { + if (forWindows) { + const hiddenFilesClean: string = `${ cleanHiddenFiles ? "/A:H": "" }`; + const cleanFilesInTarget: string = `del /q ${hiddenFilesClean} "${targetFolder}\\*"`; + // delete all files in specified folder and then delete all nested folders + return `${cleanFilesInTarget} && FOR /D %p IN ("${targetFolder}\\*.*") DO rmdir "%p" /s /q`; + } else { + // This pattern will ignore files whose name is . and .. during deletion. These are system files that exist in every Linux directory. + // An attempt to delete these files will produce warnings that could confuse users. + // Here is more information about this problem https://unix.stackexchange.com/questions/77127/rm-rf-all-files-and-all-hidden-files-without-error/77313#77313 + const hiddenFilesClean: string = `${ cleanHiddenFiles ? "{,.[!.],..?}" : "" }`; + const cleanFilesInTarget: string = `sh -c "rm -rf '${targetFolder}'/${hiddenFilesClean}*"`; + return cleanFilesInTarget; + } +} diff --git a/_generated/CopyFilesOverSSHV0_Node20/.npmrc b/_generated/CopyFilesOverSSHV0_Node20/.npmrc new file mode 100644 index 000000000000..5fca0d518be7 --- /dev/null +++ b/_generated/CopyFilesOverSSHV0_Node20/.npmrc @@ -0,0 +1 @@ +scripts-prepend-node-path=true diff --git a/_generated/CopyFilesOverSSHV0_Node20/Strings/resources.resjson/de-DE/resources.resjson b/_generated/CopyFilesOverSSHV0_Node20/Strings/resources.resjson/de-DE/resources.resjson new file mode 100644 index 000000000000..a04ccb51a625 --- /dev/null +++ b/_generated/CopyFilesOverSSHV0_Node20/Strings/resources.resjson/de-DE/resources.resjson @@ -0,0 +1,51 @@ +{ + "loc.friendlyName": "Dateien über SSH kopieren", + "loc.helpMarkDown": "[Weitere Informationen zu dieser Aufgabe](https://go.microsoft.com/fwlink/?LinkId=821894)", + "loc.description": "Dateien oder Buildartefakte auf einen Remotecomputer über SSH kopieren", + "loc.instanceNameFormat": "Dateien sicher auf den Remotecomputer kopieren", + "loc.group.displayName.advanced": "Erweitert", + "loc.input.label.sshEndpoint": "SSH-Dienstverbindung", + "loc.input.help.sshEndpoint": "Die SSH-Dienstverbindung mit Verbindungsdetails für den Remotecomputer.", + "loc.input.label.sourceFolder": "Quellordner", + "loc.input.help.sourceFolder": "Der Quellordner für die auf den Remotecomputer zu kopierenden Dateien. Wenn das Feld leer bleibt, wird der Stamm des Repositorys (Build) oder des Artefakteverzeichnisses (Release) verwendet. Dies ist $(System.DefaultWorkingDirectory). Verwenden Sie [Variablen](https://go.microsoft.com/fwlink/?LinkID=550988), wenn im Repository keine Dateien vorhanden sind. Beispiel: $(Agent.BuildDirectory)", + "loc.input.label.contents": "Inhalte", + "loc.input.help.contents": "Dateipfade, die als Teil der Kopie eingeschlossen werden sollen. Unterstützt mehrere Zeilen von Minimatchmustern. [Weitere Informationen](https://go.microsoft.com/fwlink/?LinkId=821894)", + "loc.input.label.targetFolder": "Zielordner", + "loc.input.help.targetFolder": "Der Zielordner auf dem Remotecomputer, in den die Dateien kopiert werden. Beispiel: \"/home/user/MySite\".", + "loc.input.label.isWindowsOnTarget": "Zielcomputer führt Windows aus", + "loc.input.help.isWindowsOnTarget": "Zielcomputer führt Windows aus", + "loc.input.label.cleanTargetFolder": "Zielordner bereinigen", + "loc.input.help.cleanTargetFolder": "Alle vorhandenen Dateien und Unterordner im Zielordner vor dem Kopieren löschen.", + "loc.input.label.cleanHiddenFilesInTarget": "Ausgeblendete Dateien im Zielordner entfernen", + "loc.input.help.cleanHiddenFilesInTarget": "Ausgeblendete Dateien im Zielordner entfernen.", + "loc.input.label.readyTimeout": "Timeout für SSH-Handshake", + "loc.input.help.readyTimeout": "Gibt an, wie lange (in Millisekunden) auf den Abschluss des SSH-Handshakes gewartet wird.", + "loc.input.label.overwrite": "Überschreiben", + "loc.input.help.overwrite": "Vorhandene Dateien im Zielordner sowie unterhalb des Zielordners ersetzen.", + "loc.input.label.failOnEmptySource": "Ein Fehler tritt auf, wenn keine zu kopierenden Dateien gefunden werden.", + "loc.input.help.failOnEmptySource": "Ein Fehler tritt auf, wenn keine zu kopierenden übereinstimmenden Dateien im Quellordner gefunden wurden.", + "loc.input.label.flattenFolders": "Ordner vereinfachen", + "loc.input.help.flattenFolders": "Vereinfacht die Ordnerstruktur und kopiert alle Dateien in den angegebenen Zielordner auf dem Remotecomputer.", + "loc.messages.CheckLogForStdErr": "Überprüfen Sie das Buildprotokoll auf Ausgabe an STDERR vom Befehl.", + "loc.messages.CleanTargetFolder": "Der Zielordner \"%s\" wird auf dem Remotecomputer bereinigt.", + "loc.messages.CleanTargetFolderFailed": "Fehler beim Bereinigen des Zielordners auf dem Remotecomputer. %s", + "loc.messages.ConnectionFailed": "Fehler beim Herstellen einer Verbindung mit dem Remotecomputer. Überprüfen Sie die SSH-Dienstverbindungsdetails. %s.", + "loc.messages.ConnectionNotSetup": "Die SSH-Dienstverbindung ist nicht eingerichtet.", + "loc.messages.CopyCompleted": "Das Kopieren von %s Dateien auf den Remotecomputer wurde abgeschlossen.", + "loc.messages.CopyingFiles": "Es wurden %s Dateien zum Kopieren auf den Remotecomputer gefunden.", + "loc.messages.FailedOnFile": "Fehler beim Kopieren von \"%s\". %s", + "loc.messages.FileExists": "Die Datei \"%s\" kann nicht auf den Remotecomputer kopiert werden, weil sie bereits vorhanden und die Option \"Überschreiben\" deaktiviert ist.", + "loc.messages.NothingToCopy": "Es wurden keine Dateien gefunden, die mit den auf den Remotecomputer zu kopierenden Mustern übereinstimmen.", + "loc.messages.NumberFailed": "Fehler beim Kopieren von %d Dateien.", + "loc.messages.RemoteCmdExecutionErr": "Fehler des Befehls \"%s\" auf dem Remotecomputer. %s.", + "loc.messages.RemoteCmdNonZeroExitCode": "Der Befehl \"%s\" wurde mit dem Code %s beendet.", + "loc.messages.SettingUpSSHConnection": "Die SSH-Dienstverbindung mit dem Remotehost \"%s\" wird eingerichtet.", + "loc.messages.SourceNotFolder": "Der Quellordner muss ein gültiger Ordnerpfad sein.", + "loc.messages.StartedFileCopy": "Die Datei \"%s\" wird in \"%s\" auf dem Remotecomputer kopiert.", + "loc.messages.UploadFileFailed": "Fehler beim Hochladen von %s auf %s auf dem Remotecomputer. %s", + "loc.messages.UseDefaultPort": "Port 22 wird als Standardeinstellung für SSH verwendet, da kein Port angegeben wurde.", + "loc.messages.TargetNotCreated": "Der Zielordner \"%s\" kann nicht erstellt werden.", + "loc.messages.CheckingPathExistance": "Es wird überprüft, ob \"%s\" auf dem Remotecomputer vorhanden ist.", + "loc.messages.PathExists": "\"%s\" ist auf dem Remotecomputer vorhanden.", + "loc.messages.PathNotExists": "\"%s\" ist auf dem Remotecomputer nicht vorhanden." +} \ No newline at end of file diff --git a/_generated/CopyFilesOverSSHV0_Node20/Strings/resources.resjson/en-US/resources.resjson b/_generated/CopyFilesOverSSHV0_Node20/Strings/resources.resjson/en-US/resources.resjson new file mode 100644 index 000000000000..56323de2ea28 --- /dev/null +++ b/_generated/CopyFilesOverSSHV0_Node20/Strings/resources.resjson/en-US/resources.resjson @@ -0,0 +1,51 @@ +{ + "loc.friendlyName": "Copy files over SSH", + "loc.helpMarkDown": "[Learn more about this task](https://go.microsoft.com/fwlink/?LinkId=821894)", + "loc.description": "Copy files or build artifacts to a remote machine over SSH", + "loc.instanceNameFormat": "Securely copy files to the remote machine", + "loc.group.displayName.advanced": "Advanced", + "loc.input.label.sshEndpoint": "SSH service connection", + "loc.input.help.sshEndpoint": "SSH service connection with connection details for the remote machine.", + "loc.input.label.sourceFolder": "Source folder", + "loc.input.help.sourceFolder": "The source folder of the files to copy to the remote machine. When empty, the root of the repository (build) or artifacts directory (release) is used, which is $(System.DefaultWorkingDirectory). Use [variables](https://go.microsoft.com/fwlink/?LinkID=550988) if files are not in the repository. Example: $(Agent.BuildDirectory)", + "loc.input.label.contents": "Contents", + "loc.input.help.contents": "File paths to include as part of the copy. Supports multiple lines of minimatch patterns. [More Information](https://go.microsoft.com/fwlink/?LinkId=821894)", + "loc.input.label.targetFolder": "Target folder", + "loc.input.help.targetFolder": "Target folder on the remote machine to where files will be copied. Example: /home/user/MySite.", + "loc.input.label.isWindowsOnTarget": "Target machine running Windows", + "loc.input.help.isWindowsOnTarget": "Target machine running Windows", + "loc.input.label.cleanTargetFolder": "Clean target folder", + "loc.input.help.cleanTargetFolder": "Delete all existing files and subfolders in the target folder before copying.", + "loc.input.label.cleanHiddenFilesInTarget": "Remove hidden files in target folder", + "loc.input.help.cleanHiddenFilesInTarget": "Remove hidden files in the target folder.", + "loc.input.label.readyTimeout": "SSH handshake timeout", + "loc.input.help.readyTimeout": "How long (in milliseconds) to wait for the SSH handshake to complete.", + "loc.input.label.overwrite": "Overwrite", + "loc.input.help.overwrite": "Replace existing files in and beneath the target folder.", + "loc.input.label.failOnEmptySource": "Fail if no files found to copy", + "loc.input.help.failOnEmptySource": "Fail if no matching files to be copied are found under the source folder.", + "loc.input.label.flattenFolders": "Flatten folders", + "loc.input.help.flattenFolders": "Flatten the folder structure and copy all files into the specified target folder on the remote machine.", + "loc.messages.CheckLogForStdErr": "Check the build log for STDERR from the command.", + "loc.messages.CleanTargetFolder": "Cleaning target folder %s on the remote machine", + "loc.messages.CleanTargetFolderFailed": "Failed to clean the target folder on the remote machine. %s", + "loc.messages.ConnectionFailed": "Failed to connect to remote machine. Verify the SSH service connection details. %s.", + "loc.messages.ConnectionNotSetup": "SSH service connection is not set up.", + "loc.messages.CopyCompleted": "Completed copying %s files to the remote machine.", + "loc.messages.CopyingFiles": "Found %s files to copy to the remote machine.", + "loc.messages.FailedOnFile": "Failed to copy %s. %s", + "loc.messages.FileExists": "File %s cannot be copied to the remote machine because it already exists and the 'Overwrite' option is disabled.", + "loc.messages.NothingToCopy": "No files were found matching the patterns specified to copy to the remote machine.", + "loc.messages.NumberFailed": "Failed to copy %d files", + "loc.messages.RemoteCmdExecutionErr": "Command %s failed with errors on remote machine. %s.", + "loc.messages.RemoteCmdNonZeroExitCode": "Command %s exited with code %s.", + "loc.messages.SettingUpSSHConnection": "Setting up SSH service connection to remote host %s.", + "loc.messages.SourceNotFolder": "Source folder has to be a valid folder path.", + "loc.messages.StartedFileCopy": "Copying file %s to %s on remote machine.", + "loc.messages.UploadFileFailed": "Failed to upload %s to %s on remote machine. %s.", + "loc.messages.UseDefaultPort": "Using port 22 which is the default for SSH since no port was specified.", + "loc.messages.TargetNotCreated": "Unable to create target folder %s.", + "loc.messages.CheckingPathExistance": "Checking if %s on the remote machine exists.", + "loc.messages.PathExists": "%s exists on the remote machine", + "loc.messages.PathNotExists": "%s doesn't exist on the remote machine" +} \ No newline at end of file diff --git a/_generated/CopyFilesOverSSHV0_Node20/Strings/resources.resjson/es-ES/resources.resjson b/_generated/CopyFilesOverSSHV0_Node20/Strings/resources.resjson/es-ES/resources.resjson new file mode 100644 index 000000000000..1157485cf0be --- /dev/null +++ b/_generated/CopyFilesOverSSHV0_Node20/Strings/resources.resjson/es-ES/resources.resjson @@ -0,0 +1,51 @@ +{ + "loc.friendlyName": "Copiar archivos a través de SSH", + "loc.helpMarkDown": "[Obtener más información acerca de esta tarea](https://go.microsoft.com/fwlink/?LinkId=821894)", + "loc.description": "Copia los archivos o artefactos de compilación en una máquina remota a través de SSH", + "loc.instanceNameFormat": "Copiar los archivos de forma segura en la máquina remota", + "loc.group.displayName.advanced": "Avanzado", + "loc.input.label.sshEndpoint": "Conexión de servicio SSH", + "loc.input.help.sshEndpoint": "Conexión de servicio SSH con los detalles de conexión para la máquina remota.", + "loc.input.label.sourceFolder": "Carpeta de origen", + "loc.input.help.sourceFolder": "Carpeta de origen de los archivos que se van a copiar en la máquina remota. Si se deja vacío, se usa la raíz del repositorio (compilación) o el directorio de artefactos (versión), que es $(System.DefaultWorkingDirectory). Use [variables](https://go.microsoft.com/fwlink/?LinkID=550988) si los archivos no están en el repositorio. Ejemplo: $(Agent.BuildDirectory)", + "loc.input.label.contents": "Contenido", + "loc.input.help.contents": "Rutas de acceso de archivo que deben incluirse como parte de la copia. Se admiten varias líneas de patrones de minimatch. [Más información](https://go.microsoft.com/fwlink/?LinkId=821894)", + "loc.input.label.targetFolder": "Carpeta de destino", + "loc.input.help.targetFolder": "Carpeta de destino de la máquina remota donde se copiarán los archivos. Ejemplo: /home/user/MiSitio.", + "loc.input.label.isWindowsOnTarget": "Máquina de destino que ejecuta Windows", + "loc.input.help.isWindowsOnTarget": "Máquina de destino que ejecuta Windows", + "loc.input.label.cleanTargetFolder": "Borrar carpeta de destino", + "loc.input.help.cleanTargetFolder": "Elimina todos los archivos y subcarpetas que haya en la carpeta de destino antes de la copia.", + "loc.input.label.cleanHiddenFilesInTarget": "Quitar archivos ocultos en carpetas de destino", + "loc.input.help.cleanHiddenFilesInTarget": "Quitar archivos ocultos en la carpeta de destino", + "loc.input.label.readyTimeout": "Tiempo de expiración del protocolo de enlace SSH", + "loc.input.help.readyTimeout": "Tiempo (en milisegundos) que debe esperarse para que se complete el protocolo de enlace SSH.", + "loc.input.label.overwrite": "Sobrescribir", + "loc.input.help.overwrite": "Reemplaza los archivos existentes en la carpeta de destino y sus subcarpetas.", + "loc.input.label.failOnEmptySource": "Da error si no se encuentran archivos para copiar", + "loc.input.help.failOnEmptySource": "Da error si no se encuentran archivos coincidentes para copiar en la carpeta de origen.", + "loc.input.label.flattenFolders": "Aplanar carpetas", + "loc.input.help.flattenFolders": "Aplana la estructura de carpetas y copia todos los archivos en la carpeta de destino especificada en la máquina remota.", + "loc.messages.CheckLogForStdErr": "Compruebe el registro de compilación para ver si el comando devolvió STDERR.", + "loc.messages.CleanTargetFolder": "Se está limpiando la carpeta de destino %s en la máquina remota", + "loc.messages.CleanTargetFolderFailed": "No se pudo limpiar la carpeta de destino en la máquina remota. %s", + "loc.messages.ConnectionFailed": "No se pudo conectar a la máquina remota. Compruebe los detalles de la conexión de servicio SSH. %s.", + "loc.messages.ConnectionNotSetup": "La conexión de servicio SSH no está configurada.", + "loc.messages.CopyCompleted": "Se completó la copia de %s archivos en la máquina remota.", + "loc.messages.CopyingFiles": "Se encontraron %s archivos para copiar en la máquina remota.", + "loc.messages.FailedOnFile": "No se pudo copiar %s. %s", + "loc.messages.FileExists": "El archivo %s no se puede copiar en la máquina remota porque ya existe y la opción 'Sobrescribir' está deshabilitada.", + "loc.messages.NothingToCopy": "No se encontraron archivos con los patrones especificados para copiarlos en la máquina remota.", + "loc.messages.NumberFailed": "No se pudieron copiar %d archivos", + "loc.messages.RemoteCmdExecutionErr": "No se pudo ejecutar el comando %s debido a errores en la máquina remota. %s.", + "loc.messages.RemoteCmdNonZeroExitCode": "El comando %s finalizó con el código %s.", + "loc.messages.SettingUpSSHConnection": "Configurando la conexión de servicio SSH con el host remoto %s.", + "loc.messages.SourceNotFolder": "La carpeta de origen debe ser una ruta de acceso de carpeta válida.", + "loc.messages.StartedFileCopy": "Copiando el archivo %s en %s en la máquina remota.", + "loc.messages.UploadFileFailed": "No se pudo cargar %s en %s en la máquina remota. %s.", + "loc.messages.UseDefaultPort": "Usando el puerto 22, que es el predeterminado para SSH, porque no se especificó ningún puerto.", + "loc.messages.TargetNotCreated": "No se puede crear la carpeta de destino %s.", + "loc.messages.CheckingPathExistance": "Comprobando si existe %s en la máquina remota.", + "loc.messages.PathExists": "El elemento %s existe en la máquina remota", + "loc.messages.PathNotExists": "El elemento %s no existe en la máquina remota" +} \ No newline at end of file diff --git a/_generated/CopyFilesOverSSHV0_Node20/Strings/resources.resjson/fr-FR/resources.resjson b/_generated/CopyFilesOverSSHV0_Node20/Strings/resources.resjson/fr-FR/resources.resjson new file mode 100644 index 000000000000..80892c889eed --- /dev/null +++ b/_generated/CopyFilesOverSSHV0_Node20/Strings/resources.resjson/fr-FR/resources.resjson @@ -0,0 +1,51 @@ +{ + "loc.friendlyName": "Copier des fichiers via SSH", + "loc.helpMarkDown": "[En savoir plus sur cette tâche](https://go.microsoft.com/fwlink/?LinkId=821894)", + "loc.description": "Copier des fichiers ou des artefacts de build vers une machine distante via SSH", + "loc.instanceNameFormat": "Copier les fichiers de manière sécurisée sur la machine distante", + "loc.group.displayName.advanced": "Avancé", + "loc.input.label.sshEndpoint": "Connexion de service SSH", + "loc.input.help.sshEndpoint": "Connexion de service SSH avec les détails de connexion pour la machine distante.", + "loc.input.label.sourceFolder": "Dossier source", + "loc.input.help.sourceFolder": "Dossier source des fichiers à copier vers la machine distante. Quand aucune valeur n'est spécifiée, la racine du répertoire de dépôt (build) ou du répertoire d'artefacts (mise en production) est utilisée, c'est-à-dire $(System.DefaultWorkingDirectory). Utilisez des [variables](https://go.microsoft.com/fwlink/?LinkID=550988), si les fichiers ne sont pas dans le dépôt. Exemple : $(Agent.BuildDirectory)", + "loc.input.label.contents": "Contenu", + "loc.input.help.contents": "Chemins de fichiers à inclure dans le cadre de la copie. Prend en charge plusieurs lignes de modèles minimatch. [Plus d'informations](https://go.microsoft.com/fwlink/?LinkId=821894)", + "loc.input.label.targetFolder": "Dossier cible", + "loc.input.help.targetFolder": "Dossier cible de la machine distante, où les fichiers doivent être copiés. Exemple : /home/user/MySite.", + "loc.input.label.isWindowsOnTarget": "Machine cible exécutant Windows", + "loc.input.help.isWindowsOnTarget": "Machine cible exécutant Windows", + "loc.input.label.cleanTargetFolder": "Effacer le dossier cible", + "loc.input.help.cleanTargetFolder": "Supprimez tous les fichiers et sous-dossiers existants dans le dossier cible avant la copie.", + "loc.input.label.cleanHiddenFilesInTarget": "Supprimer les fichiers masqués dans le dossier cible", + "loc.input.help.cleanHiddenFilesInTarget": "Supprimez les fichiers masqués dans le dossier cible.", + "loc.input.label.readyTimeout": "Délai d'expiration de l'établissement d'une liaison SSH", + "loc.input.help.readyTimeout": "Durée (en millisecondes) d'attente de la fin de l'établissement d'une liaison SSH.", + "loc.input.label.overwrite": "Remplacer", + "loc.input.help.overwrite": "Remplacez les fichiers existants dans le dossier cible et ses sous-dossiers.", + "loc.input.label.failOnEmptySource": "Échec si les fichiers à copier sont introuvables", + "loc.input.help.failOnEmptySource": "Échec si les fichiers correspondants à copier sont introuvables dans le dossier source.", + "loc.input.label.flattenFolders": "Aplatir les dossiers", + "loc.input.help.flattenFolders": "Aplatit la structure du dossier et copie tous les fichiers dans le dossier cible spécifié sur la machine distante.", + "loc.messages.CheckLogForStdErr": "Recherchez dans le journal de génération un STDERR de la commande.", + "loc.messages.CleanTargetFolder": "Nettoyage du dossier cible %s sur la machine distante", + "loc.messages.CleanTargetFolderFailed": "Échec du nettoyage du dossier cible sur la machine distante. %s", + "loc.messages.ConnectionFailed": "Échec de la connexion à la machine distante. Vérifiez les détails de la connexion de service SSH. %s.", + "loc.messages.ConnectionNotSetup": "La connexion de service SSH n'est pas configurée.", + "loc.messages.CopyCompleted": "Fin de la copie de %s fichiers sur la machine distante.", + "loc.messages.CopyingFiles": "Détection de %s fichiers à copier sur la machine distante.", + "loc.messages.FailedOnFile": "Échec de la copie de %s. %s", + "loc.messages.FileExists": "Impossible de copier le fichier %s sur la machine distante, car il existe déjà et l'option 'Remplacer' est désactivée.", + "loc.messages.NothingToCopy": "Les fichiers qui correspondent aux modèles spécifiés et qui sont à copier vers la machine distante sont introuvables.", + "loc.messages.NumberFailed": "Échec de la copie de %d fichiers", + "loc.messages.RemoteCmdExecutionErr": "La commande %s a échoué avec des erreurs sur la machine distante. %s.", + "loc.messages.RemoteCmdNonZeroExitCode": "Arrêt de la commande %s. Code %s.", + "loc.messages.SettingUpSSHConnection": "Configuration de la connexion de service SSH à l'hôte distant %s.", + "loc.messages.SourceNotFolder": "Le dossier source doit être un chemin de dossier valide.", + "loc.messages.StartedFileCopy": "Copie du fichier %s vers %s sur la machine distante.", + "loc.messages.UploadFileFailed": "Échec du chargement de %s vers %s sur la machine distante. %s.", + "loc.messages.UseDefaultPort": "Utilisation du port 22, qui représente la valeur par défaut pour SSH, car aucun port n'a été spécifié.", + "loc.messages.TargetNotCreated": "Impossible de créer le dossier cible %s.", + "loc.messages.CheckingPathExistance": "Vérification de l'existence de %s sur la machine distante.", + "loc.messages.PathExists": "%s existe sur la machine distante", + "loc.messages.PathNotExists": "%s n'existe pas sur la machine distante" +} \ No newline at end of file diff --git a/_generated/CopyFilesOverSSHV0_Node20/Strings/resources.resjson/it-IT/resources.resjson b/_generated/CopyFilesOverSSHV0_Node20/Strings/resources.resjson/it-IT/resources.resjson new file mode 100644 index 000000000000..d92c9d81e2e8 --- /dev/null +++ b/_generated/CopyFilesOverSSHV0_Node20/Strings/resources.resjson/it-IT/resources.resjson @@ -0,0 +1,51 @@ +{ + "loc.friendlyName": "Copia file tramite SSH", + "loc.helpMarkDown": "[Altre informazioni su questa attività](https://go.microsoft.com/fwlink/?LinkId=821894)", + "loc.description": "Copia i file o gli artefatti di compilazione in un computer remoto tramite SSH", + "loc.instanceNameFormat": "Copia i file in modo sicuro nel computer remoto", + "loc.group.displayName.advanced": "Avanzate", + "loc.input.label.sshEndpoint": "Connessione al servizio SSH", + "loc.input.help.sshEndpoint": "Connessione al servizio SSH con i dettagli della connessione per il computer remoto.", + "loc.input.label.sourceFolder": "Cartella di origine", + "loc.input.help.sourceFolder": "Cartella di origine dei file da copiare nel computer remoto. Se si lascia vuoto il campo, verrà usata la radice del repository (compilazione) o la directory degli artefatti (versione), che è $(System.DefaultWorkingDirectory). Usare le [variabili](https://go.microsoft.com/fwlink/?LinkID=550988) se i file non sono presenti nel repository. Esempio: $(Agent.BuildDirectory)", + "loc.input.label.contents": "Contenuti", + "loc.input.help.contents": "Percorsi di file da includere nella copia. Sono supportate più righe di criteri di corrispondenza minima. [Altre informazioni](https://go.microsoft.com/fwlink/?LinkId=821894)", + "loc.input.label.targetFolder": "Cartella di destinazione", + "loc.input.help.targetFolder": "Cartella di destinazione nel computer remoto in cui verranno copiati i file. Esempio: /home/user/MySite.", + "loc.input.label.isWindowsOnTarget": "Computer di destinazione che esegue Windows", + "loc.input.help.isWindowsOnTarget": "Computer di destinazione che esegue Windows", + "loc.input.label.cleanTargetFolder": "Pulisci cartella di destinazione", + "loc.input.help.cleanTargetFolder": "Elimina tutti i file e le sottocartelle esistenti nella cartella di destinazione prima della copia.", + "loc.input.label.cleanHiddenFilesInTarget": "Rimuovi i file nascosti nella cartella di destinazione", + "loc.input.help.cleanHiddenFilesInTarget": "Consente di rimuovere i file nascosti nella cartella di destinazione.", + "loc.input.label.readyTimeout": "Timeout per handshake SSH", + "loc.input.help.readyTimeout": "Indica per quanto tempo (in millisecondi) attendere il completamento dell'handshake SSH.", + "loc.input.label.overwrite": "Sovrascrivi", + "loc.input.help.overwrite": "Sostituisce i file esistenti nella cartella di destinazione e al di sotto di essa.", + "loc.input.label.failOnEmptySource": "Non riesce se non vengono trovati file da copiare", + "loc.input.help.failOnEmptySource": "Non riesce se nella cartella di origine non vengono trovati file corrispondenti da copiare.", + "loc.input.label.flattenFolders": "Rendi flat le cartelle", + "loc.input.help.flattenFolders": "Rende flat la struttura di cartelle e copia tutti i file nella cartella di destinazione specificata nel computer remoto.", + "loc.messages.CheckLogForStdErr": "Per gli errori STDERR restituiti dal comando, vedere il log di compilazione.", + "loc.messages.CleanTargetFolder": "Pulizia della cartella di destinazione %s nel computer remoto", + "loc.messages.CleanTargetFolderFailed": "Non è stato possibile pulire la cartella di destinazione nel computer remoto. %s", + "loc.messages.ConnectionFailed": "Non è stato possibile connettersi al computer remoto. Verificare i dettagli della connessione al servizio SSH. %s.", + "loc.messages.ConnectionNotSetup": "La connessione al servizio SSH non è configurata.", + "loc.messages.CopyCompleted": "La copia di %s file nel computer remoto è stata completata.", + "loc.messages.CopyingFiles": "Sono stati trovati %s file da copiare nel computer remoto.", + "loc.messages.FailedOnFile": "Non è stato possibile copiare %s. %s", + "loc.messages.FileExists": "Non è possibile copiare il file %s nel computer remoto perché esiste già e l'opzione 'Sovrascrivi' è disabilitata.", + "loc.messages.NothingToCopy": "Non sono stati trovati file da copiare nel computer remoto corrispondenti ai criteri specificati.", + "loc.messages.NumberFailed": "Non è stato possibile copiare %d file", + "loc.messages.RemoteCmdExecutionErr": "Il comando %s non è riuscito e si sono verificati errori nel computer remoto. %s.", + "loc.messages.RemoteCmdNonZeroExitCode": "Il comando %s è stato terminato. Codice: %s.", + "loc.messages.SettingUpSSHConnection": "Configurazione della connessione al servizio SSH per l'host remoto %s.", + "loc.messages.SourceNotFolder": "La cartella di origine deve essere un percorso di cartella valido.", + "loc.messages.StartedFileCopy": "Copia del file %s in %s nel computer remoto.", + "loc.messages.UploadFileFailed": "Non è stato possibile caricare %s in %s nel computer remoto. %s.", + "loc.messages.UseDefaultPort": "Verrà usata la porta 22 che corrisponde a quella predefinita per SSH perché non è stata specificata alcuna porta.", + "loc.messages.TargetNotCreated": "Non è possibile creare la cartella di destinazione %s.", + "loc.messages.CheckingPathExistance": "Verifica dell'esistenza di %s nel computer remoto.", + "loc.messages.PathExists": "%s è presente nel computer remoto", + "loc.messages.PathNotExists": "%s non è presente nel computer remoto" +} \ No newline at end of file diff --git a/_generated/CopyFilesOverSSHV0_Node20/Strings/resources.resjson/ja-JP/resources.resjson b/_generated/CopyFilesOverSSHV0_Node20/Strings/resources.resjson/ja-JP/resources.resjson new file mode 100644 index 000000000000..7a3a4d3585e6 --- /dev/null +++ b/_generated/CopyFilesOverSSHV0_Node20/Strings/resources.resjson/ja-JP/resources.resjson @@ -0,0 +1,51 @@ +{ + "loc.friendlyName": "SSH によるファイルのコピー", + "loc.helpMarkDown": "[このタスクの詳細を表示](https://go.microsoft.com/fwlink/?LinkId=821894)", + "loc.description": "SSH を使用してリモート コンピューターにファイルをコピーするか、成果物を作成します", + "loc.instanceNameFormat": "リモート コンピューターにファイルを安全にコピーする", + "loc.group.displayName.advanced": "詳細設定", + "loc.input.label.sshEndpoint": "SSH サービス接続", + "loc.input.help.sshEndpoint": "リモート マシンの接続詳細が設定された SSH サービス接続。", + "loc.input.label.sourceFolder": "ソース フォルダー", + "loc.input.help.sourceFolder": "リモート マシンにコピーするファイルのソース フォルダーです。空にすると、リポジトリ (ビルド) または成果物ディレクトリ (リリース) のルートが使用されます (これは $(System.DefaultWorkingDirectory) です)。ファイルがリポジトリにない場合は、[変数](https://go.microsoft.com/fwlink/?LinkID=550988)を使用します。例: $(Agent.BuildDirectory)", + "loc.input.label.contents": "コンテンツ", + "loc.input.help.contents": "コピーの一部として含めるファイル パス。複数行の minimatch パターンをサポートします。[詳細情報](https://go.microsoft.com/fwlink/?LinkId=821894)", + "loc.input.label.targetFolder": "ターゲット フォルダー", + "loc.input.help.targetFolder": "ファイルのコピー先となるリモート コンピューター上のターゲット フォルダー。例: /home/user/MySite。", + "loc.input.label.isWindowsOnTarget": "Windows を実行しているターゲット マシン", + "loc.input.help.isWindowsOnTarget": "Windows を実行しているターゲット マシン", + "loc.input.label.cleanTargetFolder": "ターゲット フォルダーを空にする", + "loc.input.help.cleanTargetFolder": "コピーする前に、ターゲット フォルダーにあるすべての既存のファイルとサブフォルダーを削除します。", + "loc.input.label.cleanHiddenFilesInTarget": "ターゲット フォルダー内の隠しファイルを削除する", + "loc.input.help.cleanHiddenFilesInTarget": "ターゲット フォルダー内の隠しファイルを削除します。", + "loc.input.label.readyTimeout": "SSH ハンドシェイクのタイムアウト", + "loc.input.help.readyTimeout": "SSH ハンドシェイクの完了を待機する時間 (ミリ秒)。", + "loc.input.label.overwrite": "上書き", + "loc.input.help.overwrite": "ターゲット フォルダーとその下のフォルダーにある既存のファイルを置換します。", + "loc.input.label.failOnEmptySource": "コピーするファイルが見つからない場合に、失敗します", + "loc.input.help.failOnEmptySource": "ソース フォルダーの下に一致するコピー対象のファイルが見つからない場合に、失敗します。", + "loc.input.label.flattenFolders": "フォルダーのフラット化", + "loc.input.help.flattenFolders": "フォルダー構造をフラットにし、すべてのファイルを、リモート コンピューター上にある指定のターゲット フォルダーにコピーします。", + "loc.messages.CheckLogForStdErr": "コマンドからの STDERR がないかビルド ログをご確認ください。", + "loc.messages.CleanTargetFolder": "リモート コンピューター上のターゲット フォルダー %s を空にしています", + "loc.messages.CleanTargetFolderFailed": "リモート コンピューター上のターゲット フォルダーを空にできませんでした。%s", + "loc.messages.ConnectionFailed": "リモート マシンに接続できませんでした。SSH サービス接続の詳細を確認してください。%s。", + "loc.messages.ConnectionNotSetup": "SSH サービス接続が設定されていません。", + "loc.messages.CopyCompleted": "リモート マシンへの %s 個のファイルのコピーが完了しました。", + "loc.messages.CopyingFiles": "リモート マシンにコピーする %s 個のファイルが見つかりました。", + "loc.messages.FailedOnFile": "%s のコピーに失敗しました。%s", + "loc.messages.FileExists": "ファイル %s はリモート コンピューターにコピーできません。このファイルは既に存在し、'上書き' オプションが無効です。", + "loc.messages.NothingToCopy": "リモート コンピューターにコピーするために指定したパターンと一致するファイルが見つかりませんでした。", + "loc.messages.NumberFailed": "%d 個のファイルのコピーに失敗しました", + "loc.messages.RemoteCmdExecutionErr": "コマンド %s がリモート コンピューター上のエラーで失敗しました。%s。", + "loc.messages.RemoteCmdNonZeroExitCode": "コマンド %s がコード %s で終了しました。", + "loc.messages.SettingUpSSHConnection": "リモート ホスト %s への SSH サービス接続を設定しています。", + "loc.messages.SourceNotFolder": "ソース フォルダーには有効なフォルダー パスを指定する必要があります。", + "loc.messages.StartedFileCopy": "ファイル %s をリモート コンピューター上の %s にコピーしています。", + "loc.messages.UploadFileFailed": "%s をリモート コンピューター上の %s にアップロードできませんでした。%s。", + "loc.messages.UseDefaultPort": "ポートが指定されなかったため、SSH で既定のポート 22 を使用しています。", + "loc.messages.TargetNotCreated": "ターゲット フォルダー %s を作成できません。", + "loc.messages.CheckingPathExistance": "リモート マシン上に %s が存在するかどうかを確認しています。", + "loc.messages.PathExists": "リモート マシンに %s が存在します", + "loc.messages.PathNotExists": "リモート マシンに %s が存在しません" +} \ No newline at end of file diff --git a/_generated/CopyFilesOverSSHV0_Node20/Strings/resources.resjson/ko-KR/resources.resjson b/_generated/CopyFilesOverSSHV0_Node20/Strings/resources.resjson/ko-KR/resources.resjson new file mode 100644 index 000000000000..72917d80624f --- /dev/null +++ b/_generated/CopyFilesOverSSHV0_Node20/Strings/resources.resjson/ko-KR/resources.resjson @@ -0,0 +1,51 @@ +{ + "loc.friendlyName": "SSH를 통해 파일 복사", + "loc.helpMarkDown": "[이 작업에 대한 자세한 정보](https://go.microsoft.com/fwlink/?LinkId=821894)", + "loc.description": "SSH를 통해 파일 또는 빌드 아티팩트를 원격 컴퓨터에 복사합니다.", + "loc.instanceNameFormat": "파일을 원격 컴퓨터에 안전하게 복사", + "loc.group.displayName.advanced": "고급", + "loc.input.label.sshEndpoint": "SSH 서비스 연결", + "loc.input.help.sshEndpoint": "원격 머신의 연결 정보가 있는 SSH 서비스 연결입니다.", + "loc.input.label.sourceFolder": "소스 폴더", + "loc.input.help.sourceFolder": "원격 컴퓨터에 복사할 파일의 소스 폴더입니다. 비어 있으면 리포지토리(빌드) 또는 아티팩트 디렉터리(릴리스)의 루트인 $(System.DefaultWorkingDirectory)이(가) 사용됩니다. 파일이 리포지토리에 없으면 [변수](https://go.microsoft.com/fwlink/?LinkID=550988)를 사용하세요. 예: $(Agent.BuildDirectory)", + "loc.input.label.contents": "콘텐츠", + "loc.input.help.contents": "복사의 일부로 포함할 파일 경로입니다. 여러 줄로 된 minimatch 패턴을 지원합니다. [자세한 정보](https://go.microsoft.com/fwlink/?LinkId=821894)", + "loc.input.label.targetFolder": "대상 폴더", + "loc.input.help.targetFolder": "파일을 복사할 원격 컴퓨터의 대상 폴더입니다. 예: /home/user/MySite.", + "loc.input.label.isWindowsOnTarget": "Windows를 실행하는 대상 컴퓨터", + "loc.input.help.isWindowsOnTarget": "Windows를 실행하는 대상 컴퓨터", + "loc.input.label.cleanTargetFolder": "대상 폴더 정리", + "loc.input.help.cleanTargetFolder": "복사하기 전에 대상 폴더의 모든 기존 파일과 하위 폴더를 삭제합니다.", + "loc.input.label.cleanHiddenFilesInTarget": "대상 폴더에서 숨김 파일 제거", + "loc.input.help.cleanHiddenFilesInTarget": "대상 폴더에서 숨김 파일을 제거합니다.", + "loc.input.label.readyTimeout": "SSH 핸드셰이크 시간 제한", + "loc.input.help.readyTimeout": "SSH 핸드셰이크가 완료될 때까지 대기하는 시간(밀리초)입니다.", + "loc.input.label.overwrite": "덮어쓰기", + "loc.input.help.overwrite": "대상 폴더의 기존 파일을 바꿉니다.", + "loc.input.label.failOnEmptySource": "복사할 파일이 없는 경우 실패", + "loc.input.help.failOnEmptySource": "소스 폴더에서 일치하는 복사 대상 파일을 찾을 수 없는 경우 실패합니다.", + "loc.input.label.flattenFolders": "폴더 평면화", + "loc.input.help.flattenFolders": "폴더 구조를 평면화하고 모든 파일을 원격 컴퓨터의 지정된 대상 폴더에 복사합니다.", + "loc.messages.CheckLogForStdErr": "명령에서 STDERR에 대한 빌드 로그를 확인하세요.", + "loc.messages.CleanTargetFolder": "원격 컴퓨터에서 대상 폴더 %s을(를) 정리하는 중", + "loc.messages.CleanTargetFolderFailed": "원격 컴퓨터에서 대상 폴더를 정리하지 못했습니다. %s", + "loc.messages.ConnectionFailed": "원격 머신에 연결하지 못했습니다. SSH 서비스 연결 정보를 확인하세요. %s.", + "loc.messages.ConnectionNotSetup": "SSH 서비스 연결이 설정되지 않았습니다.", + "loc.messages.CopyCompleted": "원격 컴퓨터에 %s개 파일 복사를 완료했습니다.", + "loc.messages.CopyingFiles": "원격 컴퓨터에 복사할 파일 %s개를 찾았습니다.", + "loc.messages.FailedOnFile": "%s을(를) 복사하지 못했습니다. %s", + "loc.messages.FileExists": "%s 파일이 이미 있고 '덮어쓰기' 옵션이 사용하지 않도록 설정되어 있으므로 해당 파일을 원격 컴퓨터에 복사할 수 없습니다.", + "loc.messages.NothingToCopy": "원격 컴퓨터에 복사할 지정된 패턴과 일치하는 파일을 찾을 수 없습니다.", + "loc.messages.NumberFailed": "%d개 파일을 복사하지 못했습니다.", + "loc.messages.RemoteCmdExecutionErr": "원격 컴퓨터에서 오류가 발생하여 %s 명령이 실패했습니다. %s.", + "loc.messages.RemoteCmdNonZeroExitCode": "%s 명령이 종료되었습니다(코드: %s).", + "loc.messages.SettingUpSSHConnection": "원격 호스트 %s에 대한 SSH 서비스 연결을 설정하는 중입니다.", + "loc.messages.SourceNotFolder": "소스 폴더는 유효한 폴더 경로여야 합니다.", + "loc.messages.StartedFileCopy": "%s 파일을 원격 컴퓨터의 %s에 복사하는 중입니다.", + "loc.messages.UploadFileFailed": "%s을(를) 원격 컴퓨터에 있는 %s에 업로드하지 못했습니다. %s.", + "loc.messages.UseDefaultPort": "포트가 지정되지 않았으므로 SSH에 대한 기본값인 포트 22를 사용합니다.", + "loc.messages.TargetNotCreated": "대상 폴더 %s을(를) 만들 수 없습니다.", + "loc.messages.CheckingPathExistance": "원격 머신에 %s이(가) 있는지 확인하는 중입니다.", + "loc.messages.PathExists": "%s이(가) 원격 머신에 있습니다.", + "loc.messages.PathNotExists": "%s이(가) 원격 머신에 없습니다." +} \ No newline at end of file diff --git a/_generated/CopyFilesOverSSHV0_Node20/Strings/resources.resjson/ru-RU/resources.resjson b/_generated/CopyFilesOverSSHV0_Node20/Strings/resources.resjson/ru-RU/resources.resjson new file mode 100644 index 000000000000..4beaf135d34f --- /dev/null +++ b/_generated/CopyFilesOverSSHV0_Node20/Strings/resources.resjson/ru-RU/resources.resjson @@ -0,0 +1,51 @@ +{ + "loc.friendlyName": "Копировать файлы по SSH", + "loc.helpMarkDown": "[См. дополнительные сведения об этой задаче](https://go.microsoft.com/fwlink/?LinkId=821894)", + "loc.description": "Копирование файлов или создание артефактов на удаленном компьютере через SSH-подключение", + "loc.instanceNameFormat": "Безопасное копирование файлов на удаленный компьютер", + "loc.group.displayName.advanced": "Дополнительно", + "loc.input.label.sshEndpoint": "Подключение к службе SSH", + "loc.input.help.sshEndpoint": "Подключение к службе SSH со сведениями о подключении для удаленного компьютера.", + "loc.input.label.sourceFolder": "Исходная папка", + "loc.input.help.sourceFolder": "Исходная папка для файлов, копируемых на удаленный компьютер. Если эта папка пуста, используется корневой каталог репозитория (сборка) или каталог артефактов (выпуск) (по умолчанию это каталог $(System.DefaultWorkingDirectory)). Если файлы отсутствуют в репозитории, используйте [переменные](https://go.microsoft.com/fwlink/?LinkID=550988). Пример: $(Agent.BuildDirectory)", + "loc.input.label.contents": "Содержимое", + "loc.input.help.contents": "Пути к файлам для включения в состав копии. Поддерживает несколько строк шаблонов minimatch. [Подробнее...](https://go.microsoft.com/fwlink/?LinkId=821894)", + "loc.input.label.targetFolder": "Целевая папка", + "loc.input.help.targetFolder": "Целевая папка на удаленном компьютере, в которую будут скопированы файлы. Пример: /home/user/MySite.", + "loc.input.label.isWindowsOnTarget": "Целевой компьютер под управлением Windows", + "loc.input.help.isWindowsOnTarget": "Целевой компьютер под управлением Windows", + "loc.input.label.cleanTargetFolder": "Очистить целевую папку", + "loc.input.help.cleanTargetFolder": "Удалите все существующие файлы и вложенные папки в целевой папке перед копированием.", + "loc.input.label.cleanHiddenFilesInTarget": "Удалить скрытые файлы в целевой папке", + "loc.input.help.cleanHiddenFilesInTarget": "Удалить скрытые файлы в целевой папке.", + "loc.input.label.readyTimeout": "Время ожидания подтверждения SSH", + "loc.input.help.readyTimeout": "Время (в миллисекундах) для ожидания завершения подтверждения SSH.", + "loc.input.label.overwrite": "Перезаписать", + "loc.input.help.overwrite": "Замените существующие файлы в целевой папке и во вложенных в нее папках.", + "loc.input.label.failOnEmptySource": "Если в исходной папке отсутствуют файлы для копирования, операция завершится сбоем.", + "loc.input.help.failOnEmptySource": "Если в исходной папке отсутствуют соответствующие файлы для копирования, операция завершится сбоем.", + "loc.input.label.flattenFolders": "Выполнить сведение папок", + "loc.input.help.flattenFolders": "Выполнение сведения структуры папок и копирование всех файлов в указанную целевую папку на удаленном компьютере.", + "loc.messages.CheckLogForStdErr": "Проверьте наличие в журнале сборки сообщений из потока STDERR от команды.", + "loc.messages.CleanTargetFolder": "Очистка целевой папки %s на удаленном компьютере", + "loc.messages.CleanTargetFolderFailed": "Не удалось очистить целевую папку на удаленном компьютере. %s", + "loc.messages.ConnectionFailed": "Не удалось подключиться к удаленному компьютеру. Проверьте сведения о подключении к службе SSH. %s.", + "loc.messages.ConnectionNotSetup": "Подключение к службе SSH не настроено.", + "loc.messages.CopyCompleted": "Завершено копирование файлов на удаленный компьютер (скопировано файлов: %s).", + "loc.messages.CopyingFiles": "Найдены файлы для копирования на удаленный компьютер: %s.", + "loc.messages.FailedOnFile": "Не удалось скопировать %s. %s", + "loc.messages.FileExists": "Файл %s невозможно копировать на удаленный компьютер, так как он уже существует, а параметр \"Перезаписать\" отключен.", + "loc.messages.NothingToCopy": "Не найдены файлы, соответствующие шаблону, указанному для копирования на удаленный компьютер.", + "loc.messages.NumberFailed": "Не удалось скопировать файлы: %d", + "loc.messages.RemoteCmdExecutionErr": "Сбой команды %s с ошибками на удаленном компьютере. %s.", + "loc.messages.RemoteCmdNonZeroExitCode": "Выход из команды %s с кодом %s.", + "loc.messages.SettingUpSSHConnection": "Настройка подключения службы SSH к удаленному узлу %s.", + "loc.messages.SourceNotFolder": "Исходная папка должна быть допустимым путем к папке.", + "loc.messages.StartedFileCopy": "Копирование файла %s в %s на удаленном компьютере.", + "loc.messages.UploadFileFailed": "Не удалось отправить %s в %s на удаленном компьютере. %s.", + "loc.messages.UseDefaultPort": "Используется порт 22, который является портом по умолчанию для SSH, так как порт не указан.", + "loc.messages.TargetNotCreated": "Не удалось создать целевую папку %s.", + "loc.messages.CheckingPathExistance": "Проверка наличия %s на удаленном компьютере.", + "loc.messages.PathExists": "%s существует на удаленном компьютере.", + "loc.messages.PathNotExists": "%s не существует на удаленном компьютере." +} \ No newline at end of file diff --git a/_generated/CopyFilesOverSSHV0_Node20/Strings/resources.resjson/zh-CN/resources.resjson b/_generated/CopyFilesOverSSHV0_Node20/Strings/resources.resjson/zh-CN/resources.resjson new file mode 100644 index 000000000000..c9ef76f5886c --- /dev/null +++ b/_generated/CopyFilesOverSSHV0_Node20/Strings/resources.resjson/zh-CN/resources.resjson @@ -0,0 +1,51 @@ +{ + "loc.friendlyName": "通过 SSH 复制文件", + "loc.helpMarkDown": "[详细了解此任务](https://go.microsoft.com/fwlink/?LinkId=821894)", + "loc.description": "通过 SSH 将文件或生成项目复制到远程计算机", + "loc.instanceNameFormat": "将文件安全复制到远程计算机", + "loc.group.displayName.advanced": "高级", + "loc.input.label.sshEndpoint": "SSH 服务连接", + "loc.input.help.sshEndpoint": "含远程计算机连接详细信息的 SSH 服务连接。", + "loc.input.label.sourceFolder": "源文件夹", + "loc.input.help.sourceFolder": "要复制到远程计算机的文件的源文件夹。文件夹为空时,将使用存储库(生成)的根目录或项目目录(发布),即 $(System.DefaultWorkingDirectory)。如果存储库中没有文件,请使用[变量](https://go.microsoft.com/fwlink/?LinkID=550988) 。示例: $(Agent.BuildDirectory)", + "loc.input.label.contents": "内容", + "loc.input.help.contents": "要包含在副本中的文件路径。支持多行最小匹配模式。[详细信息](https://go.microsoft.com/fwlink/?LinkId=821894)", + "loc.input.label.targetFolder": "目标文件夹", + "loc.input.help.targetFolder": "要将文件复制到其中的远程计算机上的目标文件夹。例如: /home/user/MySite。", + "loc.input.label.isWindowsOnTarget": "运行 Windows 的目标计算机", + "loc.input.help.isWindowsOnTarget": "运行 Windows 的目标计算机", + "loc.input.label.cleanTargetFolder": "清理目标文件夹", + "loc.input.help.cleanTargetFolder": "删除目标文件夹中所有现有文件和子文件夹,然后再复制。", + "loc.input.label.cleanHiddenFilesInTarget": "移除目标文件夹中的隐藏文件", + "loc.input.help.cleanHiddenFilesInTarget": "移除目标文件夹中的隐藏文件。", + "loc.input.label.readyTimeout": "SSH 握手超时", + "loc.input.help.readyTimeout": "等待 SSH 握手完成的时间(毫秒)。", + "loc.input.label.overwrite": "覆盖", + "loc.input.help.overwrite": "替换目标文件夹中及其子级文件夹中的现有文件。", + "loc.input.label.failOnEmptySource": "如果找不到要复制的文件,则失败", + "loc.input.help.failOnEmptySource": "如果在源文件夹下找不到要复制的匹配文件,则失败。", + "loc.input.label.flattenFolders": "精简文件夹", + "loc.input.help.flattenFolders": "精简文件夹结构,并将所有文件复制到远程计算机上的指定目标文件夹。", + "loc.messages.CheckLogForStdErr": "从命令检查 STDERR 生成日志。", + "loc.messages.CleanTargetFolder": "正在清理远程计算机上的目标文件夹 %s", + "loc.messages.CleanTargetFolderFailed": "未能清理远程计算机上的目标文件夹。%s", + "loc.messages.ConnectionFailed": "无法连接到远程计算机。验证 SSH 服务连接详细信息。%s。", + "loc.messages.ConnectionNotSetup": "未设置 SSH 服务连接。", + "loc.messages.CopyCompleted": "已将 %s 个文件复制到远程计算机。", + "loc.messages.CopyingFiles": "找到要复制到远程计算机的 %s 个文件。", + "loc.messages.FailedOnFile": "无法复制 %s。%s", + "loc.messages.FileExists": "无法将文件 %s 复制到远程计算机,因为它已经存在,并且禁用了“覆盖”选项。", + "loc.messages.NothingToCopy": "找不到与指定要复制到远程计算机的模式匹配的文件。", + "loc.messages.NumberFailed": "无法复制 %d 文件", + "loc.messages.RemoteCmdExecutionErr": "命令 %s 因远程计算机上的错误失败。%s。", + "loc.messages.RemoteCmdNonZeroExitCode": "命令 %s 已退出,代码为 %s。", + "loc.messages.SettingUpSSHConnection": "设置远程主机 %s 与 SSH 服务的连接。", + "loc.messages.SourceNotFolder": "源文件夹必须是有效文件夹路径。", + "loc.messages.StartedFileCopy": "正在将文件 %s 复制到远程计算机上的 %s。", + "loc.messages.UploadFileFailed": "未能将 %s 上传到远程计算机上的 %s。%s。", + "loc.messages.UseDefaultPort": "由于未指定端口,将使用SSH 的默认端口 22。", + "loc.messages.TargetNotCreated": "无法创建目标文件夹 %s。", + "loc.messages.CheckingPathExistance": "正在检查远程计算机上是否存在 %s。", + "loc.messages.PathExists": "远程计算机上仍存在 %s", + "loc.messages.PathNotExists": "远程计算机上不存在 %s" +} \ No newline at end of file diff --git a/_generated/CopyFilesOverSSHV0_Node20/Strings/resources.resjson/zh-TW/resources.resjson b/_generated/CopyFilesOverSSHV0_Node20/Strings/resources.resjson/zh-TW/resources.resjson new file mode 100644 index 000000000000..68e29db7861b --- /dev/null +++ b/_generated/CopyFilesOverSSHV0_Node20/Strings/resources.resjson/zh-TW/resources.resjson @@ -0,0 +1,51 @@ +{ + "loc.friendlyName": "透過 SSH 複製檔案", + "loc.helpMarkDown": "[深入了解此工作](https://go.microsoft.com/fwlink/?LinkId=821894)", + "loc.description": "透過 SSH 將檔案複製到遠端電或將成品建置到遠端電腦上", + "loc.instanceNameFormat": "安全地將檔案複製到遠端電腦", + "loc.group.displayName.advanced": "進階", + "loc.input.label.sshEndpoint": "SSH 服務連線", + "loc.input.help.sshEndpoint": "具有遠端電腦連線詳細資料的 SSH 服務連線。", + "loc.input.label.sourceFolder": "來源資料夾", + "loc.input.help.sourceFolder": "要複製到遠端電腦之檔案所在的來源資料夾。若為空白,將會使用存放庫 (組建) 或成品目錄 (發行) 的根資料夾,亦即 $(System.DefaultWorkingDirectory)。若檔案不在存放庫中,請使用 [變數](https://go.microsoft.com/fwlink/?LinkID=550988)。例如: $(Agent.BuildDirectory)", + "loc.input.label.contents": "內容", + "loc.input.help.contents": "要一併複製的檔案路徑。支援多行的 minimatch 樣式。[詳細資訊](https://go.microsoft.com/fwlink/?LinkId=821894)", + "loc.input.label.targetFolder": "目標資料夾", + "loc.input.help.targetFolder": "遠端電腦上要用以存放所複製之檔案的目標資料夾。例如: /home/user/MySite。", + "loc.input.label.isWindowsOnTarget": "執行 Windows 的目標電腦", + "loc.input.help.isWindowsOnTarget": "執行 Windows 的目標電腦", + "loc.input.label.cleanTargetFolder": "清理目標資料夾", + "loc.input.help.cleanTargetFolder": "複製前,請先刪除目標資料夾中現有的檔案與子資料夾。", + "loc.input.label.cleanHiddenFilesInTarget": "移除目標檔案夾中的隱藏檔案", + "loc.input.help.cleanHiddenFilesInTarget": "移除目標檔案夾中的隱藏檔案。", + "loc.input.label.readyTimeout": "SSH 交握逾時", + "loc.input.help.readyTimeout": "等候 SSH 交握完成所需的時間 (毫秒)。", + "loc.input.label.overwrite": "覆寫", + "loc.input.help.overwrite": "取代目標資料夾中及其下現有的檔案。", + "loc.input.label.failOnEmptySource": "若找不到要複製的檔案便會失敗", + "loc.input.help.failOnEmptySource": "若在來源資料夾中找不到要複製的檔案,作業便會失敗。", + "loc.input.label.flattenFolders": "壓平合併資料夾", + "loc.input.help.flattenFolders": "壓平合併資料夾結構,並將所有檔案複製到遠端電腦上指定的目標資料夾中。", + "loc.messages.CheckLogForStdErr": "請查看建置記錄中的命令有無 STDERR。", + "loc.messages.CleanTargetFolder": "清理遠端電腦上的目標資料夾 %s", + "loc.messages.CleanTargetFolderFailed": "無法清理遠端電腦上的目標資料夾。%s", + "loc.messages.ConnectionFailed": "無法連線到遠端電腦。請驗證 SSH 服務連線的詳細資料。%s。", + "loc.messages.ConnectionNotSetup": "SSH 服務連線未設定。", + "loc.messages.CopyCompleted": "已完成將 %s 個檔案複製到遠端電腦。", + "loc.messages.CopyingFiles": "共找到 %s 檔案可複製到遠端電腦。", + "loc.messages.FailedOnFile": "無法複製%s。%s", + "loc.messages.FileExists": "因為檔案 %s 已存在,且 [覆寫] 選項為停用,所以無法將該檔案複製到遠端電腦。", + "loc.messages.NothingToCopy": "找不到任何檔案符合指定樣式可以複製到遠端電腦。", + "loc.messages.NumberFailed": "無法複製 %d 個檔案", + "loc.messages.RemoteCmdExecutionErr": "遠端電腦發生錯誤,導致命令 %s 失敗。%s。", + "loc.messages.RemoteCmdNonZeroExitCode": "命令 %s 在程式碼 %s 結束。", + "loc.messages.SettingUpSSHConnection": "正在對遠端主機 %s 設定 SSH 服務連線。", + "loc.messages.SourceNotFolder": "來源資料夾必須是有效的資料夾路徑。", + "loc.messages.StartedFileCopy": "正在將檔案 %s 複製到遠端電腦上的 %s。", + "loc.messages.UploadFileFailed": "無法將 %s 上傳到遠端電腦上的 %s。%s。", + "loc.messages.UseDefaultPort": "因為未指定任何連接埠,所以將使用 SSH 的預設連接埠 22。", + "loc.messages.TargetNotCreated": "無法建立目標資料夾 %s。", + "loc.messages.CheckingPathExistance": "檢查遠端電腦上是否有 %s。", + "loc.messages.PathExists": "遠端電腦上有 %s", + "loc.messages.PathNotExists": "遠端電腦上沒有 %s" +} \ No newline at end of file diff --git a/_generated/CopyFilesOverSSHV0_Node20/Tests/L0.ts b/_generated/CopyFilesOverSSHV0_Node20/Tests/L0.ts new file mode 100644 index 000000000000..84a2fe6e3dcb --- /dev/null +++ b/_generated/CopyFilesOverSSHV0_Node20/Tests/L0.ts @@ -0,0 +1,11 @@ +import * as utilsTests from './L0UtilsTests'; + +describe('CopyFilesOverSSHV0 Suite', function () { + before(() => { + }); + + after(() => { + }); + + utilsTests.run(); +}); diff --git a/_generated/CopyFilesOverSSHV0_Node20/Tests/L0UtilsTests.ts b/_generated/CopyFilesOverSSHV0_Node20/Tests/L0UtilsTests.ts new file mode 100644 index 000000000000..496d3e996a94 --- /dev/null +++ b/_generated/CopyFilesOverSSHV0_Node20/Tests/L0UtilsTests.ts @@ -0,0 +1,33 @@ +import assert = require('assert'); +import * as utils from '../utils'; + +export function run() { + context('Utils tests: ', function () { + it('Should recognize UNC paths', function (done: MochaDone) { + const paths: string[] = [ + '\\\\host\\one\\two', + '\\\\host\\one\\two\\', + '\\\\host\\one\\two/file', + '\\\\host/one/two/file' + ]; + for (const path of paths) { + assert(utils.pathIsUNC(path), `Should be recognized as UNC path: ${path}`); + } + done(); + }); + + it('Should not recognize strings as UNC paths', function (done: MochaDone) { + const paths: string[] = [ + '//host\\one\\two', + '//host\\one\\two\\', + '//host\\one\\two/file', + '//host/one/two/file', + '\\host\\one\\two', + ]; + for (const path of paths) { + assert(!utils.pathIsUNC(path), `Should not be recognized as UNC path: ${path}`); + } + done(); + }); + }); +} \ No newline at end of file diff --git a/_generated/CopyFilesOverSSHV0_Node20/Tests/package-lock.json b/_generated/CopyFilesOverSSHV0_Node20/Tests/package-lock.json new file mode 100644 index 000000000000..ba6519c9013a --- /dev/null +++ b/_generated/CopyFilesOverSSHV0_Node20/Tests/package-lock.json @@ -0,0 +1,14 @@ +{ + "name": "copy-files-over-ssh-tests", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/mocha": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", + "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==", + "dev": true + } + } +} diff --git a/_generated/CopyFilesOverSSHV0_Node20/Tests/package.json b/_generated/CopyFilesOverSSHV0_Node20/Tests/package.json new file mode 100644 index 000000000000..0e2ac431ff28 --- /dev/null +++ b/_generated/CopyFilesOverSSHV0_Node20/Tests/package.json @@ -0,0 +1,22 @@ +{ + "name": "copy-files-over-ssh-tests", + "version": "1.0.0", + "description": "Azure Pipelines Copy Files Over SSH V0 Task Tests", + "main": "L0.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/Microsoft/azure-pipelines-tasks.git" + }, + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Microsoft/azure-pipelines-tasks/issues" + }, + "homepage": "https://github.com/Microsoft/azure-pipelines-tasks#readme", + "devDependencies": { + "@types/mocha": "^5.2.7" + } +} diff --git a/_generated/CopyFilesOverSSHV0_Node20/ThirdPartyNotice.txt b/_generated/CopyFilesOverSSHV0_Node20/ThirdPartyNotice.txt new file mode 100644 index 000000000000..4eba1e4e41c0 --- /dev/null +++ b/_generated/CopyFilesOverSSHV0_Node20/ThirdPartyNotice.txt @@ -0,0 +1,774 @@ + +THIRD-PARTY SOFTWARE NOTICES AND INFORMATION +Do Not Translate or Localize + +This Azure DevOps extension (CopyFilesOverSSHV0) is based on or incorporates material from the projects listed below (Third Party IP). The original copyright notice and the license under which Microsoft received such Third Party IP, are set forth below. Such licenses and notices are provided for informational purposes only. Microsoft licenses the Third Party IP to you under the licensing terms for the Azure DevOps extension. Microsoft reserves all other rights not expressly granted under this agreement, whether by implication, estoppel or otherwise. + +1. asn1 (git://github.com/mcavage/node-asn1.git) +2. async (git+https://github.com/caolan/async.git) +3. balanced-match (git://github.com/juliangruber/balanced-match.git) +4. brace-expansion (git://github.com/juliangruber/brace-expansion.git) +5. concat-map (git://github.com/substack/node-concat-map.git) +6. core-util-is (git://github.com/isaacs/core-util-is.git) +7. fs.realpath (git+https://github.com/isaacs/fs.realpath.git) +8. glob (git://github.com/isaacs/node-glob.git) +9. glob (git://github.com/isaacs/node-glob.git) +10. inflight (git+https://github.com/npm/inflight.git) +11. inherits (git://github.com/isaacs/inherits.git) +12. isarray (git://github.com/juliangruber/isarray.git) +13. lodash (git+https://github.com/lodash/lodash.git) +14. minimatch (git://github.com/isaacs/minimatch.git) +15. mockery (git://github.com/mfncooper/mockery.git) +16. node-uuid (git+https://github.com/broofa/node-uuid.git) +17. once (git://github.com/isaacs/once.git) +18. path-is-absolute (git+https://github.com/sindresorhus/path-is-absolute.git) +19. q (git://github.com/kriskowal/q.git) +20. readable-stream (git://github.com/isaacs/readable-stream.git) +21. ssh2-sftp-client (git+https://github.com/theophilusx/ssh2-sftp-client.git) +22. semver (git+https://github.com/npm/node-semver.git) +23. shelljs (git://github.com/arturadib/shelljs.git) +24. ssh2 (git+ssh://git@github.com/mscdex/ssh2.git) +25. ssh2 (git+ssh://git@github.com/mscdex/ssh2.git) +26. ssh2-streams (git+ssh://git@github.com/mscdex/ssh2-streams.git) +27. ssh2-streams (git+ssh://git@github.com/mscdex/ssh2-streams.git) +28. streamsearch (git+ssh://git@github.com/mscdex/streamsearch.git) +29. string_decoder (git://github.com/rvagg/string_decoder.git) +30. vso-node-api (git+https://github.com/Microsoft/vso-node-api.git) +31. vsts-task-lib (git+https://github.com/Microsoft/vsts-task-lib.git) +32. wrappy (git+https://github.com/npm/wrappy.git) + + +%% asn1 NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) 2011 Mark Cavage, All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE +========================================= +END OF asn1 NOTICES, INFORMATION, AND LICENSE + +%% async NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) 2010-2014 Caolan McMahon + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF async NOTICES, INFORMATION, AND LICENSE + +%% balanced-match NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +(MIT) + +Copyright (c) 2013 Julian Gruber <julian@juliangruber.com> + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +========================================= +END OF balanced-match NOTICES, INFORMATION, AND LICENSE + +%% brace-expansion NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +NO LICENSE FOUND +========================================= +END OF brace-expansion NOTICES, INFORMATION, AND LICENSE + +%% concat-map NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +This software is released under the MIT license: + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF concat-map NOTICES, INFORMATION, AND LICENSE + +%% core-util-is NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright Node.js contributors. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. +========================================= +END OF core-util-is NOTICES, INFORMATION, AND LICENSE + +%% fs.realpath NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +---- + +This library bundles a version of the `fs.realpath` and `fs.realpathSync` +methods from Node.js v0.10 under the terms of the Node.js MIT license. + +Node's license follows, also included at the header of `old.js` which contains +the licensed code: + + Copyright Joyent, Inc. and other Node contributors. + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. +========================================= +END OF fs.realpath NOTICES, INFORMATION, AND LICENSE + +%% glob NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF glob NOTICES, INFORMATION, AND LICENSE + +%% glob NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF glob NOTICES, INFORMATION, AND LICENSE + +%% inflight NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF inflight NOTICES, INFORMATION, AND LICENSE + +%% inherits NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF inherits NOTICES, INFORMATION, AND LICENSE + +%% isarray NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +NO LICENSE FOUND +========================================= +END OF isarray NOTICES, INFORMATION, AND LICENSE + +%% lodash NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright jQuery Foundation and other contributors + +Based on Underscore.js, copyright Jeremy Ashkenas, +DocumentCloud and Investigative Reporters & Editors + +This software consists of voluntary contributions made by many +individuals. For exact contribution history, see the revision history +available at https://github.com/lodash/lodash + +The following license applies to all parts of this software except as +documented below: + +==== + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +==== + +Copyright and related rights for sample code are waived via CC0. Sample +code is defined as all source code displayed within the prose of the +documentation. + +CC0: http://creativecommons.org/publicdomain/zero/1.0/ + +==== + +Files located in the node_modules and vendor directories are externally +maintained libraries used by this software which have their own +licenses; we recommend you read them, as their terms may differ from the +terms above. +========================================= +END OF lodash NOTICES, INFORMATION, AND LICENSE + +%% minimatch NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF minimatch NOTICES, INFORMATION, AND LICENSE + +%% mockery NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyrights for code authored by Yahoo! Inc. is licensed under the following + terms: + + MIT License + + Copyright (c) 2011 Yahoo! Inc. All Rights Reserved. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to + deal in the Software without restriction, including without limitation the + rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. +========================================= +END OF mockery NOTICES, INFORMATION, AND LICENSE + +%% node-uuid NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) 2010-2012 Robert Kieffer + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +========================================= +END OF node-uuid NOTICES, INFORMATION, AND LICENSE + +%% once NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF once NOTICES, INFORMATION, AND LICENSE + +%% path-is-absolute NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF path-is-absolute NOTICES, INFORMATION, AND LICENSE + +%% q NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright 2009–2017 Kristopher Michael Kowal. All rights reserved. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. +========================================= +END OF q NOTICES, INFORMATION, AND LICENSE + +%% readable-stream NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright Joyent, Inc. and other Node contributors. All rights reserved. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. +========================================= +END OF readable-stream NOTICES, INFORMATION, AND LICENSE + +%% scp2 NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +NO LICENSE FOUND +========================================= +END OF scp2 NOTICES, INFORMATION, AND LICENSE + +%% semver NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF semver NOTICES, INFORMATION, AND LICENSE + +%% shelljs NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) 2012, Artur Adib +All rights reserved. + +You may use this project under the terms of the New BSD license as follows: + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of Artur Adib nor the + names of the contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL ARTUR ADIB BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +========================================= +END OF shelljs NOTICES, INFORMATION, AND LICENSE + +%% ssh2 NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright Brian White. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. +========================================= +END OF ssh2 NOTICES, INFORMATION, AND LICENSE + +%% ssh2 NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright Brian White. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. +========================================= +END OF ssh2 NOTICES, INFORMATION, AND LICENSE + +%% ssh2-streams NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright 2014 Brian White. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. +========================================= +END OF ssh2-streams NOTICES, INFORMATION, AND LICENSE + +%% ssh2-streams NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright 2014 Brian White. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. +========================================= +END OF ssh2-streams NOTICES, INFORMATION, AND LICENSE + +%% streamsearch NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright Brian White. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. +========================================= +END OF streamsearch NOTICES, INFORMATION, AND LICENSE + +%% string_decoder NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright Joyent, Inc. and other Node contributors. + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to permit +persons to whom the Software is furnished to do so, subject to the +following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF string_decoder NOTICES, INFORMATION, AND LICENSE + +%% vso-node-api NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +NO LICENSE FOUND +========================================= +END OF vso-node-api NOTICES, INFORMATION, AND LICENSE + +%% vsts-task-lib NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) Microsoft Corporation. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +========================================= +END OF vsts-task-lib NOTICES, INFORMATION, AND LICENSE + +%% wrappy NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF wrappy NOTICES, INFORMATION, AND LICENSE + diff --git a/_generated/CopyFilesOverSSHV0_Node20/copyfilesoverssh.ts b/_generated/CopyFilesOverSSHV0_Node20/copyfilesoverssh.ts new file mode 100644 index 000000000000..e33a1d9f6923 --- /dev/null +++ b/_generated/CopyFilesOverSSHV0_Node20/copyfilesoverssh.ts @@ -0,0 +1,263 @@ +import * as os from 'os'; +import * as path from 'path'; +import * as tl from 'azure-pipelines-task-lib/task'; +import * as minimatch from 'minimatch'; +import * as utils from './utils'; +import { SshHelper } from './sshhelper'; + +// This method will find the list of matching files for the specified contents +// This logic is the same as the one used by CopyFiles task except for allowing dot folders to be copied +// This will be useful to put in the task-lib +function getFilesToCopy(sourceFolder: string, contents: string[]): string[] { + // include filter + const includeContents: string[] = []; + // exclude filter + const excludeContents: string[] = []; + + // evaluate leading negations `!` on the pattern + for (const pattern of contents.map(x => x.trim())) { + let negate: boolean = false; + let numberOfNegations: number = 0; + for (const c of pattern) { + if (c === '!') { + negate = !negate; + numberOfNegations++; + } else { + break; + } + } + + if (negate) { + tl.debug('exclude content pattern: ' + pattern); + const realPattern = pattern.substring(0, numberOfNegations) + path.join(sourceFolder, pattern.substring(numberOfNegations)); + excludeContents.push(realPattern); + } else { + tl.debug('include content pattern: ' + pattern); + const realPattern = path.join(sourceFolder, pattern); + includeContents.push(realPattern); + } + } + + // enumerate all files + let files: string[] = []; + const allPaths: string[] = tl.find(sourceFolder); + const allFiles: string[] = []; + + // remove folder path + for (const p of allPaths) { + if (!tl.stats(p).isDirectory()) { + allFiles.push(p); + } + } + + // if we only have exclude filters, we need add a include all filter, so we can have something to exclude. + if (includeContents.length === 0 && excludeContents.length > 0) { + includeContents.push('**'); + } + + tl.debug("counted " + allFiles.length + " files in the source tree"); + + // a map to eliminate duplicates + const pathsSeen = {}; + + // minimatch options + const matchOptions: tl.MatchOptions = { matchBase: true, dot: true }; + if (os.platform() === 'win32') { + matchOptions.nocase = true; + } + + // apply include filter + for (const pattern of includeContents) { + tl.debug('Include matching ' + pattern); + + // let minimatch do the actual filtering + const matches: string[] = minimatch.match(allFiles, pattern, matchOptions); + + tl.debug('Include matched ' + matches.length + ' files'); + for (const matchPath of matches) { + if (!pathsSeen.hasOwnProperty(matchPath)) { + pathsSeen[matchPath] = true; + files.push(matchPath); + } + } + } + + // apply exclude filter + for (const pattern of excludeContents) { + tl.debug('Exclude matching ' + pattern); + + // let minimatch do the actual filtering + const matches: string[] = minimatch.match(files, pattern, matchOptions); + + tl.debug('Exclude matched ' + matches.length + ' files'); + files = []; + for (const matchPath of matches) { + files.push(matchPath); + } + } + + return files; +} + +async function run() { + let sshHelper: SshHelper; + try { + tl.setResourcePath(path.join(__dirname, 'task.json')); + + // read SSH endpoint input + const sshEndpoint = tl.getInput('sshEndpoint', true); + const username: string = tl.getEndpointAuthorizationParameter(sshEndpoint, 'username', false); + const password: string = tl.getEndpointAuthorizationParameter(sshEndpoint, 'password', true); //passphrase is optional + const privateKey: string = process.env['ENDPOINT_DATA_' + sshEndpoint + '_PRIVATEKEY']; //private key is optional, password can be used for connecting + const hostname: string = tl.getEndpointDataParameter(sshEndpoint, 'host', false); + let port: string = tl.getEndpointDataParameter(sshEndpoint, 'port', true); //port is optional, will use 22 as default port if not specified + if (!port) { + console.log(tl.loc('UseDefaultPort')); + port = '22'; + } + + const readyTimeout = getReadyTimeoutVariable(); + const useFastPut: boolean = !(process.env['USE_FAST_PUT'] === 'false'); + + // set up the SSH connection configuration based on endpoint details + let sshConfig; + if (privateKey) { + tl.debug('Using private key for ssh connection.'); + sshConfig = { + host: hostname, + port: port, + username: username, + privateKey: privateKey, + passphrase: password, + readyTimeout: readyTimeout, + useFastPut: useFastPut + } + } else { + // use password + tl.debug('Using username and password for ssh connection.'); + sshConfig = { + host: hostname, + port: port, + username: username, + password: password, + readyTimeout: readyTimeout, + useFastPut: useFastPut + } + } + + // contents is a multiline input containing glob patterns + const contents: string[] = tl.getDelimitedInput('contents', '\n', true); + const sourceFolder: string = tl.getPathInput('sourceFolder', true, true); + let targetFolder: string = tl.getInput('targetFolder'); + + if (!targetFolder) { + targetFolder = "./"; + } else { + // '~/' is unsupported + targetFolder = targetFolder.replace(/^~\//, "./"); + } + + // read the copy options + const cleanTargetFolder: boolean = tl.getBoolInput('cleanTargetFolder', false); + const overwrite: boolean = tl.getBoolInput('overwrite', false); + const failOnEmptySource: boolean = tl.getBoolInput('failOnEmptySource', false); + const flattenFolders: boolean = tl.getBoolInput('flattenFolders', false); + + if (!tl.stats(sourceFolder).isDirectory()) { + throw tl.loc('SourceNotFolder'); + } + + // initialize the SSH helpers, set up the connection + sshHelper = new SshHelper(sshConfig); + await sshHelper.setupConnection(); + + if (cleanTargetFolder && await sshHelper.checkRemotePathExists(targetFolder)) { + console.log(tl.loc('CleanTargetFolder', targetFolder)); + const isWindowsOnTarget: boolean = tl.getBoolInput('isWindowsOnTarget', false); + const cleanHiddenFilesInTarget: boolean = tl.getBoolInput('cleanHiddenFilesInTarget', false); + const cleanTargetFolderCmd: string = utils.getCleanTargetFolderCmd(targetFolder, isWindowsOnTarget, cleanHiddenFilesInTarget); + try { + await sshHelper.runCommandOnRemoteMachine(cleanTargetFolderCmd, null); + } catch (err) { + throw tl.loc('CleanTargetFolderFailed', err); + } + } + + // identify the files to copy + const filesToCopy: string[] = getFilesToCopy(sourceFolder, contents); + + // copy files to remote machine + if (filesToCopy) { + tl.debug('Number of files to copy = ' + filesToCopy.length); + tl.debug('filesToCopy = ' + filesToCopy); + + let failureCount = 0; + console.log(tl.loc('CopyingFiles', filesToCopy.length)); + for (const fileToCopy of filesToCopy) { + try { + tl.debug('fileToCopy = ' + fileToCopy); + + let relativePath; + if (flattenFolders) { + relativePath = path.basename(fileToCopy); + } else { + relativePath = fileToCopy.substring(sourceFolder.length) + .replace(/^\\/g, "") + .replace(/^\//g, ""); + } + tl.debug('relativePath = ' + relativePath); + let targetPath = path.posix.join(targetFolder, relativePath); + + if (!path.isAbsolute(targetPath) && !utils.pathIsUNC(targetPath)) { + targetPath = `./${targetPath}`; + } + + console.log(tl.loc('StartedFileCopy', fileToCopy, targetPath)); + if (!overwrite) { + const fileExists: boolean = await sshHelper.checkRemotePathExists(targetPath); + if (fileExists) { + throw tl.loc('FileExists', targetPath); + } + } + + targetPath = utils.unixyPath(targetPath); + // looks like scp can only handle one file at a time reliably + await sshHelper.uploadFile(fileToCopy, targetPath); + } catch (err) { + tl.error(tl.loc('FailedOnFile', fileToCopy, err)); + failureCount++; + } + } + console.log(tl.loc('CopyCompleted', filesToCopy.length)); + if (failureCount) { + tl.setResult(tl.TaskResult.Failed, tl.loc('NumberFailed', failureCount)); + } + } else if (failOnEmptySource) { + throw tl.loc('NothingToCopy'); + } else { + tl.warning(tl.loc('NothingToCopy')); + } + } catch (err) { + tl.setResult(tl.TaskResult.Failed, err); + } finally { + // close the client connection to halt build execution + if (sshHelper) { + tl.debug('Closing the client connection'); + await sshHelper.closeConnection(); + } + } +} + +run().then(() => { + tl.debug('Task successfully accomplished'); + }) + .catch(err => { + tl.debug('Run was unexpectedly failed due to: ' + err); + }); + +function getReadyTimeoutVariable(): number { + let readyTimeoutString: string = tl.getInput('readyTimeout', true); + const readyTimeout: number = parseInt(readyTimeoutString, 10); + + return readyTimeout; +} diff --git a/_generated/CopyFilesOverSSHV0_Node20/icon.png b/_generated/CopyFilesOverSSHV0_Node20/icon.png new file mode 100644 index 000000000000..667721310bac Binary files /dev/null and b/_generated/CopyFilesOverSSHV0_Node20/icon.png differ diff --git a/_generated/CopyFilesOverSSHV0_Node20/icon.svg b/_generated/CopyFilesOverSSHV0_Node20/icon.svg new file mode 100644 index 000000000000..c40973a54665 --- /dev/null +++ b/_generated/CopyFilesOverSSHV0_Node20/icon.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/_generated/CopyFilesOverSSHV0_Node20/package-lock.json b/_generated/CopyFilesOverSSHV0_Node20/package-lock.json new file mode 100644 index 000000000000..0c496021046e --- /dev/null +++ b/_generated/CopyFilesOverSSHV0_Node20/package-lock.json @@ -0,0 +1,619 @@ +{ + "name": "vsts-copyssh-task", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/concat-stream": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz", + "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==", + "requires": { + "@types/node": "*" + } + }, + "@types/form-data": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", + "integrity": "sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==", + "requires": { + "@types/node": "*" + } + }, + "@types/mocha": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", + "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==" + }, + "@types/node": { + "version": "20.7.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.7.0.tgz", + "integrity": "sha512-zI22/pJW2wUZOVyguFaUL1HABdmSVxpXrzIqkjsHmyUjNhPoWM1CKfvVuXfetHhIok4RY573cqS0mZ1SJEnoTg==" + }, + "@types/qs": { + "version": "6.9.8", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.8.tgz", + "integrity": "sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg==" + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "azure-pipelines-task-lib": { + "version": "5.0.0-preview.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-5.0.0-preview.0.tgz", + "integrity": "sha512-uQJEv+q3/7RD7kgphFd33uXijaPwA1ePYoNkAgZpUhbZUtc2u4JL4ujTT/JJfgXBNW/QQNAiDQ2OC7vOQG/0tg==", + "requires": { + "minimatch": "3.0.5", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "sync-request": "6.1.0", + "uuid": "^3.0.1" + }, + "dependencies": { + "minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "brace-expansion": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", + "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "concat-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", + "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.0.2", + "typedarray": "^0.0.6" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "cpu-features": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/cpu-features/-/cpu-features-0.0.2.tgz", + "integrity": "sha512-/2yieBqvMcRj8McNzkycjW2v3OIUOibBfd2dLEJ0nWts8NobAxwiyw9phVNS6oDL8x8tz9F7uNVFEVpJncQpeA==", + "optional": true, + "requires": { + "nan": "^2.14.1" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, + "err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==" + }, + "form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + } + }, + "get-port": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", + "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==" + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "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" + }, + "dependencies": { + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==" + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "http-basic": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", + "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", + "requires": { + "caseless": "^0.12.0", + "concat-stream": "^1.6.2", + "http-response-object": "^3.0.1", + "parse-cache-control": "^1.0.1" + }, + "dependencies": { + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + } + } + }, + "http-response-object": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", + "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", + "requires": { + "@types/node": "^10.0.3" + }, + "dependencies": { + "@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + } + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" + }, + "is-core-module": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "requires": { + "has": "^1.0.3" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "nan": { + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz", + "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==", + "optional": true + }, + "object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, + "parse-cache-control": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", + "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "promise": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", + "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", + "requires": { + "asap": "~2.0.6" + } + }, + "promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "requires": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + } + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==" + }, + "qs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "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" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "requires": { + "resolve": "^1.1.6" + } + }, + "resolve": { + "version": "1.22.6", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.6.tgz", + "integrity": "sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==", + "requires": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==" + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" + }, + "shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "ssh2": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ssh2/-/ssh2-1.4.0.tgz", + "integrity": "sha512-XvXwcXKvS452DyQvCa6Ct+chpucwc/UyxgliYz+rWXJ3jDHdtBb9xgmxJdMmnIn5bpgGAEV3KaEsH98ZGPHqwg==", + "requires": { + "asn1": "^0.2.4", + "bcrypt-pbkdf": "^1.0.2", + "cpu-features": "0.0.2", + "nan": "^2.15.0" + }, + "dependencies": { + "asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "requires": { + "safer-buffer": "~2.1.0" + } + } + } + }, + "ssh2-sftp-client": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/ssh2-sftp-client/-/ssh2-sftp-client-7.0.4.tgz", + "integrity": "sha512-4fFSTgoYlzcAtGfEjiXN6N41s1jSUmPlI00f7uD7pQOjt9yK9susminINKTRvPp35dkrATrlNZVhUxNCt3z5+w==", + "requires": { + "concat-stream": "^2.0.0", + "promise-retry": "^2.0.1", + "ssh2": "^1.4.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + } + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, + "sync-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", + "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==", + "requires": { + "http-response-object": "^3.0.1", + "sync-rpc": "^1.2.1", + "then-request": "^6.0.0" + } + }, + "sync-rpc": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz", + "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==", + "requires": { + "get-port": "^3.1.0" + } + }, + "then-request": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", + "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", + "requires": { + "@types/concat-stream": "^1.6.0", + "@types/form-data": "0.0.33", + "@types/node": "^8.0.0", + "@types/qs": "^6.2.31", + "caseless": "~0.12.0", + "concat-stream": "^1.6.0", + "form-data": "^2.2.0", + "http-basic": "^8.1.1", + "http-response-object": "^3.0.1", + "promise": "^8.0.0", + "qs": "^6.4.0" + }, + "dependencies": { + "@types/node": { + "version": "8.10.66", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", + "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + } + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, + "typescript": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + } + } +} diff --git a/_generated/CopyFilesOverSSHV0_Node20/package.json b/_generated/CopyFilesOverSSHV0_Node20/package.json new file mode 100644 index 000000000000..c96ccab01154 --- /dev/null +++ b/_generated/CopyFilesOverSSHV0_Node20/package.json @@ -0,0 +1,30 @@ +{ + "name": "vsts-copyssh-task", + "version": "1.0.0", + "description": "Azure Pipelines Copy Files over SSH Tasks", + "main": "copyfilesoverssh.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/Microsoft.com/vsts-tasks.git" + }, + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Microsoft.com/vsts-tasks/issues" + }, + "homepage": "https://github.com/Microsoft.com/vsts-tasks#readme", + "dependencies": { + "ssh2": "^1.4.0", + "ssh2-sftp-client": "^7.0.4", + "minimatch": "^3.0.4", + "azure-pipelines-task-lib": "^5.0.0-preview.0", + "@types/mocha": "^5.2.7", + "@types/node": "^20.3.1" + }, + "devDependencies": { + "typescript": "5.1.6" + } +} diff --git a/_generated/CopyFilesOverSSHV0_Node20/sshhelper.ts b/_generated/CopyFilesOverSSHV0_Node20/sshhelper.ts new file mode 100644 index 000000000000..0ff955f3db03 --- /dev/null +++ b/_generated/CopyFilesOverSSHV0_Node20/sshhelper.ts @@ -0,0 +1,218 @@ +import Q = require('q'); +import tl = require('azure-pipelines-task-lib/task'); +const path = require('path'); +var Ssh2Client = require('ssh2').Client; +var SftpClient = require('ssh2-sftp-client'); + +export class RemoteCommandOptions { + public failOnStdErr : boolean; +} + +export class SshHelper { + private sshConfig: any; + private sshClient: any; + private scpClient: any; + private sftpClient: any; + + /** + * Constructor that takes a configuration object of format + * { + host: hostname, + port: port, + username: username, + privateKey: privateKey, + passphrase: passphrase + } + * @param sshConfig + */ + constructor(sshConfig: any) { + this.sshConfig = sshConfig; + } + + private async setupSshClientConnection() : Promise { + const defer = Q.defer(); + this.sshClient = new Ssh2Client(); + this.sshClient.once('ready', () => { + defer.resolve(); + }).once('error', (err) => { + defer.reject(tl.loc('ConnectionFailed', err)); + }).connect(this.sshConfig); + await defer.promise; + } + + private async setupSftpConnection() : Promise { + const defer = Q.defer(); + try { + this.sftpClient = new SftpClient(); + await this.sftpClient.connect(this.sshConfig); + defer.resolve(); + } catch (err) { + this.sftpClient = null; + defer.reject(tl.loc('ConnectionFailed', err)); + } + await defer.promise; + } + + /** + * Sets up the SSH connection + */ + async setupConnection() { + console.log(tl.loc('SettingUpSSHConnection', this.sshConfig.host)); + try { + await this.setupSshClientConnection(); + await this.setupSftpConnection(); + } catch(err) { + throw new Error(tl.loc('ConnectionFailed', err)); + } + } + + /** + * Close any open client connections for SSH, SCP and SFTP + */ + async closeConnection() { + try { + if (this.sftpClient) { + this.sftpClient.on('error', (err) => { + tl.debug('sftpClient: Ignoring error diconnecting: ' + err); + }); // ignore logout errors; see: https://github.com/mscdex/node-imap/issues/695 + await this.sftpClient.end(); + this.sftpClient = null; + } + } catch(err) { + tl.debug('Failed to close SFTP client: ' + err); + } + try { + if (this.sshClient) { + this.sshClient.on('error', (err) => { + tl.debug('sshClient: Ignoring error diconnecting: ' + err); + }); // ignore logout errors; see: https://github.com/mscdex/node-imap/issues/695 + this.sshClient.end(); + this.sshClient = null; + } + } catch(err) { + tl.debug('Failed to close SSH client: ' + err); + } + } + + /** + * Uploads a file to the remote server + * @param sourceFile + * @param dest, folders will be created if they do not exist on remote server + * @returns {Promise} + */ + async uploadFile(sourceFile: string, dest: string) : Promise { + tl.debug('Upload ' + sourceFile + ' to ' + dest + ' on remote machine.'); + + var defer = Q.defer(); + if(!this.sftpClient) { + defer.reject(tl.loc('ConnectionNotSetup')); + } + + const remotePath = path.dirname(dest); + try { + if (!await this.sftpClient.exists(remotePath)) { + await this.sftpClient.mkdir(remotePath, true); + } + } catch (error) { + defer.reject(tl.loc('TargetNotCreated', remotePath)); + } + + try { + if (this.sshConfig.useFastPut) { + await this.sftpClient.fastPut(sourceFile, dest); + } else { + await this.sftpClient.put(sourceFile, dest); + } + defer.resolve(dest); + } catch (err) { + defer.reject(tl.loc('UploadFileFailed', sourceFile, dest, err)); + } + return defer.promise; + } + + /** + * Returns true if the path exists on remote machine, false if it does not exist + * @param path + * @returns {Promise} + */ + async checkRemotePathExists(path: string) : Promise { + var defer = Q.defer(); + + tl.debug(tl.loc('CheckingPathExistance', path)); + if(!this.sftpClient) { + defer.reject(tl.loc('ConnectionNotSetup')); + } + if (await this.sftpClient.exists(path)) { + //path exists + tl.debug(tl.loc('PathExists', path)); + defer.resolve(true); + } else { + //path does not exist + tl.debug(tl.loc('PathNotExists', path)); + defer.resolve(false); + } + + return defer.promise; + } + + /** + * Runs specified command on remote machine, returns error for non-zero exit code + * @param command + * @param options + * @returns {Promise} + */ + runCommandOnRemoteMachine(command: string, options: RemoteCommandOptions) : Q.Promise { + var defer = Q.defer(); + var stdErrWritten:boolean = false; + + if(!this.sshClient) { + defer.reject(tl.loc('ConnectionNotSetup')); + } + + if(!options) { + tl.debug('Options not passed to runCommandOnRemoteMachine, setting defaults.'); + var options = new RemoteCommandOptions(); + options.failOnStdErr = true; + } + + var cmdToRun = command; + if(cmdToRun.indexOf(';') > 0) { + //multiple commands were passed separated by ; + cmdToRun = cmdToRun.replace(/;/g, '\n'); + } + tl.debug('cmdToRun = ' + cmdToRun); + + this.sshClient.exec(cmdToRun, (err, stream) => { + if(err) { + defer.reject(tl.loc('RemoteCmdExecutionErr', cmdToRun, err)) + } + stream.on('close', (code, signal) => { + tl.debug('code = ' + code + ', signal = ' + signal); + if(code && code != 0) { + //non zero exit code - fail + defer.reject(tl.loc('RemoteCmdNonZeroExitCode', cmdToRun, code)); + } else { + //no exit code or exit code of 0 + + //based on the options decide whether to fail the build or not if data was written to STDERR + if(stdErrWritten === true && options.failOnStdErr === true) { + //stderr written - fail the build + defer.reject(tl.loc('RemoteCmdExecutionErr', cmdToRun, tl.loc('CheckLogForStdErr'))); + } else { + //success + defer.resolve('0'); + } + } + }).on('data', (data) => { + console.log(data); + }).stderr.on('data', (data) => { + stdErrWritten = true; + tl.debug('stderr = ' + data); + if(data && data.toString().trim() !== '') { + tl.error(data); + } + }); + }); + return defer.promise; + } +} diff --git a/_generated/CopyFilesOverSSHV0_Node20/task.json b/_generated/CopyFilesOverSSHV0_Node20/task.json new file mode 100644 index 000000000000..e9a194d572b9 --- /dev/null +++ b/_generated/CopyFilesOverSSHV0_Node20/task.json @@ -0,0 +1,185 @@ +{ + "id": "67cec91b-0351-4c2f-8465-d74b3d2a2d96", + "name": "CopyFilesOverSSH", + "friendlyName": "Copy files over SSH", + "description": "Copy files or build artifacts to a remote machine over SSH", + "helpUrl": "https://docs.microsoft.com/azure/devops/pipelines/tasks/deploy/copy-files-over-ssh", + "helpMarkDown": "[Learn more about this task](https://go.microsoft.com/fwlink/?LinkId=821894)", + "category": "Deploy", + "visibility": [ + "Build", + "Release" + ], + "runsOn": [ + "Agent", + "DeploymentGroup" + ], + "author": "Microsoft Corporation", + "version": { + "Major": 0, + "Minor": 229, + "Patch": 1 + }, + "demands": [], + "minimumAgentVersion": "2.182.1", + "instanceNameFormat": "Securely copy files to the remote machine", + "groups": [ + { + "name": "advanced", + "displayName": "Advanced", + "isExpanded": false + } + ], + "inputs": [ + { + "name": "sshEndpoint", + "type": "connectedService:ssh", + "label": "SSH service connection", + "defaultValue": "", + "required": true, + "helpMarkDown": "SSH service connection with connection details for the remote machine." + }, + { + "name": "sourceFolder", + "type": "filePath", + "label": "Source folder", + "defaultValue": "", + "required": false, + "helpMarkDown": "The source folder of the files to copy to the remote machine. When empty, the root of the repository (build) or artifacts directory (release) is used, which is $(System.DefaultWorkingDirectory). Use [variables](https://go.microsoft.com/fwlink/?LinkID=550988) if files are not in the repository. Example: $(Agent.BuildDirectory)" + }, + { + "name": "contents", + "type": "multiLine", + "label": "Contents", + "defaultValue": "**", + "required": true, + "helpMarkDown": "File paths to include as part of the copy. Supports multiple lines of minimatch patterns. [More Information](https://go.microsoft.com/fwlink/?LinkId=821894)" + }, + { + "name": "targetFolder", + "type": "string", + "label": "Target folder", + "defaultValue": "", + "required": false, + "helpMarkDown": "Target folder on the remote machine to where files will be copied. Example: /home/user/MySite." + }, + { + "name": "isWindowsOnTarget", + "type": "boolean", + "label": "Target machine running Windows", + "defaultValue": "false", + "required": false, + "helpMarkDown": "Target machine running Windows", + "groupName": "advanced" + }, + { + "name": "cleanTargetFolder", + "type": "boolean", + "label": "Clean target folder", + "defaultValue": "false", + "required": false, + "helpMarkDown": "Delete all existing files and subfolders in the target folder before copying.", + "groupName": "advanced" + }, + { + "name": "cleanHiddenFilesInTarget", + "type": "boolean", + "label": "Remove hidden files in target folder", + "defaultValue": "false", + "required": false, + "helpMarkDown": "Remove hidden files in the target folder.", + "groupName": "advanced", + "visibleRule": "cleanTargetFolder = true" + }, + { + "name": "readyTimeout", + "type": "string", + "label": "SSH handshake timeout", + "defaultValue": "20000", + "required": true, + "groupName": "advanced", + "helpMarkDown": "How long (in milliseconds) to wait for the SSH handshake to complete.", + "validation": { + "expression": "isMatch(value, '(^\\d*$)','Multiline')", + "message": "Enter a valid value for timeout." + } + }, + { + "name": "overwrite", + "type": "boolean", + "label": "Overwrite", + "defaultValue": "true", + "required": false, + "helpMarkDown": "Replace existing files in and beneath the target folder.", + "groupName": "advanced" + }, + { + "name": "failOnEmptySource", + "type": "boolean", + "label": "Fail if no files found to copy", + "defaultValue": "false", + "required": false, + "helpMarkDown": "Fail if no matching files to be copied are found under the source folder.", + "groupName": "advanced" + }, + { + "name": "flattenFolders", + "type": "boolean", + "label": "Flatten folders", + "defaultValue": "false", + "required": false, + "helpMarkDown": "Flatten the folder structure and copy all files into the specified target folder on the remote machine.", + "groupName": "advanced" + } + ], + "execution": { + "Node10": { + "target": "copyfilesoverssh.js", + "argumentFormat": "" + }, + "Node16": { + "target": "copyfilesoverssh.js", + "argumentFormat": "" + }, + "Node20": { + "target": "copyfilesoverssh.js", + "argumentFormat": "" + } + }, + "restrictions": { + "commands": { + "mode": "restricted" + }, + "settableVariables": { + "allowed": [] + } + }, + "messages": { + "CheckLogForStdErr": "Check the build log for STDERR from the command.", + "CleanTargetFolder": "Cleaning target folder %s on the remote machine", + "CleanTargetFolderFailed": "Failed to clean the target folder on the remote machine. %s", + "ConnectionFailed": "Failed to connect to remote machine. Verify the SSH service connection details. %s.", + "ConnectionNotSetup": "SSH service connection is not set up.", + "CopyCompleted": "Completed copying %s files to the remote machine.", + "CopyingFiles": "Found %s files to copy to the remote machine.", + "FailedOnFile": "Failed to copy %s. %s", + "FileExists": "File %s cannot be copied to the remote machine because it already exists and the 'Overwrite' option is disabled.", + "NothingToCopy": "No files were found matching the patterns specified to copy to the remote machine.", + "NumberFailed": "Failed to copy %d files", + "RemoteCmdExecutionErr": "Command %s failed with errors on remote machine. %s.", + "RemoteCmdNonZeroExitCode": "Command %s exited with code %s.", + "SettingUpSSHConnection": "Setting up SSH service connection to remote host %s.", + "SourceNotFolder": "Source folder has to be a valid folder path.", + "StartedFileCopy": "Copying file %s to %s on remote machine.", + "UploadFileFailed": "Failed to upload %s to %s on remote machine. %s.", + "UseDefaultPort": "Using port 22 which is the default for SSH since no port was specified.", + "TargetNotCreated": "Unable to create target folder %s.", + "CheckingPathExistance": "Checking if %s on the remote machine exists.", + "PathExists": "%s exists on the remote machine", + "PathNotExists": "%s doesn't exist on the remote machine" + }, + "_buildConfigMapping": { + "Default": "0.229.0", + "Node20-225": "0.229.1" + } +} \ No newline at end of file diff --git a/_generated/CopyFilesOverSSHV0_Node20/task.loc.json b/_generated/CopyFilesOverSSHV0_Node20/task.loc.json new file mode 100644 index 000000000000..bff7702cd9ca --- /dev/null +++ b/_generated/CopyFilesOverSSHV0_Node20/task.loc.json @@ -0,0 +1,185 @@ +{ + "id": "67cec91b-0351-4c2f-8465-d74b3d2a2d96", + "name": "CopyFilesOverSSH", + "friendlyName": "ms-resource:loc.friendlyName", + "description": "ms-resource:loc.description", + "helpUrl": "https://docs.microsoft.com/azure/devops/pipelines/tasks/deploy/copy-files-over-ssh", + "helpMarkDown": "ms-resource:loc.helpMarkDown", + "category": "Deploy", + "visibility": [ + "Build", + "Release" + ], + "runsOn": [ + "Agent", + "DeploymentGroup" + ], + "author": "Microsoft Corporation", + "version": { + "Major": 0, + "Minor": 229, + "Patch": 1 + }, + "demands": [], + "minimumAgentVersion": "2.182.1", + "instanceNameFormat": "ms-resource:loc.instanceNameFormat", + "groups": [ + { + "name": "advanced", + "displayName": "ms-resource:loc.group.displayName.advanced", + "isExpanded": false + } + ], + "inputs": [ + { + "name": "sshEndpoint", + "type": "connectedService:ssh", + "label": "ms-resource:loc.input.label.sshEndpoint", + "defaultValue": "", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.sshEndpoint" + }, + { + "name": "sourceFolder", + "type": "filePath", + "label": "ms-resource:loc.input.label.sourceFolder", + "defaultValue": "", + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.sourceFolder" + }, + { + "name": "contents", + "type": "multiLine", + "label": "ms-resource:loc.input.label.contents", + "defaultValue": "**", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.contents" + }, + { + "name": "targetFolder", + "type": "string", + "label": "ms-resource:loc.input.label.targetFolder", + "defaultValue": "", + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.targetFolder" + }, + { + "name": "isWindowsOnTarget", + "type": "boolean", + "label": "ms-resource:loc.input.label.isWindowsOnTarget", + "defaultValue": "false", + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.isWindowsOnTarget", + "groupName": "advanced" + }, + { + "name": "cleanTargetFolder", + "type": "boolean", + "label": "ms-resource:loc.input.label.cleanTargetFolder", + "defaultValue": "false", + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.cleanTargetFolder", + "groupName": "advanced" + }, + { + "name": "cleanHiddenFilesInTarget", + "type": "boolean", + "label": "ms-resource:loc.input.label.cleanHiddenFilesInTarget", + "defaultValue": "false", + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.cleanHiddenFilesInTarget", + "groupName": "advanced", + "visibleRule": "cleanTargetFolder = true" + }, + { + "name": "readyTimeout", + "type": "string", + "label": "ms-resource:loc.input.label.readyTimeout", + "defaultValue": "20000", + "required": true, + "groupName": "advanced", + "helpMarkDown": "ms-resource:loc.input.help.readyTimeout", + "validation": { + "expression": "isMatch(value, '(^\\d*$)','Multiline')", + "message": "Enter a valid value for timeout." + } + }, + { + "name": "overwrite", + "type": "boolean", + "label": "ms-resource:loc.input.label.overwrite", + "defaultValue": "true", + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.overwrite", + "groupName": "advanced" + }, + { + "name": "failOnEmptySource", + "type": "boolean", + "label": "ms-resource:loc.input.label.failOnEmptySource", + "defaultValue": "false", + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.failOnEmptySource", + "groupName": "advanced" + }, + { + "name": "flattenFolders", + "type": "boolean", + "label": "ms-resource:loc.input.label.flattenFolders", + "defaultValue": "false", + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.flattenFolders", + "groupName": "advanced" + } + ], + "execution": { + "Node10": { + "target": "copyfilesoverssh.js", + "argumentFormat": "" + }, + "Node16": { + "target": "copyfilesoverssh.js", + "argumentFormat": "" + }, + "Node20": { + "target": "copyfilesoverssh.js", + "argumentFormat": "" + } + }, + "restrictions": { + "commands": { + "mode": "restricted" + }, + "settableVariables": { + "allowed": [] + } + }, + "messages": { + "CheckLogForStdErr": "ms-resource:loc.messages.CheckLogForStdErr", + "CleanTargetFolder": "ms-resource:loc.messages.CleanTargetFolder", + "CleanTargetFolderFailed": "ms-resource:loc.messages.CleanTargetFolderFailed", + "ConnectionFailed": "ms-resource:loc.messages.ConnectionFailed", + "ConnectionNotSetup": "ms-resource:loc.messages.ConnectionNotSetup", + "CopyCompleted": "ms-resource:loc.messages.CopyCompleted", + "CopyingFiles": "ms-resource:loc.messages.CopyingFiles", + "FailedOnFile": "ms-resource:loc.messages.FailedOnFile", + "FileExists": "ms-resource:loc.messages.FileExists", + "NothingToCopy": "ms-resource:loc.messages.NothingToCopy", + "NumberFailed": "ms-resource:loc.messages.NumberFailed", + "RemoteCmdExecutionErr": "ms-resource:loc.messages.RemoteCmdExecutionErr", + "RemoteCmdNonZeroExitCode": "ms-resource:loc.messages.RemoteCmdNonZeroExitCode", + "SettingUpSSHConnection": "ms-resource:loc.messages.SettingUpSSHConnection", + "SourceNotFolder": "ms-resource:loc.messages.SourceNotFolder", + "StartedFileCopy": "ms-resource:loc.messages.StartedFileCopy", + "UploadFileFailed": "ms-resource:loc.messages.UploadFileFailed", + "UseDefaultPort": "ms-resource:loc.messages.UseDefaultPort", + "TargetNotCreated": "ms-resource:loc.messages.TargetNotCreated", + "CheckingPathExistance": "ms-resource:loc.messages.CheckingPathExistance", + "PathExists": "ms-resource:loc.messages.PathExists", + "PathNotExists": "ms-resource:loc.messages.PathNotExists" + }, + "_buildConfigMapping": { + "Default": "0.229.0", + "Node20-225": "0.229.1" + } +} \ No newline at end of file diff --git a/_generated/CopyFilesOverSSHV0_Node20/tsconfig.json b/_generated/CopyFilesOverSSHV0_Node20/tsconfig.json new file mode 100644 index 000000000000..0438b79f69ac --- /dev/null +++ b/_generated/CopyFilesOverSSHV0_Node20/tsconfig.json @@ -0,0 +1,6 @@ +{ + "compilerOptions": { + "target": "ES6", + "module": "commonjs" + } +} \ No newline at end of file diff --git a/_generated/CopyFilesOverSSHV0_Node20/utils.ts b/_generated/CopyFilesOverSSHV0_Node20/utils.ts new file mode 100644 index 000000000000..0c3627636d6f --- /dev/null +++ b/_generated/CopyFilesOverSSHV0_Node20/utils.ts @@ -0,0 +1,47 @@ +import * as tl from 'azure-pipelines-task-lib/task'; + +const UNCPathPattern: RegExp = /^[\\]{2,}[^\\\/]+[\\\/]+[^\\\/]+/; + +/** + * Change path separator for Windows-based platforms + * See https://github.com/spmjs/node-scp2/blob/master/lib/client.js#L319 + * + * @param filePath + */ +export function unixyPath(filePath: string): string { + if (process.platform === 'win32') { + return filePath.replace(/\\/g, '/'); + } + return filePath; +} + +/** + * Determines whether {path} is an UNC path. + * @param path + */ +export function pathIsUNC(path: string): boolean { + return UNCPathPattern.test(path); +} + +/** + * Gets OS specific command to clean folder in specified path. + * @returns {string} OS specific command to clean target folder on the remote machine + * @param {string} targetFolder path to target folder + * @param {boolean} forWindows return command for Windows CMD + * @param {boolean} cleanHiddenFiles clean hidden files in target folder + */ +export function getCleanTargetFolderCmd(targetFolder: string, forWindows: boolean, cleanHiddenFiles: boolean = false ): string { + if (forWindows) { + const hiddenFilesClean: string = `${ cleanHiddenFiles ? "/A:H": "" }`; + const cleanFilesInTarget: string = `del /q ${hiddenFilesClean} "${targetFolder}\\*"`; + // delete all files in specified folder and then delete all nested folders + return `${cleanFilesInTarget} && FOR /D %p IN ("${targetFolder}\\*.*") DO rmdir "%p" /s /q`; + } else { + // This pattern will ignore files whose name is . and .. during deletion. These are system files that exist in every Linux directory. + // An attempt to delete these files will produce warnings that could confuse users. + // Here is more information about this problem https://unix.stackexchange.com/questions/77127/rm-rf-all-files-and-all-hidden-files-without-error/77313#77313 + const hiddenFilesClean: string = `${ cleanHiddenFiles ? "{,.[!.],..?}" : "" }`; + const cleanFilesInTarget: string = `sh -c "rm -rf '${targetFolder}'/${hiddenFilesClean}*"`; + return cleanFilesInTarget; + } +} diff --git a/_generated/CopyFilesV2.versionmap.txt b/_generated/CopyFilesV2.versionmap.txt new file mode 100644 index 000000000000..22bfac82ab29 --- /dev/null +++ b/_generated/CopyFilesV2.versionmap.txt @@ -0,0 +1,2 @@ +Default|2.229.0 +Node20-225|2.229.1 diff --git a/_generated/CopyFilesV2/Strings/resources.resjson/de-DE/resources.resjson b/_generated/CopyFilesV2/Strings/resources.resjson/de-DE/resources.resjson new file mode 100644 index 000000000000..b3392ae2b462 --- /dev/null +++ b/_generated/CopyFilesV2/Strings/resources.resjson/de-DE/resources.resjson @@ -0,0 +1,33 @@ +{ + "loc.friendlyName": "Dateien kopieren", + "loc.helpMarkDown": "[Weitere Informationen zu dieser Aufgabe](https://go.microsoft.com/fwlink/?LinkID=708389)", + "loc.description": "Hiermit werden Dateien unter Verwendung von Mustern zum Abgleich von Dateipfaden (nicht von Ordnerpfaden) aus einem Quellordner in einen Zielordner kopiert.", + "loc.instanceNameFormat": "Dateien kopieren in: $(TargetFolder)", + "loc.releaseNotes": "Übereinstimmungsmusterkonsistenz.", + "loc.group.displayName.advanced": "Erweitert", + "loc.input.label.SourceFolder": "Quellordner", + "loc.input.help.SourceFolder": "Der Quellordner, aus dem mindestens ein Kopiermuster ausgeführt wird. \"Empty\" ist der Stamm des Repositorys. Verwenden Sie [Variablen](https://go.microsoft.com/fwlink/?LinkID=550988), wenn sich Dateien nicht im Repository befinden. Beispiel: \"$(agent.builddirectory)\".", + "loc.input.label.Contents": "Inhalte", + "loc.input.help.Contents": "Dateipfade, die als Teil der Kopie eingeschlossen werden sollen. Unterstützt mehrere Zeilen von Vergleichsmustern. [Weitere Informationen](https://go.microsoft.com/fwlink/?LinkID=708389)", + "loc.input.label.TargetFolder": "Zielordner", + "loc.input.help.TargetFolder": "Der Zielordner oder UNC-Pfad, in den die Dateien kopiert werden. Sie können [Variablen](http://go.microsoft.com/fwlink/?LinkID=550988) verwenden. Beispiel: \"$(build.artifactstagingdirectory)\".", + "loc.input.label.CleanTargetFolder": "Zielordner bereinigen", + "loc.input.help.CleanTargetFolder": "Alle vorhandenen Dateien im Zielordner vor dem Kopieren löschen", + "loc.input.label.OverWrite": "Überschreiben", + "loc.input.help.OverWrite": "Vorhandene Datei im Zielordner ersetzen", + "loc.input.label.flattenFolders": "Ordner vereinfachen", + "loc.input.help.flattenFolders": "Vereinfachen Sie die Ordnerstruktur, und kopieren Sie alle Dateien in den angegebenen Zielordner.", + "loc.input.label.preserveTimestamp": "Zielzeitstempel beibehalten", + "loc.input.help.preserveTimestamp": "Behalten Sie unter Verwendung der ursprüngliche Quelldatei den Zeitstempel der Zieldatei bei.", + "loc.input.label.retryCount": "Wiederholungsanzahl zum Kopieren der Datei", + "loc.input.help.retryCount": "Geben Sie die Wiederholungsanzahl an, um die Datei zu kopieren. Dies kann helfen, zeitweilige Probleme zu lösen, z. B. mit UNC-Zielpfaden auf einem Remote-Host.", + "loc.input.label.delayBetweenRetries": "Verzögerung zwischen zwei Wiederholungsversuchen.", + "loc.input.help.delayBetweenRetries": "Geben Sie die Verzögerung zwischen zwei Wiederholungsversuchen an. Möglicherweise ist es hilfreich widerstandsfähiger für intermittierende Probleme, z. B. mit UNC-Zielpfaden auf einem Remote-Host, zu sein.", + "loc.input.label.ignoreMakeDirErrors": "Ignorieren Sie Fehler beim Erstellen des Zielordners.", + "loc.input.help.ignoreMakeDirErrors": "Ignorieren Sie beim Erstellen des Zielordners auftretende Fehler. Dies kann hilfreich sein, um Probleme bei der gleichzeitigen Ausführung einer Aufgabe durch mehrere Agents mit einem Zielordner zu vermeiden.", + "loc.messages.FoundNFiles": "%d Dateien wurden gefunden.", + "loc.messages.CleaningTargetFolder": "Bereinigen des Zielordners: %s", + "loc.messages.FileAlreadyExistAt": "Die Datei \"%s\" ist bereits unter \"%s\" vorhanden.", + "loc.messages.CopyingTo": "\"%s\" wird nach \"%s\" kopiert.", + "loc.messages.TargetIsDir": "Die Datei \"%s\" kann nicht nach \"%s\" kopiert werden. Der Zielpfad ist bereits als Verzeichnis vorhanden." +} \ No newline at end of file diff --git a/_generated/CopyFilesV2/Strings/resources.resjson/en-US/resources.resjson b/_generated/CopyFilesV2/Strings/resources.resjson/en-US/resources.resjson new file mode 100644 index 000000000000..6afc4874239d --- /dev/null +++ b/_generated/CopyFilesV2/Strings/resources.resjson/en-US/resources.resjson @@ -0,0 +1,33 @@ +{ + "loc.friendlyName": "Copy files", + "loc.helpMarkDown": "[Learn more about this task](https://go.microsoft.com/fwlink/?LinkID=708389)", + "loc.description": "Copy files from a source folder to a target folder using patterns matching file paths (not folder paths)", + "loc.instanceNameFormat": "Copy Files to: $(TargetFolder)", + "loc.releaseNotes": "Match pattern consistency.", + "loc.group.displayName.advanced": "Advanced", + "loc.input.label.SourceFolder": "Source Folder", + "loc.input.help.SourceFolder": "The source folder that the copy pattern(s) will be run from. Empty is the root of the repo. Use [variables](https://go.microsoft.com/fwlink/?LinkID=550988) if files are not in the repo. Example: $(agent.builddirectory)", + "loc.input.label.Contents": "Contents", + "loc.input.help.Contents": "File paths to include as part of the copy. Supports multiple lines of match patterns. [More Information](https://go.microsoft.com/fwlink/?LinkID=708389)", + "loc.input.label.TargetFolder": "Target Folder", + "loc.input.help.TargetFolder": "Target folder or UNC path files will copy to. You can use [variables](http://go.microsoft.com/fwlink/?LinkID=550988). Example: $(build.artifactstagingdirectory)", + "loc.input.label.CleanTargetFolder": "Clean Target Folder", + "loc.input.help.CleanTargetFolder": "Delete all existing files in target folder before copy", + "loc.input.label.OverWrite": "Overwrite", + "loc.input.help.OverWrite": "Replace existing file in target folder", + "loc.input.label.flattenFolders": "Flatten Folders", + "loc.input.help.flattenFolders": "Flatten the folder structure and copy all files into the specified target folder.", + "loc.input.label.preserveTimestamp": "Preserve Target Timestamp", + "loc.input.help.preserveTimestamp": "Using the original source file, preserve the target file timestamp.", + "loc.input.label.retryCount": "Retry count to copy the file", + "loc.input.help.retryCount": "Specify the retry count to copy the file. It might help to resolve intermittent issues e.g. with UNC target paths on a remote host.", + "loc.input.label.delayBetweenRetries": "Delay between two retries.", + "loc.input.help.delayBetweenRetries": "Specify the delay between two retries. It might help to be more resilient to intermittent issues e.g. with UNC target paths on a remote host.", + "loc.input.label.ignoreMakeDirErrors": "Ignore errors during creation of target folder.", + "loc.input.help.ignoreMakeDirErrors": "Ignore errors which happen during creation of target folder. This could be useful to avoid issues with parallel execution of task by several agents with one target folder.", + "loc.messages.FoundNFiles": "found %d files", + "loc.messages.CleaningTargetFolder": "Cleaning target folder: %s", + "loc.messages.FileAlreadyExistAt": "File %s already exist at %s", + "loc.messages.CopyingTo": "Copying %s to %s", + "loc.messages.TargetIsDir": "Unable to copy file %s to %s. The target path already exists as a directory." +} \ No newline at end of file diff --git a/_generated/CopyFilesV2/Strings/resources.resjson/es-ES/resources.resjson b/_generated/CopyFilesV2/Strings/resources.resjson/es-ES/resources.resjson new file mode 100644 index 000000000000..69a1ce11edf2 --- /dev/null +++ b/_generated/CopyFilesV2/Strings/resources.resjson/es-ES/resources.resjson @@ -0,0 +1,33 @@ +{ + "loc.friendlyName": "Copiar archivos", + "loc.helpMarkDown": "[Obtener más información acerca de esta tarea](https://go.microsoft.com/fwlink/?LinkID=708389)", + "loc.description": "Copia archivos de una carpeta de origen a una carpeta de destino mediante patrones que coinciden con las rutas de acceso de los archivos (no con las rutas de carpeta).", + "loc.instanceNameFormat": "Copiar archivos a: $(TargetFolder)", + "loc.releaseNotes": "Coherencia de los patrones de coincidencia.", + "loc.group.displayName.advanced": "Avanzado", + "loc.input.label.SourceFolder": "Carpeta de origen", + "loc.input.help.SourceFolder": "La carpeta de origen desde la que se ejecutarán los patrones de copia. La raíz del repositorio está vacía. Use [variables](https://go.microsoft.com/fwlink/?LinkID=550988) si los archivos no están en el repositorio. Ejemplo: $(agent.builddirectory)", + "loc.input.label.Contents": "Contenido", + "loc.input.help.Contents": "Rutas de acceso de archivo que se incluirán como parte de la copia. Se admiten varias líneas de patrones de coincidencia. [Más información] (https://go.microsoft.com/fwlink/?LinkID=708389)", + "loc.input.label.TargetFolder": "Carpeta de destino", + "loc.input.help.TargetFolder": "La carpeta de destino o la ruta UNC en la que se copiarán los archivos. Puede usar [variables](http://go.microsoft.com/fwlink/?LinkID=550988). Ejemplo: $(build.artifactstagingdirectory)", + "loc.input.label.CleanTargetFolder": "Borrar carpeta de destino", + "loc.input.help.CleanTargetFolder": "Eliminar todos los archivos existentes en la carpeta de destino antes de copiar", + "loc.input.label.OverWrite": "Sobrescribir", + "loc.input.help.OverWrite": "Reemplazar archivo existente en la carpeta de destino", + "loc.input.label.flattenFolders": "Acoplar carpetas", + "loc.input.help.flattenFolders": "Acople la estructura de carpeta y copie todos los archivos en la carpeta de destino especificada.", + "loc.input.label.preserveTimestamp": "Conservar la marca de tiempo de destino", + "loc.input.help.preserveTimestamp": "Al usar el archivo de código fuente original, conserve la marca de tiempo del archivo de destino.", + "loc.input.label.retryCount": "Número de reintentos para copiar el archivo", + "loc.input.help.retryCount": "Especifique el número de reintentos para copiar el archivo. Puede que ayude a resolver problemas intermitentes, por ejemplo, con rutas de acceso de destino UNC en un host remoto.", + "loc.input.label.delayBetweenRetries": "Retraso entre dos reintentos.", + "loc.input.help.delayBetweenRetries": "Especifique el retraso entre dos reintentos. Es posible que resulte más resistente a los problemas intermitentes, por ejemplo, con rutas de acceso de destino UNC en un host remoto.", + "loc.input.label.ignoreMakeDirErrors": "Omitir errores durante la creación de la carpeta de destino.", + "loc.input.help.ignoreMakeDirErrors": "Omite los errores que se producen durante la creación de la carpeta de destino. Esto puede ser útil para evitar problemas con la ejecución simultánea de tareas por parte de diversos agentes con una carpeta de destino.", + "loc.messages.FoundNFiles": "se encontraron %d archivos", + "loc.messages.CleaningTargetFolder": "Limpiando carpeta de destino: %s", + "loc.messages.FileAlreadyExistAt": "El archivo %s ya existe en %s", + "loc.messages.CopyingTo": "Copiando %s en %s", + "loc.messages.TargetIsDir": "No se puede copiar el archivo %s en %s. La ruta de acceso de destino ya existe como directorio." +} \ No newline at end of file diff --git a/_generated/CopyFilesV2/Strings/resources.resjson/fr-FR/resources.resjson b/_generated/CopyFilesV2/Strings/resources.resjson/fr-FR/resources.resjson new file mode 100644 index 000000000000..a2269a8d6c40 --- /dev/null +++ b/_generated/CopyFilesV2/Strings/resources.resjson/fr-FR/resources.resjson @@ -0,0 +1,33 @@ +{ + "loc.friendlyName": "Copier des fichiers", + "loc.helpMarkDown": "[En savoir plus sur cette tâche](https://go.microsoft.com/fwlink/?LinkID=708389)", + "loc.description": "Copier les fichiers d'un dossier source vers un dossier cible à l'aide de modèles correspondant à des chemins de fichiers (et non des chemins de dossiers)", + "loc.instanceNameFormat": "Copier les fichiers vers : $(TargetFolder)", + "loc.releaseNotes": "Cohérence du modèle de correspondance.", + "loc.group.displayName.advanced": "Avancé", + "loc.input.label.SourceFolder": "Dossier source", + "loc.input.help.SourceFolder": "Dossier source à partir duquel les modèles de copie sont exécutés. La valeur vide est la racine du référentiel. Utilisez [variables](https://go.microsoft.com/fwlink/?LinkID=550988) si les fichiers ne sont pas dans le référentiel. Exemple : $(agent.builddirectory)", + "loc.input.label.Contents": "Contenu", + "loc.input.help.Contents": "Chemins de fichiers à inclure dans le cadre de la copie. Prend en charge plusieurs lignes de modèles de correspondance. [Plus d'informations](https://go.microsoft.com/fwlink/?LinkID=708389)", + "loc.input.label.TargetFolder": "Dossier cible", + "loc.input.help.TargetFolder": "Dossier cible ou chemin UNC vers lequel les fichiers sont copiés. Vous pouvez utiliser [variables](http://go.microsoft.com/fwlink/?LinkID=550988). Exemple : $(build.artifactstagingdirectory)", + "loc.input.label.CleanTargetFolder": "Effacer le dossier cible", + "loc.input.help.CleanTargetFolder": "Supprimer tous les fichiers existants dans le dossier cible avant de copier", + "loc.input.label.OverWrite": "Remplacer", + "loc.input.help.OverWrite": "Remplacer le fichier existant dans le dossier cible", + "loc.input.label.flattenFolders": "Aplatir les dossiers", + "loc.input.help.flattenFolders": "Aplatit la structure des dossiers et copie tous les fichiers dans le dossier cible spécifié.", + "loc.input.label.preserveTimestamp": "Conserver l'horodatage cible", + "loc.input.help.preserveTimestamp": "À l'aide du fichier source d'origine, conservez l'horodatage du fichier cible.", + "loc.input.label.retryCount": "Recommencer le nombre de tentatives pour copier le fichier", + "loc.input.help.retryCount": "Spécifiez le nombre d’tentatives pour copier le fichier. Il peut être utile de résoudre les problèmes intermittents par exemple, avec les chemins d’accès cibles UNC sur un hôte distant.", + "loc.input.label.delayBetweenRetries": "Délai entre deux nouvelles tentatives.", + "loc.input.help.delayBetweenRetries": "Spécifiez le délai entre deux tentatives. Cela peut contribuer à améliorer la résilience aux problèmes intermittents, par exemple avec les chemins d’améliorer cibles UNC sur un hôte distant.", + "loc.input.label.ignoreMakeDirErrors": "Ignorer les erreurs lors de la création d’un dossier cible.", + "loc.input.help.ignoreMakeDirErrors": "Ignore les erreurs survenues lors de la création d’un dossier cible. Cela peut être utile pour éviter les problèmes avec l’exécution en parallèle de tâches par plusieurs agents avec un dossier cible.", + "loc.messages.FoundNFiles": "%d fichiers trouvés", + "loc.messages.CleaningTargetFolder": "Nettoyage du dossier cible : %s", + "loc.messages.FileAlreadyExistAt": "Le fichier %s existe déjà sur %s", + "loc.messages.CopyingTo": "Copie de %s vers %s", + "loc.messages.TargetIsDir": "Impossible de copier le fichier %s dans %s. Le chemin cible existe déjà sous forme de répertoire." +} \ No newline at end of file diff --git a/_generated/CopyFilesV2/Strings/resources.resjson/it-IT/resources.resjson b/_generated/CopyFilesV2/Strings/resources.resjson/it-IT/resources.resjson new file mode 100644 index 000000000000..cd254747abbc --- /dev/null +++ b/_generated/CopyFilesV2/Strings/resources.resjson/it-IT/resources.resjson @@ -0,0 +1,33 @@ +{ + "loc.friendlyName": "Copia file", + "loc.helpMarkDown": "[Altre informazioni su questa attività](https://go.microsoft.com/fwlink/?LinkID=708389)", + "loc.description": "Copia i file da una cartella di origine a una cartella di destinazione usando criteri corrispondenti a percorsi di file (non percorsi di cartella)", + "loc.instanceNameFormat": "Copia file in: $(TargetFolder)", + "loc.releaseNotes": "Coerenza dei criteri di corrispondenza.", + "loc.group.displayName.advanced": "Avanzate", + "loc.input.label.SourceFolder": "Cartella di origine", + "loc.input.help.SourceFolder": "Cartella di origine da cui verranno eseguiti i criteri di copia. Il valore vuoto corrisponde alla radice del repository. Usare [variabili](https://go.microsoft.com/fwlink/?LinkID=550988) se i file non sono presenti nel repository. Esempio: $(agent.builddirectory)", + "loc.input.label.Contents": "Contenuti", + "loc.input.help.Contents": "Percorsi di file da includere nella copia. Sono supportate più righe di criteri di corrispondenza. [Altre informazioni](https://go.microsoft.com/fwlink/?LinkID=708389)", + "loc.input.label.TargetFolder": "Cartella di destinazione", + "loc.input.help.TargetFolder": "Cartella di destinazione o percorso UNC in cui verranno copiati i file. È possibile usare [variabili](http://go.microsoft.com/fwlink/?LinkID=550988). Esempio: $(build.artifactstagingdirectory)", + "loc.input.label.CleanTargetFolder": "Pulisci cartella di destinazione", + "loc.input.help.CleanTargetFolder": "Elimina tutti i file esistenti nella cartella di destinazione prima della copia", + "loc.input.label.OverWrite": "Sovrascrivi", + "loc.input.help.OverWrite": "Sostituisce il file esistente nella cartella di destinazione", + "loc.input.label.flattenFolders": "Rendi flat le cartelle", + "loc.input.help.flattenFolders": "Rende flat la struttura di cartelle e copia tutti i file nella cartella di destinazione specificata.", + "loc.input.label.preserveTimestamp": "Mantieni timestamp di destinazione", + "loc.input.help.preserveTimestamp": "Quando si usa il file di origine iniziale, mantiene il timestamp del file di destinazione.", + "loc.input.label.retryCount": "Numero di tentativi eseguiti per copiare il file", + "loc.input.help.retryCount": "Specificare il numero di tentativi eseguiti per copiare il file. Ciò potrebbe aiutare a risolvere i problemi intermittenti, ad esempio nei percorsi di destinazione UNC su un host remoto.", + "loc.input.label.delayBetweenRetries": "Ritardo tra due tentativi.", + "loc.input.help.delayBetweenRetries": "Specifica il ritardo tra due tentativi. Potrebbe essere utile per una maggiore resilienza a problemi intermittenti, ad esempio quelli relativi a percorsi di destinazione UNC in un host remoto.", + "loc.input.label.ignoreMakeDirErrors": "Ignorare gli errori durante la creazione della cartella di destinazione.", + "loc.input.help.ignoreMakeDirErrors": "Ignorare gli errori che si verificano durante la creazione della cartella di destinazione. Questa operazione potrebbe essere utile per evitare problemi di esecuzione parallela dell'attività da parte di diversi agenti con una cartella di destinazione.", + "loc.messages.FoundNFiles": "sono stati trovati %d file", + "loc.messages.CleaningTargetFolder": "Pulizia della cartella di destinazione: %s", + "loc.messages.FileAlreadyExistAt": "Il file %s esiste già in %s", + "loc.messages.CopyingTo": "Copia di %s in %s", + "loc.messages.TargetIsDir": "Non è possibile copiare il file %s in %s. Il percorso di destinazione esiste già come directory." +} \ No newline at end of file diff --git a/_generated/CopyFilesV2/Strings/resources.resjson/ja-JP/resources.resjson b/_generated/CopyFilesV2/Strings/resources.resjson/ja-JP/resources.resjson new file mode 100644 index 000000000000..4460b173de99 --- /dev/null +++ b/_generated/CopyFilesV2/Strings/resources.resjson/ja-JP/resources.resjson @@ -0,0 +1,33 @@ +{ + "loc.friendlyName": "ファイルのコピー", + "loc.helpMarkDown": "[このタスクの詳細を表示](https://go.microsoft.com/fwlink/?LinkID=708389)", + "loc.description": "パターン マッチングのファイル パス (フォルダー パスではない) を使用して、ソース フォルダーからターゲット フォルダーにファイルをコピーします", + "loc.instanceNameFormat": "ファイルのコピー先: $(TargetFolder)", + "loc.releaseNotes": "パターンの整合性を一致させます。", + "loc.group.displayName.advanced": "詳細設定", + "loc.input.label.SourceFolder": "ソース フォルダー", + "loc.input.help.SourceFolder": "コピー パターンの実行元のソース フォルダー。空白はリポジトリのルートです。ファイルがリポジトリにない場合は、[変数](https://go.microsoft.com/fwlink/?LinkID=550988) を使用します。例: $(agent.builddirectory)", + "loc.input.label.Contents": "コンテンツ", + "loc.input.help.Contents": "コピーの一部として含むファイル パス。複数行の一致パターンをサポートします。[詳細](https://go.microsoft.com/fwlink/?LinkID=708389)", + "loc.input.label.TargetFolder": "ターゲット フォルダー", + "loc.input.help.TargetFolder": "ファイルをコピーするターゲット フォルダーまたは UNC パス。[変数](http://go.microsoft.com/fwlink/?LinkID=550988) を使用できます。例: $(build.artifactstagingdirectory)", + "loc.input.label.CleanTargetFolder": "ターゲット フォルダーの消去", + "loc.input.help.CleanTargetFolder": "コピーする前にターゲット フォルダーにある既存のファイルをすべて削除する", + "loc.input.label.OverWrite": "上書き", + "loc.input.help.OverWrite": "ターゲット フォルダー内の既存のファイルを置き換える", + "loc.input.label.flattenFolders": "フォルダーのフラット化", + "loc.input.help.flattenFolders": "フォルダー構造をフラットにして、すべてのファイルを指定のターゲット フォルダーにコピーします。", + "loc.input.label.preserveTimestamp": "ターゲットのタイムスタンプの保持", + "loc.input.help.preserveTimestamp": "元のソース ファイルを使用して、ターゲット ファイルのタイムスタンプを保持します。", + "loc.input.label.retryCount": "ファイル コピーの再試行回数", + "loc.input.help.retryCount": "ファイルをコピーする再試行回数を指定します。リモート ホスト上の UNC ターゲット パスなど、断続的な問題を解決するのに役立つ可能性があります。", + "loc.input.label.delayBetweenRetries": "2 回の再試行の間の遅延。", + "loc.input.help.delayBetweenRetries": "2 回の再試行の間の遅延を指定してください。断続的な問題に対してはさらに回復性を高めると役立つかもしれません (例: リモート ホストでの UNC ターゲット パスなど)。", + "loc.input.label.ignoreMakeDirErrors": "ターゲット フォルダーの作成中に発生したエラーを無視します。", + "loc.input.help.ignoreMakeDirErrors": "ターゲット フォルダーの作成中に発生するエラーを無視します。これは、1 つのターゲット フォルダーで複数のエージェントによるタスクの並列実行に関する問題を回避するために役立ちます。", + "loc.messages.FoundNFiles": "%d 件のファイルが見つかりました", + "loc.messages.CleaningTargetFolder": "ターゲット フォルダーをクリーンアップ中: %s", + "loc.messages.FileAlreadyExistAt": "ファイル %s は %s に既に存在しています", + "loc.messages.CopyingTo": "%s を %s にコピー中", + "loc.messages.TargetIsDir": "ファイル %s を %s にコピーできません。ターゲット パスはディレクトリとして既に存在します。" +} \ No newline at end of file diff --git a/_generated/CopyFilesV2/Strings/resources.resjson/ko-KR/resources.resjson b/_generated/CopyFilesV2/Strings/resources.resjson/ko-KR/resources.resjson new file mode 100644 index 000000000000..8fb6be7e6859 --- /dev/null +++ b/_generated/CopyFilesV2/Strings/resources.resjson/ko-KR/resources.resjson @@ -0,0 +1,33 @@ +{ + "loc.friendlyName": "파일 복사", + "loc.helpMarkDown": "[이 작업에 대한 자세한 정보](https://go.microsoft.com/fwlink/?LinkID=708389)", + "loc.description": "패턴 일치 파일 경로(폴더 경로 아님)를 사용하여 소스 폴더에서 대상 폴더로 파일을 복사합니다.", + "loc.instanceNameFormat": "파일을 복사할 위치: $(TargetFolder)", + "loc.releaseNotes": "일치 패턴 일관성입니다.", + "loc.group.displayName.advanced": "고급", + "loc.input.label.SourceFolder": "소스 폴더", + "loc.input.help.SourceFolder": "사본 패턴이 실행될 소스 폴더입니다. 리포지토리의 루트는 [비어 있음]입니다. 파일이 리포지토리에 없으면 [변수](https://go.microsoft.com/fwlink/?LinkID=550988)를 사용하세요. 예: $(agent.builddirectory)", + "loc.input.label.Contents": "콘텐츠", + "loc.input.help.Contents": "복사의 일부로 포함할 파일 경로입니다. 여러 줄의 일치 패턴을 지원합니다. [자세한 정보](https://go.microsoft.com/fwlink/?LinkID=708389)", + "loc.input.label.TargetFolder": "대상 폴더", + "loc.input.help.TargetFolder": "파일이 복사될 대상 폴더 또는 UNC 경로입니다. [변수](http://go.microsoft.com/fwlink/?LinkID=550988)를 사용할 수 있습니다. 예: $(build.artifactstagingdirectory)", + "loc.input.label.CleanTargetFolder": "대상 폴더 정리", + "loc.input.help.CleanTargetFolder": "복사 전 대상 폴더에서 기존 파일 모두 삭제", + "loc.input.label.OverWrite": "덮어쓰기", + "loc.input.help.OverWrite": "대상 폴더에서 기존 파일 바꾸기", + "loc.input.label.flattenFolders": "폴더 평면화", + "loc.input.help.flattenFolders": "폴더 구조를 평면화하고 모든 파일을 지정된 대상 폴더에 복사합니다.", + "loc.input.label.preserveTimestamp": "대상 타임스탬프 유지", + "loc.input.help.preserveTimestamp": "원본 소스 파일을 사용하여 대상 파일 타임스탬프를 유지합니다.", + "loc.input.label.retryCount": "파일 복사 재시도 횟수", + "loc.input.help.retryCount": "파일을 복사하려면 재시도 횟수를 지정합니다. 원격 호스트의 UNC 대상 경로와 같은 간헐적인 문제를 해결하는 데 도움이 될 수 있습니다.", + "loc.input.label.delayBetweenRetries": "두 번의 재시도 사이의 지연 시간입니다.", + "loc.input.help.delayBetweenRetries": "두 번의 재시도 사이의 지연을 지정합니다. 간헐적인 문제에 더 탄력적으로 대처하는 데 도움이 될 수 있습니다(예: 원격 호스트의 UNC 대상 경로 문제).", + "loc.input.label.ignoreMakeDirErrors": "대상 폴더를 만드는 동안 발생하는 오류를 무시하세요.", + "loc.input.help.ignoreMakeDirErrors": "대상 폴더를 만드는 동안 발생하는 오류를 무시하세요. 이 기능은 대상 폴더가 하나인 여러 에이전트의 병렬 작업 실행과 관련된 문제를 방지하는 데 유용할 수 있습니다.", + "loc.messages.FoundNFiles": "%d개 파일을 찾았습니다.", + "loc.messages.CleaningTargetFolder": "대상 폴더 정리: %s", + "loc.messages.FileAlreadyExistAt": "%s 파일이 %s에 이미 있습니다.", + "loc.messages.CopyingTo": "%s을(를) %s(으)로 복사하는 중", + "loc.messages.TargetIsDir": "%s 파일을 %s에 복사할 수 없습니다. 대상 경로가 이미 디렉터리로 있습니다." +} \ No newline at end of file diff --git a/_generated/CopyFilesV2/Strings/resources.resjson/ru-RU/resources.resjson b/_generated/CopyFilesV2/Strings/resources.resjson/ru-RU/resources.resjson new file mode 100644 index 000000000000..0ecbbb8adee7 --- /dev/null +++ b/_generated/CopyFilesV2/Strings/resources.resjson/ru-RU/resources.resjson @@ -0,0 +1,33 @@ +{ + "loc.friendlyName": "Копировать файлы", + "loc.helpMarkDown": "[См. дополнительные сведения об этой задаче](https://go.microsoft.com/fwlink/?LinkID=708389)", + "loc.description": "Копировать файлы из исходной папки в целевую с использованием шаблонов, соответствующих путям файлов (не путям к папкам)", + "loc.instanceNameFormat": "Копировать файлы в: $(TargetFolder)", + "loc.releaseNotes": "Согласованность шаблонов соответствия.", + "loc.group.displayName.advanced": "Дополнительно", + "loc.input.label.SourceFolder": "Исходная папка", + "loc.input.help.SourceFolder": "Исходная папка, откуда будут запускаться шаблоны копирования. Если значение не указано, используется корень репозитория. Используйте [переменные](https://go.microsoft.com/fwlink/?LinkID=550988), если файлы находятся не в репозитории. Например: $(agent.builddirectory)", + "loc.input.label.Contents": "Содержимое", + "loc.input.help.Contents": "Пути к файлам, которые будут включены в операцию копирования. Есть поддержка многострочных шаблонов сопоставления. [Подробнее...](https://go.microsoft.com/fwlink/?LinkID=708389)", + "loc.input.label.TargetFolder": "Целевая папка", + "loc.input.help.TargetFolder": "Целевая папка или UNC-путь для копирования файлов. Можно использовать [переменные](http://go.microsoft.com/fwlink/?LinkID=550988). Например: $(build.artifactstagingdirectory)", + "loc.input.label.CleanTargetFolder": "Очистить целевую папку", + "loc.input.help.CleanTargetFolder": "Удалить все существующие файлы в целевой папке перед копированием", + "loc.input.label.OverWrite": "Перезаписать", + "loc.input.help.OverWrite": "Заменить существующий файл в целевой папке", + "loc.input.label.flattenFolders": "Выполнить сведение папок", + "loc.input.help.flattenFolders": "Выполнение сведения структуры папок и копирование всех файлов в указанную целевую папку.", + "loc.input.label.preserveTimestamp": "Сохранить целевую метку времени", + "loc.input.help.preserveTimestamp": "Используя оригинальный исходный файл, сохраните метку времени целевого файла.", + "loc.input.label.retryCount": "Число повторных попыток копировать файл", + "loc.input.help.retryCount": "Укажите число повторных попыток копировать файл. Это может помочь в устранении временных проблем, например с целевыми UNC-путями на удаленном узле.", + "loc.input.label.delayBetweenRetries": "Задержка между двумя попытками.", + "loc.input.help.delayBetweenRetries": "Укажите задержку между двумя попытками. Это может повысить устойчивость к периодическим проблемам, например с целевыми путями UNC на удаленном узле.", + "loc.input.label.ignoreMakeDirErrors": "Игнорировать ошибки при создании целевой папки.", + "loc.input.help.ignoreMakeDirErrors": "Игнорируйте ошибки, возникающие при создании целевой папки. Это может позволить избежать проблем с параллельным выполнением задачи несколькими агентами с одной целевой папкой.", + "loc.messages.FoundNFiles": "найдено файлов: %d", + "loc.messages.CleaningTargetFolder": "Очистка целевого каталога: %s", + "loc.messages.FileAlreadyExistAt": "Файл \"%s\" уже существует в \"%s\"", + "loc.messages.CopyingTo": "Копирование \"%s\" в \"%s\"", + "loc.messages.TargetIsDir": "Не удалось скопировать файл %s в %s. Путь назначения уже существует в виде каталога." +} \ No newline at end of file diff --git a/_generated/CopyFilesV2/Strings/resources.resjson/zh-CN/resources.resjson b/_generated/CopyFilesV2/Strings/resources.resjson/zh-CN/resources.resjson new file mode 100644 index 000000000000..b9d813ebe4f0 --- /dev/null +++ b/_generated/CopyFilesV2/Strings/resources.resjson/zh-CN/resources.resjson @@ -0,0 +1,33 @@ +{ + "loc.friendlyName": "复制文件", + "loc.helpMarkDown": "[详细了解此任务](https://go.microsoft.com/fwlink/?LinkID=708389)", + "loc.description": "使用与文件路径(不是文件夹路径)匹配的模式将源文件夹中的文件复制到目标文件夹", + "loc.instanceNameFormat": "将文件复制到: $(TargetFolder)", + "loc.releaseNotes": "匹配模式一致性。", + "loc.group.displayName.advanced": "高级", + "loc.input.label.SourceFolder": "源文件夹", + "loc.input.help.SourceFolder": "将在其中运行复制模式的源文件夹。为空表示存储库的根。如果存储库中没有文件,请使用[变量](https://go.microsoft.com/fwlink/?LinkID=550988)。示例: $(agent.builddirectory)", + "loc.input.label.Contents": "内容", + "loc.input.help.Contents": "要包含在副本中的文件路径。支持多行匹配模式。[详细信息](https://go.microsoft.com/fwlink/?LinkID=708389)", + "loc.input.label.TargetFolder": "目标文件夹", + "loc.input.help.TargetFolder": "文件将复制到的目标文件夹或 UNC 路径。可以使用 [variables](http://go.microsoft.com/fwlink/?LinkID=550988)。示例: $(build.artifactstagingdirectory)", + "loc.input.label.CleanTargetFolder": "清理目标文件夹", + "loc.input.help.CleanTargetFolder": "复制之前,先删除目标文件夹中的现有全部文件", + "loc.input.label.OverWrite": "覆盖", + "loc.input.help.OverWrite": "替换目标文件夹中的现有文件", + "loc.input.label.flattenFolders": "精简文件夹", + "loc.input.help.flattenFolders": "平展文件夹结构并将所有文件复制到指定的目标文件夹。", + "loc.input.label.preserveTimestamp": "保留目标时间戳", + "loc.input.help.preserveTimestamp": "使用原始源文件,保留目标文件时间戳。", + "loc.input.label.retryCount": "复制该文件的重试计数", + "loc.input.help.retryCount": "指定复制该文件的重试计数。它可以帮助解决间歇性问题,例如远程主机上的 UNC 目标路径的问题。", + "loc.input.label.delayBetweenRetries": "两次重试之间的延迟。", + "loc.input.help.delayBetweenRetries": "指定两次重试之间的延迟。这可能有助于更灵活地应对间歇性问题,例如远程主机上的 UNC 目标路径。", + "loc.input.label.ignoreMakeDirErrors": "在创建目标文件夹期间忽略错误。", + "loc.input.help.ignoreMakeDirErrors": "忽略创建目标文件夹期间发生的错误。这有助于避免由具有一个目标文件夹的多个代理并行执行任务的问题。", + "loc.messages.FoundNFiles": "已找到 %d 个文件", + "loc.messages.CleaningTargetFolder": "正在清理目标文件夹: %s", + "loc.messages.FileAlreadyExistAt": "文件 %s 已存在于 %s", + "loc.messages.CopyingTo": "正在将 %s 复制到 %s", + "loc.messages.TargetIsDir": "无法将文件 %s 复制到 %s。目标路径已作为目录存在。" +} \ No newline at end of file diff --git a/_generated/CopyFilesV2/Strings/resources.resjson/zh-TW/resources.resjson b/_generated/CopyFilesV2/Strings/resources.resjson/zh-TW/resources.resjson new file mode 100644 index 000000000000..52c4e6abbe42 --- /dev/null +++ b/_generated/CopyFilesV2/Strings/resources.resjson/zh-TW/resources.resjson @@ -0,0 +1,33 @@ +{ + "loc.friendlyName": "複製檔案", + "loc.helpMarkDown": "[深入了解此工作](https://go.microsoft.com/fwlink/?LinkID=708389)", + "loc.description": "使用模式比對檔案路徑 (非資料夾路徑) 從來源資料夾將檔案複製到目標資料夾", + "loc.instanceNameFormat": "將檔案複製到: $(TargetFolder)", + "loc.releaseNotes": "符合模式一致性。", + "loc.group.displayName.advanced": "進階", + "loc.input.label.SourceFolder": "來源資料夾", + "loc.input.help.SourceFolder": "複製模式執行所在的來源資料夾。保留空白表示是存放庫的根資料夾。若檔案不在存放庫中,請使用 [變數](https://go.microsoft.com/fwlink/?LinkID=550988)。例如: $(agent.builddirectory)", + "loc.input.label.Contents": "內容", + "loc.input.help.Contents": "要在複製時一併加入的檔案路徑。支援多行的比對模式。[詳細資訊](https://go.microsoft.com/fwlink/?LinkID=708389)", + "loc.input.label.TargetFolder": "目標資料夾", + "loc.input.help.TargetFolder": "設定要複製檔案的目標資料夾或 UNC 路徑。您可以使用[變數](http://go.microsoft.com/fwlink/?LinkID=550988)。例如: $(build.artifactstagingdirectory)", + "loc.input.label.CleanTargetFolder": "清除目標資料夾", + "loc.input.help.CleanTargetFolder": "複製前先刪除目標資料夾中所有現有的檔案", + "loc.input.label.OverWrite": "覆寫", + "loc.input.help.OverWrite": "取代目標資料夾中現有的檔案", + "loc.input.label.flattenFolders": "壓平合併資料夾", + "loc.input.help.flattenFolders": "壓平合併資料夾結構並將所有檔案複製到指定的目標資料夾。", + "loc.input.label.preserveTimestamp": "保留目標時間戳記", + "loc.input.help.preserveTimestamp": "正在使用原始來源檔案,保留目標檔案時間戳記。", + "loc.input.label.retryCount": "要複製檔案的重試計數", + "loc.input.help.retryCount": "指定要複製檔案的重試計數。這可能有助於解決間歇性問題,例如在遠端主機上使用 UNC 目標路徑。", + "loc.input.label.delayBetweenRetries": "兩次重試之間的延遲。", + "loc.input.help.delayBetweenRetries": "指定兩次重試之間的延遲。它可能有助於對間歇性問題保持彈性,例如在遠端主機上使用 UNC 目標路徑。", + "loc.input.label.ignoreMakeDirErrors": "在建立目標資料夾期間,略過錯誤。", + "loc.input.help.ignoreMakeDirErrors": "在建立目標資料夾期間,略過錯誤。這可能有助於避免多個代理程式與一個目標資料夾平行執行工作的問題。", + "loc.messages.FoundNFiles": "找到 %d 個檔案", + "loc.messages.CleaningTargetFolder": "正在刪除目標資料夾: %s", + "loc.messages.FileAlreadyExistAt": "檔案 %s 已存在於 %s 上", + "loc.messages.CopyingTo": "正在將 %s 複製到 %s", + "loc.messages.TargetIsDir": "無法將檔案 %s 複製到 %s。目標路徑已作為目錄存在。" +} \ No newline at end of file diff --git a/_generated/CopyFilesV2/Tests/L0.ts b/_generated/CopyFilesV2/Tests/L0.ts new file mode 100644 index 000000000000..dfe3095fe63f --- /dev/null +++ b/_generated/CopyFilesV2/Tests/L0.ts @@ -0,0 +1,436 @@ +import * as assert from 'assert'; +import * as mocktest from 'azure-pipelines-task-lib/mock-test'; +import * as os from 'os'; +import * as path from 'path'; + +describe('CopyFiles L0 Suite', function () { + this.timeout(parseInt(process.env.TASK_TEST_TIMEOUT) || 20000); + + before(() => { }); + + after(() => { }); + + it('copy files from srcdir to destdir', (done: Mocha.Done) => { + this.timeout(1000); + + let testPath = path.join(__dirname, 'L0copyAllFiles.js'); + let runner: mocktest.MockTestRunner = new mocktest.MockTestRunner(testPath); + runner.run(); + + assert( + runner.succeeded, + 'should have succeeded'); + assert( + runner.stdOutContained(`creating path: ${path.normalize('/destDir')}`), + 'should have mkdirP destDir'); + assert( + runner.stdOutContained(`creating path: ${path.normalize('/destDir/someOtherDir')}`), + 'should have mkdirP someOtherDir'); + assert( + runner.stdOutContained(`creating path: ${path.normalize('/destDir/someOtherDir2')}`), + 'should have mkdirP someOtherDir2'); + assert( + !runner.stdOutContained(`creating path: ${path.normalize('/destDir/someOtherDir3')}`), + 'should not have mkdirP someOtherDir3'); + assert( + runner.stdOutContained(`copying ${path.normalize('/srcDir/someOtherDir/file1.file')} to ${path.normalize('/destDir/someOtherDir/file1.file')}`), + 'should have copied dir1 file1'); + assert( + runner.stdOutContained(`copying ${path.normalize('/srcDir/someOtherDir/file2.file')} to ${path.normalize('/destDir/someOtherDir/file2.file')}`), + 'should have copied dir1 file2'); + assert( + runner.stdOutContained(`copying ${path.normalize('/srcDir/someOtherDir2/file1.file')} to ${path.normalize('/destDir/someOtherDir2/file1.file')}`), + 'should have copied dir2 file1'); + assert( + runner.stdOutContained(`copying ${path.normalize('/srcDir/someOtherDir2/file2.file')} to ${path.normalize('/destDir/someOtherDir2/file2.file')}`), + 'should have copied dir2 file2'); + assert( + runner.stdOutContained(`copying ${path.normalize('/srcDir/someOtherDir2/file3.file')} to ${path.normalize('/destDir/someOtherDir2/file3.file')}`), + 'should have copied dir2 file3'); + done(); + }); + + it('copy files from srcdir to destdir with brackets in src path', (done: Mocha.Done) => { + this.timeout(1000); + + let testPath = path.join(__dirname, 'L0copyAllFilesWithBracketsInSrcPath.js'); + let runner: mocktest.MockTestRunner = new mocktest.MockTestRunner(testPath); + runner.run(); + + assert( + runner.succeeded, + 'should have succeeded'); + assert( + runner.stdOutContained(`creating path: ${path.normalize('/destDir')}`), + 'should have mkdirP destDir'); + assert( + runner.stdOutContained(`creating path: ${path.normalize('/destDir/someOtherDir')}`), + 'should have mkdirP someOtherDir'); + assert( + runner.stdOutContained(`creating path: ${path.normalize('/destDir/someOtherDir2')}`), + 'should have mkdirP someOtherDir2'); + assert( + !runner.stdOutContained(`creating path: ${path.normalize('/destDir/someOtherDir3')}`), + 'should not have mkdirP someOtherDir3'); + assert( + runner.stdOutContained(`copying ${path.normalize('/srcDir [bracket]/someOtherDir/file1.file')} to ${path.normalize('/destDir/someOtherDir/file1.file')}`), + 'should have copied dir1 file1'); + assert( + runner.stdOutContained(`copying ${path.normalize('/srcDir [bracket]/someOtherDir/file2.file')} to ${path.normalize('/destDir/someOtherDir/file2.file')}`), + 'should have copied dir1 file2'); + assert( + runner.stdOutContained(`copying ${path.normalize('/srcDir [bracket]/someOtherDir2/file1.file')} to ${path.normalize('/destDir/someOtherDir2/file1.file')}`), + 'should have copied dir2 file1'); + assert( + runner.stdOutContained(`copying ${path.normalize('/srcDir [bracket]/someOtherDir2/file2.file')} to ${path.normalize('/destDir/someOtherDir2/file2.file')}`), + 'should have copied dir2 file2'); + assert( + runner.stdOutContained(`copying ${path.normalize('/srcDir [bracket]/someOtherDir2/file3.file')} to ${path.normalize('/destDir/someOtherDir2/file3.file')}`), + 'should have copied dir2 file3'); + done(); + }); + + it('copy files and subtract based on exclude pattern', (done: Mocha.Done) => { + this.timeout(1000); + + let testPath = path.join(__dirname, 'L0copySubtractExclude.js'); + let runner: mocktest.MockTestRunner = new mocktest.MockTestRunner(testPath); + runner.run(); + + assert( + runner.succeeded, + 'should have succeeded'); + assert( + runner.stdOutContained(`creating path: ${path.normalize('/destDir')}`), + 'should have mkdirP destDir'); + assert( + runner.stdOutContained(`creating path: ${path.normalize('/destDir/someOtherDir')}`), + 'should have mkdirP someOtherDir'); + assert( + !runner.stdOutContained(`creating path: ${path.normalize('/destDir/someOtherDir2')}`), + 'should not have mkdirP someOtherDir2'); + assert( + runner.stdOutContained(`copying ${path.normalize('/srcDir/someOtherDir/file1.file')} to ${path.normalize('/destDir/someOtherDir/file1.file')}`), + 'should have copied dir1 file1'); + assert( + runner.stdOutContained(`copying ${path.normalize('/srcDir/someOtherDir/file2.file')} to ${path.normalize('/destDir/someOtherDir/file2.file')}`), + 'should have copied dir1 file2'); + assert( + !runner.stdOutContained(`copying ${path.normalize('/srcDir/someOtherDir2/file1.file')} to ${path.normalize('/destDir/someOtherDir2/file1.file')}`), + 'should not have copied dir2 file1'); + done(); + }); + + it('fails if Contents not set', (done: Mocha.Done) => { + this.timeout(1000); + + let testPath = path.join(__dirname, 'L0failsIfContentsNotSet.js'); + let runner: mocktest.MockTestRunner = new mocktest.MockTestRunner(testPath); + runner.run(); + + assert(runner.failed, 'should have failed'); + assert(runner.createdErrorIssue('Error: Input required: Contents'), 'should have created error issue'); + done(); + }); + + it('fails if SourceFolder not set', (done: Mocha.Done) => { + this.timeout(1000); + + let testPath = path.join(__dirname, 'L0failsIfSourceFolderNotSet.js'); + let runner: mocktest.MockTestRunner = new mocktest.MockTestRunner(testPath); + runner.run(); + + assert(runner.failed, 'should have failed'); + assert(runner.createdErrorIssue('Error: Input required: SourceFolder'), 'should have created error issue'); + done(); + }); + + it('fails if TargetFolder not set', (done: Mocha.Done) => { + this.timeout(1000); + + let testPath = path.join(__dirname, 'L0failsIfTargetFolderNotSet.js'); + let runner: mocktest.MockTestRunner = new mocktest.MockTestRunner(testPath); + runner.run(); + + assert(runner.failed, 'should have failed'); + assert(runner.createdErrorIssue('Error: Input required: TargetFolder'), 'should have created error issue'); + done(); + }); + + it('fails if SourceFolder not found', (done: Mocha.Done) => { + this.timeout(1000); + + let testPath = path.join(__dirname, 'L0failsIfSourceFolderNotFound.js'); + let runner: mocktest.MockTestRunner = new mocktest.MockTestRunner(testPath); + runner.run(); + + assert(runner.failed, 'should have failed'); + assert(runner.createdErrorIssue(`Error: Not found ${path.normalize('/srcDir')}`), 'should have created error issue'); + done(); + }); + + it('fails if target file is a directory', (done: Mocha.Done) => { + this.timeout(1000); + + let testPath = path.join(__dirname, 'L0failsIfTargetFileIsDir.js'); + let runner: mocktest.MockTestRunner = new mocktest.MockTestRunner(testPath); + runner.run(); + + assert(runner.failed, 'should have failed'); + assert(runner.createdErrorIssue(`Error: loc_mock_TargetIsDir ${path.normalize('/srcDir/someOtherDir/file1.file')} ${path.normalize('/destDir/someOtherDir/file1.file')}`), 'should have created error issue'); + done(); + }); + + it('skips if exists', (done: Mocha.Done) => { + this.timeout(1000); + + let testPath = path.join(__dirname, 'L0skipsIfExists.js'); + let runner: mocktest.MockTestRunner = new mocktest.MockTestRunner(testPath); + runner.run(); + + assert( + runner.succeeded, + 'should have succeeded'); + assert( + runner.stdOutContained(`creating path: ${path.normalize('/destDir')}`), + 'should have mkdirP destDir'); + assert( + runner.stdOutContained(`creating path: ${path.normalize('/destDir/someOtherDir')}`), + 'should have mkdirP someOtherDir'); + assert( + !runner.stdOutContained(`copying ${path.normalize('/srcDir/someOtherDir/file1.file')} to ${path.normalize('/destDir/someOtherDir/file1.file')}`), + 'should not have copied file1'); + assert( + runner.stdOutContained(`copying ${path.normalize('/srcDir/someOtherDir/file2.file')} to ${path.normalize('/destDir/someOtherDir/file2.file')}`), + 'should have copied file2'); + done(); + }); + + it('overwrites if specified', (done: Mocha.Done) => { + this.timeout(1000); + + let testPath = path.join(__dirname, 'L0overwritesIfSpecified.js'); + let runner: mocktest.MockTestRunner = new mocktest.MockTestRunner(testPath); + runner.run(); + + assert( + runner.succeeded, + 'should have succeeded'); + assert( + runner.stdOutContained(`creating path: ${path.normalize('/destDir')}`), + 'should have mkdirP destDir'); + assert( + runner.stdOutContained(`creating path: ${path.normalize('/destDir/someOtherDir')}`), + 'should have mkdirP someOtherDir'); + assert( + runner.stdOutContained(`copying ${path.normalize('/srcDir/someOtherDir/file1.file')} to ${path.normalize('/destDir/someOtherDir/file1.file')}`), + 'should have copied file1'); + assert( + runner.stdOutContained(`copying ${path.normalize('/srcDir/someOtherDir/file2.file')} to ${path.normalize('/destDir/someOtherDir/file2.file')}`), + 'should have copied file2'); + done(); + }); + + it('preserves timestamp if specified', (done: Mocha.Done) => { + this.timeout(1000); + + let testPath = path.join(__dirname, 'L0preservesTimestampIfSpecified.js'); + let runner: mocktest.MockTestRunner = new mocktest.MockTestRunner(testPath); + runner.run(); + + assert( + runner.succeeded, + 'should have succeeded'); + assert( + runner.stdOutContained(`Calling fs.utimes on ${path.normalize('/destDir')}`), + 'should have copied timestamp'); + assert( + runner.stdOutContained(`creating path: ${path.normalize('/destDir')}`), + 'should have mkdirP destDir'); + assert( + runner.stdOutContained(`creating path: ${path.normalize('/destDir/someOtherDir')}`), + 'should have mkdirP someOtherDir'); + assert( + runner.stdOutContained(`copying ${path.normalize('/srcDir/someOtherDir/file1.file')} to ${path.normalize('/destDir/someOtherDir/file1.file')}`), + 'should have copied file1'); + assert( + runner.stdOutContained(`copying ${path.normalize('/srcDir/someOtherDir/file2.file')} to ${path.normalize('/destDir/someOtherDir/file2.file')}`), + 'should have copied file2'); + done(); + }); + + it('cleans if specified', (done: Mocha.Done) => { + this.timeout(1000); + + let testPath = path.join(__dirname, 'L0cleansIfSpecified.js'); + let runner: mocktest.MockTestRunner = new mocktest.MockTestRunner(testPath); + runner.run(); + + assert( + runner.succeeded, + 'should have succeeded'); + assert( + runner.stdOutContained(`rmRF ${path.normalize('/destDir/clean-subDir')}`), + 'should have cleaned destDir/clean-subDir'); + assert( + runner.stdOutContained(`rmRF ${path.normalize('/destDir/clean-file.txt')}`), + 'should have cleaned destDir/clean-file.txt'); + assert( + runner.stdOutContained(`creating path: ${path.normalize('/destDir')}`), + 'should have mkdirP destDir'); + assert( + runner.stdOutContained(`creating path: ${path.join('/destDir', 'someOtherDir')}`), + 'should have mkdirP someOtherDir'); + assert( + runner.stdOutContained(`copying ${path.normalize('/srcDir/someOtherDir/file1.file')} to ${path.normalize('/destDir/someOtherDir/file1.file')}`), + 'should have copied file1'); + assert( + runner.stdOutContained(`copying ${path.normalize('/srcDir/someOtherDir/file2.file')} to ${path.normalize('/destDir/someOtherDir/file2.file')}`), + 'should have copied file2'); + done(); + }); + + it("skips cleaning when destination folder doesn't exist", (done: Mocha.Done) => { + this.timeout(1000); + + let testPath = path.join(__dirname, 'L0cleansIfSpecifiedAndDestDoesntExist.js'); + let runner: mocktest.MockTestRunner = new mocktest.MockTestRunner(testPath); + runner.run(); + + // This will fail if stat is called with throwEnoent=true + assert( + runner.succeeded, + 'should have succeeded'); + assert( + !runner.stdOutContained(`rmRF ${path.normalize('/destDir/clean-subDir')}`), + 'should have skipped cleaning non-existent directory'); + assert( + !runner.stdOutContained(`rmRF ${path.normalize('/destDir/clean-file.txt')}`), + 'should have skipped cleaning non-existent directory'); + assert( + runner.stdOutContained(`creating path: ${path.normalize('/destDir')}`), + 'should have mkdirP destDir'); + assert( + runner.stdOutContained(`creating path: ${path.join('/destDir', 'someOtherDir')}`), + 'should have mkdirP someOtherDir'); + assert( + runner.stdOutContained(`copying ${path.normalize('/srcDir/someOtherDir/file1.file')} to ${path.normalize('/destDir/someOtherDir/file1.file')}`), + 'should have copied file1'); + assert( + runner.stdOutContained(`copying ${path.normalize('/srcDir/someOtherDir/file2.file')} to ${path.normalize('/destDir/someOtherDir/file2.file')}`), + 'should have copied file2'); + done(); + }); + + it('cleans if specified and target is file', (done: Mocha.Done) => { + this.timeout(1000); + + let testPath = path.join(__dirname, 'L0cleansIfSpecifiedAndTargetIsFile.js'); + let runner: mocktest.MockTestRunner = new mocktest.MockTestRunner(testPath); + runner.run(); + + assert( + runner.succeeded, + 'should have succeeded'); + assert( + runner.stdOutContained(`rmRF ${path.normalize('/destDir')}`), + 'should have cleaned destDir'); + assert( + runner.stdOutContained(`creating path: ${path.normalize('/destDir')}`), + 'should have mkdirP destDir'); + assert( + runner.stdOutContained(`creating path: ${path.join('/destDir', 'someOtherDir')}`), + 'should have mkdirP someOtherDir'); + assert( + runner.stdOutContained(`copying ${path.normalize('/srcDir/someOtherDir/file1.file')} to ${path.normalize('/destDir/someOtherDir/file1.file')}`), + 'should have copied file1'); + assert( + runner.stdOutContained(`copying ${path.normalize('/srcDir/someOtherDir/file2.file')} to ${path.normalize('/destDir/someOtherDir/file2.file')}`), + 'should have copied file2'); + done(); + }); + + it('roots patterns', (done: Mocha.Done) => { + this.timeout(1000); + + let testPath = path.join(__dirname, 'L0rootsPatterns.js'); + let runner: mocktest.MockTestRunner = new mocktest.MockTestRunner(testPath); + runner.run(); + + assert( + runner.succeeded, + 'should have succeeded'); + assert( + runner.stdOutContained(`copying ${path.normalize('/srcDir/someOtherDir/file1.file')} to ${path.normalize('/destDir/someOtherDir/file1.file')}`), + 'should have copied file1'); + assert( + runner.stdOutContained(`copying ${path.normalize('/srcDir/someOtherDir/file2.file')} to ${path.normalize('/destDir/someOtherDir/file2.file')}`), + 'should have copied file2'); + assert( + runner.stdOutContained(`copying ${path.normalize('/srcDir/someOtherDir2/file2.file')} to ${path.normalize('/destDir/someOtherDir2/file2.file')}`), + 'should have copied file1'); + done(); + }); + + it('ignores errors during target folder creation if ignoreMakeDirErrors is true', (done: Mocha.Done) => { + let testPath = path.join(__dirname, 'L0IgnoresMakeDirError.js'); + let runner: mocktest.MockTestRunner = new mocktest.MockTestRunner(testPath); + runner.run(); + + assert( + runner.succeeded, + 'should have succeeded'); + assert( + runner.stdOutContained(`copying ${path.normalize('/srcDir/someOtherDir/file1.file')} to ${path.normalize('/destDir/someOtherDir/file1.file')}`), + 'should have copied file1'); + + assert( + runner.stdOutContained(`copying ${path.normalize('/srcDir/someOtherDir/file2.file')} to ${path.normalize('/destDir/someOtherDir/file2.file')}`), + 'should have copied file2'); + done(); + }); + + it('fails if there are errors during target folder creation if ignoreMakeDirErrors is false', (done: Mocha.Done) => { + let testPath = path.join(__dirname, 'L0FailsIfThereIsMkdirError.js'); + let runner: mocktest.MockTestRunner = new mocktest.MockTestRunner(testPath); + runner.run(); + + assert( + runner.failed, + 'should have failed'); + done(); + }); + + if (process.platform == 'win32') { + it('overwrites readonly', (done: Mocha.Done) => { + this.timeout(1000); + + let testPath = path.join(__dirname, 'L0overwritesReadonly.js'); + let runner: mocktest.MockTestRunner = new mocktest.MockTestRunner(testPath); + runner.run(); + + assert( + runner.succeeded, + 'should have succeeded'); + assert( + runner.stdOutContained(`creating path: ${path.normalize('/destDir')}`), + 'should have mkdirP destDir'); + assert( + runner.stdOutContained(`creating path: ${path.normalize('/destDir/someOtherDir')}`), + 'should have mkdirP someOtherDir'); + assert( + runner.stdOutContained(`chmodSync ${path.normalize('/destDir/someOtherDir/file1.file')} ${(6 << 6) + (6 << 3) + 6}`), // rw-rw-rw- + 'should have chmod file1'); + assert( + runner.stdOutContained(`copying ${path.normalize('/srcDir/someOtherDir/file1.file')} to ${path.normalize('/destDir/someOtherDir/file1.file')}`), + 'should have copied file1'); + assert( + !runner.stdOutContained(`chmodSync ${path.normalize('/destDir/someOtherDir/file2.file')} ${(6 << 6) + (6 << 3) + 6}`), // rw-rw-rw- + 'should not have chmod file2'); + assert( + runner.stdOutContained(`copying ${path.normalize('/srcDir/someOtherDir/file2.file')} to ${path.normalize('/destDir/someOtherDir/file2.file')}`), + 'should have copied file2'); + done(); + }); + } +}); diff --git a/_generated/CopyFilesV2/Tests/L0BrokenSymlinksAllowed.ts b/_generated/CopyFilesV2/Tests/L0BrokenSymlinksAllowed.ts new file mode 100644 index 000000000000..195ea0543da9 --- /dev/null +++ b/_generated/CopyFilesV2/Tests/L0BrokenSymlinksAllowed.ts @@ -0,0 +1,33 @@ +import fs = require('fs'); +import mockanswer = require('azure-pipelines-task-lib/mock-answer'); +import mockrun = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'copyfiles.js'); +let runner: mockrun.TaskMockRunner = new mockrun.TaskMockRunner(taskPath); +runner.setInput('Contents', '**'); +runner.setInput('SourceFolder', path.normalize('/srcDir')); +runner.setInput('TargetFolder', path.normalize('/destDir')); +runner.setInput('CleanTargetFolder', 'false'); +runner.setInput('Overwrite', 'false'); +let answers = { + checkPath: { }, + find: { }, +}; +answers.checkPath[path.normalize('/srcDir')] = true; +runner.setAnswers(answers); + + +runner.registerMockExport('find', (itemPath: string, options: any) => { + if(!options.allowBrokenSymbolicLinks) { + throw new Error(""); + } + + return ['/srcDir/file1']; +}); + +// as a precaution, disable fs.chmodSync. it should not be called during this scenario. +fs.chmodSync = null; +runner.registerMock('fs', fs); + +runner.run(); diff --git a/_generated/CopyFilesV2/Tests/L0FailsIfThereIsMkdirError.ts b/_generated/CopyFilesV2/Tests/L0FailsIfThereIsMkdirError.ts new file mode 100644 index 000000000000..a0b08a051a61 --- /dev/null +++ b/_generated/CopyFilesV2/Tests/L0FailsIfThereIsMkdirError.ts @@ -0,0 +1,66 @@ +import fs = require('fs'); +import mockanswer = require('azure-pipelines-task-lib/mock-answer'); +import mockrun = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'copyfiles.js'); +let runner: mockrun.TaskMockRunner = new mockrun.TaskMockRunner(taskPath); +runner.setInput('Contents', '**'); +runner.setInput('SourceFolder', path.normalize('/srcDir')); +runner.setInput('TargetFolder', path.normalize('/destDir')); +runner.setInput('CleanTargetFolder', 'false'); +runner.setInput('ignoreMakeDirErrors', 'false'); +runner.setInput('Overwrite', 'false'); +let answers = { + checkPath: { }, + find: { }, +}; +answers.checkPath[path.normalize('/srcDir')] = true; +answers.find[path.normalize('/srcDir')] = [ + path.normalize('/srcDir'), + path.normalize('/srcDir/someOtherDir'), + path.normalize('/srcDir/someOtherDir/file1.file'), + path.normalize('/srcDir/someOtherDir/file2.file'), +]; +runner.setAnswers(answers); + +const fsClone = Object.assign({}, fs); +Object.assign(fsClone, { + existsSync(itemPath: string): boolean { + switch (itemPath) { + case path.normalize('/srcDir/someOtherDir'): + case path.normalize('/srcDir/someOtherDir/file1.file'): + case path.normalize('/srcDir/someOtherDir/file2.file'): + return true; + default: + return false; + } + }, + statSync(itemPath: string): fs.Stats { + const itemStats: fs.Stats = new fs.Stats(); + switch (itemPath) { + case path.normalize('/srcDir/someOtherDir'): + itemStats.isDirectory = () => true; + break; + case path.normalize('/srcDir/someOtherDir/file1.file'): + case path.normalize('/srcDir/someOtherDir/file2.file'): + itemStats.isDirectory = () => false; + break; + default: + throw { code: 'ENOENT' }; + } + return itemStats; + }, + // as a precaution, disable fs.chmodSync. it should not be called during this scenario. + chmodSync(p: fs.PathLike, mode: fs.Mode): void {} +}); + +runner.registerMockExport('mkdirP', (p: string) => { + console.log(`mkdirP: ${p}`); + + throw "Error during creation of target folder." +}); + +runner.registerMock('fs', fsClone); + +runner.run(); diff --git a/_generated/CopyFilesV2/Tests/L0IgnoresMakeDirError.ts b/_generated/CopyFilesV2/Tests/L0IgnoresMakeDirError.ts new file mode 100644 index 000000000000..7d2126885308 --- /dev/null +++ b/_generated/CopyFilesV2/Tests/L0IgnoresMakeDirError.ts @@ -0,0 +1,66 @@ +import fs = require('fs'); +import mockanswer = require('azure-pipelines-task-lib/mock-answer'); +import mockrun = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'copyfiles.js'); +let runner: mockrun.TaskMockRunner = new mockrun.TaskMockRunner(taskPath); +runner.setInput('Contents', '**'); +runner.setInput('SourceFolder', path.normalize('/srcDir')); +runner.setInput('TargetFolder', path.normalize('/destDir')); +runner.setInput('CleanTargetFolder', 'false'); +runner.setInput('ignoreMakeDirErrors', 'true'); +runner.setInput('Overwrite', 'false'); +let answers = { + checkPath: { }, + find: { }, +}; +answers.checkPath[path.normalize('/srcDir')] = true; +answers.find[path.normalize('/srcDir')] = [ + path.normalize('/srcDir'), + path.normalize('/srcDir/someOtherDir'), + path.normalize('/srcDir/someOtherDir/file1.file'), + path.normalize('/srcDir/someOtherDir/file2.file'), +]; +runner.setAnswers(answers); + +const fsClone = Object.assign({}, fs); +Object.assign(fsClone, { + existsSync(itemPath: string): boolean { + switch (itemPath) { + case path.normalize('/srcDir/someOtherDir'): + case path.normalize('/srcDir/someOtherDir/file1.file'): + case path.normalize('/srcDir/someOtherDir/file2.file'): + return true; + default: + return false; + } + }, + statSync(itemPath: string): fs.Stats { + const itemStats: fs.Stats = new fs.Stats(); + switch (itemPath) { + case path.normalize('/srcDir/someOtherDir'): + itemStats.isDirectory = () => true; + break; + case path.normalize('/srcDir/someOtherDir/file1.file'): + case path.normalize('/srcDir/someOtherDir/file2.file'): + itemStats.isDirectory = () => false; + break; + default: + throw { code: 'ENOENT' }; + } + return itemStats; + }, + // as a precaution, disable fs.chmodSync. it should not be called during this scenario. + chmodSync(p: fs.PathLike, mode: fs.Mode): void {} +}); + +runner.registerMockExport('mkdirP', (p: string) => { + console.log(`mkdirP: ${p}`); + + throw "Error during creation of target folder." +}); + +runner.registerMock('fs', fsClone); + +runner.run(); diff --git a/_generated/CopyFilesV2/Tests/L0cleansIfSpecified.ts b/_generated/CopyFilesV2/Tests/L0cleansIfSpecified.ts new file mode 100644 index 000000000000..7ae840d3ddb7 --- /dev/null +++ b/_generated/CopyFilesV2/Tests/L0cleansIfSpecified.ts @@ -0,0 +1,79 @@ +import fs = require('fs'); +import mockanswer = require('azure-pipelines-task-lib/mock-answer'); +import mockrun = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'copyfiles.js'); +let runner: mockrun.TaskMockRunner = new mockrun.TaskMockRunner(taskPath); +runner.setInput('Contents', '**'); +runner.setInput('SourceFolder', path.normalize('/srcDir')); +runner.setInput('TargetFolder', path.normalize('/destDir')); +runner.setInput('CleanTargetFolder', 'true'); +runner.setInput('Overwrite', 'false'); +let answers = { + checkPath: { }, + find: { }, + rmRF: { }, +}; +answers.checkPath[path.normalize('/srcDir')] = true; +answers.find[path.normalize('/srcDir')] = [ + path.normalize('/srcDir'), + path.normalize('/srcDir/someOtherDir'), + path.normalize('/srcDir/someOtherDir/file1.file'), + path.normalize('/srcDir/someOtherDir/file2.file'), +]; +answers.rmRF[path.join(path.normalize('/destDir/clean-subDir'))] = { success: true }; +answers.rmRF[path.join(path.normalize('/destDir/clean-file.txt'))] = { success: true }; +runner.setAnswers(answers); + +let origReaddirSync = fs.readdirSync; +const fsClone = Object.assign({}, fs); +Object.assign(fsClone, { + existsSync(itemPath: string): boolean { + switch (itemPath) { + case path.normalize('/destDir'): + case path.normalize('/srcDir'): + case path.normalize('/srcDir/someOtherDir'): + case path.normalize('/srcDir/someOtherDir/file1.file'): + case path.normalize('/srcDir/someOtherDir/file2.file'): + return true; + default: + return false; + } + }, + statSync(itemPath: string): fs.Stats { + const itemStats: fs.Stats = new fs.Stats(); + switch (itemPath) { + case path.normalize('/destDir'): + case path.normalize('/srcDir'): + case path.normalize('/srcDir/someOtherDir'): + itemStats.isDirectory = () => true; + break; + case path.normalize('/srcDir/someOtherDir/file1.file'): + case path.normalize('/srcDir/someOtherDir/file2.file'): + itemStats.isDirectory = () => false; + break; + default: + throw { code: 'ENOENT' }; + } + return itemStats; + }, + readdirSync(p: fs.PathLike, o?: any): string[] { + console.log('HERE path ' + p); + let result: string[]; + if (p == path.normalize('/destDir')) { + result = [ 'clean-subDir', 'clean-file.txt' ]; + } + else { + result = origReaddirSync(p); + } + + return result; + }, + // as a precaution, disable fs.chmodSync. it should not be called during this scenario. + chmodSync(p: fs.PathLike, mode: fs.Mode): void {} +}); + +runner.registerMock('fs', fsClone); + +runner.run(); diff --git a/_generated/CopyFilesV2/Tests/L0cleansIfSpecifiedAndDestDoesntExist.ts b/_generated/CopyFilesV2/Tests/L0cleansIfSpecifiedAndDestDoesntExist.ts new file mode 100644 index 000000000000..6f82a706ee7d --- /dev/null +++ b/_generated/CopyFilesV2/Tests/L0cleansIfSpecifiedAndDestDoesntExist.ts @@ -0,0 +1,70 @@ +import fs = require('fs'); +import mockanswer = require('azure-pipelines-task-lib/mock-answer'); +import mockrun = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'copyfiles.js'); +let runner: mockrun.TaskMockRunner = new mockrun.TaskMockRunner(taskPath); +runner.setInput('Contents', '**'); +runner.setInput('SourceFolder', path.normalize('/srcDir')); +runner.setInput('TargetFolder', path.normalize('/destDir')); +runner.setInput('CleanTargetFolder', 'true'); +runner.setInput('Overwrite', 'false'); +let answers = { + checkPath: { }, + find: { }, + rmRF: { }, +}; +answers.checkPath[path.normalize('/srcDir')] = true; +answers.find[path.normalize('/srcDir')] = [ + path.normalize('/srcDir'), + path.normalize('/srcDir/someOtherDir'), + path.normalize('/srcDir/someOtherDir/file1.file'), + path.normalize('/srcDir/someOtherDir/file2.file'), +]; +answers.rmRF[path.join(path.normalize('/destDir/clean-subDir'))] = { success: true }; +answers.rmRF[path.join(path.normalize('/destDir/clean-file.txt'))] = { success: true }; +runner.setAnswers(answers); + +let origReaddirSync = fs.readdirSync; +const fsClone = Object.assign({}, fs); +Object.assign(fsClone, { + existsSync(itemPath: string): boolean { + switch (itemPath) { + case path.normalize('/srcDir'): + case path.normalize('/srcDir/someOtherDir'): + case path.normalize('/srcDir/someOtherDir/file1.file'): + case path.normalize('/srcDir/someOtherDir/file2.file'): + return true; + default: + return false; + } + }, + statSync(itemPath: string): fs.Stats { + const itemStats: fs.Stats = new fs.Stats(); + switch (itemPath) { + case path.normalize('/srcDir'): + case path.normalize('/srcDir/someOtherDir'): + itemStats.isDirectory = () => true; + break; + case path.normalize('/srcDir/someOtherDir/file1.file'): + case path.normalize('/srcDir/someOtherDir/file2.file'): + itemStats.isDirectory = () => false; + break; + default: + throw { code: 'ENOENT' }; + } + return itemStats; + }, + readdirSync(p: fs.PathLike, o?: any): any { + console.log('HERE path ' + p); + let result = origReaddirSync(p); + return result; + }, + // as a precaution, disable fs.chmodSync. it should not be called during this scenario. + chmodSync(p: fs.PathLike, mode: fs.Mode): void {} +}); + +runner.registerMock('fs', fsClone); + +runner.run(); diff --git a/_generated/CopyFilesV2/Tests/L0cleansIfSpecifiedAndTargetIsFile.ts b/_generated/CopyFilesV2/Tests/L0cleansIfSpecifiedAndTargetIsFile.ts new file mode 100644 index 000000000000..b4ceec7035ce --- /dev/null +++ b/_generated/CopyFilesV2/Tests/L0cleansIfSpecifiedAndTargetIsFile.ts @@ -0,0 +1,65 @@ +import fs = require('fs'); +import mockanswer = require('azure-pipelines-task-lib/mock-answer'); +import mockrun = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'copyfiles.js'); +let runner: mockrun.TaskMockRunner = new mockrun.TaskMockRunner(taskPath); +runner.setInput('Contents', '**'); +runner.setInput('SourceFolder', path.normalize('/srcDir')); +runner.setInput('TargetFolder', path.normalize('/destDir')); +runner.setInput('CleanTargetFolder', 'true'); +runner.setInput('Overwrite', 'false'); +let answers = { + checkPath: { }, + find: { }, + rmRF: { }, +}; +answers.checkPath[path.normalize('/srcDir')] = true; +answers.find[path.normalize('/srcDir')] = [ + path.normalize('/srcDir'), + path.normalize('/srcDir/someOtherDir'), + path.normalize('/srcDir/someOtherDir/file1.file'), + path.normalize('/srcDir/someOtherDir/file2.file'), +]; +answers.rmRF[path.join(path.normalize('/destDir'))] = { success: true }; +runner.setAnswers(answers); + +const fsClone = Object.assign({}, fs); +Object.assign(fsClone, { + existsSync(itemPath: string): boolean { + switch (itemPath) { + case path.normalize('/srcDir'): + case path.normalize('/srcDir/someOtherDir'): + case path.normalize('/destDir'): + case path.normalize('/srcDir/someOtherDir/file1.file'): + case path.normalize('/srcDir/someOtherDir/file2.file'): + return true; + default: + return false; + } + }, + statSync(itemPath: string): fs.Stats { + const itemStats: fs.Stats = new fs.Stats(); + switch (itemPath) { + case path.normalize('/srcDir'): + case path.normalize('/srcDir/someOtherDir'): + itemStats.isDirectory = () => true; + break; + case path.normalize('/destDir'): + case path.normalize('/srcDir/someOtherDir/file1.file'): + case path.normalize('/srcDir/someOtherDir/file2.file'): + itemStats.isDirectory = () => false; + break; + default: + throw { code: 'ENOENT' }; + } + return itemStats; + }, + // as a precaution, disable fs.chmodSync. it should not be called during this scenario. + chmodSync(p: fs.PathLike, mode: fs.Mode): void {} +}); + +runner.registerMock('fs', fsClone); + +runner.run(); diff --git a/_generated/CopyFilesV2/Tests/L0copyAllFiles.ts b/_generated/CopyFilesV2/Tests/L0copyAllFiles.ts new file mode 100644 index 000000000000..91f0a616be97 --- /dev/null +++ b/_generated/CopyFilesV2/Tests/L0copyAllFiles.ts @@ -0,0 +1,75 @@ +import fs = require('fs'); +import mockanswer = require('azure-pipelines-task-lib/mock-answer'); +import mockrun = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'copyfiles.js'); +let runner: mockrun.TaskMockRunner = new mockrun.TaskMockRunner(taskPath); +runner.setInput('Contents', '**'); +runner.setInput('SourceFolder', path.normalize('/srcDir')); +runner.setInput('TargetFolder', path.normalize('/destDir')); +runner.setInput('CleanTargetFolder', 'false'); +runner.setInput('Overwrite', 'false'); +let answers = { + checkPath: { }, + find: { }, +}; +answers.checkPath[path.normalize('/srcDir')] = true; +answers.find[path.normalize('/srcDir')] = [ + path.normalize('/srcDir'), + path.normalize('/srcDir/someOtherDir'), + path.normalize('/srcDir/someOtherDir/file1.file'), + path.normalize('/srcDir/someOtherDir/file2.file'), + path.normalize('/srcDir/someOtherDir2'), + path.normalize('/srcDir/someOtherDir2/file1.file'), + path.normalize('/srcDir/someOtherDir2/file2.file'), + path.normalize('/srcDir/someOtherDir2/file3.file'), + path.normalize('/srcDir/someOtherDir3'), +]; +runner.setAnswers(answers); + +const fsClone = Object.assign({}, fs); +Object.assign(fsClone, { + existsSync(itemPath: string): boolean { + switch (itemPath) { + case path.normalize('/srcDir'): + case path.normalize('/srcDir/someOtherDir'): + case path.normalize('/srcDir/someOtherDir/file1.file'): + case path.normalize('/srcDir/someOtherDir/file2.file'): + case path.normalize('/srcDir/someOtherDir2'): + case path.normalize('/srcDir/someOtherDir2/file1.file'): + case path.normalize('/srcDir/someOtherDir2/file2.file'): + case path.normalize('/srcDir/someOtherDir2/file3.file'): + case path.normalize('/srcDir/someOtherDir3'): + return true; + default: + return false; + } + }, + statSync(itemPath: string): fs.Stats { + const itemStats: fs.Stats = new fs.Stats(); + switch (itemPath) { + case path.normalize('/srcDir/someOtherDir'): + case path.normalize('/srcDir/someOtherDir2'): + case path.normalize('/srcDir/someOtherDir3'): + itemStats.isDirectory = () => true; + break; + case path.normalize('/srcDir/someOtherDir/file1.file'): + case path.normalize('/srcDir/someOtherDir/file2.file'): + case path.normalize('/srcDir/someOtherDir2/file1.file'): + case path.normalize('/srcDir/someOtherDir2/file2.file'): + case path.normalize('/srcDir/someOtherDir2/file3.file'): + itemStats.isDirectory = () => false; + break; + default: + throw { code: 'ENOENT' }; + } + return itemStats; + }, + // as a precaution, disable fs.chmodSync. it should not be called during this scenario. + chmodSync(p: fs.PathLike, mode: fs.Mode): void {} +}); + +runner.registerMock('fs', fsClone); + +runner.run(); diff --git a/_generated/CopyFilesV2/Tests/L0copyAllFilesWithBracketsInSrcPath.ts b/_generated/CopyFilesV2/Tests/L0copyAllFilesWithBracketsInSrcPath.ts new file mode 100644 index 000000000000..3ef5cf93c1ce --- /dev/null +++ b/_generated/CopyFilesV2/Tests/L0copyAllFilesWithBracketsInSrcPath.ts @@ -0,0 +1,74 @@ +import fs = require('fs'); +import mockanswer = require('azure-pipelines-task-lib/mock-answer'); +import mockrun = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'copyfiles.js'); +let runner: mockrun.TaskMockRunner = new mockrun.TaskMockRunner(taskPath); +runner.setInput('Contents', '**'); +runner.setInput('SourceFolder', path.normalize('/srcDir [bracket]')); +runner.setInput('TargetFolder', path.normalize('/destDir')); +runner.setInput('CleanTargetFolder', 'false'); +runner.setInput('Overwrite', 'false'); +let answers = { + checkPath: { }, + find: { }, +}; +answers.checkPath[path.normalize('/srcDir [bracket]')] = true; +answers.find[path.normalize('/srcDir [bracket]')] = [ + path.normalize('/srcDir [bracket]'), + path.normalize('/srcDir [bracket]/someOtherDir'), + path.normalize('/srcDir [bracket]/someOtherDir/file1.file'), + path.normalize('/srcDir [bracket]/someOtherDir/file2.file'), + path.normalize('/srcDir [bracket]/someOtherDir2'), + path.normalize('/srcDir [bracket]/someOtherDir2/file1.file'), + path.normalize('/srcDir [bracket]/someOtherDir2/file2.file'), + path.normalize('/srcDir [bracket]/someOtherDir2/file3.file'), + path.normalize('/srcDir [bracket]/someOtherDir3'), +]; +runner.setAnswers(answers); + +const fsClone = Object.assign({}, fs); +Object.assign(fsClone, { + existsSync(itemPath: string): boolean { + switch (itemPath) { + case path.normalize('/srcDir [bracket]/someOtherDir'): + case path.normalize('/srcDir [bracket]/someOtherDir2'): + case path.normalize('/srcDir [bracket]/someOtherDir3'): + case path.normalize('/srcDir [bracket]/someOtherDir/file1.file'): + case path.normalize('/srcDir [bracket]/someOtherDir/file2.file'): + case path.normalize('/srcDir [bracket]/someOtherDir2/file1.file'): + case path.normalize('/srcDir [bracket]/someOtherDir2/file2.file'): + case path.normalize('/srcDir [bracket]/someOtherDir2/file3.file'): + return true; + default: + return false; + } + }, + statSync(itemPath: string): fs.Stats { + const itemStats: fs.Stats = new fs.Stats(); + switch (itemPath) { + case path.normalize('/srcDir [bracket]/someOtherDir'): + case path.normalize('/srcDir [bracket]/someOtherDir2'): + case path.normalize('/srcDir [bracket]/someOtherDir3'): + itemStats.isDirectory = () => true; + break; + case path.normalize('/srcDir [bracket]/someOtherDir/file1.file'): + case path.normalize('/srcDir [bracket]/someOtherDir/file2.file'): + case path.normalize('/srcDir [bracket]/someOtherDir2/file1.file'): + case path.normalize('/srcDir [bracket]/someOtherDir2/file2.file'): + case path.normalize('/srcDir [bracket]/someOtherDir2/file3.file'): + itemStats.isDirectory = () => false; + break; + default: + throw { code: 'ENOENT' }; + } + return itemStats; + }, + // as a precaution, disable fs.chmodSync. it should not be called during this scenario. + chmodSync(p: fs.PathLike, mode: fs.Mode): void {} +}); + +runner.registerMock('fs', fsClone); + +runner.run(); diff --git a/_generated/CopyFilesV2/Tests/L0copySubtractExclude.ts b/_generated/CopyFilesV2/Tests/L0copySubtractExclude.ts new file mode 100644 index 000000000000..7a87c776beca --- /dev/null +++ b/_generated/CopyFilesV2/Tests/L0copySubtractExclude.ts @@ -0,0 +1,75 @@ +import fs = require('fs'); +import mockanswer = require('azure-pipelines-task-lib/mock-answer'); +import mockrun = require('azure-pipelines-task-lib/mock-run'); +import os = require('os'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'copyfiles.js'); +let runner: mockrun.TaskMockRunner = new mockrun.TaskMockRunner(taskPath); +runner.setInput('Contents', '**\n!**/someOtherDir2/**'); +runner.setInput('SourceFolder', path.normalize('/srcDir')); +runner.setInput('TargetFolder', path.normalize('/destDir')); +runner.setInput('CleanTargetFolder', 'false'); +runner.setInput('Overwrite', 'false'); +let answers = { + checkPath: { }, + find: { }, +}; +answers.checkPath[path.normalize('/srcDir')] = true; +answers.find[path.normalize('/srcDir')] = [ + path.normalize('/srcDir'), + path.normalize('/srcDir/someOtherDir'), + path.normalize('/srcDir/someOtherDir/file1.file'), + path.normalize('/srcDir/someOtherDir/file2.file'), + path.normalize('/srcDir/someOtherDir2'), + path.normalize('/srcDir/someOtherDir2/file1.file'), + path.normalize('/srcDir/someOtherDir2/file2.file'), + path.normalize('/srcDir/someOtherDir2/file3.file'), + path.normalize('/srcDir/someOtherDir3'), +]; +runner.setAnswers(answers); + +const fsClone = Object.assign({}, fs); +Object.assign(fsClone, { + existsSync(itemPath: string): boolean { + switch (itemPath) { + case path.normalize('/srcDir/someOtherDir'): + case path.normalize('/srcDir/someOtherDir2'): + case path.normalize('/srcDir/someOtherDir3'): + case path.normalize('/srcDir/someOtherDir/file1.file'): + case path.normalize('/srcDir/someOtherDir/file2.file'): + case path.normalize('/srcDir/someOtherDir2/file1.file'): + case path.normalize('/srcDir/someOtherDir2/file2.file'): + case path.normalize('/srcDir/someOtherDir2/file3.file'): + return true; + default: + return false; + } + }, + statSync(itemPath: string): fs.Stats { + const itemStats: fs.Stats = new fs.Stats(); + switch (itemPath) { + case path.normalize('/srcDir/someOtherDir'): + case path.normalize('/srcDir/someOtherDir2'): + case path.normalize('/srcDir/someOtherDir3'): + itemStats.isDirectory = () => true; + break; + case path.normalize('/srcDir/someOtherDir/file1.file'): + case path.normalize('/srcDir/someOtherDir/file2.file'): + case path.normalize('/srcDir/someOtherDir2/file1.file'): + case path.normalize('/srcDir/someOtherDir2/file2.file'): + case path.normalize('/srcDir/someOtherDir2/file3.file'): + itemStats.isDirectory = () => false; + break; + default: + throw { code: 'ENOENT' }; + } + return itemStats; + }, + // as a precaution, disable fs.chmodSync. it should not be called during this scenario. + chmodSync(p: fs.PathLike, mode: fs.Mode): void {} +}); + +runner.registerMock('fs', fsClone); + +runner.run(); diff --git a/_generated/CopyFilesV2/Tests/L0failsIfContentsNotSet.ts b/_generated/CopyFilesV2/Tests/L0failsIfContentsNotSet.ts new file mode 100644 index 000000000000..42705b62ac41 --- /dev/null +++ b/_generated/CopyFilesV2/Tests/L0failsIfContentsNotSet.ts @@ -0,0 +1,22 @@ +import fs = require('fs'); +import mockanswer = require('azure-pipelines-task-lib/mock-answer'); +import mockrun = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'copyfiles.js'); +let runner: mockrun.TaskMockRunner = new mockrun.TaskMockRunner(taskPath); +runner.setInput('SourceFolder', path.normalize('/srcDir')); +runner.setInput('TargetFolder', path.normalize('/destDir)')); +runner.setInput('CleanTargetFolder', 'false'); +runner.setInput('Overwrite', 'false'); +let answers = { + checkPath: { }, +}; +answers.checkPath[path.normalize('/srcDir')] = true; +runner.setAnswers(answers); + +// as a precaution, disable fs.chmodSync. it should not be called during this scenario. +fs.chmodSync = null; +runner.registerMock('fs', fs); + +runner.run(); diff --git a/_generated/CopyFilesV2/Tests/L0failsIfSourceFolderNotFound.ts b/_generated/CopyFilesV2/Tests/L0failsIfSourceFolderNotFound.ts new file mode 100644 index 000000000000..218163b8fbca --- /dev/null +++ b/_generated/CopyFilesV2/Tests/L0failsIfSourceFolderNotFound.ts @@ -0,0 +1,23 @@ +import fs = require('fs'); +import mockanswer = require('azure-pipelines-task-lib/mock-answer'); +import mockrun = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'copyfiles.js'); +let runner: mockrun.TaskMockRunner = new mockrun.TaskMockRunner(taskPath); +runner.setInput('Contents', '**'); +runner.setInput('SourceFolder', path.normalize('/srcDir')); +runner.setInput('TargetFolder', path.normalize('/destDir')); +runner.setInput('CleanTargetFolder', 'false'); +runner.setInput('Overwrite', 'false'); +let answers = { + checkPath: { }, +}; +answers.checkPath[path.normalize('/srcDir')] = false; +runner.setAnswers(answers); + +// as a precaution, disable fs.chmodSync. it should not be called during this scenario. +fs.chmodSync = null; +runner.registerMock('fs', fs); + +runner.run(); diff --git a/_generated/CopyFilesV2/Tests/L0failsIfSourceFolderNotSet.ts b/_generated/CopyFilesV2/Tests/L0failsIfSourceFolderNotSet.ts new file mode 100644 index 000000000000..78d7d7e2a493 --- /dev/null +++ b/_generated/CopyFilesV2/Tests/L0failsIfSourceFolderNotSet.ts @@ -0,0 +1,17 @@ +import fs = require('fs'); +import mockanswer = require('azure-pipelines-task-lib/mock-answer'); +import mockrun = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'copyfiles.js'); +let runner: mockrun.TaskMockRunner = new mockrun.TaskMockRunner(taskPath); +runner.setInput('Contents', '**'); +runner.setInput('TargetFolder', path.normalize('/destDir')); +runner.setInput('CleanTargetFolder', 'false'); +runner.setInput('Overwrite', 'false'); + +// as a precaution, disable fs.chmodSync. it should not be called during this scenario. +fs.chmodSync = null; +runner.registerMock('fs', fs); + +runner.run(); diff --git a/_generated/CopyFilesV2/Tests/L0failsIfTargetFileIsDir.ts b/_generated/CopyFilesV2/Tests/L0failsIfTargetFileIsDir.ts new file mode 100644 index 000000000000..70b773bd1fb7 --- /dev/null +++ b/_generated/CopyFilesV2/Tests/L0failsIfTargetFileIsDir.ts @@ -0,0 +1,61 @@ +import fs = require('fs'); +import mockanswer = require('azure-pipelines-task-lib/mock-answer'); +import mockrun = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'copyfiles.js'); +let runner: mockrun.TaskMockRunner = new mockrun.TaskMockRunner(taskPath); +runner.setInput('Contents', '**'); +runner.setInput('SourceFolder', path.normalize('/srcDir')); +runner.setInput('TargetFolder', path.normalize('/destDir')); +runner.setInput('CleanTargetFolder', 'false'); +runner.setInput('Overwrite', 'false'); +let answers = { + checkPath: { }, + find: { }, +}; +answers.checkPath[path.normalize('/srcDir')] = true; +answers.find[path.normalize('/srcDir')] = [ + path.normalize('/srcDir'), + path.normalize('/srcDir/someOtherDir'), + path.normalize('/srcDir/someOtherDir/file1.file'), + path.normalize('/srcDir/someOtherDir/file2.file'), +]; +runner.setAnswers(answers); + +const fsClone = Object.assign({}, fs); +Object.assign(fsClone, { + existsSync(itemPath: string): boolean { + switch (itemPath) { + case path.normalize('/srcDir/someOtherDir'): + case path.normalize('/destDir/someOtherDir/file1.file'): + case path.normalize('/srcDir/someOtherDir/file1.file'): + case path.normalize('/srcDir/someOtherDir/file2.file'): + return true; + default: + return false; + } + }, + statSync(itemPath: string): fs.Stats { + const itemStats: fs.Stats = new fs.Stats(); + switch (itemPath) { + case path.normalize('/srcDir/someOtherDir'): + case path.normalize('/destDir/someOtherDir/file1.file'): + itemStats.isDirectory = () => true; + break; + case path.normalize('/srcDir/someOtherDir/file1.file'): + case path.normalize('/srcDir/someOtherDir/file2.file'): + itemStats.isDirectory = () => false; + break; + default: + throw { code: 'ENOENT' }; + } + return itemStats; + }, + // as a precaution, disable fs.chmodSync. it should not be called during this scenario. + chmodSync(p: fs.PathLike, mode: fs.Mode): void {} +}); + +runner.registerMock('fs', fsClone); + +runner.run(); diff --git a/_generated/CopyFilesV2/Tests/L0failsIfTargetFolderNotSet.ts b/_generated/CopyFilesV2/Tests/L0failsIfTargetFolderNotSet.ts new file mode 100644 index 000000000000..32828282e4d6 --- /dev/null +++ b/_generated/CopyFilesV2/Tests/L0failsIfTargetFolderNotSet.ts @@ -0,0 +1,22 @@ +import fs = require('fs'); +import mockanswer = require('azure-pipelines-task-lib/mock-answer'); +import mockrun = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'copyfiles.js'); +let runner: mockrun.TaskMockRunner = new mockrun.TaskMockRunner(taskPath); +runner.setInput('Contents', '**'); +runner.setInput('SourceFolder', path.normalize('/srcDir')); +runner.setInput('CleanTargetFolder', 'false'); +runner.setInput('Overwrite', 'false'); +let answers = { + checkPath: { }, +}; +answers.checkPath[path.normalize('/srcDir')] = true; +runner.setAnswers(answers); + +// as a precaution, disable fs.chmodSync. it should not be called during this scenario. +fs.chmodSync = null; +runner.registerMock('fs', fs); + +runner.run(); diff --git a/_generated/CopyFilesV2/Tests/L0overwritesIfSpecified.ts b/_generated/CopyFilesV2/Tests/L0overwritesIfSpecified.ts new file mode 100644 index 000000000000..a5b6381e74f1 --- /dev/null +++ b/_generated/CopyFilesV2/Tests/L0overwritesIfSpecified.ts @@ -0,0 +1,66 @@ +import fs = require('fs'); +import mockanswer = require('azure-pipelines-task-lib/mock-answer'); +import mockrun = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'copyfiles.js'); +let runner: mockrun.TaskMockRunner = new mockrun.TaskMockRunner(taskPath); +runner.setInput('Contents', '**'); +runner.setInput('SourceFolder', path.normalize('/srcDir')); +runner.setInput('TargetFolder', path.normalize('/destDir')); +runner.setInput('CleanTargetFolder', 'false'); +runner.setInput('Overwrite', 'true'); +let answers = { + checkPath: { }, + find: { }, +}; +answers.checkPath[path.normalize('/srcDir')] = true; +answers.find[path.normalize('/srcDir')] = [ + path.normalize('/srcDir'), + path.normalize('/srcDir/someOtherDir'), + path.normalize('/srcDir/someOtherDir/file1.file'), + path.normalize('/srcDir/someOtherDir/file2.file'), +]; +runner.setAnswers(answers); + +const fsClone = Object.assign({}, fs); +Object.assign(fsClone, { + existsSync(itemPath: string): boolean { + switch (itemPath) { + case path.normalize('/srcDir/someOtherDir'): + case path.normalize('/destDir/someOtherDir'): + case path.normalize('/srcDir/someOtherDir/file1.file'): + case path.normalize('/srcDir/someOtherDir/file2.file'): + case path.normalize('/destDir/someOtherDir/file1.file'): + return true; + default: + return false; + } + }, + statSync(itemPath: string): fs.Stats { + const itemStats: fs.Stats = new fs.Stats(); + switch (itemPath) { + case path.normalize('/srcDir/someOtherDir'): + case path.normalize('/destDir/someOtherDir'): + itemStats.isDirectory = () => true; + break; + case path.normalize('/srcDir/someOtherDir/file1.file'): + case path.normalize('/srcDir/someOtherDir/file2.file'): + itemStats.isDirectory = () => false; + break; + case path.normalize('/destDir/someOtherDir/file1.file'): + itemStats.isDirectory = () => false; + itemStats.mode = (6 << 6) + (6 << 3) + 6; // rw-rw-rw- + break; + default: + throw { code: 'ENOENT' }; + } + return itemStats; + }, + // as a precaution, disable fs.chmodSync. it should not be called during this scenario. + chmodSync(p: fs.PathLike, mode: fs.Mode): void {} +}); + +runner.registerMock('fs', fsClone); + +runner.run(); diff --git a/_generated/CopyFilesV2/Tests/L0overwritesReadonly.ts b/_generated/CopyFilesV2/Tests/L0overwritesReadonly.ts new file mode 100644 index 000000000000..7e6a517a114f --- /dev/null +++ b/_generated/CopyFilesV2/Tests/L0overwritesReadonly.ts @@ -0,0 +1,71 @@ +import fs = require('fs'); +import mockanswer = require('azure-pipelines-task-lib/mock-answer'); +import mockrun = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'copyfiles.js'); +let runner: mockrun.TaskMockRunner = new mockrun.TaskMockRunner(taskPath); +runner.setInput('Contents', '**'); +runner.setInput('SourceFolder', path.normalize('/srcDir')); +runner.setInput('TargetFolder', path.normalize('/destDir')); +runner.setInput('CleanTargetFolder', 'false'); +runner.setInput('Overwrite', 'true'); +let answers = { + checkPath: { }, + find: { }, +}; +answers.checkPath[path.normalize('/srcDir')] = true; +answers.find[path.normalize('/srcDir')] = [ + path.normalize('/srcDir'), + path.normalize('/srcDir/someOtherDir'), + path.normalize('/srcDir/someOtherDir/file1.file'), + path.normalize('/srcDir/someOtherDir/file2.file'), +]; +runner.setAnswers(answers); + +const fsClone = Object.assign({}, fs); +Object.assign(fsClone, { + existsSync(itemPath: string): boolean { + switch (itemPath) { + case path.normalize('/srcDir/someOtherDir'): + case path.normalize('/destDir/someOtherDir'): + case path.normalize('/srcDir/someOtherDir/file1.file'): + case path.normalize('/srcDir/someOtherDir/file2.file'): + case path.normalize('/destDir/someOtherDir/file1.file'): + return true; + default: + return false; + } + }, + statSync(itemPath: string): fs.Stats { + const itemStats: fs.Stats = new fs.Stats(); + switch (itemPath) { + case path.normalize('/srcDir/someOtherDir'): + case path.normalize('/destDir/someOtherDir'): + itemStats.isDirectory = () => true; + break; + case path.normalize('/srcDir/someOtherDir/file1.file'): + case path.normalize('/srcDir/someOtherDir/file2.file'): + itemStats.isDirectory = () => false; + break; + case path.normalize('/destDir/someOtherDir/file1.file'): + itemStats.isDirectory = () => false; + itemStats.mode = (4 << 6) + (4 << 3) + 4; // r--r--r-- + break; + default: + throw { code: 'ENOENT' }; + } + return itemStats; + }, + // as a precaution, disable fs.chmodSync. it should not be called during this scenario. + chmodSync(p: fs.PathLike, mode: fs.Mode): void {} +}); + +// override fs.chmodSync +(fsClone as any).chmodSync = (path: string, mode: number) => { + console.log(`##vso[task.debug]chmodSync ${path} ${mode}`); +}; + +runner.registerMock('fs', fsClone); + +runner.run(); diff --git a/_generated/CopyFilesV2/Tests/L0preservesTimestampIfSpecified.ts b/_generated/CopyFilesV2/Tests/L0preservesTimestampIfSpecified.ts new file mode 100644 index 000000000000..5a78ad8f43b6 --- /dev/null +++ b/_generated/CopyFilesV2/Tests/L0preservesTimestampIfSpecified.ts @@ -0,0 +1,78 @@ +import fs = require('fs'); +import mockanswer = require('azure-pipelines-task-lib/mock-answer'); +import mockrun = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +const { promisify } = require('util'); + +let taskPath = path.join(__dirname, '..', 'copyfiles.js'); +let runner: mockrun.TaskMockRunner = new mockrun.TaskMockRunner(taskPath); +runner.setInput('Contents', '**'); +runner.setInput('SourceFolder', path.normalize('/srcDir')); +runner.setInput('TargetFolder', path.normalize('/destDir')); +runner.setInput('CleanTargetFolder', 'false'); +runner.setInput('Overwrite', 'false'); +runner.setInput('preserveTimestamp', 'true'); +let answers = { + checkPath: {}, + find: {}, +}; +answers.checkPath[path.normalize('/srcDir')] = true; +answers.find[path.normalize('/srcDir')] = [ + path.normalize('/srcDir'), + path.normalize('/srcDir/someOtherDir'), + path.normalize('/srcDir/someOtherDir/file1.file'), + path.normalize('/srcDir/someOtherDir/file2.file'), + path.normalize('/srcDir/someOtherDir2'), + path.normalize('/srcDir/someOtherDir2/file1.file'), + path.normalize('/srcDir/someOtherDir2/file2.file'), + path.normalize('/srcDir/someOtherDir2/file3.file'), + path.normalize('/srcDir/someOtherDir3'), +]; +runner.setAnswers(answers); + +const fsClone = Object.assign({}, fs); +Object.assign(fsClone, { + existsSync(itemPath: string): boolean { + switch (itemPath) { + case path.normalize('/srcDir/someOtherDir'): + case path.normalize('/srcDir/someOtherDir2'): + case path.normalize('/srcDir/someOtherDir3'): + case path.normalize('/srcDir/someOtherDir/file1.file'): + case path.normalize('/srcDir/someOtherDir/file2.file'): + case path.normalize('/srcDir/someOtherDir2/file1.file'): + case path.normalize('/srcDir/someOtherDir2/file2.file'): + case path.normalize('/srcDir/someOtherDir2/file3.file'): + return true; + default: + return false; + } + }, + statSync(itemPath: string): fs.Stats { + const itemStats: fs.Stats = new fs.Stats(); + switch (itemPath) { + case path.normalize('/srcDir/someOtherDir'): + case path.normalize('/srcDir/someOtherDir2'): + case path.normalize('/srcDir/someOtherDir3'): + itemStats.isDirectory = () => true; + break; + case path.normalize('/srcDir/someOtherDir/file1.file'): + case path.normalize('/srcDir/someOtherDir/file2.file'): + case path.normalize('/srcDir/someOtherDir2/file1.file'): + case path.normalize('/srcDir/someOtherDir2/file2.file'): + case path.normalize('/srcDir/someOtherDir2/file3.file'): + itemStats.isDirectory = () => false; + break; + default: + throw { code: 'ENOENT' }; + } + return itemStats; + }, + utimes(targetPath, atime, mtime, err): void { + console.log('Calling fs.utimes on', targetPath); + } +}); + +runner.registerMock('fs', fsClone); + +runner.run(); diff --git a/_generated/CopyFilesV2/Tests/L0rootsPatterns.ts b/_generated/CopyFilesV2/Tests/L0rootsPatterns.ts new file mode 100644 index 000000000000..87bf728e7642 --- /dev/null +++ b/_generated/CopyFilesV2/Tests/L0rootsPatterns.ts @@ -0,0 +1,63 @@ +import fs = require('fs'); +import mockanswer = require('azure-pipelines-task-lib/mock-answer'); +import mockrun = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'copyfiles.js'); +let runner: mockrun.TaskMockRunner = new mockrun.TaskMockRunner(taskPath); +runner.setInput('Contents', 'someOtherDir/file?.file\nsomeOtherDir2/*.file\n!someOtherDir2/file[13].file'); +runner.setInput('SourceFolder', path.normalize('/srcDir')); +runner.setInput('TargetFolder', path.normalize('/destDir')); +runner.setInput('CleanTargetFolder', 'false'); +runner.setInput('Overwrite', 'false'); +let answers = { + checkPath: { }, + find: { }, +}; +answers.checkPath[path.normalize('/srcDir')] = true; +answers.find[path.normalize('/srcDir')] = [ + path.normalize('/srcDir'), + path.normalize('/srcDir/someOtherDir'), + path.normalize('/srcDir/someOtherDir/file1.file'), + path.normalize('/srcDir/someOtherDir/file2.file'), + path.normalize('/srcDir/someOtherDir/file-zzz.file'), + path.normalize('/srcDir/someOtherDir2'), + path.normalize('/srcDir/someOtherDir2/file1.file'), + path.normalize('/srcDir/someOtherDir2/file2.file'), + path.normalize('/srcDir/someOtherDir2/file3.file'), + path.normalize('/srcDir/someOtherDir3'), +]; +runner.setAnswers(answers); + +const fsClone = Object.assign({}, fs); +Object.assign(fsClone, { + existsSync(itemPath: string): boolean { + switch (itemPath) { + case path.normalize('/srcDir/someOtherDir/file1.file'): + case path.normalize('/srcDir/someOtherDir/file2.file'): + case path.normalize('/srcDir/someOtherDir2/file2.file'): + return true; + default: + return false; + } + }, + statSync(itemPath: string): fs.Stats { + const itemStats: fs.Stats = new fs.Stats(); + switch (itemPath) { + case path.normalize('/srcDir/someOtherDir/file1.file'): + case path.normalize('/srcDir/someOtherDir/file2.file'): + case path.normalize('/srcDir/someOtherDir2/file2.file'): + itemStats.isDirectory = () => false; + break; + default: + throw { code: 'ENOENT' }; + } + return itemStats; + }, + // as a precaution, disable fs.chmodSync. it should not be called during this scenario. + chmodSync(p: fs.PathLike, mode: fs.Mode): void {} +}); + +runner.registerMock('fs', fsClone); + +runner.run(); diff --git a/_generated/CopyFilesV2/Tests/L0skipsIfExists.ts b/_generated/CopyFilesV2/Tests/L0skipsIfExists.ts new file mode 100644 index 000000000000..b509e9d6660e --- /dev/null +++ b/_generated/CopyFilesV2/Tests/L0skipsIfExists.ts @@ -0,0 +1,63 @@ +import fs = require('fs'); +import mockanswer = require('azure-pipelines-task-lib/mock-answer'); +import mockrun = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'copyfiles.js'); +let runner: mockrun.TaskMockRunner = new mockrun.TaskMockRunner(taskPath); +runner.setInput('Contents', '**'); +runner.setInput('SourceFolder', path.normalize('/srcDir')); +runner.setInput('TargetFolder', path.normalize('/destDir')); +runner.setInput('CleanTargetFolder', 'false'); +runner.setInput('Overwrite', 'false'); +let answers = { + checkPath: { }, + find: { }, +}; +answers.checkPath[path.normalize('/srcDir')] = true; +answers.find[path.normalize('/srcDir')] = [ + path.normalize('/srcDir'), + path.normalize('/srcDir/someOtherDir'), + path.normalize('/srcDir/someOtherDir/file1.file'), + path.normalize('/srcDir/someOtherDir/file2.file'), +]; +runner.setAnswers(answers); + +const fsClone = Object.assign({}, fs); +Object.assign(fsClone, { + existsSync(itemPath: string): boolean { + switch (itemPath) { + case path.normalize('/srcDir/someOtherDir'): + case path.normalize('/destDir/someOtherDir'): + case path.normalize('/srcDir/someOtherDir/file1.file'): + case path.normalize('/srcDir/someOtherDir/file2.file'): + case path.normalize('/destDir/someOtherDir/file1.file'): + return true; + default: + return false; + } + }, + statSync(itemPath: string): fs.Stats { + const itemStats: fs.Stats = new fs.Stats(); + switch (itemPath) { + case path.normalize('/srcDir/someOtherDir'): + case path.normalize('/destDir/someOtherDir'): + itemStats.isDirectory = () => true; + break; + case path.normalize('/srcDir/someOtherDir/file1.file'): + case path.normalize('/srcDir/someOtherDir/file2.file'): + case path.normalize('/destDir/someOtherDir/file1.file'): + itemStats.isDirectory = () => false; + break; + default: + throw { code: 'ENOENT' }; + } + return itemStats; + }, + // as a precaution, disable fs.chmodSync. it should not be called during this scenario. + chmodSync(p: fs.PathLike, mode: fs.Mode): void {} +}); + +runner.registerMock('fs', fsClone); + +runner.run(); diff --git a/_generated/CopyFilesV2/copyfiles.ts b/_generated/CopyFilesV2/copyfiles.ts new file mode 100644 index 000000000000..a310d23a76e2 --- /dev/null +++ b/_generated/CopyFilesV2/copyfiles.ts @@ -0,0 +1,275 @@ +import fs = require('fs'); +import path = require('path'); +import tl = require('azure-pipelines-task-lib/task'); +import { RetryOptions, RetryHelper } from './retrylogichelper'; + +/** + * Shows timestamp change operation results + * @param fileStats file stats + * @param err error - null if there is no error + */ +function displayTimestampChangeResults( + fileStats: fs.Stats, + err: NodeJS.ErrnoException +) { + if (err) { + console.warn(`Problem applying the timestamp: ${err}`); + } else { + console.log(`Timestamp preserved successfully - access time: ${fileStats.atime}, modified time: ${fileStats.mtime}`) + } +} + +/** + * Creates the full path with folders in between. Will throw an error if it fails + * If ignoreErrors is true - ignores the errors. + * @param targetFolder target folder. For more details see https://github.com/Microsoft/azure-pipelines-task-lib/blob/master/node/docs/azure-pipelines-task-lib.md#taskmkdirP + * @param ignoreErrors ignore errors during creation of target folder. + */ +function makeDirP(targetFolder: string, ignoreErrors: boolean): void { + try { + tl.mkdirP(targetFolder); + } catch (err) { + if (ignoreErrors) { + console.log(`Unable to create target folder (${targetFolder}): ${err}. Ignoring this as error since 'ignoreErrors' is true.`); + } else { + throw err; + } + } +} + +/** + * Gets stats for the provided path. + * Will throw error if entry does not exist and `throwEnoent` is `true`. + * @param path path for which method will try to get `fs.Stats`. + * @param throwEnoent throw error if entry does not exist. + * @returns `fs.Stats` or `null` + */ +function stats(path: string, throwEnoent: boolean = true): fs.Stats | null { + if (fs.existsSync(path)) { + return fs.statSync(path); + } else { + const message: string = `Entry "${path}" does not exist`; + if (throwEnoent) { + tl.warning(message); + throw new Error(message); + } + tl.debug(message); + return null; + } +} + +function filterOutDirectories(paths: string[]): string[] { + return paths.filter((path: string) => { + const itemStats: fs.Stats = stats(path); + return !itemStats.isDirectory(); + }); +} + +async function main(): Promise { + // we allow broken symlinks - since there could be broken symlinks found in source folder, but filtered by contents pattern + const findOptions: tl.FindOptions = { + allowBrokenSymbolicLinks: true, + followSpecifiedSymbolicLink: true, + followSymbolicLinks: true + }; + + tl.setResourcePath(path.join(__dirname, 'task.json')); + + // contents is a multiline input containing glob patterns + let contents: string[] = tl.getDelimitedInput('Contents', '\n', true); + let sourceFolder: string = tl.getPathInput('SourceFolder', true, true); + let targetFolder: string = tl.getPathInput('TargetFolder', true); + let cleanTargetFolder: boolean = tl.getBoolInput('CleanTargetFolder', false); + let overWrite: boolean = tl.getBoolInput('OverWrite', false); + let flattenFolders: boolean = tl.getBoolInput('flattenFolders', false); + let retryCount: number = parseInt(tl.getInput('retryCount')); + let delayBetweenRetries: number = parseInt(tl.getInput('delayBetweenRetries')); + + if (isNaN(retryCount) || retryCount < 0) { + retryCount = 0; + } + + if (isNaN(delayBetweenRetries) || delayBetweenRetries < 0) { + delayBetweenRetries = 0; + } + + const retryOptions: RetryOptions = { + timeoutBetweenRetries: delayBetweenRetries, + numberOfReties: retryCount + }; + const retryHelper = new RetryHelper(retryOptions); + + const preserveTimestamp: boolean = tl.getBoolInput('preserveTimestamp', false); + const ignoreMakeDirErrors: boolean = tl.getBoolInput('ignoreMakeDirErrors', false); + + // normalize the source folder path. this is important for later in order to accurately + // determine the relative path of each found file (substring using sourceFolder.length). + sourceFolder = path.normalize(sourceFolder); + let allPaths: string[] = tl.find(sourceFolder, findOptions); + let sourceFolderPattern = sourceFolder.replace('[', '[[]'); // directories can have [] in them, and they have special meanings as a pattern, so escape them + let matchedPaths: string[] = tl.match(allPaths, contents, sourceFolderPattern); // default match options + let matchedFiles: string[] = filterOutDirectories(matchedPaths); + + // copy the files to the target folder + console.log(tl.loc('FoundNFiles', matchedFiles.length)); + + if (matchedFiles.length > 0) { + // clean target folder if required + if (cleanTargetFolder) { + console.log(tl.loc('CleaningTargetFolder', targetFolder)); + + // stat the targetFolder path + const targetFolderStats: fs.Stats = await retryHelper.RunWithRetry( + () => stats(targetFolder, false), + `stats for ${targetFolder}` + ); + + // If there are no stats, the folder doesn't exist. Nothing to clean. + if (targetFolderStats) { + if (targetFolderStats.isDirectory()) { + // delete the child items + const folderItems: string[] = await retryHelper.RunWithRetry( + () => fs.readdirSync(targetFolder), + `readdirSync for ${targetFolder}` + ); + + for (let item of folderItems) { + let itemPath = path.join(targetFolder, item); + await retryHelper.RunWithRetry(() => + tl.rmRF(itemPath), + `delete of ${itemPath}` + ); + } + } else { + await retryHelper.RunWithRetry(() => + tl.rmRF(targetFolder), + `delete of ${targetFolder}` + ); + } + } + } + + // make sure the target folder exists + await retryHelper.RunWithRetry(() => + makeDirP(targetFolder, ignoreMakeDirErrors), + `makeDirP for ${targetFolder}` + ); + try { + let createdFolders: { [folder: string]: boolean } = {}; + for (let file of matchedFiles) { + let relativePath; + if (flattenFolders) { + relativePath = path.basename(file); + } else { + relativePath = file.substring(sourceFolder.length); + + // trim leading path separator + // note, assumes normalized above + if (relativePath.startsWith(path.sep)) { + relativePath = relativePath.substr(1); + } + } + + let targetPath = path.join(targetFolder, relativePath); + let targetDir = path.dirname(targetPath); + + if (!createdFolders[targetDir]) { + await retryHelper.RunWithRetry( + () => makeDirP(targetDir, ignoreMakeDirErrors), + `makeDirP for ${targetDir}` + ); + + createdFolders[targetDir] = true; + } + + // stat the target + let targetStats: fs.Stats; + if (!cleanTargetFolder) { // optimization - no need to check if relative target exists when CleanTargetFolder=true + targetStats = await retryHelper.RunWithRetry( + () => stats(targetPath, false), + `Stats for ${targetPath}` + ); + } + + // validate the target is not a directory + if (targetStats && targetStats.isDirectory()) { + throw new Error(tl.loc('TargetIsDir', file, targetPath)); + } + + if (!overWrite) { + if (targetStats) { // exists, skip + console.log(tl.loc('FileAlreadyExistAt', file, targetPath)); + } else { // copy + console.log(tl.loc('CopyingTo', file, targetPath)); + await retryHelper.RunWithRetry( + () => tl.cp(file, targetPath), + `copy ${file} to ${targetPath}` + ); + if (preserveTimestamp) { + try { + const fileStats: fs.Stats = await retryHelper.RunWithRetry( + () => stats(file), + `stats for ${file}` + ); + fs.utimes(targetPath, fileStats.atime, fileStats.mtime, (err) => { + displayTimestampChangeResults(fileStats, err); + }); + } catch (err) { + console.warn(`Problem preserving the timestamp: ${err}`) + } + } + } + } else { // copy + console.log(tl.loc('CopyingTo', file, targetPath)); + if (process.platform == 'win32' && targetStats && (targetStats.mode & 146) != 146) { + // The readonly attribute can be interpreted by performing a bitwise-AND operation on + // "fs.Stats.mode" and the integer 146. The integer 146 represents "-w--w--w-" or (128 + 16 + 2), + // see following chart: + // R W X R W X R W X + // 256 128 64 32 16 8 4 2 1 + // + // "fs.Stats.mode" on Windows is based on whether the readonly attribute is set. + // If the readonly attribute is set, then the mode is set to "r--r--r--". + // If the readonly attribute is not set, then the mode is set to "rw-rw-rw-". + // + // Note, additional bits may also be set (e.g. if directory). Therefore, a bitwise + // comparison is appropriate. + // + // For additional information, refer to the fs source code and ctrl+f "st_mode": + // https://github.com/nodejs/node/blob/v5.x/deps/uv/src/win/fs.c#L1064 + tl.debug(`removing readonly attribute on '${targetPath}'`); + + await retryHelper.RunWithRetry( + () => fs.chmodSync(targetPath, targetStats.mode | 146), + `chmodSync for ${targetPath}` + ); + } + await retryHelper.RunWithRetry( + () => tl.cp(file, targetPath, "-f"), + `copy ${file} to ${targetPath}` + ); + + if (preserveTimestamp) { + try { + const fileStats = await retryHelper.RunWithRetry( + () => stats(file), + `stats for ${file}` + ); + fs.utimes(targetPath, fileStats.atime, fileStats.mtime, (err) => { + displayTimestampChangeResults(fileStats, err); + }); + } catch (err) { + console.warn(`Problem preserving the timestamp: ${err}`) + } + } + } + } + } catch (err) { + tl.setResult(tl.TaskResult.Failed, err); + } + } +} + +main().catch((err) => { + tl.setResult(tl.TaskResult.Failed, err); +}); diff --git a/_generated/CopyFilesV2/icon.png b/_generated/CopyFilesV2/icon.png new file mode 100644 index 000000000000..443e57fd1c28 Binary files /dev/null and b/_generated/CopyFilesV2/icon.png differ diff --git a/_generated/CopyFilesV2/icon.svg b/_generated/CopyFilesV2/icon.svg new file mode 100644 index 000000000000..a854146f9cfd --- /dev/null +++ b/_generated/CopyFilesV2/icon.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/_generated/CopyFilesV2/package-lock.json b/_generated/CopyFilesV2/package-lock.json new file mode 100644 index 000000000000..a33b36513a7d --- /dev/null +++ b/_generated/CopyFilesV2/package-lock.json @@ -0,0 +1,488 @@ +{ + "name": "vsts-copyfiles-task", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/concat-stream": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz", + "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==", + "requires": { + "@types/node": "*" + } + }, + "@types/form-data": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", + "integrity": "sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==", + "requires": { + "@types/node": "*" + } + }, + "@types/mocha": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", + "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==" + }, + "@types/node": { + "version": "16.11.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.60.tgz", + "integrity": "sha512-kYIYa1D1L+HDv5M5RXQeEu1o0FKA6yedZIoyugm/MBPROkLpX4L7HRxMrPVyo8bnvjpW/wDlqFNGzXNMb7AdRw==" + }, + "@types/qs": { + "version": "6.9.8", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.8.tgz", + "integrity": "sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg==" + }, + "@types/uuid": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.4.tgz", + "integrity": "sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==" + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "azure-pipelines-task-lib": { + "version": "5.0.0-preview.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-5.0.0-preview.0.tgz", + "integrity": "sha512-uQJEv+q3/7RD7kgphFd33uXijaPwA1ePYoNkAgZpUhbZUtc2u4JL4ujTT/JJfgXBNW/QQNAiDQ2OC7vOQG/0tg==", + "requires": { + "minimatch": "3.0.5", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "sync-request": "6.1.0", + "uuid": "^3.0.1" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, + "form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + } + }, + "get-port": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", + "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==" + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "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" + }, + "dependencies": { + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==" + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "http-basic": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", + "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", + "requires": { + "caseless": "^0.12.0", + "concat-stream": "^1.6.2", + "http-response-object": "^3.0.1", + "parse-cache-control": "^1.0.1" + } + }, + "http-response-object": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", + "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", + "requires": { + "@types/node": "^10.0.3" + }, + "dependencies": { + "@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + } + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" + }, + "is-core-module": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "requires": { + "has": "^1.0.3" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, + "parse-cache-control": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", + "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "promise": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", + "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", + "requires": { + "asap": "~2.0.6" + } + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==" + }, + "qs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "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" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "requires": { + "resolve": "^1.1.6" + } + }, + "resolve": { + "version": "1.22.6", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.6.tgz", + "integrity": "sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==", + "requires": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" + }, + "shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, + "sync-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", + "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==", + "requires": { + "http-response-object": "^3.0.1", + "sync-rpc": "^1.2.1", + "then-request": "^6.0.0" + } + }, + "sync-rpc": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz", + "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==", + "requires": { + "get-port": "^3.1.0" + } + }, + "then-request": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", + "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", + "requires": { + "@types/concat-stream": "^1.6.0", + "@types/form-data": "0.0.33", + "@types/node": "^8.0.0", + "@types/qs": "^6.2.31", + "caseless": "~0.12.0", + "concat-stream": "^1.6.0", + "form-data": "^2.2.0", + "http-basic": "^8.1.1", + "http-response-object": "^3.0.1", + "promise": "^8.0.0", + "qs": "^6.4.0" + }, + "dependencies": { + "@types/node": { + "version": "8.10.66", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", + "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==" + } + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, + "typescript": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.2.tgz", + "integrity": "sha512-e4ERvRV2wb+rRZ/IQeb3jm2VxBsirQLpQhdxplZ2MEzGvDkkMmPglecnNDfSUBivMjP93vRbngYYDQqQ/78bcQ==", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + } + } +} diff --git a/_generated/CopyFilesV2/package.json b/_generated/CopyFilesV2/package.json new file mode 100644 index 000000000000..f6cdffdefcdc --- /dev/null +++ b/_generated/CopyFilesV2/package.json @@ -0,0 +1,21 @@ +{ + "name": "vsts-copyfiles-task", + "version": "1.0.0", + "description": "Azure Pipelines Copy Files Task", + "main": "copyfiles.js", + "repository": { + "type": "git", + "url": "git+https://github.com/Microsoft/azure-pipelines-tasks.git" + }, + "author": "Microsoft Corporation", + "license": "MIT", + "dependencies": { + "@types/node": "^16.11.59", + "@types/mocha": "^5.2.7", + "@types/uuid": "^8.3.0", + "azure-pipelines-task-lib": "^5.0.0-preview.0" + }, + "devDependencies": { + "typescript": "4.0.2" + } +} diff --git a/_generated/CopyFilesV2/retrylogichelper.ts b/_generated/CopyFilesV2/retrylogichelper.ts new file mode 100644 index 000000000000..75171ac2417c --- /dev/null +++ b/_generated/CopyFilesV2/retrylogichelper.ts @@ -0,0 +1,47 @@ +/** + * Interface for FindOptions + * Contains properties to control whether to follow symlinks + */ + export interface RetryOptions { + + /** + * Number of retries + */ + numberOfReties: number, + + /** + * Timeout between retries in milliseconds + */ + timeoutBetweenRetries: number +} + +export class RetryHelper { + private retryOptions: RetryOptions; + + constructor (retryOptions: RetryOptions) { + this.retryOptions = retryOptions; + } + + + public async RunWithRetry(action: () => T, actionName: string): Promise { + let attempts = this.retryOptions.numberOfReties; + while (true) { + try { + const result: T = await action(); + return result; + } catch (err) { + --attempts; + if (attempts <= 0) { + throw err; + } + console.log(`Error while ${actionName}: ${err}. Remaining attempts: ${attempts}`); + await this.sleep(); + } + } + } + + private async sleep() { + return new Promise(resolve => setTimeout(resolve, + this.retryOptions.timeoutBetweenRetries)); + } +} \ No newline at end of file diff --git a/_generated/CopyFilesV2/task.json b/_generated/CopyFilesV2/task.json new file mode 100644 index 000000000000..798c20c0a5cd --- /dev/null +++ b/_generated/CopyFilesV2/task.json @@ -0,0 +1,151 @@ +{ + "id": "5BFB729A-A7C8-4A78-A7C3-8D717BB7C13C", + "name": "CopyFiles", + "friendlyName": "Copy files", + "description": "Copy files from a source folder to a target folder using patterns matching file paths (not folder paths)", + "helpUrl": "https://docs.microsoft.com/azure/devops/pipelines/tasks/utility/copy-files", + "helpMarkDown": "[Learn more about this task](https://go.microsoft.com/fwlink/?LinkID=708389)", + "category": "Utility", + "visibility": [ + "Build" + ], + "runsOn": [ + "Agent", + "DeploymentGroup" + ], + "author": "Microsoft Corporation", + "version": { + "Major": 2, + "Minor": 229, + "Patch": 0 + }, + "releaseNotes": "Match pattern consistency.", + "demands": [], + "minimumAgentVersion": "2.182.1", + "groups": [ + { + "name": "advanced", + "displayName": "Advanced", + "isExpanded": false + } + ], + "inputs": [ + { + "name": "SourceFolder", + "type": "filePath", + "label": "Source Folder", + "defaultValue": "", + "required": false, + "helpMarkDown": "The source folder that the copy pattern(s) will be run from. Empty is the root of the repo. Use [variables](https://go.microsoft.com/fwlink/?LinkID=550988) if files are not in the repo. Example: $(agent.builddirectory)" + }, + { + "name": "Contents", + "type": "multiLine", + "label": "Contents", + "defaultValue": "**", + "required": true, + "helpMarkDown": "File paths to include as part of the copy. Supports multiple lines of match patterns. [More Information](https://go.microsoft.com/fwlink/?LinkID=708389)" + }, + { + "name": "TargetFolder", + "type": "string", + "label": "Target Folder", + "defaultValue": "", + "required": true, + "helpMarkDown": "Target folder or UNC path files will copy to. You can use [variables](http://go.microsoft.com/fwlink/?LinkID=550988). Example: $(build.artifactstagingdirectory)" + }, + { + "name": "CleanTargetFolder", + "type": "boolean", + "label": "Clean Target Folder", + "defaultValue": "false", + "required": false, + "helpMarkDown": "Delete all existing files in target folder before copy", + "groupName": "advanced" + }, + { + "name": "OverWrite", + "type": "boolean", + "label": "Overwrite", + "defaultValue": "false", + "required": false, + "helpMarkDown": "Replace existing file in target folder", + "groupName": "advanced" + }, + { + "name": "flattenFolders", + "type": "boolean", + "label": "Flatten Folders", + "defaultValue": "false", + "required": false, + "helpMarkDown": "Flatten the folder structure and copy all files into the specified target folder.", + "groupName": "advanced" + }, + { + "name": "preserveTimestamp", + "type": "boolean", + "label": "Preserve Target Timestamp", + "defaultValue": "false", + "required": false, + "helpMarkDown": "Using the original source file, preserve the target file timestamp.", + "groupName": "advanced" + }, + { + "name": "retryCount", + "type": "string", + "label": "Retry count to copy the file", + "defaultValue": "0", + "required": false, + "helpMarkDown": "Specify the retry count to copy the file. It might help to resolve intermittent issues e.g. with UNC target paths on a remote host.", + "groupName": "advanced" + }, + { + "name": "delayBetweenRetries", + "type": "string", + "label": "Delay between two retries.", + "defaultValue": "1000", + "required": false, + "helpMarkDown": "Specify the delay between two retries. It might help to be more resilient to intermittent issues e.g. with UNC target paths on a remote host.", + "groupName": "advanced" + }, + { + "name": "ignoreMakeDirErrors", + "type": "boolean", + "label": "Ignore errors during creation of target folder.", + "defaultValue": "false", + "required": false, + "helpMarkDown": "Ignore errors which happen during creation of target folder. This could be useful to avoid issues with parallel execution of task by several agents with one target folder.", + "groupName": "advanced" + } + ], + "instanceNameFormat": "Copy Files to: $(TargetFolder)", + "execution": { + "Node10": { + "target": "copyfiles.js", + "argumentFormat": "" + }, + "Node16": { + "target": "copyfiles.js", + "argumentFormat": "" + } + }, + "messages": { + "FoundNFiles": "found %d files", + "CleaningTargetFolder": "Cleaning target folder: %s", + "FileAlreadyExistAt": "File %s already exist at %s", + "CopyingTo": "Copying %s to %s", + "TargetIsDir": "Unable to copy file %s to %s. The target path already exists as a directory." + }, + "restrictions": { + "commands": { + "mode": "restricted" + }, + "settableVariables": { + "allowed": [] + } + }, + "_buildConfigMapping": { + "Default": "2.229.0", + "Node20-225": "2.229.1" + } +} \ No newline at end of file diff --git a/_generated/CopyFilesV2/task.loc.json b/_generated/CopyFilesV2/task.loc.json new file mode 100644 index 000000000000..23d7874af131 --- /dev/null +++ b/_generated/CopyFilesV2/task.loc.json @@ -0,0 +1,151 @@ +{ + "id": "5BFB729A-A7C8-4A78-A7C3-8D717BB7C13C", + "name": "CopyFiles", + "friendlyName": "ms-resource:loc.friendlyName", + "description": "ms-resource:loc.description", + "helpUrl": "https://docs.microsoft.com/azure/devops/pipelines/tasks/utility/copy-files", + "helpMarkDown": "ms-resource:loc.helpMarkDown", + "category": "Utility", + "visibility": [ + "Build" + ], + "runsOn": [ + "Agent", + "DeploymentGroup" + ], + "author": "Microsoft Corporation", + "version": { + "Major": 2, + "Minor": 229, + "Patch": 0 + }, + "releaseNotes": "ms-resource:loc.releaseNotes", + "demands": [], + "minimumAgentVersion": "2.182.1", + "groups": [ + { + "name": "advanced", + "displayName": "ms-resource:loc.group.displayName.advanced", + "isExpanded": false + } + ], + "inputs": [ + { + "name": "SourceFolder", + "type": "filePath", + "label": "ms-resource:loc.input.label.SourceFolder", + "defaultValue": "", + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.SourceFolder" + }, + { + "name": "Contents", + "type": "multiLine", + "label": "ms-resource:loc.input.label.Contents", + "defaultValue": "**", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.Contents" + }, + { + "name": "TargetFolder", + "type": "string", + "label": "ms-resource:loc.input.label.TargetFolder", + "defaultValue": "", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.TargetFolder" + }, + { + "name": "CleanTargetFolder", + "type": "boolean", + "label": "ms-resource:loc.input.label.CleanTargetFolder", + "defaultValue": "false", + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.CleanTargetFolder", + "groupName": "advanced" + }, + { + "name": "OverWrite", + "type": "boolean", + "label": "ms-resource:loc.input.label.OverWrite", + "defaultValue": "false", + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.OverWrite", + "groupName": "advanced" + }, + { + "name": "flattenFolders", + "type": "boolean", + "label": "ms-resource:loc.input.label.flattenFolders", + "defaultValue": "false", + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.flattenFolders", + "groupName": "advanced" + }, + { + "name": "preserveTimestamp", + "type": "boolean", + "label": "ms-resource:loc.input.label.preserveTimestamp", + "defaultValue": "false", + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.preserveTimestamp", + "groupName": "advanced" + }, + { + "name": "retryCount", + "type": "string", + "label": "ms-resource:loc.input.label.retryCount", + "defaultValue": "0", + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.retryCount", + "groupName": "advanced" + }, + { + "name": "delayBetweenRetries", + "type": "string", + "label": "ms-resource:loc.input.label.delayBetweenRetries", + "defaultValue": "1000", + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.delayBetweenRetries", + "groupName": "advanced" + }, + { + "name": "ignoreMakeDirErrors", + "type": "boolean", + "label": "ms-resource:loc.input.label.ignoreMakeDirErrors", + "defaultValue": "false", + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.ignoreMakeDirErrors", + "groupName": "advanced" + } + ], + "instanceNameFormat": "ms-resource:loc.instanceNameFormat", + "execution": { + "Node10": { + "target": "copyfiles.js", + "argumentFormat": "" + }, + "Node16": { + "target": "copyfiles.js", + "argumentFormat": "" + } + }, + "messages": { + "FoundNFiles": "ms-resource:loc.messages.FoundNFiles", + "CleaningTargetFolder": "ms-resource:loc.messages.CleaningTargetFolder", + "FileAlreadyExistAt": "ms-resource:loc.messages.FileAlreadyExistAt", + "CopyingTo": "ms-resource:loc.messages.CopyingTo", + "TargetIsDir": "ms-resource:loc.messages.TargetIsDir" + }, + "restrictions": { + "commands": { + "mode": "restricted" + }, + "settableVariables": { + "allowed": [] + } + }, + "_buildConfigMapping": { + "Default": "2.229.0", + "Node20-225": "2.229.1" + } +} \ No newline at end of file diff --git a/_generated/CopyFilesV2/tsconfig.json b/_generated/CopyFilesV2/tsconfig.json new file mode 100644 index 000000000000..0438b79f69ac --- /dev/null +++ b/_generated/CopyFilesV2/tsconfig.json @@ -0,0 +1,6 @@ +{ + "compilerOptions": { + "target": "ES6", + "module": "commonjs" + } +} \ No newline at end of file diff --git a/_generated/CopyFilesV2_Node20/.npmrc b/_generated/CopyFilesV2_Node20/.npmrc new file mode 100644 index 000000000000..5fca0d518be7 --- /dev/null +++ b/_generated/CopyFilesV2_Node20/.npmrc @@ -0,0 +1 @@ +scripts-prepend-node-path=true diff --git a/_generated/CopyFilesV2_Node20/Strings/resources.resjson/de-DE/resources.resjson b/_generated/CopyFilesV2_Node20/Strings/resources.resjson/de-DE/resources.resjson new file mode 100644 index 000000000000..b3392ae2b462 --- /dev/null +++ b/_generated/CopyFilesV2_Node20/Strings/resources.resjson/de-DE/resources.resjson @@ -0,0 +1,33 @@ +{ + "loc.friendlyName": "Dateien kopieren", + "loc.helpMarkDown": "[Weitere Informationen zu dieser Aufgabe](https://go.microsoft.com/fwlink/?LinkID=708389)", + "loc.description": "Hiermit werden Dateien unter Verwendung von Mustern zum Abgleich von Dateipfaden (nicht von Ordnerpfaden) aus einem Quellordner in einen Zielordner kopiert.", + "loc.instanceNameFormat": "Dateien kopieren in: $(TargetFolder)", + "loc.releaseNotes": "Übereinstimmungsmusterkonsistenz.", + "loc.group.displayName.advanced": "Erweitert", + "loc.input.label.SourceFolder": "Quellordner", + "loc.input.help.SourceFolder": "Der Quellordner, aus dem mindestens ein Kopiermuster ausgeführt wird. \"Empty\" ist der Stamm des Repositorys. Verwenden Sie [Variablen](https://go.microsoft.com/fwlink/?LinkID=550988), wenn sich Dateien nicht im Repository befinden. Beispiel: \"$(agent.builddirectory)\".", + "loc.input.label.Contents": "Inhalte", + "loc.input.help.Contents": "Dateipfade, die als Teil der Kopie eingeschlossen werden sollen. Unterstützt mehrere Zeilen von Vergleichsmustern. [Weitere Informationen](https://go.microsoft.com/fwlink/?LinkID=708389)", + "loc.input.label.TargetFolder": "Zielordner", + "loc.input.help.TargetFolder": "Der Zielordner oder UNC-Pfad, in den die Dateien kopiert werden. Sie können [Variablen](http://go.microsoft.com/fwlink/?LinkID=550988) verwenden. Beispiel: \"$(build.artifactstagingdirectory)\".", + "loc.input.label.CleanTargetFolder": "Zielordner bereinigen", + "loc.input.help.CleanTargetFolder": "Alle vorhandenen Dateien im Zielordner vor dem Kopieren löschen", + "loc.input.label.OverWrite": "Überschreiben", + "loc.input.help.OverWrite": "Vorhandene Datei im Zielordner ersetzen", + "loc.input.label.flattenFolders": "Ordner vereinfachen", + "loc.input.help.flattenFolders": "Vereinfachen Sie die Ordnerstruktur, und kopieren Sie alle Dateien in den angegebenen Zielordner.", + "loc.input.label.preserveTimestamp": "Zielzeitstempel beibehalten", + "loc.input.help.preserveTimestamp": "Behalten Sie unter Verwendung der ursprüngliche Quelldatei den Zeitstempel der Zieldatei bei.", + "loc.input.label.retryCount": "Wiederholungsanzahl zum Kopieren der Datei", + "loc.input.help.retryCount": "Geben Sie die Wiederholungsanzahl an, um die Datei zu kopieren. Dies kann helfen, zeitweilige Probleme zu lösen, z. B. mit UNC-Zielpfaden auf einem Remote-Host.", + "loc.input.label.delayBetweenRetries": "Verzögerung zwischen zwei Wiederholungsversuchen.", + "loc.input.help.delayBetweenRetries": "Geben Sie die Verzögerung zwischen zwei Wiederholungsversuchen an. Möglicherweise ist es hilfreich widerstandsfähiger für intermittierende Probleme, z. B. mit UNC-Zielpfaden auf einem Remote-Host, zu sein.", + "loc.input.label.ignoreMakeDirErrors": "Ignorieren Sie Fehler beim Erstellen des Zielordners.", + "loc.input.help.ignoreMakeDirErrors": "Ignorieren Sie beim Erstellen des Zielordners auftretende Fehler. Dies kann hilfreich sein, um Probleme bei der gleichzeitigen Ausführung einer Aufgabe durch mehrere Agents mit einem Zielordner zu vermeiden.", + "loc.messages.FoundNFiles": "%d Dateien wurden gefunden.", + "loc.messages.CleaningTargetFolder": "Bereinigen des Zielordners: %s", + "loc.messages.FileAlreadyExistAt": "Die Datei \"%s\" ist bereits unter \"%s\" vorhanden.", + "loc.messages.CopyingTo": "\"%s\" wird nach \"%s\" kopiert.", + "loc.messages.TargetIsDir": "Die Datei \"%s\" kann nicht nach \"%s\" kopiert werden. Der Zielpfad ist bereits als Verzeichnis vorhanden." +} \ No newline at end of file diff --git a/_generated/CopyFilesV2_Node20/Strings/resources.resjson/en-US/resources.resjson b/_generated/CopyFilesV2_Node20/Strings/resources.resjson/en-US/resources.resjson new file mode 100644 index 000000000000..6afc4874239d --- /dev/null +++ b/_generated/CopyFilesV2_Node20/Strings/resources.resjson/en-US/resources.resjson @@ -0,0 +1,33 @@ +{ + "loc.friendlyName": "Copy files", + "loc.helpMarkDown": "[Learn more about this task](https://go.microsoft.com/fwlink/?LinkID=708389)", + "loc.description": "Copy files from a source folder to a target folder using patterns matching file paths (not folder paths)", + "loc.instanceNameFormat": "Copy Files to: $(TargetFolder)", + "loc.releaseNotes": "Match pattern consistency.", + "loc.group.displayName.advanced": "Advanced", + "loc.input.label.SourceFolder": "Source Folder", + "loc.input.help.SourceFolder": "The source folder that the copy pattern(s) will be run from. Empty is the root of the repo. Use [variables](https://go.microsoft.com/fwlink/?LinkID=550988) if files are not in the repo. Example: $(agent.builddirectory)", + "loc.input.label.Contents": "Contents", + "loc.input.help.Contents": "File paths to include as part of the copy. Supports multiple lines of match patterns. [More Information](https://go.microsoft.com/fwlink/?LinkID=708389)", + "loc.input.label.TargetFolder": "Target Folder", + "loc.input.help.TargetFolder": "Target folder or UNC path files will copy to. You can use [variables](http://go.microsoft.com/fwlink/?LinkID=550988). Example: $(build.artifactstagingdirectory)", + "loc.input.label.CleanTargetFolder": "Clean Target Folder", + "loc.input.help.CleanTargetFolder": "Delete all existing files in target folder before copy", + "loc.input.label.OverWrite": "Overwrite", + "loc.input.help.OverWrite": "Replace existing file in target folder", + "loc.input.label.flattenFolders": "Flatten Folders", + "loc.input.help.flattenFolders": "Flatten the folder structure and copy all files into the specified target folder.", + "loc.input.label.preserveTimestamp": "Preserve Target Timestamp", + "loc.input.help.preserveTimestamp": "Using the original source file, preserve the target file timestamp.", + "loc.input.label.retryCount": "Retry count to copy the file", + "loc.input.help.retryCount": "Specify the retry count to copy the file. It might help to resolve intermittent issues e.g. with UNC target paths on a remote host.", + "loc.input.label.delayBetweenRetries": "Delay between two retries.", + "loc.input.help.delayBetweenRetries": "Specify the delay between two retries. It might help to be more resilient to intermittent issues e.g. with UNC target paths on a remote host.", + "loc.input.label.ignoreMakeDirErrors": "Ignore errors during creation of target folder.", + "loc.input.help.ignoreMakeDirErrors": "Ignore errors which happen during creation of target folder. This could be useful to avoid issues with parallel execution of task by several agents with one target folder.", + "loc.messages.FoundNFiles": "found %d files", + "loc.messages.CleaningTargetFolder": "Cleaning target folder: %s", + "loc.messages.FileAlreadyExistAt": "File %s already exist at %s", + "loc.messages.CopyingTo": "Copying %s to %s", + "loc.messages.TargetIsDir": "Unable to copy file %s to %s. The target path already exists as a directory." +} \ No newline at end of file diff --git a/_generated/CopyFilesV2_Node20/Strings/resources.resjson/es-ES/resources.resjson b/_generated/CopyFilesV2_Node20/Strings/resources.resjson/es-ES/resources.resjson new file mode 100644 index 000000000000..69a1ce11edf2 --- /dev/null +++ b/_generated/CopyFilesV2_Node20/Strings/resources.resjson/es-ES/resources.resjson @@ -0,0 +1,33 @@ +{ + "loc.friendlyName": "Copiar archivos", + "loc.helpMarkDown": "[Obtener más información acerca de esta tarea](https://go.microsoft.com/fwlink/?LinkID=708389)", + "loc.description": "Copia archivos de una carpeta de origen a una carpeta de destino mediante patrones que coinciden con las rutas de acceso de los archivos (no con las rutas de carpeta).", + "loc.instanceNameFormat": "Copiar archivos a: $(TargetFolder)", + "loc.releaseNotes": "Coherencia de los patrones de coincidencia.", + "loc.group.displayName.advanced": "Avanzado", + "loc.input.label.SourceFolder": "Carpeta de origen", + "loc.input.help.SourceFolder": "La carpeta de origen desde la que se ejecutarán los patrones de copia. La raíz del repositorio está vacía. Use [variables](https://go.microsoft.com/fwlink/?LinkID=550988) si los archivos no están en el repositorio. Ejemplo: $(agent.builddirectory)", + "loc.input.label.Contents": "Contenido", + "loc.input.help.Contents": "Rutas de acceso de archivo que se incluirán como parte de la copia. Se admiten varias líneas de patrones de coincidencia. [Más información] (https://go.microsoft.com/fwlink/?LinkID=708389)", + "loc.input.label.TargetFolder": "Carpeta de destino", + "loc.input.help.TargetFolder": "La carpeta de destino o la ruta UNC en la que se copiarán los archivos. Puede usar [variables](http://go.microsoft.com/fwlink/?LinkID=550988). Ejemplo: $(build.artifactstagingdirectory)", + "loc.input.label.CleanTargetFolder": "Borrar carpeta de destino", + "loc.input.help.CleanTargetFolder": "Eliminar todos los archivos existentes en la carpeta de destino antes de copiar", + "loc.input.label.OverWrite": "Sobrescribir", + "loc.input.help.OverWrite": "Reemplazar archivo existente en la carpeta de destino", + "loc.input.label.flattenFolders": "Acoplar carpetas", + "loc.input.help.flattenFolders": "Acople la estructura de carpeta y copie todos los archivos en la carpeta de destino especificada.", + "loc.input.label.preserveTimestamp": "Conservar la marca de tiempo de destino", + "loc.input.help.preserveTimestamp": "Al usar el archivo de código fuente original, conserve la marca de tiempo del archivo de destino.", + "loc.input.label.retryCount": "Número de reintentos para copiar el archivo", + "loc.input.help.retryCount": "Especifique el número de reintentos para copiar el archivo. Puede que ayude a resolver problemas intermitentes, por ejemplo, con rutas de acceso de destino UNC en un host remoto.", + "loc.input.label.delayBetweenRetries": "Retraso entre dos reintentos.", + "loc.input.help.delayBetweenRetries": "Especifique el retraso entre dos reintentos. Es posible que resulte más resistente a los problemas intermitentes, por ejemplo, con rutas de acceso de destino UNC en un host remoto.", + "loc.input.label.ignoreMakeDirErrors": "Omitir errores durante la creación de la carpeta de destino.", + "loc.input.help.ignoreMakeDirErrors": "Omite los errores que se producen durante la creación de la carpeta de destino. Esto puede ser útil para evitar problemas con la ejecución simultánea de tareas por parte de diversos agentes con una carpeta de destino.", + "loc.messages.FoundNFiles": "se encontraron %d archivos", + "loc.messages.CleaningTargetFolder": "Limpiando carpeta de destino: %s", + "loc.messages.FileAlreadyExistAt": "El archivo %s ya existe en %s", + "loc.messages.CopyingTo": "Copiando %s en %s", + "loc.messages.TargetIsDir": "No se puede copiar el archivo %s en %s. La ruta de acceso de destino ya existe como directorio." +} \ No newline at end of file diff --git a/_generated/CopyFilesV2_Node20/Strings/resources.resjson/fr-FR/resources.resjson b/_generated/CopyFilesV2_Node20/Strings/resources.resjson/fr-FR/resources.resjson new file mode 100644 index 000000000000..a2269a8d6c40 --- /dev/null +++ b/_generated/CopyFilesV2_Node20/Strings/resources.resjson/fr-FR/resources.resjson @@ -0,0 +1,33 @@ +{ + "loc.friendlyName": "Copier des fichiers", + "loc.helpMarkDown": "[En savoir plus sur cette tâche](https://go.microsoft.com/fwlink/?LinkID=708389)", + "loc.description": "Copier les fichiers d'un dossier source vers un dossier cible à l'aide de modèles correspondant à des chemins de fichiers (et non des chemins de dossiers)", + "loc.instanceNameFormat": "Copier les fichiers vers : $(TargetFolder)", + "loc.releaseNotes": "Cohérence du modèle de correspondance.", + "loc.group.displayName.advanced": "Avancé", + "loc.input.label.SourceFolder": "Dossier source", + "loc.input.help.SourceFolder": "Dossier source à partir duquel les modèles de copie sont exécutés. La valeur vide est la racine du référentiel. Utilisez [variables](https://go.microsoft.com/fwlink/?LinkID=550988) si les fichiers ne sont pas dans le référentiel. Exemple : $(agent.builddirectory)", + "loc.input.label.Contents": "Contenu", + "loc.input.help.Contents": "Chemins de fichiers à inclure dans le cadre de la copie. Prend en charge plusieurs lignes de modèles de correspondance. [Plus d'informations](https://go.microsoft.com/fwlink/?LinkID=708389)", + "loc.input.label.TargetFolder": "Dossier cible", + "loc.input.help.TargetFolder": "Dossier cible ou chemin UNC vers lequel les fichiers sont copiés. Vous pouvez utiliser [variables](http://go.microsoft.com/fwlink/?LinkID=550988). Exemple : $(build.artifactstagingdirectory)", + "loc.input.label.CleanTargetFolder": "Effacer le dossier cible", + "loc.input.help.CleanTargetFolder": "Supprimer tous les fichiers existants dans le dossier cible avant de copier", + "loc.input.label.OverWrite": "Remplacer", + "loc.input.help.OverWrite": "Remplacer le fichier existant dans le dossier cible", + "loc.input.label.flattenFolders": "Aplatir les dossiers", + "loc.input.help.flattenFolders": "Aplatit la structure des dossiers et copie tous les fichiers dans le dossier cible spécifié.", + "loc.input.label.preserveTimestamp": "Conserver l'horodatage cible", + "loc.input.help.preserveTimestamp": "À l'aide du fichier source d'origine, conservez l'horodatage du fichier cible.", + "loc.input.label.retryCount": "Recommencer le nombre de tentatives pour copier le fichier", + "loc.input.help.retryCount": "Spécifiez le nombre d’tentatives pour copier le fichier. Il peut être utile de résoudre les problèmes intermittents par exemple, avec les chemins d’accès cibles UNC sur un hôte distant.", + "loc.input.label.delayBetweenRetries": "Délai entre deux nouvelles tentatives.", + "loc.input.help.delayBetweenRetries": "Spécifiez le délai entre deux tentatives. Cela peut contribuer à améliorer la résilience aux problèmes intermittents, par exemple avec les chemins d’améliorer cibles UNC sur un hôte distant.", + "loc.input.label.ignoreMakeDirErrors": "Ignorer les erreurs lors de la création d’un dossier cible.", + "loc.input.help.ignoreMakeDirErrors": "Ignore les erreurs survenues lors de la création d’un dossier cible. Cela peut être utile pour éviter les problèmes avec l’exécution en parallèle de tâches par plusieurs agents avec un dossier cible.", + "loc.messages.FoundNFiles": "%d fichiers trouvés", + "loc.messages.CleaningTargetFolder": "Nettoyage du dossier cible : %s", + "loc.messages.FileAlreadyExistAt": "Le fichier %s existe déjà sur %s", + "loc.messages.CopyingTo": "Copie de %s vers %s", + "loc.messages.TargetIsDir": "Impossible de copier le fichier %s dans %s. Le chemin cible existe déjà sous forme de répertoire." +} \ No newline at end of file diff --git a/_generated/CopyFilesV2_Node20/Strings/resources.resjson/it-IT/resources.resjson b/_generated/CopyFilesV2_Node20/Strings/resources.resjson/it-IT/resources.resjson new file mode 100644 index 000000000000..cd254747abbc --- /dev/null +++ b/_generated/CopyFilesV2_Node20/Strings/resources.resjson/it-IT/resources.resjson @@ -0,0 +1,33 @@ +{ + "loc.friendlyName": "Copia file", + "loc.helpMarkDown": "[Altre informazioni su questa attività](https://go.microsoft.com/fwlink/?LinkID=708389)", + "loc.description": "Copia i file da una cartella di origine a una cartella di destinazione usando criteri corrispondenti a percorsi di file (non percorsi di cartella)", + "loc.instanceNameFormat": "Copia file in: $(TargetFolder)", + "loc.releaseNotes": "Coerenza dei criteri di corrispondenza.", + "loc.group.displayName.advanced": "Avanzate", + "loc.input.label.SourceFolder": "Cartella di origine", + "loc.input.help.SourceFolder": "Cartella di origine da cui verranno eseguiti i criteri di copia. Il valore vuoto corrisponde alla radice del repository. Usare [variabili](https://go.microsoft.com/fwlink/?LinkID=550988) se i file non sono presenti nel repository. Esempio: $(agent.builddirectory)", + "loc.input.label.Contents": "Contenuti", + "loc.input.help.Contents": "Percorsi di file da includere nella copia. Sono supportate più righe di criteri di corrispondenza. [Altre informazioni](https://go.microsoft.com/fwlink/?LinkID=708389)", + "loc.input.label.TargetFolder": "Cartella di destinazione", + "loc.input.help.TargetFolder": "Cartella di destinazione o percorso UNC in cui verranno copiati i file. È possibile usare [variabili](http://go.microsoft.com/fwlink/?LinkID=550988). Esempio: $(build.artifactstagingdirectory)", + "loc.input.label.CleanTargetFolder": "Pulisci cartella di destinazione", + "loc.input.help.CleanTargetFolder": "Elimina tutti i file esistenti nella cartella di destinazione prima della copia", + "loc.input.label.OverWrite": "Sovrascrivi", + "loc.input.help.OverWrite": "Sostituisce il file esistente nella cartella di destinazione", + "loc.input.label.flattenFolders": "Rendi flat le cartelle", + "loc.input.help.flattenFolders": "Rende flat la struttura di cartelle e copia tutti i file nella cartella di destinazione specificata.", + "loc.input.label.preserveTimestamp": "Mantieni timestamp di destinazione", + "loc.input.help.preserveTimestamp": "Quando si usa il file di origine iniziale, mantiene il timestamp del file di destinazione.", + "loc.input.label.retryCount": "Numero di tentativi eseguiti per copiare il file", + "loc.input.help.retryCount": "Specificare il numero di tentativi eseguiti per copiare il file. Ciò potrebbe aiutare a risolvere i problemi intermittenti, ad esempio nei percorsi di destinazione UNC su un host remoto.", + "loc.input.label.delayBetweenRetries": "Ritardo tra due tentativi.", + "loc.input.help.delayBetweenRetries": "Specifica il ritardo tra due tentativi. Potrebbe essere utile per una maggiore resilienza a problemi intermittenti, ad esempio quelli relativi a percorsi di destinazione UNC in un host remoto.", + "loc.input.label.ignoreMakeDirErrors": "Ignorare gli errori durante la creazione della cartella di destinazione.", + "loc.input.help.ignoreMakeDirErrors": "Ignorare gli errori che si verificano durante la creazione della cartella di destinazione. Questa operazione potrebbe essere utile per evitare problemi di esecuzione parallela dell'attività da parte di diversi agenti con una cartella di destinazione.", + "loc.messages.FoundNFiles": "sono stati trovati %d file", + "loc.messages.CleaningTargetFolder": "Pulizia della cartella di destinazione: %s", + "loc.messages.FileAlreadyExistAt": "Il file %s esiste già in %s", + "loc.messages.CopyingTo": "Copia di %s in %s", + "loc.messages.TargetIsDir": "Non è possibile copiare il file %s in %s. Il percorso di destinazione esiste già come directory." +} \ No newline at end of file diff --git a/_generated/CopyFilesV2_Node20/Strings/resources.resjson/ja-JP/resources.resjson b/_generated/CopyFilesV2_Node20/Strings/resources.resjson/ja-JP/resources.resjson new file mode 100644 index 000000000000..4460b173de99 --- /dev/null +++ b/_generated/CopyFilesV2_Node20/Strings/resources.resjson/ja-JP/resources.resjson @@ -0,0 +1,33 @@ +{ + "loc.friendlyName": "ファイルのコピー", + "loc.helpMarkDown": "[このタスクの詳細を表示](https://go.microsoft.com/fwlink/?LinkID=708389)", + "loc.description": "パターン マッチングのファイル パス (フォルダー パスではない) を使用して、ソース フォルダーからターゲット フォルダーにファイルをコピーします", + "loc.instanceNameFormat": "ファイルのコピー先: $(TargetFolder)", + "loc.releaseNotes": "パターンの整合性を一致させます。", + "loc.group.displayName.advanced": "詳細設定", + "loc.input.label.SourceFolder": "ソース フォルダー", + "loc.input.help.SourceFolder": "コピー パターンの実行元のソース フォルダー。空白はリポジトリのルートです。ファイルがリポジトリにない場合は、[変数](https://go.microsoft.com/fwlink/?LinkID=550988) を使用します。例: $(agent.builddirectory)", + "loc.input.label.Contents": "コンテンツ", + "loc.input.help.Contents": "コピーの一部として含むファイル パス。複数行の一致パターンをサポートします。[詳細](https://go.microsoft.com/fwlink/?LinkID=708389)", + "loc.input.label.TargetFolder": "ターゲット フォルダー", + "loc.input.help.TargetFolder": "ファイルをコピーするターゲット フォルダーまたは UNC パス。[変数](http://go.microsoft.com/fwlink/?LinkID=550988) を使用できます。例: $(build.artifactstagingdirectory)", + "loc.input.label.CleanTargetFolder": "ターゲット フォルダーの消去", + "loc.input.help.CleanTargetFolder": "コピーする前にターゲット フォルダーにある既存のファイルをすべて削除する", + "loc.input.label.OverWrite": "上書き", + "loc.input.help.OverWrite": "ターゲット フォルダー内の既存のファイルを置き換える", + "loc.input.label.flattenFolders": "フォルダーのフラット化", + "loc.input.help.flattenFolders": "フォルダー構造をフラットにして、すべてのファイルを指定のターゲット フォルダーにコピーします。", + "loc.input.label.preserveTimestamp": "ターゲットのタイムスタンプの保持", + "loc.input.help.preserveTimestamp": "元のソース ファイルを使用して、ターゲット ファイルのタイムスタンプを保持します。", + "loc.input.label.retryCount": "ファイル コピーの再試行回数", + "loc.input.help.retryCount": "ファイルをコピーする再試行回数を指定します。リモート ホスト上の UNC ターゲット パスなど、断続的な問題を解決するのに役立つ可能性があります。", + "loc.input.label.delayBetweenRetries": "2 回の再試行の間の遅延。", + "loc.input.help.delayBetweenRetries": "2 回の再試行の間の遅延を指定してください。断続的な問題に対してはさらに回復性を高めると役立つかもしれません (例: リモート ホストでの UNC ターゲット パスなど)。", + "loc.input.label.ignoreMakeDirErrors": "ターゲット フォルダーの作成中に発生したエラーを無視します。", + "loc.input.help.ignoreMakeDirErrors": "ターゲット フォルダーの作成中に発生するエラーを無視します。これは、1 つのターゲット フォルダーで複数のエージェントによるタスクの並列実行に関する問題を回避するために役立ちます。", + "loc.messages.FoundNFiles": "%d 件のファイルが見つかりました", + "loc.messages.CleaningTargetFolder": "ターゲット フォルダーをクリーンアップ中: %s", + "loc.messages.FileAlreadyExistAt": "ファイル %s は %s に既に存在しています", + "loc.messages.CopyingTo": "%s を %s にコピー中", + "loc.messages.TargetIsDir": "ファイル %s を %s にコピーできません。ターゲット パスはディレクトリとして既に存在します。" +} \ No newline at end of file diff --git a/_generated/CopyFilesV2_Node20/Strings/resources.resjson/ko-KR/resources.resjson b/_generated/CopyFilesV2_Node20/Strings/resources.resjson/ko-KR/resources.resjson new file mode 100644 index 000000000000..8fb6be7e6859 --- /dev/null +++ b/_generated/CopyFilesV2_Node20/Strings/resources.resjson/ko-KR/resources.resjson @@ -0,0 +1,33 @@ +{ + "loc.friendlyName": "파일 복사", + "loc.helpMarkDown": "[이 작업에 대한 자세한 정보](https://go.microsoft.com/fwlink/?LinkID=708389)", + "loc.description": "패턴 일치 파일 경로(폴더 경로 아님)를 사용하여 소스 폴더에서 대상 폴더로 파일을 복사합니다.", + "loc.instanceNameFormat": "파일을 복사할 위치: $(TargetFolder)", + "loc.releaseNotes": "일치 패턴 일관성입니다.", + "loc.group.displayName.advanced": "고급", + "loc.input.label.SourceFolder": "소스 폴더", + "loc.input.help.SourceFolder": "사본 패턴이 실행될 소스 폴더입니다. 리포지토리의 루트는 [비어 있음]입니다. 파일이 리포지토리에 없으면 [변수](https://go.microsoft.com/fwlink/?LinkID=550988)를 사용하세요. 예: $(agent.builddirectory)", + "loc.input.label.Contents": "콘텐츠", + "loc.input.help.Contents": "복사의 일부로 포함할 파일 경로입니다. 여러 줄의 일치 패턴을 지원합니다. [자세한 정보](https://go.microsoft.com/fwlink/?LinkID=708389)", + "loc.input.label.TargetFolder": "대상 폴더", + "loc.input.help.TargetFolder": "파일이 복사될 대상 폴더 또는 UNC 경로입니다. [변수](http://go.microsoft.com/fwlink/?LinkID=550988)를 사용할 수 있습니다. 예: $(build.artifactstagingdirectory)", + "loc.input.label.CleanTargetFolder": "대상 폴더 정리", + "loc.input.help.CleanTargetFolder": "복사 전 대상 폴더에서 기존 파일 모두 삭제", + "loc.input.label.OverWrite": "덮어쓰기", + "loc.input.help.OverWrite": "대상 폴더에서 기존 파일 바꾸기", + "loc.input.label.flattenFolders": "폴더 평면화", + "loc.input.help.flattenFolders": "폴더 구조를 평면화하고 모든 파일을 지정된 대상 폴더에 복사합니다.", + "loc.input.label.preserveTimestamp": "대상 타임스탬프 유지", + "loc.input.help.preserveTimestamp": "원본 소스 파일을 사용하여 대상 파일 타임스탬프를 유지합니다.", + "loc.input.label.retryCount": "파일 복사 재시도 횟수", + "loc.input.help.retryCount": "파일을 복사하려면 재시도 횟수를 지정합니다. 원격 호스트의 UNC 대상 경로와 같은 간헐적인 문제를 해결하는 데 도움이 될 수 있습니다.", + "loc.input.label.delayBetweenRetries": "두 번의 재시도 사이의 지연 시간입니다.", + "loc.input.help.delayBetweenRetries": "두 번의 재시도 사이의 지연을 지정합니다. 간헐적인 문제에 더 탄력적으로 대처하는 데 도움이 될 수 있습니다(예: 원격 호스트의 UNC 대상 경로 문제).", + "loc.input.label.ignoreMakeDirErrors": "대상 폴더를 만드는 동안 발생하는 오류를 무시하세요.", + "loc.input.help.ignoreMakeDirErrors": "대상 폴더를 만드는 동안 발생하는 오류를 무시하세요. 이 기능은 대상 폴더가 하나인 여러 에이전트의 병렬 작업 실행과 관련된 문제를 방지하는 데 유용할 수 있습니다.", + "loc.messages.FoundNFiles": "%d개 파일을 찾았습니다.", + "loc.messages.CleaningTargetFolder": "대상 폴더 정리: %s", + "loc.messages.FileAlreadyExistAt": "%s 파일이 %s에 이미 있습니다.", + "loc.messages.CopyingTo": "%s을(를) %s(으)로 복사하는 중", + "loc.messages.TargetIsDir": "%s 파일을 %s에 복사할 수 없습니다. 대상 경로가 이미 디렉터리로 있습니다." +} \ No newline at end of file diff --git a/_generated/CopyFilesV2_Node20/Strings/resources.resjson/ru-RU/resources.resjson b/_generated/CopyFilesV2_Node20/Strings/resources.resjson/ru-RU/resources.resjson new file mode 100644 index 000000000000..0ecbbb8adee7 --- /dev/null +++ b/_generated/CopyFilesV2_Node20/Strings/resources.resjson/ru-RU/resources.resjson @@ -0,0 +1,33 @@ +{ + "loc.friendlyName": "Копировать файлы", + "loc.helpMarkDown": "[См. дополнительные сведения об этой задаче](https://go.microsoft.com/fwlink/?LinkID=708389)", + "loc.description": "Копировать файлы из исходной папки в целевую с использованием шаблонов, соответствующих путям файлов (не путям к папкам)", + "loc.instanceNameFormat": "Копировать файлы в: $(TargetFolder)", + "loc.releaseNotes": "Согласованность шаблонов соответствия.", + "loc.group.displayName.advanced": "Дополнительно", + "loc.input.label.SourceFolder": "Исходная папка", + "loc.input.help.SourceFolder": "Исходная папка, откуда будут запускаться шаблоны копирования. Если значение не указано, используется корень репозитория. Используйте [переменные](https://go.microsoft.com/fwlink/?LinkID=550988), если файлы находятся не в репозитории. Например: $(agent.builddirectory)", + "loc.input.label.Contents": "Содержимое", + "loc.input.help.Contents": "Пути к файлам, которые будут включены в операцию копирования. Есть поддержка многострочных шаблонов сопоставления. [Подробнее...](https://go.microsoft.com/fwlink/?LinkID=708389)", + "loc.input.label.TargetFolder": "Целевая папка", + "loc.input.help.TargetFolder": "Целевая папка или UNC-путь для копирования файлов. Можно использовать [переменные](http://go.microsoft.com/fwlink/?LinkID=550988). Например: $(build.artifactstagingdirectory)", + "loc.input.label.CleanTargetFolder": "Очистить целевую папку", + "loc.input.help.CleanTargetFolder": "Удалить все существующие файлы в целевой папке перед копированием", + "loc.input.label.OverWrite": "Перезаписать", + "loc.input.help.OverWrite": "Заменить существующий файл в целевой папке", + "loc.input.label.flattenFolders": "Выполнить сведение папок", + "loc.input.help.flattenFolders": "Выполнение сведения структуры папок и копирование всех файлов в указанную целевую папку.", + "loc.input.label.preserveTimestamp": "Сохранить целевую метку времени", + "loc.input.help.preserveTimestamp": "Используя оригинальный исходный файл, сохраните метку времени целевого файла.", + "loc.input.label.retryCount": "Число повторных попыток копировать файл", + "loc.input.help.retryCount": "Укажите число повторных попыток копировать файл. Это может помочь в устранении временных проблем, например с целевыми UNC-путями на удаленном узле.", + "loc.input.label.delayBetweenRetries": "Задержка между двумя попытками.", + "loc.input.help.delayBetweenRetries": "Укажите задержку между двумя попытками. Это может повысить устойчивость к периодическим проблемам, например с целевыми путями UNC на удаленном узле.", + "loc.input.label.ignoreMakeDirErrors": "Игнорировать ошибки при создании целевой папки.", + "loc.input.help.ignoreMakeDirErrors": "Игнорируйте ошибки, возникающие при создании целевой папки. Это может позволить избежать проблем с параллельным выполнением задачи несколькими агентами с одной целевой папкой.", + "loc.messages.FoundNFiles": "найдено файлов: %d", + "loc.messages.CleaningTargetFolder": "Очистка целевого каталога: %s", + "loc.messages.FileAlreadyExistAt": "Файл \"%s\" уже существует в \"%s\"", + "loc.messages.CopyingTo": "Копирование \"%s\" в \"%s\"", + "loc.messages.TargetIsDir": "Не удалось скопировать файл %s в %s. Путь назначения уже существует в виде каталога." +} \ No newline at end of file diff --git a/_generated/CopyFilesV2_Node20/Strings/resources.resjson/zh-CN/resources.resjson b/_generated/CopyFilesV2_Node20/Strings/resources.resjson/zh-CN/resources.resjson new file mode 100644 index 000000000000..b9d813ebe4f0 --- /dev/null +++ b/_generated/CopyFilesV2_Node20/Strings/resources.resjson/zh-CN/resources.resjson @@ -0,0 +1,33 @@ +{ + "loc.friendlyName": "复制文件", + "loc.helpMarkDown": "[详细了解此任务](https://go.microsoft.com/fwlink/?LinkID=708389)", + "loc.description": "使用与文件路径(不是文件夹路径)匹配的模式将源文件夹中的文件复制到目标文件夹", + "loc.instanceNameFormat": "将文件复制到: $(TargetFolder)", + "loc.releaseNotes": "匹配模式一致性。", + "loc.group.displayName.advanced": "高级", + "loc.input.label.SourceFolder": "源文件夹", + "loc.input.help.SourceFolder": "将在其中运行复制模式的源文件夹。为空表示存储库的根。如果存储库中没有文件,请使用[变量](https://go.microsoft.com/fwlink/?LinkID=550988)。示例: $(agent.builddirectory)", + "loc.input.label.Contents": "内容", + "loc.input.help.Contents": "要包含在副本中的文件路径。支持多行匹配模式。[详细信息](https://go.microsoft.com/fwlink/?LinkID=708389)", + "loc.input.label.TargetFolder": "目标文件夹", + "loc.input.help.TargetFolder": "文件将复制到的目标文件夹或 UNC 路径。可以使用 [variables](http://go.microsoft.com/fwlink/?LinkID=550988)。示例: $(build.artifactstagingdirectory)", + "loc.input.label.CleanTargetFolder": "清理目标文件夹", + "loc.input.help.CleanTargetFolder": "复制之前,先删除目标文件夹中的现有全部文件", + "loc.input.label.OverWrite": "覆盖", + "loc.input.help.OverWrite": "替换目标文件夹中的现有文件", + "loc.input.label.flattenFolders": "精简文件夹", + "loc.input.help.flattenFolders": "平展文件夹结构并将所有文件复制到指定的目标文件夹。", + "loc.input.label.preserveTimestamp": "保留目标时间戳", + "loc.input.help.preserveTimestamp": "使用原始源文件,保留目标文件时间戳。", + "loc.input.label.retryCount": "复制该文件的重试计数", + "loc.input.help.retryCount": "指定复制该文件的重试计数。它可以帮助解决间歇性问题,例如远程主机上的 UNC 目标路径的问题。", + "loc.input.label.delayBetweenRetries": "两次重试之间的延迟。", + "loc.input.help.delayBetweenRetries": "指定两次重试之间的延迟。这可能有助于更灵活地应对间歇性问题,例如远程主机上的 UNC 目标路径。", + "loc.input.label.ignoreMakeDirErrors": "在创建目标文件夹期间忽略错误。", + "loc.input.help.ignoreMakeDirErrors": "忽略创建目标文件夹期间发生的错误。这有助于避免由具有一个目标文件夹的多个代理并行执行任务的问题。", + "loc.messages.FoundNFiles": "已找到 %d 个文件", + "loc.messages.CleaningTargetFolder": "正在清理目标文件夹: %s", + "loc.messages.FileAlreadyExistAt": "文件 %s 已存在于 %s", + "loc.messages.CopyingTo": "正在将 %s 复制到 %s", + "loc.messages.TargetIsDir": "无法将文件 %s 复制到 %s。目标路径已作为目录存在。" +} \ No newline at end of file diff --git a/_generated/CopyFilesV2_Node20/Strings/resources.resjson/zh-TW/resources.resjson b/_generated/CopyFilesV2_Node20/Strings/resources.resjson/zh-TW/resources.resjson new file mode 100644 index 000000000000..52c4e6abbe42 --- /dev/null +++ b/_generated/CopyFilesV2_Node20/Strings/resources.resjson/zh-TW/resources.resjson @@ -0,0 +1,33 @@ +{ + "loc.friendlyName": "複製檔案", + "loc.helpMarkDown": "[深入了解此工作](https://go.microsoft.com/fwlink/?LinkID=708389)", + "loc.description": "使用模式比對檔案路徑 (非資料夾路徑) 從來源資料夾將檔案複製到目標資料夾", + "loc.instanceNameFormat": "將檔案複製到: $(TargetFolder)", + "loc.releaseNotes": "符合模式一致性。", + "loc.group.displayName.advanced": "進階", + "loc.input.label.SourceFolder": "來源資料夾", + "loc.input.help.SourceFolder": "複製模式執行所在的來源資料夾。保留空白表示是存放庫的根資料夾。若檔案不在存放庫中,請使用 [變數](https://go.microsoft.com/fwlink/?LinkID=550988)。例如: $(agent.builddirectory)", + "loc.input.label.Contents": "內容", + "loc.input.help.Contents": "要在複製時一併加入的檔案路徑。支援多行的比對模式。[詳細資訊](https://go.microsoft.com/fwlink/?LinkID=708389)", + "loc.input.label.TargetFolder": "目標資料夾", + "loc.input.help.TargetFolder": "設定要複製檔案的目標資料夾或 UNC 路徑。您可以使用[變數](http://go.microsoft.com/fwlink/?LinkID=550988)。例如: $(build.artifactstagingdirectory)", + "loc.input.label.CleanTargetFolder": "清除目標資料夾", + "loc.input.help.CleanTargetFolder": "複製前先刪除目標資料夾中所有現有的檔案", + "loc.input.label.OverWrite": "覆寫", + "loc.input.help.OverWrite": "取代目標資料夾中現有的檔案", + "loc.input.label.flattenFolders": "壓平合併資料夾", + "loc.input.help.flattenFolders": "壓平合併資料夾結構並將所有檔案複製到指定的目標資料夾。", + "loc.input.label.preserveTimestamp": "保留目標時間戳記", + "loc.input.help.preserveTimestamp": "正在使用原始來源檔案,保留目標檔案時間戳記。", + "loc.input.label.retryCount": "要複製檔案的重試計數", + "loc.input.help.retryCount": "指定要複製檔案的重試計數。這可能有助於解決間歇性問題,例如在遠端主機上使用 UNC 目標路徑。", + "loc.input.label.delayBetweenRetries": "兩次重試之間的延遲。", + "loc.input.help.delayBetweenRetries": "指定兩次重試之間的延遲。它可能有助於對間歇性問題保持彈性,例如在遠端主機上使用 UNC 目標路徑。", + "loc.input.label.ignoreMakeDirErrors": "在建立目標資料夾期間,略過錯誤。", + "loc.input.help.ignoreMakeDirErrors": "在建立目標資料夾期間,略過錯誤。這可能有助於避免多個代理程式與一個目標資料夾平行執行工作的問題。", + "loc.messages.FoundNFiles": "找到 %d 個檔案", + "loc.messages.CleaningTargetFolder": "正在刪除目標資料夾: %s", + "loc.messages.FileAlreadyExistAt": "檔案 %s 已存在於 %s 上", + "loc.messages.CopyingTo": "正在將 %s 複製到 %s", + "loc.messages.TargetIsDir": "無法將檔案 %s 複製到 %s。目標路徑已作為目錄存在。" +} \ No newline at end of file diff --git a/_generated/CopyFilesV2_Node20/Tests/L0.ts b/_generated/CopyFilesV2_Node20/Tests/L0.ts new file mode 100644 index 000000000000..dfe3095fe63f --- /dev/null +++ b/_generated/CopyFilesV2_Node20/Tests/L0.ts @@ -0,0 +1,436 @@ +import * as assert from 'assert'; +import * as mocktest from 'azure-pipelines-task-lib/mock-test'; +import * as os from 'os'; +import * as path from 'path'; + +describe('CopyFiles L0 Suite', function () { + this.timeout(parseInt(process.env.TASK_TEST_TIMEOUT) || 20000); + + before(() => { }); + + after(() => { }); + + it('copy files from srcdir to destdir', (done: Mocha.Done) => { + this.timeout(1000); + + let testPath = path.join(__dirname, 'L0copyAllFiles.js'); + let runner: mocktest.MockTestRunner = new mocktest.MockTestRunner(testPath); + runner.run(); + + assert( + runner.succeeded, + 'should have succeeded'); + assert( + runner.stdOutContained(`creating path: ${path.normalize('/destDir')}`), + 'should have mkdirP destDir'); + assert( + runner.stdOutContained(`creating path: ${path.normalize('/destDir/someOtherDir')}`), + 'should have mkdirP someOtherDir'); + assert( + runner.stdOutContained(`creating path: ${path.normalize('/destDir/someOtherDir2')}`), + 'should have mkdirP someOtherDir2'); + assert( + !runner.stdOutContained(`creating path: ${path.normalize('/destDir/someOtherDir3')}`), + 'should not have mkdirP someOtherDir3'); + assert( + runner.stdOutContained(`copying ${path.normalize('/srcDir/someOtherDir/file1.file')} to ${path.normalize('/destDir/someOtherDir/file1.file')}`), + 'should have copied dir1 file1'); + assert( + runner.stdOutContained(`copying ${path.normalize('/srcDir/someOtherDir/file2.file')} to ${path.normalize('/destDir/someOtherDir/file2.file')}`), + 'should have copied dir1 file2'); + assert( + runner.stdOutContained(`copying ${path.normalize('/srcDir/someOtherDir2/file1.file')} to ${path.normalize('/destDir/someOtherDir2/file1.file')}`), + 'should have copied dir2 file1'); + assert( + runner.stdOutContained(`copying ${path.normalize('/srcDir/someOtherDir2/file2.file')} to ${path.normalize('/destDir/someOtherDir2/file2.file')}`), + 'should have copied dir2 file2'); + assert( + runner.stdOutContained(`copying ${path.normalize('/srcDir/someOtherDir2/file3.file')} to ${path.normalize('/destDir/someOtherDir2/file3.file')}`), + 'should have copied dir2 file3'); + done(); + }); + + it('copy files from srcdir to destdir with brackets in src path', (done: Mocha.Done) => { + this.timeout(1000); + + let testPath = path.join(__dirname, 'L0copyAllFilesWithBracketsInSrcPath.js'); + let runner: mocktest.MockTestRunner = new mocktest.MockTestRunner(testPath); + runner.run(); + + assert( + runner.succeeded, + 'should have succeeded'); + assert( + runner.stdOutContained(`creating path: ${path.normalize('/destDir')}`), + 'should have mkdirP destDir'); + assert( + runner.stdOutContained(`creating path: ${path.normalize('/destDir/someOtherDir')}`), + 'should have mkdirP someOtherDir'); + assert( + runner.stdOutContained(`creating path: ${path.normalize('/destDir/someOtherDir2')}`), + 'should have mkdirP someOtherDir2'); + assert( + !runner.stdOutContained(`creating path: ${path.normalize('/destDir/someOtherDir3')}`), + 'should not have mkdirP someOtherDir3'); + assert( + runner.stdOutContained(`copying ${path.normalize('/srcDir [bracket]/someOtherDir/file1.file')} to ${path.normalize('/destDir/someOtherDir/file1.file')}`), + 'should have copied dir1 file1'); + assert( + runner.stdOutContained(`copying ${path.normalize('/srcDir [bracket]/someOtherDir/file2.file')} to ${path.normalize('/destDir/someOtherDir/file2.file')}`), + 'should have copied dir1 file2'); + assert( + runner.stdOutContained(`copying ${path.normalize('/srcDir [bracket]/someOtherDir2/file1.file')} to ${path.normalize('/destDir/someOtherDir2/file1.file')}`), + 'should have copied dir2 file1'); + assert( + runner.stdOutContained(`copying ${path.normalize('/srcDir [bracket]/someOtherDir2/file2.file')} to ${path.normalize('/destDir/someOtherDir2/file2.file')}`), + 'should have copied dir2 file2'); + assert( + runner.stdOutContained(`copying ${path.normalize('/srcDir [bracket]/someOtherDir2/file3.file')} to ${path.normalize('/destDir/someOtherDir2/file3.file')}`), + 'should have copied dir2 file3'); + done(); + }); + + it('copy files and subtract based on exclude pattern', (done: Mocha.Done) => { + this.timeout(1000); + + let testPath = path.join(__dirname, 'L0copySubtractExclude.js'); + let runner: mocktest.MockTestRunner = new mocktest.MockTestRunner(testPath); + runner.run(); + + assert( + runner.succeeded, + 'should have succeeded'); + assert( + runner.stdOutContained(`creating path: ${path.normalize('/destDir')}`), + 'should have mkdirP destDir'); + assert( + runner.stdOutContained(`creating path: ${path.normalize('/destDir/someOtherDir')}`), + 'should have mkdirP someOtherDir'); + assert( + !runner.stdOutContained(`creating path: ${path.normalize('/destDir/someOtherDir2')}`), + 'should not have mkdirP someOtherDir2'); + assert( + runner.stdOutContained(`copying ${path.normalize('/srcDir/someOtherDir/file1.file')} to ${path.normalize('/destDir/someOtherDir/file1.file')}`), + 'should have copied dir1 file1'); + assert( + runner.stdOutContained(`copying ${path.normalize('/srcDir/someOtherDir/file2.file')} to ${path.normalize('/destDir/someOtherDir/file2.file')}`), + 'should have copied dir1 file2'); + assert( + !runner.stdOutContained(`copying ${path.normalize('/srcDir/someOtherDir2/file1.file')} to ${path.normalize('/destDir/someOtherDir2/file1.file')}`), + 'should not have copied dir2 file1'); + done(); + }); + + it('fails if Contents not set', (done: Mocha.Done) => { + this.timeout(1000); + + let testPath = path.join(__dirname, 'L0failsIfContentsNotSet.js'); + let runner: mocktest.MockTestRunner = new mocktest.MockTestRunner(testPath); + runner.run(); + + assert(runner.failed, 'should have failed'); + assert(runner.createdErrorIssue('Error: Input required: Contents'), 'should have created error issue'); + done(); + }); + + it('fails if SourceFolder not set', (done: Mocha.Done) => { + this.timeout(1000); + + let testPath = path.join(__dirname, 'L0failsIfSourceFolderNotSet.js'); + let runner: mocktest.MockTestRunner = new mocktest.MockTestRunner(testPath); + runner.run(); + + assert(runner.failed, 'should have failed'); + assert(runner.createdErrorIssue('Error: Input required: SourceFolder'), 'should have created error issue'); + done(); + }); + + it('fails if TargetFolder not set', (done: Mocha.Done) => { + this.timeout(1000); + + let testPath = path.join(__dirname, 'L0failsIfTargetFolderNotSet.js'); + let runner: mocktest.MockTestRunner = new mocktest.MockTestRunner(testPath); + runner.run(); + + assert(runner.failed, 'should have failed'); + assert(runner.createdErrorIssue('Error: Input required: TargetFolder'), 'should have created error issue'); + done(); + }); + + it('fails if SourceFolder not found', (done: Mocha.Done) => { + this.timeout(1000); + + let testPath = path.join(__dirname, 'L0failsIfSourceFolderNotFound.js'); + let runner: mocktest.MockTestRunner = new mocktest.MockTestRunner(testPath); + runner.run(); + + assert(runner.failed, 'should have failed'); + assert(runner.createdErrorIssue(`Error: Not found ${path.normalize('/srcDir')}`), 'should have created error issue'); + done(); + }); + + it('fails if target file is a directory', (done: Mocha.Done) => { + this.timeout(1000); + + let testPath = path.join(__dirname, 'L0failsIfTargetFileIsDir.js'); + let runner: mocktest.MockTestRunner = new mocktest.MockTestRunner(testPath); + runner.run(); + + assert(runner.failed, 'should have failed'); + assert(runner.createdErrorIssue(`Error: loc_mock_TargetIsDir ${path.normalize('/srcDir/someOtherDir/file1.file')} ${path.normalize('/destDir/someOtherDir/file1.file')}`), 'should have created error issue'); + done(); + }); + + it('skips if exists', (done: Mocha.Done) => { + this.timeout(1000); + + let testPath = path.join(__dirname, 'L0skipsIfExists.js'); + let runner: mocktest.MockTestRunner = new mocktest.MockTestRunner(testPath); + runner.run(); + + assert( + runner.succeeded, + 'should have succeeded'); + assert( + runner.stdOutContained(`creating path: ${path.normalize('/destDir')}`), + 'should have mkdirP destDir'); + assert( + runner.stdOutContained(`creating path: ${path.normalize('/destDir/someOtherDir')}`), + 'should have mkdirP someOtherDir'); + assert( + !runner.stdOutContained(`copying ${path.normalize('/srcDir/someOtherDir/file1.file')} to ${path.normalize('/destDir/someOtherDir/file1.file')}`), + 'should not have copied file1'); + assert( + runner.stdOutContained(`copying ${path.normalize('/srcDir/someOtherDir/file2.file')} to ${path.normalize('/destDir/someOtherDir/file2.file')}`), + 'should have copied file2'); + done(); + }); + + it('overwrites if specified', (done: Mocha.Done) => { + this.timeout(1000); + + let testPath = path.join(__dirname, 'L0overwritesIfSpecified.js'); + let runner: mocktest.MockTestRunner = new mocktest.MockTestRunner(testPath); + runner.run(); + + assert( + runner.succeeded, + 'should have succeeded'); + assert( + runner.stdOutContained(`creating path: ${path.normalize('/destDir')}`), + 'should have mkdirP destDir'); + assert( + runner.stdOutContained(`creating path: ${path.normalize('/destDir/someOtherDir')}`), + 'should have mkdirP someOtherDir'); + assert( + runner.stdOutContained(`copying ${path.normalize('/srcDir/someOtherDir/file1.file')} to ${path.normalize('/destDir/someOtherDir/file1.file')}`), + 'should have copied file1'); + assert( + runner.stdOutContained(`copying ${path.normalize('/srcDir/someOtherDir/file2.file')} to ${path.normalize('/destDir/someOtherDir/file2.file')}`), + 'should have copied file2'); + done(); + }); + + it('preserves timestamp if specified', (done: Mocha.Done) => { + this.timeout(1000); + + let testPath = path.join(__dirname, 'L0preservesTimestampIfSpecified.js'); + let runner: mocktest.MockTestRunner = new mocktest.MockTestRunner(testPath); + runner.run(); + + assert( + runner.succeeded, + 'should have succeeded'); + assert( + runner.stdOutContained(`Calling fs.utimes on ${path.normalize('/destDir')}`), + 'should have copied timestamp'); + assert( + runner.stdOutContained(`creating path: ${path.normalize('/destDir')}`), + 'should have mkdirP destDir'); + assert( + runner.stdOutContained(`creating path: ${path.normalize('/destDir/someOtherDir')}`), + 'should have mkdirP someOtherDir'); + assert( + runner.stdOutContained(`copying ${path.normalize('/srcDir/someOtherDir/file1.file')} to ${path.normalize('/destDir/someOtherDir/file1.file')}`), + 'should have copied file1'); + assert( + runner.stdOutContained(`copying ${path.normalize('/srcDir/someOtherDir/file2.file')} to ${path.normalize('/destDir/someOtherDir/file2.file')}`), + 'should have copied file2'); + done(); + }); + + it('cleans if specified', (done: Mocha.Done) => { + this.timeout(1000); + + let testPath = path.join(__dirname, 'L0cleansIfSpecified.js'); + let runner: mocktest.MockTestRunner = new mocktest.MockTestRunner(testPath); + runner.run(); + + assert( + runner.succeeded, + 'should have succeeded'); + assert( + runner.stdOutContained(`rmRF ${path.normalize('/destDir/clean-subDir')}`), + 'should have cleaned destDir/clean-subDir'); + assert( + runner.stdOutContained(`rmRF ${path.normalize('/destDir/clean-file.txt')}`), + 'should have cleaned destDir/clean-file.txt'); + assert( + runner.stdOutContained(`creating path: ${path.normalize('/destDir')}`), + 'should have mkdirP destDir'); + assert( + runner.stdOutContained(`creating path: ${path.join('/destDir', 'someOtherDir')}`), + 'should have mkdirP someOtherDir'); + assert( + runner.stdOutContained(`copying ${path.normalize('/srcDir/someOtherDir/file1.file')} to ${path.normalize('/destDir/someOtherDir/file1.file')}`), + 'should have copied file1'); + assert( + runner.stdOutContained(`copying ${path.normalize('/srcDir/someOtherDir/file2.file')} to ${path.normalize('/destDir/someOtherDir/file2.file')}`), + 'should have copied file2'); + done(); + }); + + it("skips cleaning when destination folder doesn't exist", (done: Mocha.Done) => { + this.timeout(1000); + + let testPath = path.join(__dirname, 'L0cleansIfSpecifiedAndDestDoesntExist.js'); + let runner: mocktest.MockTestRunner = new mocktest.MockTestRunner(testPath); + runner.run(); + + // This will fail if stat is called with throwEnoent=true + assert( + runner.succeeded, + 'should have succeeded'); + assert( + !runner.stdOutContained(`rmRF ${path.normalize('/destDir/clean-subDir')}`), + 'should have skipped cleaning non-existent directory'); + assert( + !runner.stdOutContained(`rmRF ${path.normalize('/destDir/clean-file.txt')}`), + 'should have skipped cleaning non-existent directory'); + assert( + runner.stdOutContained(`creating path: ${path.normalize('/destDir')}`), + 'should have mkdirP destDir'); + assert( + runner.stdOutContained(`creating path: ${path.join('/destDir', 'someOtherDir')}`), + 'should have mkdirP someOtherDir'); + assert( + runner.stdOutContained(`copying ${path.normalize('/srcDir/someOtherDir/file1.file')} to ${path.normalize('/destDir/someOtherDir/file1.file')}`), + 'should have copied file1'); + assert( + runner.stdOutContained(`copying ${path.normalize('/srcDir/someOtherDir/file2.file')} to ${path.normalize('/destDir/someOtherDir/file2.file')}`), + 'should have copied file2'); + done(); + }); + + it('cleans if specified and target is file', (done: Mocha.Done) => { + this.timeout(1000); + + let testPath = path.join(__dirname, 'L0cleansIfSpecifiedAndTargetIsFile.js'); + let runner: mocktest.MockTestRunner = new mocktest.MockTestRunner(testPath); + runner.run(); + + assert( + runner.succeeded, + 'should have succeeded'); + assert( + runner.stdOutContained(`rmRF ${path.normalize('/destDir')}`), + 'should have cleaned destDir'); + assert( + runner.stdOutContained(`creating path: ${path.normalize('/destDir')}`), + 'should have mkdirP destDir'); + assert( + runner.stdOutContained(`creating path: ${path.join('/destDir', 'someOtherDir')}`), + 'should have mkdirP someOtherDir'); + assert( + runner.stdOutContained(`copying ${path.normalize('/srcDir/someOtherDir/file1.file')} to ${path.normalize('/destDir/someOtherDir/file1.file')}`), + 'should have copied file1'); + assert( + runner.stdOutContained(`copying ${path.normalize('/srcDir/someOtherDir/file2.file')} to ${path.normalize('/destDir/someOtherDir/file2.file')}`), + 'should have copied file2'); + done(); + }); + + it('roots patterns', (done: Mocha.Done) => { + this.timeout(1000); + + let testPath = path.join(__dirname, 'L0rootsPatterns.js'); + let runner: mocktest.MockTestRunner = new mocktest.MockTestRunner(testPath); + runner.run(); + + assert( + runner.succeeded, + 'should have succeeded'); + assert( + runner.stdOutContained(`copying ${path.normalize('/srcDir/someOtherDir/file1.file')} to ${path.normalize('/destDir/someOtherDir/file1.file')}`), + 'should have copied file1'); + assert( + runner.stdOutContained(`copying ${path.normalize('/srcDir/someOtherDir/file2.file')} to ${path.normalize('/destDir/someOtherDir/file2.file')}`), + 'should have copied file2'); + assert( + runner.stdOutContained(`copying ${path.normalize('/srcDir/someOtherDir2/file2.file')} to ${path.normalize('/destDir/someOtherDir2/file2.file')}`), + 'should have copied file1'); + done(); + }); + + it('ignores errors during target folder creation if ignoreMakeDirErrors is true', (done: Mocha.Done) => { + let testPath = path.join(__dirname, 'L0IgnoresMakeDirError.js'); + let runner: mocktest.MockTestRunner = new mocktest.MockTestRunner(testPath); + runner.run(); + + assert( + runner.succeeded, + 'should have succeeded'); + assert( + runner.stdOutContained(`copying ${path.normalize('/srcDir/someOtherDir/file1.file')} to ${path.normalize('/destDir/someOtherDir/file1.file')}`), + 'should have copied file1'); + + assert( + runner.stdOutContained(`copying ${path.normalize('/srcDir/someOtherDir/file2.file')} to ${path.normalize('/destDir/someOtherDir/file2.file')}`), + 'should have copied file2'); + done(); + }); + + it('fails if there are errors during target folder creation if ignoreMakeDirErrors is false', (done: Mocha.Done) => { + let testPath = path.join(__dirname, 'L0FailsIfThereIsMkdirError.js'); + let runner: mocktest.MockTestRunner = new mocktest.MockTestRunner(testPath); + runner.run(); + + assert( + runner.failed, + 'should have failed'); + done(); + }); + + if (process.platform == 'win32') { + it('overwrites readonly', (done: Mocha.Done) => { + this.timeout(1000); + + let testPath = path.join(__dirname, 'L0overwritesReadonly.js'); + let runner: mocktest.MockTestRunner = new mocktest.MockTestRunner(testPath); + runner.run(); + + assert( + runner.succeeded, + 'should have succeeded'); + assert( + runner.stdOutContained(`creating path: ${path.normalize('/destDir')}`), + 'should have mkdirP destDir'); + assert( + runner.stdOutContained(`creating path: ${path.normalize('/destDir/someOtherDir')}`), + 'should have mkdirP someOtherDir'); + assert( + runner.stdOutContained(`chmodSync ${path.normalize('/destDir/someOtherDir/file1.file')} ${(6 << 6) + (6 << 3) + 6}`), // rw-rw-rw- + 'should have chmod file1'); + assert( + runner.stdOutContained(`copying ${path.normalize('/srcDir/someOtherDir/file1.file')} to ${path.normalize('/destDir/someOtherDir/file1.file')}`), + 'should have copied file1'); + assert( + !runner.stdOutContained(`chmodSync ${path.normalize('/destDir/someOtherDir/file2.file')} ${(6 << 6) + (6 << 3) + 6}`), // rw-rw-rw- + 'should not have chmod file2'); + assert( + runner.stdOutContained(`copying ${path.normalize('/srcDir/someOtherDir/file2.file')} to ${path.normalize('/destDir/someOtherDir/file2.file')}`), + 'should have copied file2'); + done(); + }); + } +}); diff --git a/_generated/CopyFilesV2_Node20/Tests/L0BrokenSymlinksAllowed.ts b/_generated/CopyFilesV2_Node20/Tests/L0BrokenSymlinksAllowed.ts new file mode 100644 index 000000000000..195ea0543da9 --- /dev/null +++ b/_generated/CopyFilesV2_Node20/Tests/L0BrokenSymlinksAllowed.ts @@ -0,0 +1,33 @@ +import fs = require('fs'); +import mockanswer = require('azure-pipelines-task-lib/mock-answer'); +import mockrun = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'copyfiles.js'); +let runner: mockrun.TaskMockRunner = new mockrun.TaskMockRunner(taskPath); +runner.setInput('Contents', '**'); +runner.setInput('SourceFolder', path.normalize('/srcDir')); +runner.setInput('TargetFolder', path.normalize('/destDir')); +runner.setInput('CleanTargetFolder', 'false'); +runner.setInput('Overwrite', 'false'); +let answers = { + checkPath: { }, + find: { }, +}; +answers.checkPath[path.normalize('/srcDir')] = true; +runner.setAnswers(answers); + + +runner.registerMockExport('find', (itemPath: string, options: any) => { + if(!options.allowBrokenSymbolicLinks) { + throw new Error(""); + } + + return ['/srcDir/file1']; +}); + +// as a precaution, disable fs.chmodSync. it should not be called during this scenario. +fs.chmodSync = null; +runner.registerMock('fs', fs); + +runner.run(); diff --git a/_generated/CopyFilesV2_Node20/Tests/L0FailsIfThereIsMkdirError.ts b/_generated/CopyFilesV2_Node20/Tests/L0FailsIfThereIsMkdirError.ts new file mode 100644 index 000000000000..a0b08a051a61 --- /dev/null +++ b/_generated/CopyFilesV2_Node20/Tests/L0FailsIfThereIsMkdirError.ts @@ -0,0 +1,66 @@ +import fs = require('fs'); +import mockanswer = require('azure-pipelines-task-lib/mock-answer'); +import mockrun = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'copyfiles.js'); +let runner: mockrun.TaskMockRunner = new mockrun.TaskMockRunner(taskPath); +runner.setInput('Contents', '**'); +runner.setInput('SourceFolder', path.normalize('/srcDir')); +runner.setInput('TargetFolder', path.normalize('/destDir')); +runner.setInput('CleanTargetFolder', 'false'); +runner.setInput('ignoreMakeDirErrors', 'false'); +runner.setInput('Overwrite', 'false'); +let answers = { + checkPath: { }, + find: { }, +}; +answers.checkPath[path.normalize('/srcDir')] = true; +answers.find[path.normalize('/srcDir')] = [ + path.normalize('/srcDir'), + path.normalize('/srcDir/someOtherDir'), + path.normalize('/srcDir/someOtherDir/file1.file'), + path.normalize('/srcDir/someOtherDir/file2.file'), +]; +runner.setAnswers(answers); + +const fsClone = Object.assign({}, fs); +Object.assign(fsClone, { + existsSync(itemPath: string): boolean { + switch (itemPath) { + case path.normalize('/srcDir/someOtherDir'): + case path.normalize('/srcDir/someOtherDir/file1.file'): + case path.normalize('/srcDir/someOtherDir/file2.file'): + return true; + default: + return false; + } + }, + statSync(itemPath: string): fs.Stats { + const itemStats: fs.Stats = new fs.Stats(); + switch (itemPath) { + case path.normalize('/srcDir/someOtherDir'): + itemStats.isDirectory = () => true; + break; + case path.normalize('/srcDir/someOtherDir/file1.file'): + case path.normalize('/srcDir/someOtherDir/file2.file'): + itemStats.isDirectory = () => false; + break; + default: + throw { code: 'ENOENT' }; + } + return itemStats; + }, + // as a precaution, disable fs.chmodSync. it should not be called during this scenario. + chmodSync(p: fs.PathLike, mode: fs.Mode): void {} +}); + +runner.registerMockExport('mkdirP', (p: string) => { + console.log(`mkdirP: ${p}`); + + throw "Error during creation of target folder." +}); + +runner.registerMock('fs', fsClone); + +runner.run(); diff --git a/_generated/CopyFilesV2_Node20/Tests/L0IgnoresMakeDirError.ts b/_generated/CopyFilesV2_Node20/Tests/L0IgnoresMakeDirError.ts new file mode 100644 index 000000000000..7d2126885308 --- /dev/null +++ b/_generated/CopyFilesV2_Node20/Tests/L0IgnoresMakeDirError.ts @@ -0,0 +1,66 @@ +import fs = require('fs'); +import mockanswer = require('azure-pipelines-task-lib/mock-answer'); +import mockrun = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'copyfiles.js'); +let runner: mockrun.TaskMockRunner = new mockrun.TaskMockRunner(taskPath); +runner.setInput('Contents', '**'); +runner.setInput('SourceFolder', path.normalize('/srcDir')); +runner.setInput('TargetFolder', path.normalize('/destDir')); +runner.setInput('CleanTargetFolder', 'false'); +runner.setInput('ignoreMakeDirErrors', 'true'); +runner.setInput('Overwrite', 'false'); +let answers = { + checkPath: { }, + find: { }, +}; +answers.checkPath[path.normalize('/srcDir')] = true; +answers.find[path.normalize('/srcDir')] = [ + path.normalize('/srcDir'), + path.normalize('/srcDir/someOtherDir'), + path.normalize('/srcDir/someOtherDir/file1.file'), + path.normalize('/srcDir/someOtherDir/file2.file'), +]; +runner.setAnswers(answers); + +const fsClone = Object.assign({}, fs); +Object.assign(fsClone, { + existsSync(itemPath: string): boolean { + switch (itemPath) { + case path.normalize('/srcDir/someOtherDir'): + case path.normalize('/srcDir/someOtherDir/file1.file'): + case path.normalize('/srcDir/someOtherDir/file2.file'): + return true; + default: + return false; + } + }, + statSync(itemPath: string): fs.Stats { + const itemStats: fs.Stats = new fs.Stats(); + switch (itemPath) { + case path.normalize('/srcDir/someOtherDir'): + itemStats.isDirectory = () => true; + break; + case path.normalize('/srcDir/someOtherDir/file1.file'): + case path.normalize('/srcDir/someOtherDir/file2.file'): + itemStats.isDirectory = () => false; + break; + default: + throw { code: 'ENOENT' }; + } + return itemStats; + }, + // as a precaution, disable fs.chmodSync. it should not be called during this scenario. + chmodSync(p: fs.PathLike, mode: fs.Mode): void {} +}); + +runner.registerMockExport('mkdirP', (p: string) => { + console.log(`mkdirP: ${p}`); + + throw "Error during creation of target folder." +}); + +runner.registerMock('fs', fsClone); + +runner.run(); diff --git a/_generated/CopyFilesV2_Node20/Tests/L0cleansIfSpecified.ts b/_generated/CopyFilesV2_Node20/Tests/L0cleansIfSpecified.ts new file mode 100644 index 000000000000..7ae840d3ddb7 --- /dev/null +++ b/_generated/CopyFilesV2_Node20/Tests/L0cleansIfSpecified.ts @@ -0,0 +1,79 @@ +import fs = require('fs'); +import mockanswer = require('azure-pipelines-task-lib/mock-answer'); +import mockrun = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'copyfiles.js'); +let runner: mockrun.TaskMockRunner = new mockrun.TaskMockRunner(taskPath); +runner.setInput('Contents', '**'); +runner.setInput('SourceFolder', path.normalize('/srcDir')); +runner.setInput('TargetFolder', path.normalize('/destDir')); +runner.setInput('CleanTargetFolder', 'true'); +runner.setInput('Overwrite', 'false'); +let answers = { + checkPath: { }, + find: { }, + rmRF: { }, +}; +answers.checkPath[path.normalize('/srcDir')] = true; +answers.find[path.normalize('/srcDir')] = [ + path.normalize('/srcDir'), + path.normalize('/srcDir/someOtherDir'), + path.normalize('/srcDir/someOtherDir/file1.file'), + path.normalize('/srcDir/someOtherDir/file2.file'), +]; +answers.rmRF[path.join(path.normalize('/destDir/clean-subDir'))] = { success: true }; +answers.rmRF[path.join(path.normalize('/destDir/clean-file.txt'))] = { success: true }; +runner.setAnswers(answers); + +let origReaddirSync = fs.readdirSync; +const fsClone = Object.assign({}, fs); +Object.assign(fsClone, { + existsSync(itemPath: string): boolean { + switch (itemPath) { + case path.normalize('/destDir'): + case path.normalize('/srcDir'): + case path.normalize('/srcDir/someOtherDir'): + case path.normalize('/srcDir/someOtherDir/file1.file'): + case path.normalize('/srcDir/someOtherDir/file2.file'): + return true; + default: + return false; + } + }, + statSync(itemPath: string): fs.Stats { + const itemStats: fs.Stats = new fs.Stats(); + switch (itemPath) { + case path.normalize('/destDir'): + case path.normalize('/srcDir'): + case path.normalize('/srcDir/someOtherDir'): + itemStats.isDirectory = () => true; + break; + case path.normalize('/srcDir/someOtherDir/file1.file'): + case path.normalize('/srcDir/someOtherDir/file2.file'): + itemStats.isDirectory = () => false; + break; + default: + throw { code: 'ENOENT' }; + } + return itemStats; + }, + readdirSync(p: fs.PathLike, o?: any): string[] { + console.log('HERE path ' + p); + let result: string[]; + if (p == path.normalize('/destDir')) { + result = [ 'clean-subDir', 'clean-file.txt' ]; + } + else { + result = origReaddirSync(p); + } + + return result; + }, + // as a precaution, disable fs.chmodSync. it should not be called during this scenario. + chmodSync(p: fs.PathLike, mode: fs.Mode): void {} +}); + +runner.registerMock('fs', fsClone); + +runner.run(); diff --git a/_generated/CopyFilesV2_Node20/Tests/L0cleansIfSpecifiedAndDestDoesntExist.ts b/_generated/CopyFilesV2_Node20/Tests/L0cleansIfSpecifiedAndDestDoesntExist.ts new file mode 100644 index 000000000000..6f82a706ee7d --- /dev/null +++ b/_generated/CopyFilesV2_Node20/Tests/L0cleansIfSpecifiedAndDestDoesntExist.ts @@ -0,0 +1,70 @@ +import fs = require('fs'); +import mockanswer = require('azure-pipelines-task-lib/mock-answer'); +import mockrun = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'copyfiles.js'); +let runner: mockrun.TaskMockRunner = new mockrun.TaskMockRunner(taskPath); +runner.setInput('Contents', '**'); +runner.setInput('SourceFolder', path.normalize('/srcDir')); +runner.setInput('TargetFolder', path.normalize('/destDir')); +runner.setInput('CleanTargetFolder', 'true'); +runner.setInput('Overwrite', 'false'); +let answers = { + checkPath: { }, + find: { }, + rmRF: { }, +}; +answers.checkPath[path.normalize('/srcDir')] = true; +answers.find[path.normalize('/srcDir')] = [ + path.normalize('/srcDir'), + path.normalize('/srcDir/someOtherDir'), + path.normalize('/srcDir/someOtherDir/file1.file'), + path.normalize('/srcDir/someOtherDir/file2.file'), +]; +answers.rmRF[path.join(path.normalize('/destDir/clean-subDir'))] = { success: true }; +answers.rmRF[path.join(path.normalize('/destDir/clean-file.txt'))] = { success: true }; +runner.setAnswers(answers); + +let origReaddirSync = fs.readdirSync; +const fsClone = Object.assign({}, fs); +Object.assign(fsClone, { + existsSync(itemPath: string): boolean { + switch (itemPath) { + case path.normalize('/srcDir'): + case path.normalize('/srcDir/someOtherDir'): + case path.normalize('/srcDir/someOtherDir/file1.file'): + case path.normalize('/srcDir/someOtherDir/file2.file'): + return true; + default: + return false; + } + }, + statSync(itemPath: string): fs.Stats { + const itemStats: fs.Stats = new fs.Stats(); + switch (itemPath) { + case path.normalize('/srcDir'): + case path.normalize('/srcDir/someOtherDir'): + itemStats.isDirectory = () => true; + break; + case path.normalize('/srcDir/someOtherDir/file1.file'): + case path.normalize('/srcDir/someOtherDir/file2.file'): + itemStats.isDirectory = () => false; + break; + default: + throw { code: 'ENOENT' }; + } + return itemStats; + }, + readdirSync(p: fs.PathLike, o?: any): any { + console.log('HERE path ' + p); + let result = origReaddirSync(p); + return result; + }, + // as a precaution, disable fs.chmodSync. it should not be called during this scenario. + chmodSync(p: fs.PathLike, mode: fs.Mode): void {} +}); + +runner.registerMock('fs', fsClone); + +runner.run(); diff --git a/_generated/CopyFilesV2_Node20/Tests/L0cleansIfSpecifiedAndTargetIsFile.ts b/_generated/CopyFilesV2_Node20/Tests/L0cleansIfSpecifiedAndTargetIsFile.ts new file mode 100644 index 000000000000..b4ceec7035ce --- /dev/null +++ b/_generated/CopyFilesV2_Node20/Tests/L0cleansIfSpecifiedAndTargetIsFile.ts @@ -0,0 +1,65 @@ +import fs = require('fs'); +import mockanswer = require('azure-pipelines-task-lib/mock-answer'); +import mockrun = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'copyfiles.js'); +let runner: mockrun.TaskMockRunner = new mockrun.TaskMockRunner(taskPath); +runner.setInput('Contents', '**'); +runner.setInput('SourceFolder', path.normalize('/srcDir')); +runner.setInput('TargetFolder', path.normalize('/destDir')); +runner.setInput('CleanTargetFolder', 'true'); +runner.setInput('Overwrite', 'false'); +let answers = { + checkPath: { }, + find: { }, + rmRF: { }, +}; +answers.checkPath[path.normalize('/srcDir')] = true; +answers.find[path.normalize('/srcDir')] = [ + path.normalize('/srcDir'), + path.normalize('/srcDir/someOtherDir'), + path.normalize('/srcDir/someOtherDir/file1.file'), + path.normalize('/srcDir/someOtherDir/file2.file'), +]; +answers.rmRF[path.join(path.normalize('/destDir'))] = { success: true }; +runner.setAnswers(answers); + +const fsClone = Object.assign({}, fs); +Object.assign(fsClone, { + existsSync(itemPath: string): boolean { + switch (itemPath) { + case path.normalize('/srcDir'): + case path.normalize('/srcDir/someOtherDir'): + case path.normalize('/destDir'): + case path.normalize('/srcDir/someOtherDir/file1.file'): + case path.normalize('/srcDir/someOtherDir/file2.file'): + return true; + default: + return false; + } + }, + statSync(itemPath: string): fs.Stats { + const itemStats: fs.Stats = new fs.Stats(); + switch (itemPath) { + case path.normalize('/srcDir'): + case path.normalize('/srcDir/someOtherDir'): + itemStats.isDirectory = () => true; + break; + case path.normalize('/destDir'): + case path.normalize('/srcDir/someOtherDir/file1.file'): + case path.normalize('/srcDir/someOtherDir/file2.file'): + itemStats.isDirectory = () => false; + break; + default: + throw { code: 'ENOENT' }; + } + return itemStats; + }, + // as a precaution, disable fs.chmodSync. it should not be called during this scenario. + chmodSync(p: fs.PathLike, mode: fs.Mode): void {} +}); + +runner.registerMock('fs', fsClone); + +runner.run(); diff --git a/_generated/CopyFilesV2_Node20/Tests/L0copyAllFiles.ts b/_generated/CopyFilesV2_Node20/Tests/L0copyAllFiles.ts new file mode 100644 index 000000000000..91f0a616be97 --- /dev/null +++ b/_generated/CopyFilesV2_Node20/Tests/L0copyAllFiles.ts @@ -0,0 +1,75 @@ +import fs = require('fs'); +import mockanswer = require('azure-pipelines-task-lib/mock-answer'); +import mockrun = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'copyfiles.js'); +let runner: mockrun.TaskMockRunner = new mockrun.TaskMockRunner(taskPath); +runner.setInput('Contents', '**'); +runner.setInput('SourceFolder', path.normalize('/srcDir')); +runner.setInput('TargetFolder', path.normalize('/destDir')); +runner.setInput('CleanTargetFolder', 'false'); +runner.setInput('Overwrite', 'false'); +let answers = { + checkPath: { }, + find: { }, +}; +answers.checkPath[path.normalize('/srcDir')] = true; +answers.find[path.normalize('/srcDir')] = [ + path.normalize('/srcDir'), + path.normalize('/srcDir/someOtherDir'), + path.normalize('/srcDir/someOtherDir/file1.file'), + path.normalize('/srcDir/someOtherDir/file2.file'), + path.normalize('/srcDir/someOtherDir2'), + path.normalize('/srcDir/someOtherDir2/file1.file'), + path.normalize('/srcDir/someOtherDir2/file2.file'), + path.normalize('/srcDir/someOtherDir2/file3.file'), + path.normalize('/srcDir/someOtherDir3'), +]; +runner.setAnswers(answers); + +const fsClone = Object.assign({}, fs); +Object.assign(fsClone, { + existsSync(itemPath: string): boolean { + switch (itemPath) { + case path.normalize('/srcDir'): + case path.normalize('/srcDir/someOtherDir'): + case path.normalize('/srcDir/someOtherDir/file1.file'): + case path.normalize('/srcDir/someOtherDir/file2.file'): + case path.normalize('/srcDir/someOtherDir2'): + case path.normalize('/srcDir/someOtherDir2/file1.file'): + case path.normalize('/srcDir/someOtherDir2/file2.file'): + case path.normalize('/srcDir/someOtherDir2/file3.file'): + case path.normalize('/srcDir/someOtherDir3'): + return true; + default: + return false; + } + }, + statSync(itemPath: string): fs.Stats { + const itemStats: fs.Stats = new fs.Stats(); + switch (itemPath) { + case path.normalize('/srcDir/someOtherDir'): + case path.normalize('/srcDir/someOtherDir2'): + case path.normalize('/srcDir/someOtherDir3'): + itemStats.isDirectory = () => true; + break; + case path.normalize('/srcDir/someOtherDir/file1.file'): + case path.normalize('/srcDir/someOtherDir/file2.file'): + case path.normalize('/srcDir/someOtherDir2/file1.file'): + case path.normalize('/srcDir/someOtherDir2/file2.file'): + case path.normalize('/srcDir/someOtherDir2/file3.file'): + itemStats.isDirectory = () => false; + break; + default: + throw { code: 'ENOENT' }; + } + return itemStats; + }, + // as a precaution, disable fs.chmodSync. it should not be called during this scenario. + chmodSync(p: fs.PathLike, mode: fs.Mode): void {} +}); + +runner.registerMock('fs', fsClone); + +runner.run(); diff --git a/_generated/CopyFilesV2_Node20/Tests/L0copyAllFilesWithBracketsInSrcPath.ts b/_generated/CopyFilesV2_Node20/Tests/L0copyAllFilesWithBracketsInSrcPath.ts new file mode 100644 index 000000000000..3ef5cf93c1ce --- /dev/null +++ b/_generated/CopyFilesV2_Node20/Tests/L0copyAllFilesWithBracketsInSrcPath.ts @@ -0,0 +1,74 @@ +import fs = require('fs'); +import mockanswer = require('azure-pipelines-task-lib/mock-answer'); +import mockrun = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'copyfiles.js'); +let runner: mockrun.TaskMockRunner = new mockrun.TaskMockRunner(taskPath); +runner.setInput('Contents', '**'); +runner.setInput('SourceFolder', path.normalize('/srcDir [bracket]')); +runner.setInput('TargetFolder', path.normalize('/destDir')); +runner.setInput('CleanTargetFolder', 'false'); +runner.setInput('Overwrite', 'false'); +let answers = { + checkPath: { }, + find: { }, +}; +answers.checkPath[path.normalize('/srcDir [bracket]')] = true; +answers.find[path.normalize('/srcDir [bracket]')] = [ + path.normalize('/srcDir [bracket]'), + path.normalize('/srcDir [bracket]/someOtherDir'), + path.normalize('/srcDir [bracket]/someOtherDir/file1.file'), + path.normalize('/srcDir [bracket]/someOtherDir/file2.file'), + path.normalize('/srcDir [bracket]/someOtherDir2'), + path.normalize('/srcDir [bracket]/someOtherDir2/file1.file'), + path.normalize('/srcDir [bracket]/someOtherDir2/file2.file'), + path.normalize('/srcDir [bracket]/someOtherDir2/file3.file'), + path.normalize('/srcDir [bracket]/someOtherDir3'), +]; +runner.setAnswers(answers); + +const fsClone = Object.assign({}, fs); +Object.assign(fsClone, { + existsSync(itemPath: string): boolean { + switch (itemPath) { + case path.normalize('/srcDir [bracket]/someOtherDir'): + case path.normalize('/srcDir [bracket]/someOtherDir2'): + case path.normalize('/srcDir [bracket]/someOtherDir3'): + case path.normalize('/srcDir [bracket]/someOtherDir/file1.file'): + case path.normalize('/srcDir [bracket]/someOtherDir/file2.file'): + case path.normalize('/srcDir [bracket]/someOtherDir2/file1.file'): + case path.normalize('/srcDir [bracket]/someOtherDir2/file2.file'): + case path.normalize('/srcDir [bracket]/someOtherDir2/file3.file'): + return true; + default: + return false; + } + }, + statSync(itemPath: string): fs.Stats { + const itemStats: fs.Stats = new fs.Stats(); + switch (itemPath) { + case path.normalize('/srcDir [bracket]/someOtherDir'): + case path.normalize('/srcDir [bracket]/someOtherDir2'): + case path.normalize('/srcDir [bracket]/someOtherDir3'): + itemStats.isDirectory = () => true; + break; + case path.normalize('/srcDir [bracket]/someOtherDir/file1.file'): + case path.normalize('/srcDir [bracket]/someOtherDir/file2.file'): + case path.normalize('/srcDir [bracket]/someOtherDir2/file1.file'): + case path.normalize('/srcDir [bracket]/someOtherDir2/file2.file'): + case path.normalize('/srcDir [bracket]/someOtherDir2/file3.file'): + itemStats.isDirectory = () => false; + break; + default: + throw { code: 'ENOENT' }; + } + return itemStats; + }, + // as a precaution, disable fs.chmodSync. it should not be called during this scenario. + chmodSync(p: fs.PathLike, mode: fs.Mode): void {} +}); + +runner.registerMock('fs', fsClone); + +runner.run(); diff --git a/_generated/CopyFilesV2_Node20/Tests/L0copySubtractExclude.ts b/_generated/CopyFilesV2_Node20/Tests/L0copySubtractExclude.ts new file mode 100644 index 000000000000..7a87c776beca --- /dev/null +++ b/_generated/CopyFilesV2_Node20/Tests/L0copySubtractExclude.ts @@ -0,0 +1,75 @@ +import fs = require('fs'); +import mockanswer = require('azure-pipelines-task-lib/mock-answer'); +import mockrun = require('azure-pipelines-task-lib/mock-run'); +import os = require('os'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'copyfiles.js'); +let runner: mockrun.TaskMockRunner = new mockrun.TaskMockRunner(taskPath); +runner.setInput('Contents', '**\n!**/someOtherDir2/**'); +runner.setInput('SourceFolder', path.normalize('/srcDir')); +runner.setInput('TargetFolder', path.normalize('/destDir')); +runner.setInput('CleanTargetFolder', 'false'); +runner.setInput('Overwrite', 'false'); +let answers = { + checkPath: { }, + find: { }, +}; +answers.checkPath[path.normalize('/srcDir')] = true; +answers.find[path.normalize('/srcDir')] = [ + path.normalize('/srcDir'), + path.normalize('/srcDir/someOtherDir'), + path.normalize('/srcDir/someOtherDir/file1.file'), + path.normalize('/srcDir/someOtherDir/file2.file'), + path.normalize('/srcDir/someOtherDir2'), + path.normalize('/srcDir/someOtherDir2/file1.file'), + path.normalize('/srcDir/someOtherDir2/file2.file'), + path.normalize('/srcDir/someOtherDir2/file3.file'), + path.normalize('/srcDir/someOtherDir3'), +]; +runner.setAnswers(answers); + +const fsClone = Object.assign({}, fs); +Object.assign(fsClone, { + existsSync(itemPath: string): boolean { + switch (itemPath) { + case path.normalize('/srcDir/someOtherDir'): + case path.normalize('/srcDir/someOtherDir2'): + case path.normalize('/srcDir/someOtherDir3'): + case path.normalize('/srcDir/someOtherDir/file1.file'): + case path.normalize('/srcDir/someOtherDir/file2.file'): + case path.normalize('/srcDir/someOtherDir2/file1.file'): + case path.normalize('/srcDir/someOtherDir2/file2.file'): + case path.normalize('/srcDir/someOtherDir2/file3.file'): + return true; + default: + return false; + } + }, + statSync(itemPath: string): fs.Stats { + const itemStats: fs.Stats = new fs.Stats(); + switch (itemPath) { + case path.normalize('/srcDir/someOtherDir'): + case path.normalize('/srcDir/someOtherDir2'): + case path.normalize('/srcDir/someOtherDir3'): + itemStats.isDirectory = () => true; + break; + case path.normalize('/srcDir/someOtherDir/file1.file'): + case path.normalize('/srcDir/someOtherDir/file2.file'): + case path.normalize('/srcDir/someOtherDir2/file1.file'): + case path.normalize('/srcDir/someOtherDir2/file2.file'): + case path.normalize('/srcDir/someOtherDir2/file3.file'): + itemStats.isDirectory = () => false; + break; + default: + throw { code: 'ENOENT' }; + } + return itemStats; + }, + // as a precaution, disable fs.chmodSync. it should not be called during this scenario. + chmodSync(p: fs.PathLike, mode: fs.Mode): void {} +}); + +runner.registerMock('fs', fsClone); + +runner.run(); diff --git a/_generated/CopyFilesV2_Node20/Tests/L0failsIfContentsNotSet.ts b/_generated/CopyFilesV2_Node20/Tests/L0failsIfContentsNotSet.ts new file mode 100644 index 000000000000..42705b62ac41 --- /dev/null +++ b/_generated/CopyFilesV2_Node20/Tests/L0failsIfContentsNotSet.ts @@ -0,0 +1,22 @@ +import fs = require('fs'); +import mockanswer = require('azure-pipelines-task-lib/mock-answer'); +import mockrun = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'copyfiles.js'); +let runner: mockrun.TaskMockRunner = new mockrun.TaskMockRunner(taskPath); +runner.setInput('SourceFolder', path.normalize('/srcDir')); +runner.setInput('TargetFolder', path.normalize('/destDir)')); +runner.setInput('CleanTargetFolder', 'false'); +runner.setInput('Overwrite', 'false'); +let answers = { + checkPath: { }, +}; +answers.checkPath[path.normalize('/srcDir')] = true; +runner.setAnswers(answers); + +// as a precaution, disable fs.chmodSync. it should not be called during this scenario. +fs.chmodSync = null; +runner.registerMock('fs', fs); + +runner.run(); diff --git a/_generated/CopyFilesV2_Node20/Tests/L0failsIfSourceFolderNotFound.ts b/_generated/CopyFilesV2_Node20/Tests/L0failsIfSourceFolderNotFound.ts new file mode 100644 index 000000000000..218163b8fbca --- /dev/null +++ b/_generated/CopyFilesV2_Node20/Tests/L0failsIfSourceFolderNotFound.ts @@ -0,0 +1,23 @@ +import fs = require('fs'); +import mockanswer = require('azure-pipelines-task-lib/mock-answer'); +import mockrun = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'copyfiles.js'); +let runner: mockrun.TaskMockRunner = new mockrun.TaskMockRunner(taskPath); +runner.setInput('Contents', '**'); +runner.setInput('SourceFolder', path.normalize('/srcDir')); +runner.setInput('TargetFolder', path.normalize('/destDir')); +runner.setInput('CleanTargetFolder', 'false'); +runner.setInput('Overwrite', 'false'); +let answers = { + checkPath: { }, +}; +answers.checkPath[path.normalize('/srcDir')] = false; +runner.setAnswers(answers); + +// as a precaution, disable fs.chmodSync. it should not be called during this scenario. +fs.chmodSync = null; +runner.registerMock('fs', fs); + +runner.run(); diff --git a/_generated/CopyFilesV2_Node20/Tests/L0failsIfSourceFolderNotSet.ts b/_generated/CopyFilesV2_Node20/Tests/L0failsIfSourceFolderNotSet.ts new file mode 100644 index 000000000000..78d7d7e2a493 --- /dev/null +++ b/_generated/CopyFilesV2_Node20/Tests/L0failsIfSourceFolderNotSet.ts @@ -0,0 +1,17 @@ +import fs = require('fs'); +import mockanswer = require('azure-pipelines-task-lib/mock-answer'); +import mockrun = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'copyfiles.js'); +let runner: mockrun.TaskMockRunner = new mockrun.TaskMockRunner(taskPath); +runner.setInput('Contents', '**'); +runner.setInput('TargetFolder', path.normalize('/destDir')); +runner.setInput('CleanTargetFolder', 'false'); +runner.setInput('Overwrite', 'false'); + +// as a precaution, disable fs.chmodSync. it should not be called during this scenario. +fs.chmodSync = null; +runner.registerMock('fs', fs); + +runner.run(); diff --git a/_generated/CopyFilesV2_Node20/Tests/L0failsIfTargetFileIsDir.ts b/_generated/CopyFilesV2_Node20/Tests/L0failsIfTargetFileIsDir.ts new file mode 100644 index 000000000000..70b773bd1fb7 --- /dev/null +++ b/_generated/CopyFilesV2_Node20/Tests/L0failsIfTargetFileIsDir.ts @@ -0,0 +1,61 @@ +import fs = require('fs'); +import mockanswer = require('azure-pipelines-task-lib/mock-answer'); +import mockrun = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'copyfiles.js'); +let runner: mockrun.TaskMockRunner = new mockrun.TaskMockRunner(taskPath); +runner.setInput('Contents', '**'); +runner.setInput('SourceFolder', path.normalize('/srcDir')); +runner.setInput('TargetFolder', path.normalize('/destDir')); +runner.setInput('CleanTargetFolder', 'false'); +runner.setInput('Overwrite', 'false'); +let answers = { + checkPath: { }, + find: { }, +}; +answers.checkPath[path.normalize('/srcDir')] = true; +answers.find[path.normalize('/srcDir')] = [ + path.normalize('/srcDir'), + path.normalize('/srcDir/someOtherDir'), + path.normalize('/srcDir/someOtherDir/file1.file'), + path.normalize('/srcDir/someOtherDir/file2.file'), +]; +runner.setAnswers(answers); + +const fsClone = Object.assign({}, fs); +Object.assign(fsClone, { + existsSync(itemPath: string): boolean { + switch (itemPath) { + case path.normalize('/srcDir/someOtherDir'): + case path.normalize('/destDir/someOtherDir/file1.file'): + case path.normalize('/srcDir/someOtherDir/file1.file'): + case path.normalize('/srcDir/someOtherDir/file2.file'): + return true; + default: + return false; + } + }, + statSync(itemPath: string): fs.Stats { + const itemStats: fs.Stats = new fs.Stats(); + switch (itemPath) { + case path.normalize('/srcDir/someOtherDir'): + case path.normalize('/destDir/someOtherDir/file1.file'): + itemStats.isDirectory = () => true; + break; + case path.normalize('/srcDir/someOtherDir/file1.file'): + case path.normalize('/srcDir/someOtherDir/file2.file'): + itemStats.isDirectory = () => false; + break; + default: + throw { code: 'ENOENT' }; + } + return itemStats; + }, + // as a precaution, disable fs.chmodSync. it should not be called during this scenario. + chmodSync(p: fs.PathLike, mode: fs.Mode): void {} +}); + +runner.registerMock('fs', fsClone); + +runner.run(); diff --git a/_generated/CopyFilesV2_Node20/Tests/L0failsIfTargetFolderNotSet.ts b/_generated/CopyFilesV2_Node20/Tests/L0failsIfTargetFolderNotSet.ts new file mode 100644 index 000000000000..32828282e4d6 --- /dev/null +++ b/_generated/CopyFilesV2_Node20/Tests/L0failsIfTargetFolderNotSet.ts @@ -0,0 +1,22 @@ +import fs = require('fs'); +import mockanswer = require('azure-pipelines-task-lib/mock-answer'); +import mockrun = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'copyfiles.js'); +let runner: mockrun.TaskMockRunner = new mockrun.TaskMockRunner(taskPath); +runner.setInput('Contents', '**'); +runner.setInput('SourceFolder', path.normalize('/srcDir')); +runner.setInput('CleanTargetFolder', 'false'); +runner.setInput('Overwrite', 'false'); +let answers = { + checkPath: { }, +}; +answers.checkPath[path.normalize('/srcDir')] = true; +runner.setAnswers(answers); + +// as a precaution, disable fs.chmodSync. it should not be called during this scenario. +fs.chmodSync = null; +runner.registerMock('fs', fs); + +runner.run(); diff --git a/_generated/CopyFilesV2_Node20/Tests/L0overwritesIfSpecified.ts b/_generated/CopyFilesV2_Node20/Tests/L0overwritesIfSpecified.ts new file mode 100644 index 000000000000..a5b6381e74f1 --- /dev/null +++ b/_generated/CopyFilesV2_Node20/Tests/L0overwritesIfSpecified.ts @@ -0,0 +1,66 @@ +import fs = require('fs'); +import mockanswer = require('azure-pipelines-task-lib/mock-answer'); +import mockrun = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'copyfiles.js'); +let runner: mockrun.TaskMockRunner = new mockrun.TaskMockRunner(taskPath); +runner.setInput('Contents', '**'); +runner.setInput('SourceFolder', path.normalize('/srcDir')); +runner.setInput('TargetFolder', path.normalize('/destDir')); +runner.setInput('CleanTargetFolder', 'false'); +runner.setInput('Overwrite', 'true'); +let answers = { + checkPath: { }, + find: { }, +}; +answers.checkPath[path.normalize('/srcDir')] = true; +answers.find[path.normalize('/srcDir')] = [ + path.normalize('/srcDir'), + path.normalize('/srcDir/someOtherDir'), + path.normalize('/srcDir/someOtherDir/file1.file'), + path.normalize('/srcDir/someOtherDir/file2.file'), +]; +runner.setAnswers(answers); + +const fsClone = Object.assign({}, fs); +Object.assign(fsClone, { + existsSync(itemPath: string): boolean { + switch (itemPath) { + case path.normalize('/srcDir/someOtherDir'): + case path.normalize('/destDir/someOtherDir'): + case path.normalize('/srcDir/someOtherDir/file1.file'): + case path.normalize('/srcDir/someOtherDir/file2.file'): + case path.normalize('/destDir/someOtherDir/file1.file'): + return true; + default: + return false; + } + }, + statSync(itemPath: string): fs.Stats { + const itemStats: fs.Stats = new fs.Stats(); + switch (itemPath) { + case path.normalize('/srcDir/someOtherDir'): + case path.normalize('/destDir/someOtherDir'): + itemStats.isDirectory = () => true; + break; + case path.normalize('/srcDir/someOtherDir/file1.file'): + case path.normalize('/srcDir/someOtherDir/file2.file'): + itemStats.isDirectory = () => false; + break; + case path.normalize('/destDir/someOtherDir/file1.file'): + itemStats.isDirectory = () => false; + itemStats.mode = (6 << 6) + (6 << 3) + 6; // rw-rw-rw- + break; + default: + throw { code: 'ENOENT' }; + } + return itemStats; + }, + // as a precaution, disable fs.chmodSync. it should not be called during this scenario. + chmodSync(p: fs.PathLike, mode: fs.Mode): void {} +}); + +runner.registerMock('fs', fsClone); + +runner.run(); diff --git a/_generated/CopyFilesV2_Node20/Tests/L0overwritesReadonly.ts b/_generated/CopyFilesV2_Node20/Tests/L0overwritesReadonly.ts new file mode 100644 index 000000000000..7e6a517a114f --- /dev/null +++ b/_generated/CopyFilesV2_Node20/Tests/L0overwritesReadonly.ts @@ -0,0 +1,71 @@ +import fs = require('fs'); +import mockanswer = require('azure-pipelines-task-lib/mock-answer'); +import mockrun = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'copyfiles.js'); +let runner: mockrun.TaskMockRunner = new mockrun.TaskMockRunner(taskPath); +runner.setInput('Contents', '**'); +runner.setInput('SourceFolder', path.normalize('/srcDir')); +runner.setInput('TargetFolder', path.normalize('/destDir')); +runner.setInput('CleanTargetFolder', 'false'); +runner.setInput('Overwrite', 'true'); +let answers = { + checkPath: { }, + find: { }, +}; +answers.checkPath[path.normalize('/srcDir')] = true; +answers.find[path.normalize('/srcDir')] = [ + path.normalize('/srcDir'), + path.normalize('/srcDir/someOtherDir'), + path.normalize('/srcDir/someOtherDir/file1.file'), + path.normalize('/srcDir/someOtherDir/file2.file'), +]; +runner.setAnswers(answers); + +const fsClone = Object.assign({}, fs); +Object.assign(fsClone, { + existsSync(itemPath: string): boolean { + switch (itemPath) { + case path.normalize('/srcDir/someOtherDir'): + case path.normalize('/destDir/someOtherDir'): + case path.normalize('/srcDir/someOtherDir/file1.file'): + case path.normalize('/srcDir/someOtherDir/file2.file'): + case path.normalize('/destDir/someOtherDir/file1.file'): + return true; + default: + return false; + } + }, + statSync(itemPath: string): fs.Stats { + const itemStats: fs.Stats = new fs.Stats(); + switch (itemPath) { + case path.normalize('/srcDir/someOtherDir'): + case path.normalize('/destDir/someOtherDir'): + itemStats.isDirectory = () => true; + break; + case path.normalize('/srcDir/someOtherDir/file1.file'): + case path.normalize('/srcDir/someOtherDir/file2.file'): + itemStats.isDirectory = () => false; + break; + case path.normalize('/destDir/someOtherDir/file1.file'): + itemStats.isDirectory = () => false; + itemStats.mode = (4 << 6) + (4 << 3) + 4; // r--r--r-- + break; + default: + throw { code: 'ENOENT' }; + } + return itemStats; + }, + // as a precaution, disable fs.chmodSync. it should not be called during this scenario. + chmodSync(p: fs.PathLike, mode: fs.Mode): void {} +}); + +// override fs.chmodSync +(fsClone as any).chmodSync = (path: string, mode: number) => { + console.log(`##vso[task.debug]chmodSync ${path} ${mode}`); +}; + +runner.registerMock('fs', fsClone); + +runner.run(); diff --git a/_generated/CopyFilesV2_Node20/Tests/L0preservesTimestampIfSpecified.ts b/_generated/CopyFilesV2_Node20/Tests/L0preservesTimestampIfSpecified.ts new file mode 100644 index 000000000000..5a78ad8f43b6 --- /dev/null +++ b/_generated/CopyFilesV2_Node20/Tests/L0preservesTimestampIfSpecified.ts @@ -0,0 +1,78 @@ +import fs = require('fs'); +import mockanswer = require('azure-pipelines-task-lib/mock-answer'); +import mockrun = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +const { promisify } = require('util'); + +let taskPath = path.join(__dirname, '..', 'copyfiles.js'); +let runner: mockrun.TaskMockRunner = new mockrun.TaskMockRunner(taskPath); +runner.setInput('Contents', '**'); +runner.setInput('SourceFolder', path.normalize('/srcDir')); +runner.setInput('TargetFolder', path.normalize('/destDir')); +runner.setInput('CleanTargetFolder', 'false'); +runner.setInput('Overwrite', 'false'); +runner.setInput('preserveTimestamp', 'true'); +let answers = { + checkPath: {}, + find: {}, +}; +answers.checkPath[path.normalize('/srcDir')] = true; +answers.find[path.normalize('/srcDir')] = [ + path.normalize('/srcDir'), + path.normalize('/srcDir/someOtherDir'), + path.normalize('/srcDir/someOtherDir/file1.file'), + path.normalize('/srcDir/someOtherDir/file2.file'), + path.normalize('/srcDir/someOtherDir2'), + path.normalize('/srcDir/someOtherDir2/file1.file'), + path.normalize('/srcDir/someOtherDir2/file2.file'), + path.normalize('/srcDir/someOtherDir2/file3.file'), + path.normalize('/srcDir/someOtherDir3'), +]; +runner.setAnswers(answers); + +const fsClone = Object.assign({}, fs); +Object.assign(fsClone, { + existsSync(itemPath: string): boolean { + switch (itemPath) { + case path.normalize('/srcDir/someOtherDir'): + case path.normalize('/srcDir/someOtherDir2'): + case path.normalize('/srcDir/someOtherDir3'): + case path.normalize('/srcDir/someOtherDir/file1.file'): + case path.normalize('/srcDir/someOtherDir/file2.file'): + case path.normalize('/srcDir/someOtherDir2/file1.file'): + case path.normalize('/srcDir/someOtherDir2/file2.file'): + case path.normalize('/srcDir/someOtherDir2/file3.file'): + return true; + default: + return false; + } + }, + statSync(itemPath: string): fs.Stats { + const itemStats: fs.Stats = new fs.Stats(); + switch (itemPath) { + case path.normalize('/srcDir/someOtherDir'): + case path.normalize('/srcDir/someOtherDir2'): + case path.normalize('/srcDir/someOtherDir3'): + itemStats.isDirectory = () => true; + break; + case path.normalize('/srcDir/someOtherDir/file1.file'): + case path.normalize('/srcDir/someOtherDir/file2.file'): + case path.normalize('/srcDir/someOtherDir2/file1.file'): + case path.normalize('/srcDir/someOtherDir2/file2.file'): + case path.normalize('/srcDir/someOtherDir2/file3.file'): + itemStats.isDirectory = () => false; + break; + default: + throw { code: 'ENOENT' }; + } + return itemStats; + }, + utimes(targetPath, atime, mtime, err): void { + console.log('Calling fs.utimes on', targetPath); + } +}); + +runner.registerMock('fs', fsClone); + +runner.run(); diff --git a/_generated/CopyFilesV2_Node20/Tests/L0rootsPatterns.ts b/_generated/CopyFilesV2_Node20/Tests/L0rootsPatterns.ts new file mode 100644 index 000000000000..87bf728e7642 --- /dev/null +++ b/_generated/CopyFilesV2_Node20/Tests/L0rootsPatterns.ts @@ -0,0 +1,63 @@ +import fs = require('fs'); +import mockanswer = require('azure-pipelines-task-lib/mock-answer'); +import mockrun = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'copyfiles.js'); +let runner: mockrun.TaskMockRunner = new mockrun.TaskMockRunner(taskPath); +runner.setInput('Contents', 'someOtherDir/file?.file\nsomeOtherDir2/*.file\n!someOtherDir2/file[13].file'); +runner.setInput('SourceFolder', path.normalize('/srcDir')); +runner.setInput('TargetFolder', path.normalize('/destDir')); +runner.setInput('CleanTargetFolder', 'false'); +runner.setInput('Overwrite', 'false'); +let answers = { + checkPath: { }, + find: { }, +}; +answers.checkPath[path.normalize('/srcDir')] = true; +answers.find[path.normalize('/srcDir')] = [ + path.normalize('/srcDir'), + path.normalize('/srcDir/someOtherDir'), + path.normalize('/srcDir/someOtherDir/file1.file'), + path.normalize('/srcDir/someOtherDir/file2.file'), + path.normalize('/srcDir/someOtherDir/file-zzz.file'), + path.normalize('/srcDir/someOtherDir2'), + path.normalize('/srcDir/someOtherDir2/file1.file'), + path.normalize('/srcDir/someOtherDir2/file2.file'), + path.normalize('/srcDir/someOtherDir2/file3.file'), + path.normalize('/srcDir/someOtherDir3'), +]; +runner.setAnswers(answers); + +const fsClone = Object.assign({}, fs); +Object.assign(fsClone, { + existsSync(itemPath: string): boolean { + switch (itemPath) { + case path.normalize('/srcDir/someOtherDir/file1.file'): + case path.normalize('/srcDir/someOtherDir/file2.file'): + case path.normalize('/srcDir/someOtherDir2/file2.file'): + return true; + default: + return false; + } + }, + statSync(itemPath: string): fs.Stats { + const itemStats: fs.Stats = new fs.Stats(); + switch (itemPath) { + case path.normalize('/srcDir/someOtherDir/file1.file'): + case path.normalize('/srcDir/someOtherDir/file2.file'): + case path.normalize('/srcDir/someOtherDir2/file2.file'): + itemStats.isDirectory = () => false; + break; + default: + throw { code: 'ENOENT' }; + } + return itemStats; + }, + // as a precaution, disable fs.chmodSync. it should not be called during this scenario. + chmodSync(p: fs.PathLike, mode: fs.Mode): void {} +}); + +runner.registerMock('fs', fsClone); + +runner.run(); diff --git a/_generated/CopyFilesV2_Node20/Tests/L0skipsIfExists.ts b/_generated/CopyFilesV2_Node20/Tests/L0skipsIfExists.ts new file mode 100644 index 000000000000..b509e9d6660e --- /dev/null +++ b/_generated/CopyFilesV2_Node20/Tests/L0skipsIfExists.ts @@ -0,0 +1,63 @@ +import fs = require('fs'); +import mockanswer = require('azure-pipelines-task-lib/mock-answer'); +import mockrun = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'copyfiles.js'); +let runner: mockrun.TaskMockRunner = new mockrun.TaskMockRunner(taskPath); +runner.setInput('Contents', '**'); +runner.setInput('SourceFolder', path.normalize('/srcDir')); +runner.setInput('TargetFolder', path.normalize('/destDir')); +runner.setInput('CleanTargetFolder', 'false'); +runner.setInput('Overwrite', 'false'); +let answers = { + checkPath: { }, + find: { }, +}; +answers.checkPath[path.normalize('/srcDir')] = true; +answers.find[path.normalize('/srcDir')] = [ + path.normalize('/srcDir'), + path.normalize('/srcDir/someOtherDir'), + path.normalize('/srcDir/someOtherDir/file1.file'), + path.normalize('/srcDir/someOtherDir/file2.file'), +]; +runner.setAnswers(answers); + +const fsClone = Object.assign({}, fs); +Object.assign(fsClone, { + existsSync(itemPath: string): boolean { + switch (itemPath) { + case path.normalize('/srcDir/someOtherDir'): + case path.normalize('/destDir/someOtherDir'): + case path.normalize('/srcDir/someOtherDir/file1.file'): + case path.normalize('/srcDir/someOtherDir/file2.file'): + case path.normalize('/destDir/someOtherDir/file1.file'): + return true; + default: + return false; + } + }, + statSync(itemPath: string): fs.Stats { + const itemStats: fs.Stats = new fs.Stats(); + switch (itemPath) { + case path.normalize('/srcDir/someOtherDir'): + case path.normalize('/destDir/someOtherDir'): + itemStats.isDirectory = () => true; + break; + case path.normalize('/srcDir/someOtherDir/file1.file'): + case path.normalize('/srcDir/someOtherDir/file2.file'): + case path.normalize('/destDir/someOtherDir/file1.file'): + itemStats.isDirectory = () => false; + break; + default: + throw { code: 'ENOENT' }; + } + return itemStats; + }, + // as a precaution, disable fs.chmodSync. it should not be called during this scenario. + chmodSync(p: fs.PathLike, mode: fs.Mode): void {} +}); + +runner.registerMock('fs', fsClone); + +runner.run(); diff --git a/_generated/CopyFilesV2_Node20/copyfiles.ts b/_generated/CopyFilesV2_Node20/copyfiles.ts new file mode 100644 index 000000000000..a310d23a76e2 --- /dev/null +++ b/_generated/CopyFilesV2_Node20/copyfiles.ts @@ -0,0 +1,275 @@ +import fs = require('fs'); +import path = require('path'); +import tl = require('azure-pipelines-task-lib/task'); +import { RetryOptions, RetryHelper } from './retrylogichelper'; + +/** + * Shows timestamp change operation results + * @param fileStats file stats + * @param err error - null if there is no error + */ +function displayTimestampChangeResults( + fileStats: fs.Stats, + err: NodeJS.ErrnoException +) { + if (err) { + console.warn(`Problem applying the timestamp: ${err}`); + } else { + console.log(`Timestamp preserved successfully - access time: ${fileStats.atime}, modified time: ${fileStats.mtime}`) + } +} + +/** + * Creates the full path with folders in between. Will throw an error if it fails + * If ignoreErrors is true - ignores the errors. + * @param targetFolder target folder. For more details see https://github.com/Microsoft/azure-pipelines-task-lib/blob/master/node/docs/azure-pipelines-task-lib.md#taskmkdirP + * @param ignoreErrors ignore errors during creation of target folder. + */ +function makeDirP(targetFolder: string, ignoreErrors: boolean): void { + try { + tl.mkdirP(targetFolder); + } catch (err) { + if (ignoreErrors) { + console.log(`Unable to create target folder (${targetFolder}): ${err}. Ignoring this as error since 'ignoreErrors' is true.`); + } else { + throw err; + } + } +} + +/** + * Gets stats for the provided path. + * Will throw error if entry does not exist and `throwEnoent` is `true`. + * @param path path for which method will try to get `fs.Stats`. + * @param throwEnoent throw error if entry does not exist. + * @returns `fs.Stats` or `null` + */ +function stats(path: string, throwEnoent: boolean = true): fs.Stats | null { + if (fs.existsSync(path)) { + return fs.statSync(path); + } else { + const message: string = `Entry "${path}" does not exist`; + if (throwEnoent) { + tl.warning(message); + throw new Error(message); + } + tl.debug(message); + return null; + } +} + +function filterOutDirectories(paths: string[]): string[] { + return paths.filter((path: string) => { + const itemStats: fs.Stats = stats(path); + return !itemStats.isDirectory(); + }); +} + +async function main(): Promise { + // we allow broken symlinks - since there could be broken symlinks found in source folder, but filtered by contents pattern + const findOptions: tl.FindOptions = { + allowBrokenSymbolicLinks: true, + followSpecifiedSymbolicLink: true, + followSymbolicLinks: true + }; + + tl.setResourcePath(path.join(__dirname, 'task.json')); + + // contents is a multiline input containing glob patterns + let contents: string[] = tl.getDelimitedInput('Contents', '\n', true); + let sourceFolder: string = tl.getPathInput('SourceFolder', true, true); + let targetFolder: string = tl.getPathInput('TargetFolder', true); + let cleanTargetFolder: boolean = tl.getBoolInput('CleanTargetFolder', false); + let overWrite: boolean = tl.getBoolInput('OverWrite', false); + let flattenFolders: boolean = tl.getBoolInput('flattenFolders', false); + let retryCount: number = parseInt(tl.getInput('retryCount')); + let delayBetweenRetries: number = parseInt(tl.getInput('delayBetweenRetries')); + + if (isNaN(retryCount) || retryCount < 0) { + retryCount = 0; + } + + if (isNaN(delayBetweenRetries) || delayBetweenRetries < 0) { + delayBetweenRetries = 0; + } + + const retryOptions: RetryOptions = { + timeoutBetweenRetries: delayBetweenRetries, + numberOfReties: retryCount + }; + const retryHelper = new RetryHelper(retryOptions); + + const preserveTimestamp: boolean = tl.getBoolInput('preserveTimestamp', false); + const ignoreMakeDirErrors: boolean = tl.getBoolInput('ignoreMakeDirErrors', false); + + // normalize the source folder path. this is important for later in order to accurately + // determine the relative path of each found file (substring using sourceFolder.length). + sourceFolder = path.normalize(sourceFolder); + let allPaths: string[] = tl.find(sourceFolder, findOptions); + let sourceFolderPattern = sourceFolder.replace('[', '[[]'); // directories can have [] in them, and they have special meanings as a pattern, so escape them + let matchedPaths: string[] = tl.match(allPaths, contents, sourceFolderPattern); // default match options + let matchedFiles: string[] = filterOutDirectories(matchedPaths); + + // copy the files to the target folder + console.log(tl.loc('FoundNFiles', matchedFiles.length)); + + if (matchedFiles.length > 0) { + // clean target folder if required + if (cleanTargetFolder) { + console.log(tl.loc('CleaningTargetFolder', targetFolder)); + + // stat the targetFolder path + const targetFolderStats: fs.Stats = await retryHelper.RunWithRetry( + () => stats(targetFolder, false), + `stats for ${targetFolder}` + ); + + // If there are no stats, the folder doesn't exist. Nothing to clean. + if (targetFolderStats) { + if (targetFolderStats.isDirectory()) { + // delete the child items + const folderItems: string[] = await retryHelper.RunWithRetry( + () => fs.readdirSync(targetFolder), + `readdirSync for ${targetFolder}` + ); + + for (let item of folderItems) { + let itemPath = path.join(targetFolder, item); + await retryHelper.RunWithRetry(() => + tl.rmRF(itemPath), + `delete of ${itemPath}` + ); + } + } else { + await retryHelper.RunWithRetry(() => + tl.rmRF(targetFolder), + `delete of ${targetFolder}` + ); + } + } + } + + // make sure the target folder exists + await retryHelper.RunWithRetry(() => + makeDirP(targetFolder, ignoreMakeDirErrors), + `makeDirP for ${targetFolder}` + ); + try { + let createdFolders: { [folder: string]: boolean } = {}; + for (let file of matchedFiles) { + let relativePath; + if (flattenFolders) { + relativePath = path.basename(file); + } else { + relativePath = file.substring(sourceFolder.length); + + // trim leading path separator + // note, assumes normalized above + if (relativePath.startsWith(path.sep)) { + relativePath = relativePath.substr(1); + } + } + + let targetPath = path.join(targetFolder, relativePath); + let targetDir = path.dirname(targetPath); + + if (!createdFolders[targetDir]) { + await retryHelper.RunWithRetry( + () => makeDirP(targetDir, ignoreMakeDirErrors), + `makeDirP for ${targetDir}` + ); + + createdFolders[targetDir] = true; + } + + // stat the target + let targetStats: fs.Stats; + if (!cleanTargetFolder) { // optimization - no need to check if relative target exists when CleanTargetFolder=true + targetStats = await retryHelper.RunWithRetry( + () => stats(targetPath, false), + `Stats for ${targetPath}` + ); + } + + // validate the target is not a directory + if (targetStats && targetStats.isDirectory()) { + throw new Error(tl.loc('TargetIsDir', file, targetPath)); + } + + if (!overWrite) { + if (targetStats) { // exists, skip + console.log(tl.loc('FileAlreadyExistAt', file, targetPath)); + } else { // copy + console.log(tl.loc('CopyingTo', file, targetPath)); + await retryHelper.RunWithRetry( + () => tl.cp(file, targetPath), + `copy ${file} to ${targetPath}` + ); + if (preserveTimestamp) { + try { + const fileStats: fs.Stats = await retryHelper.RunWithRetry( + () => stats(file), + `stats for ${file}` + ); + fs.utimes(targetPath, fileStats.atime, fileStats.mtime, (err) => { + displayTimestampChangeResults(fileStats, err); + }); + } catch (err) { + console.warn(`Problem preserving the timestamp: ${err}`) + } + } + } + } else { // copy + console.log(tl.loc('CopyingTo', file, targetPath)); + if (process.platform == 'win32' && targetStats && (targetStats.mode & 146) != 146) { + // The readonly attribute can be interpreted by performing a bitwise-AND operation on + // "fs.Stats.mode" and the integer 146. The integer 146 represents "-w--w--w-" or (128 + 16 + 2), + // see following chart: + // R W X R W X R W X + // 256 128 64 32 16 8 4 2 1 + // + // "fs.Stats.mode" on Windows is based on whether the readonly attribute is set. + // If the readonly attribute is set, then the mode is set to "r--r--r--". + // If the readonly attribute is not set, then the mode is set to "rw-rw-rw-". + // + // Note, additional bits may also be set (e.g. if directory). Therefore, a bitwise + // comparison is appropriate. + // + // For additional information, refer to the fs source code and ctrl+f "st_mode": + // https://github.com/nodejs/node/blob/v5.x/deps/uv/src/win/fs.c#L1064 + tl.debug(`removing readonly attribute on '${targetPath}'`); + + await retryHelper.RunWithRetry( + () => fs.chmodSync(targetPath, targetStats.mode | 146), + `chmodSync for ${targetPath}` + ); + } + await retryHelper.RunWithRetry( + () => tl.cp(file, targetPath, "-f"), + `copy ${file} to ${targetPath}` + ); + + if (preserveTimestamp) { + try { + const fileStats = await retryHelper.RunWithRetry( + () => stats(file), + `stats for ${file}` + ); + fs.utimes(targetPath, fileStats.atime, fileStats.mtime, (err) => { + displayTimestampChangeResults(fileStats, err); + }); + } catch (err) { + console.warn(`Problem preserving the timestamp: ${err}`) + } + } + } + } + } catch (err) { + tl.setResult(tl.TaskResult.Failed, err); + } + } +} + +main().catch((err) => { + tl.setResult(tl.TaskResult.Failed, err); +}); diff --git a/_generated/CopyFilesV2_Node20/icon.png b/_generated/CopyFilesV2_Node20/icon.png new file mode 100644 index 000000000000..443e57fd1c28 Binary files /dev/null and b/_generated/CopyFilesV2_Node20/icon.png differ diff --git a/_generated/CopyFilesV2_Node20/icon.svg b/_generated/CopyFilesV2_Node20/icon.svg new file mode 100644 index 000000000000..a854146f9cfd --- /dev/null +++ b/_generated/CopyFilesV2_Node20/icon.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/_generated/CopyFilesV2_Node20/package-lock.json b/_generated/CopyFilesV2_Node20/package-lock.json new file mode 100644 index 000000000000..172f1cd632ba --- /dev/null +++ b/_generated/CopyFilesV2_Node20/package-lock.json @@ -0,0 +1,488 @@ +{ + "name": "vsts-copyfiles-task", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/concat-stream": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz", + "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==", + "requires": { + "@types/node": "*" + } + }, + "@types/form-data": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", + "integrity": "sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==", + "requires": { + "@types/node": "*" + } + }, + "@types/mocha": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", + "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==" + }, + "@types/node": { + "version": "20.7.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.7.0.tgz", + "integrity": "sha512-zI22/pJW2wUZOVyguFaUL1HABdmSVxpXrzIqkjsHmyUjNhPoWM1CKfvVuXfetHhIok4RY573cqS0mZ1SJEnoTg==" + }, + "@types/qs": { + "version": "6.9.8", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.8.tgz", + "integrity": "sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg==" + }, + "@types/uuid": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.4.tgz", + "integrity": "sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==" + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "azure-pipelines-task-lib": { + "version": "5.0.0-preview.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-5.0.0-preview.0.tgz", + "integrity": "sha512-uQJEv+q3/7RD7kgphFd33uXijaPwA1ePYoNkAgZpUhbZUtc2u4JL4ujTT/JJfgXBNW/QQNAiDQ2OC7vOQG/0tg==", + "requires": { + "minimatch": "3.0.5", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "sync-request": "6.1.0", + "uuid": "^3.0.1" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, + "form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + } + }, + "get-port": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", + "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==" + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "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" + }, + "dependencies": { + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==" + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "http-basic": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", + "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", + "requires": { + "caseless": "^0.12.0", + "concat-stream": "^1.6.2", + "http-response-object": "^3.0.1", + "parse-cache-control": "^1.0.1" + } + }, + "http-response-object": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", + "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", + "requires": { + "@types/node": "^10.0.3" + }, + "dependencies": { + "@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + } + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" + }, + "is-core-module": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "requires": { + "has": "^1.0.3" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, + "parse-cache-control": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", + "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "promise": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", + "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", + "requires": { + "asap": "~2.0.6" + } + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==" + }, + "qs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "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" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "requires": { + "resolve": "^1.1.6" + } + }, + "resolve": { + "version": "1.22.6", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.6.tgz", + "integrity": "sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==", + "requires": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" + }, + "shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, + "sync-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", + "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==", + "requires": { + "http-response-object": "^3.0.1", + "sync-rpc": "^1.2.1", + "then-request": "^6.0.0" + } + }, + "sync-rpc": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz", + "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==", + "requires": { + "get-port": "^3.1.0" + } + }, + "then-request": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", + "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", + "requires": { + "@types/concat-stream": "^1.6.0", + "@types/form-data": "0.0.33", + "@types/node": "^8.0.0", + "@types/qs": "^6.2.31", + "caseless": "~0.12.0", + "concat-stream": "^1.6.0", + "form-data": "^2.2.0", + "http-basic": "^8.1.1", + "http-response-object": "^3.0.1", + "promise": "^8.0.0", + "qs": "^6.4.0" + }, + "dependencies": { + "@types/node": { + "version": "8.10.66", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", + "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==" + } + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, + "typescript": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + } + } +} diff --git a/_generated/CopyFilesV2_Node20/package.json b/_generated/CopyFilesV2_Node20/package.json new file mode 100644 index 000000000000..fda842b3d2f6 --- /dev/null +++ b/_generated/CopyFilesV2_Node20/package.json @@ -0,0 +1,21 @@ +{ + "name": "vsts-copyfiles-task", + "version": "1.0.0", + "description": "Azure Pipelines Copy Files Task", + "main": "copyfiles.js", + "repository": { + "type": "git", + "url": "git+https://github.com/Microsoft/azure-pipelines-tasks.git" + }, + "author": "Microsoft Corporation", + "license": "MIT", + "dependencies": { + "@types/node": "^20.3.1", + "@types/mocha": "^5.2.7", + "@types/uuid": "^8.3.0", + "azure-pipelines-task-lib": "^5.0.0-preview.0" + }, + "devDependencies": { + "typescript": "5.1.6" + } +} diff --git a/_generated/CopyFilesV2_Node20/retrylogichelper.ts b/_generated/CopyFilesV2_Node20/retrylogichelper.ts new file mode 100644 index 000000000000..75171ac2417c --- /dev/null +++ b/_generated/CopyFilesV2_Node20/retrylogichelper.ts @@ -0,0 +1,47 @@ +/** + * Interface for FindOptions + * Contains properties to control whether to follow symlinks + */ + export interface RetryOptions { + + /** + * Number of retries + */ + numberOfReties: number, + + /** + * Timeout between retries in milliseconds + */ + timeoutBetweenRetries: number +} + +export class RetryHelper { + private retryOptions: RetryOptions; + + constructor (retryOptions: RetryOptions) { + this.retryOptions = retryOptions; + } + + + public async RunWithRetry(action: () => T, actionName: string): Promise { + let attempts = this.retryOptions.numberOfReties; + while (true) { + try { + const result: T = await action(); + return result; + } catch (err) { + --attempts; + if (attempts <= 0) { + throw err; + } + console.log(`Error while ${actionName}: ${err}. Remaining attempts: ${attempts}`); + await this.sleep(); + } + } + } + + private async sleep() { + return new Promise(resolve => setTimeout(resolve, + this.retryOptions.timeoutBetweenRetries)); + } +} \ No newline at end of file diff --git a/_generated/CopyFilesV2_Node20/task.json b/_generated/CopyFilesV2_Node20/task.json new file mode 100644 index 000000000000..908d3b4a61df --- /dev/null +++ b/_generated/CopyFilesV2_Node20/task.json @@ -0,0 +1,155 @@ +{ + "id": "5BFB729A-A7C8-4A78-A7C3-8D717BB7C13C", + "name": "CopyFiles", + "friendlyName": "Copy files", + "description": "Copy files from a source folder to a target folder using patterns matching file paths (not folder paths)", + "helpUrl": "https://docs.microsoft.com/azure/devops/pipelines/tasks/utility/copy-files", + "helpMarkDown": "[Learn more about this task](https://go.microsoft.com/fwlink/?LinkID=708389)", + "category": "Utility", + "visibility": [ + "Build" + ], + "runsOn": [ + "Agent", + "DeploymentGroup" + ], + "author": "Microsoft Corporation", + "version": { + "Major": 2, + "Minor": 229, + "Patch": 1 + }, + "releaseNotes": "Match pattern consistency.", + "demands": [], + "minimumAgentVersion": "2.182.1", + "groups": [ + { + "name": "advanced", + "displayName": "Advanced", + "isExpanded": false + } + ], + "inputs": [ + { + "name": "SourceFolder", + "type": "filePath", + "label": "Source Folder", + "defaultValue": "", + "required": false, + "helpMarkDown": "The source folder that the copy pattern(s) will be run from. Empty is the root of the repo. Use [variables](https://go.microsoft.com/fwlink/?LinkID=550988) if files are not in the repo. Example: $(agent.builddirectory)" + }, + { + "name": "Contents", + "type": "multiLine", + "label": "Contents", + "defaultValue": "**", + "required": true, + "helpMarkDown": "File paths to include as part of the copy. Supports multiple lines of match patterns. [More Information](https://go.microsoft.com/fwlink/?LinkID=708389)" + }, + { + "name": "TargetFolder", + "type": "string", + "label": "Target Folder", + "defaultValue": "", + "required": true, + "helpMarkDown": "Target folder or UNC path files will copy to. You can use [variables](http://go.microsoft.com/fwlink/?LinkID=550988). Example: $(build.artifactstagingdirectory)" + }, + { + "name": "CleanTargetFolder", + "type": "boolean", + "label": "Clean Target Folder", + "defaultValue": "false", + "required": false, + "helpMarkDown": "Delete all existing files in target folder before copy", + "groupName": "advanced" + }, + { + "name": "OverWrite", + "type": "boolean", + "label": "Overwrite", + "defaultValue": "false", + "required": false, + "helpMarkDown": "Replace existing file in target folder", + "groupName": "advanced" + }, + { + "name": "flattenFolders", + "type": "boolean", + "label": "Flatten Folders", + "defaultValue": "false", + "required": false, + "helpMarkDown": "Flatten the folder structure and copy all files into the specified target folder.", + "groupName": "advanced" + }, + { + "name": "preserveTimestamp", + "type": "boolean", + "label": "Preserve Target Timestamp", + "defaultValue": "false", + "required": false, + "helpMarkDown": "Using the original source file, preserve the target file timestamp.", + "groupName": "advanced" + }, + { + "name": "retryCount", + "type": "string", + "label": "Retry count to copy the file", + "defaultValue": "0", + "required": false, + "helpMarkDown": "Specify the retry count to copy the file. It might help to resolve intermittent issues e.g. with UNC target paths on a remote host.", + "groupName": "advanced" + }, + { + "name": "delayBetweenRetries", + "type": "string", + "label": "Delay between two retries.", + "defaultValue": "1000", + "required": false, + "helpMarkDown": "Specify the delay between two retries. It might help to be more resilient to intermittent issues e.g. with UNC target paths on a remote host.", + "groupName": "advanced" + }, + { + "name": "ignoreMakeDirErrors", + "type": "boolean", + "label": "Ignore errors during creation of target folder.", + "defaultValue": "false", + "required": false, + "helpMarkDown": "Ignore errors which happen during creation of target folder. This could be useful to avoid issues with parallel execution of task by several agents with one target folder.", + "groupName": "advanced" + } + ], + "instanceNameFormat": "Copy Files to: $(TargetFolder)", + "execution": { + "Node10": { + "target": "copyfiles.js", + "argumentFormat": "" + }, + "Node16": { + "target": "copyfiles.js", + "argumentFormat": "" + }, + "Node20": { + "target": "copyfiles.js", + "argumentFormat": "" + } + }, + "messages": { + "FoundNFiles": "found %d files", + "CleaningTargetFolder": "Cleaning target folder: %s", + "FileAlreadyExistAt": "File %s already exist at %s", + "CopyingTo": "Copying %s to %s", + "TargetIsDir": "Unable to copy file %s to %s. The target path already exists as a directory." + }, + "restrictions": { + "commands": { + "mode": "restricted" + }, + "settableVariables": { + "allowed": [] + } + }, + "_buildConfigMapping": { + "Default": "2.229.0", + "Node20-225": "2.229.1" + } +} \ No newline at end of file diff --git a/_generated/CopyFilesV2_Node20/task.loc.json b/_generated/CopyFilesV2_Node20/task.loc.json new file mode 100644 index 000000000000..a919e3924479 --- /dev/null +++ b/_generated/CopyFilesV2_Node20/task.loc.json @@ -0,0 +1,155 @@ +{ + "id": "5BFB729A-A7C8-4A78-A7C3-8D717BB7C13C", + "name": "CopyFiles", + "friendlyName": "ms-resource:loc.friendlyName", + "description": "ms-resource:loc.description", + "helpUrl": "https://docs.microsoft.com/azure/devops/pipelines/tasks/utility/copy-files", + "helpMarkDown": "ms-resource:loc.helpMarkDown", + "category": "Utility", + "visibility": [ + "Build" + ], + "runsOn": [ + "Agent", + "DeploymentGroup" + ], + "author": "Microsoft Corporation", + "version": { + "Major": 2, + "Minor": 229, + "Patch": 1 + }, + "releaseNotes": "ms-resource:loc.releaseNotes", + "demands": [], + "minimumAgentVersion": "2.182.1", + "groups": [ + { + "name": "advanced", + "displayName": "ms-resource:loc.group.displayName.advanced", + "isExpanded": false + } + ], + "inputs": [ + { + "name": "SourceFolder", + "type": "filePath", + "label": "ms-resource:loc.input.label.SourceFolder", + "defaultValue": "", + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.SourceFolder" + }, + { + "name": "Contents", + "type": "multiLine", + "label": "ms-resource:loc.input.label.Contents", + "defaultValue": "**", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.Contents" + }, + { + "name": "TargetFolder", + "type": "string", + "label": "ms-resource:loc.input.label.TargetFolder", + "defaultValue": "", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.TargetFolder" + }, + { + "name": "CleanTargetFolder", + "type": "boolean", + "label": "ms-resource:loc.input.label.CleanTargetFolder", + "defaultValue": "false", + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.CleanTargetFolder", + "groupName": "advanced" + }, + { + "name": "OverWrite", + "type": "boolean", + "label": "ms-resource:loc.input.label.OverWrite", + "defaultValue": "false", + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.OverWrite", + "groupName": "advanced" + }, + { + "name": "flattenFolders", + "type": "boolean", + "label": "ms-resource:loc.input.label.flattenFolders", + "defaultValue": "false", + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.flattenFolders", + "groupName": "advanced" + }, + { + "name": "preserveTimestamp", + "type": "boolean", + "label": "ms-resource:loc.input.label.preserveTimestamp", + "defaultValue": "false", + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.preserveTimestamp", + "groupName": "advanced" + }, + { + "name": "retryCount", + "type": "string", + "label": "ms-resource:loc.input.label.retryCount", + "defaultValue": "0", + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.retryCount", + "groupName": "advanced" + }, + { + "name": "delayBetweenRetries", + "type": "string", + "label": "ms-resource:loc.input.label.delayBetweenRetries", + "defaultValue": "1000", + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.delayBetweenRetries", + "groupName": "advanced" + }, + { + "name": "ignoreMakeDirErrors", + "type": "boolean", + "label": "ms-resource:loc.input.label.ignoreMakeDirErrors", + "defaultValue": "false", + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.ignoreMakeDirErrors", + "groupName": "advanced" + } + ], + "instanceNameFormat": "ms-resource:loc.instanceNameFormat", + "execution": { + "Node10": { + "target": "copyfiles.js", + "argumentFormat": "" + }, + "Node16": { + "target": "copyfiles.js", + "argumentFormat": "" + }, + "Node20": { + "target": "copyfiles.js", + "argumentFormat": "" + } + }, + "messages": { + "FoundNFiles": "ms-resource:loc.messages.FoundNFiles", + "CleaningTargetFolder": "ms-resource:loc.messages.CleaningTargetFolder", + "FileAlreadyExistAt": "ms-resource:loc.messages.FileAlreadyExistAt", + "CopyingTo": "ms-resource:loc.messages.CopyingTo", + "TargetIsDir": "ms-resource:loc.messages.TargetIsDir" + }, + "restrictions": { + "commands": { + "mode": "restricted" + }, + "settableVariables": { + "allowed": [] + } + }, + "_buildConfigMapping": { + "Default": "2.229.0", + "Node20-225": "2.229.1" + } +} \ No newline at end of file diff --git a/_generated/CopyFilesV2_Node20/tsconfig.json b/_generated/CopyFilesV2_Node20/tsconfig.json new file mode 100644 index 000000000000..0438b79f69ac --- /dev/null +++ b/_generated/CopyFilesV2_Node20/tsconfig.json @@ -0,0 +1,6 @@ +{ + "compilerOptions": { + "target": "ES6", + "module": "commonjs" + } +} \ No newline at end of file diff --git a/_generated/DecryptFileV1.versionmap.txt b/_generated/DecryptFileV1.versionmap.txt new file mode 100644 index 000000000000..f74febd08e1e --- /dev/null +++ b/_generated/DecryptFileV1.versionmap.txt @@ -0,0 +1,2 @@ +Default|1.229.0 +Node20-225|1.229.1 diff --git a/_generated/DecryptFileV1/Strings/resources.resjson/de-DE/resources.resjson b/_generated/DecryptFileV1/Strings/resources.resjson/de-DE/resources.resjson new file mode 100644 index 000000000000..13d9d730eb41 --- /dev/null +++ b/_generated/DecryptFileV1/Strings/resources.resjson/de-DE/resources.resjson @@ -0,0 +1,19 @@ +{ + "loc.friendlyName": "Datei entschlüsseln (OpenSSL)", + "loc.helpMarkDown": "", + "loc.description": "Hiermit wird eine Datei mit OpenSSL entschlüsselt.", + "loc.instanceNameFormat": "Entschlüsseln $(inFile)", + "loc.group.displayName.advanced": "Erweitert", + "loc.input.label.cipher": "Verschlüsselungsverfahren", + "loc.input.help.cipher": "Das zu verwendenden Verschlüsselungsverfahren. Eine vollständige Liste der möglichen Werte finden Sie unter \"[Cipher Suite Names](https://go.microsoft.com/fwlink/?LinkID=627129)\".", + "loc.input.label.inFile": "Verschlüsselte Datei", + "loc.input.help.inFile": "Der relative Pfad der zu entschlüsselnden Datei.", + "loc.input.label.passphrase": "Passphrase", + "loc.input.help.passphrase": "Die Passphrase, die für die Entschlüsselung verwendet werden soll. **Verwenden Sie eine Variable zum Verschlüsseln der Passphrase.**", + "loc.input.label.outFile": "Entschlüsselter Dateipfad", + "loc.input.help.outFile": "Der optionale Dateiname für die entschlüsselte Datei. Standardmäßig wird der Name der verschlüsselten Datei mit der Erweiterung \"OUT\" verwendet.", + "loc.input.label.cwd": "Arbeitsverzeichnis", + "loc.input.help.cwd": "Das Arbeitsverzeichnis für die Entschlüsselung. Standardmäßig wird der Stamm des Repositorys verwendet.", + "loc.messages.OpenSSLReturnCode": "openssl wurde mit dem folgenden Rückgabecode beendet: %d", + "loc.messages.OpenSSLFailed": "openssl-Fehler: %s" +} \ No newline at end of file diff --git a/_generated/DecryptFileV1/Strings/resources.resjson/en-US/resources.resjson b/_generated/DecryptFileV1/Strings/resources.resjson/en-US/resources.resjson new file mode 100644 index 000000000000..6c4c4afa9a5f --- /dev/null +++ b/_generated/DecryptFileV1/Strings/resources.resjson/en-US/resources.resjson @@ -0,0 +1,19 @@ +{ + "loc.friendlyName": "Decrypt file (OpenSSL)", + "loc.helpMarkDown": "", + "loc.description": "Decrypt a file using OpenSSL", + "loc.instanceNameFormat": "Decrypt $(inFile)", + "loc.group.displayName.advanced": "Advanced", + "loc.input.label.cipher": "Cypher", + "loc.input.help.cipher": "Encryption cypher to use. See [cypher suite names](https://go.microsoft.com/fwlink/?LinkID=627129) for a complete list of possible values.", + "loc.input.label.inFile": "Encrypted file", + "loc.input.help.inFile": "Relative path of file to decrypt.", + "loc.input.label.passphrase": "Passphrase", + "loc.input.help.passphrase": "Passphrase to use for decryption. **Use a Variable to encrypt the passphrase.**", + "loc.input.label.outFile": "Decrypted file path", + "loc.input.help.outFile": "Optional filename for decrypted file. Defaults to the Encrypted File with a \".out\" extension", + "loc.input.label.cwd": "Working directory", + "loc.input.help.cwd": "Working directory for decryption. Defaults to the root of the repository.", + "loc.messages.OpenSSLReturnCode": "openssl exited with return code: %d", + "loc.messages.OpenSSLFailed": "openssl failed with error: %s" +} \ No newline at end of file diff --git a/_generated/DecryptFileV1/Strings/resources.resjson/es-ES/resources.resjson b/_generated/DecryptFileV1/Strings/resources.resjson/es-ES/resources.resjson new file mode 100644 index 000000000000..d3440c8661a7 --- /dev/null +++ b/_generated/DecryptFileV1/Strings/resources.resjson/es-ES/resources.resjson @@ -0,0 +1,19 @@ +{ + "loc.friendlyName": "Descifrar archivo (OpenSSL)", + "loc.helpMarkDown": "", + "loc.description": "Descifra un archivo con OpenSSL.", + "loc.instanceNameFormat": "Descifrar $(inFile)", + "loc.group.displayName.advanced": "Avanzado", + "loc.input.label.cipher": "Cifrado", + "loc.input.help.cipher": "Cifrados disponibles para su uso. Consulte [nombres de conjuntos de cifrado](https://go.microsoft.com/fwlink/?LinkID=627129) para obtener una lista completa de los posibles valores.", + "loc.input.label.inFile": "Archivo cifrado", + "loc.input.help.inFile": "Ruta relativa del archivo que se va a descifrar.", + "loc.input.label.passphrase": "Frase de contraseña", + "loc.input.help.passphrase": "Frase de contraseña que se usará para el descifrado. **Use una variable para cifrar la frase de contraseña.**", + "loc.input.label.outFile": "Ruta de acceso del archivo descifrado", + "loc.input.help.outFile": "Nombre de archivo opcional para el archivo descifrado. Se establece de manera predeterminada con el nombre del archivo cifrado y la extensión \".out\"", + "loc.input.label.cwd": "Directorio de trabajo", + "loc.input.help.cwd": "Directorio de trabajo para el descifrado. Se establece de manera predeterminada en la raíz del repositorio.", + "loc.messages.OpenSSLReturnCode": "Se cerró openssl con el código de devolución: %d", + "loc.messages.OpenSSLFailed": "Error de openssl: %s" +} \ No newline at end of file diff --git a/_generated/DecryptFileV1/Strings/resources.resjson/fr-FR/resources.resjson b/_generated/DecryptFileV1/Strings/resources.resjson/fr-FR/resources.resjson new file mode 100644 index 000000000000..832ef0906f72 --- /dev/null +++ b/_generated/DecryptFileV1/Strings/resources.resjson/fr-FR/resources.resjson @@ -0,0 +1,19 @@ +{ + "loc.friendlyName": "Déchiffrer un fichier (OpenSSL)", + "loc.helpMarkDown": "", + "loc.description": "Déchiffrer un fichier à l'aide d'OpenSSL", + "loc.instanceNameFormat": "Déchiffrer $(inFile)", + "loc.group.displayName.advanced": "Avancé", + "loc.input.label.cipher": "Code", + "loc.input.help.cipher": "Code de chiffrement à utiliser. Consultez [cipher suite names](https://go.microsoft.com/fwlink/?LinkID=627129) pour obtenir une liste complète des valeurs possibles.", + "loc.input.label.inFile": "Fichier chiffré", + "loc.input.help.inFile": "Chemin relatif du fichier à déchiffrer.", + "loc.input.label.passphrase": "Phrase secrète", + "loc.input.help.passphrase": "Phrase secrète à utiliser pour le déchiffrement. **Utilisez une variable pour chiffrer la phrase secrète.**", + "loc.input.label.outFile": "Chemin du fichier déchiffré", + "loc.input.help.outFile": "Nom facultatif du fichier déchiffré. Le nom par défaut est celui du fichier chiffré avec une extension \".out\"", + "loc.input.label.cwd": "Répertoire de travail", + "loc.input.help.cwd": "Répertoire de travail pour le déchiffrement. Le répertoire par défaut est la racine du dépôt.", + "loc.messages.OpenSSLReturnCode": "Sortie de openssl avec le code de retour : %d", + "loc.messages.OpenSSLFailed": "Échec de openssl avec l'erreur : %s" +} \ No newline at end of file diff --git a/_generated/DecryptFileV1/Strings/resources.resjson/it-IT/resources.resjson b/_generated/DecryptFileV1/Strings/resources.resjson/it-IT/resources.resjson new file mode 100644 index 000000000000..b856a7889c5e --- /dev/null +++ b/_generated/DecryptFileV1/Strings/resources.resjson/it-IT/resources.resjson @@ -0,0 +1,19 @@ +{ + "loc.friendlyName": "Decrittografa file (OpenSSL)", + "loc.helpMarkDown": "", + "loc.description": "Decrittografa un file con OpenSSL", + "loc.instanceNameFormat": "Decrittografa $(inFile)", + "loc.group.displayName.advanced": "Avanzate", + "loc.input.label.cipher": "Crittografia", + "loc.input.help.cipher": "Tipo di crittografia da usare. Per un elenco completo dei possibili valori, vedere la pagina relativa ai [nomi della famiglia di opzioni per cipher](https://go.microsoft.com/fwlink/?LinkID=627129).", + "loc.input.label.inFile": "File crittografato", + "loc.input.help.inFile": "Percorso relativo del file da decrittografare.", + "loc.input.label.passphrase": "Passphrase", + "loc.input.help.passphrase": "Passphrase da usare per la decrittografia. **Usare una variabile per decrittografare la passphrase.**", + "loc.input.label.outFile": "Percorso del file decrittografato", + "loc.input.help.outFile": "Nome file facoltativo del file decrittografato. L'impostazione predefinita è il nome del file crittografato con un'estensione \"out\"", + "loc.input.label.cwd": "Directory di lavoro", + "loc.input.help.cwd": "Directory di lavoro per la decrittografia. L'impostazione predefinita è la radice del repository.", + "loc.messages.OpenSSLReturnCode": "Il comando openssl è stato terminato. Codice restituito: %d", + "loc.messages.OpenSSLFailed": "Il comando openssl non è riuscito. Errore: %s" +} \ No newline at end of file diff --git a/_generated/DecryptFileV1/Strings/resources.resjson/ja-JP/resources.resjson b/_generated/DecryptFileV1/Strings/resources.resjson/ja-JP/resources.resjson new file mode 100644 index 000000000000..16fb9e89df6f --- /dev/null +++ b/_generated/DecryptFileV1/Strings/resources.resjson/ja-JP/resources.resjson @@ -0,0 +1,19 @@ +{ + "loc.friendlyName": "ファイルの暗号化解除 (OpenSSL)", + "loc.helpMarkDown": "", + "loc.description": "OpenSSL を使用してファイルの暗号化を解除します", + "loc.instanceNameFormat": "暗号化解除 $(inFile)", + "loc.group.displayName.advanced": "詳細設定", + "loc.input.label.cipher": "暗号", + "loc.input.help.cipher": "暗号化に使用する暗号。使用可能な値の一覧については、[cypher suite names](https://go.microsoft.com/fwlink/?LinkID=627129) を参照してください。", + "loc.input.label.inFile": "暗号化されたファイル", + "loc.input.help.inFile": "暗号化解除するファイルの相対パス。", + "loc.input.label.passphrase": "パスフレーズ", + "loc.input.help.passphrase": "暗号化解除に使用するパスフレーズ。**変数を使用してパスフレーズを暗号化します。**", + "loc.input.label.outFile": "暗号化解除されたファイル パス", + "loc.input.help.outFile": "暗号化解除されているファイルのファイル名 (省略可能)。既定値は暗号化ファイルの拡張子を \".out\" にしたものです。", + "loc.input.label.cwd": "作業ディレクトリ", + "loc.input.help.cwd": "暗号化解除の作業ディレクトリ。既定値はリポジトリのルートです。", + "loc.messages.OpenSSLReturnCode": "openssl が次のリターン コードで終了しました: %d", + "loc.messages.OpenSSLFailed": "openssl に失敗し、次のエラーが発生しました: %s" +} \ No newline at end of file diff --git a/_generated/DecryptFileV1/Strings/resources.resjson/ko-KR/resources.resjson b/_generated/DecryptFileV1/Strings/resources.resjson/ko-KR/resources.resjson new file mode 100644 index 000000000000..ee5546bf3c2e --- /dev/null +++ b/_generated/DecryptFileV1/Strings/resources.resjson/ko-KR/resources.resjson @@ -0,0 +1,19 @@ +{ + "loc.friendlyName": "파일 암호 해독(OpenSSL)", + "loc.helpMarkDown": "", + "loc.description": "OpenSSL을 사용하여 파일 암호를 해독합니다.", + "loc.instanceNameFormat": "$(inFile) 암호 해독", + "loc.group.displayName.advanced": "고급", + "loc.input.label.cipher": "암호", + "loc.input.help.cipher": "사용할 암호화 암호입니다. 가능한 값의 전체 목록은 [암호 제품군 이름](https://go.microsoft.com/fwlink/?LinkID=627129)을 참조하세요.", + "loc.input.label.inFile": "암호화된 파일", + "loc.input.help.inFile": "암호 해독할 파일의 상대 경로입니다.", + "loc.input.label.passphrase": "암호", + "loc.input.help.passphrase": "암호 해독에 사용할 암호입니다. **암호를 암호화하려면 변수를 사용하세요.**", + "loc.input.label.outFile": "암호 해독된 파일 경로", + "loc.input.help.outFile": "암호 해독된 파일의 선택적 파일 이름입니다. 기본값은 확장명이 \".out\"인 암호화된 파일입니다.", + "loc.input.label.cwd": "작업 디렉터리", + "loc.input.help.cwd": "암호 해독에 사용할 작업 디렉터리입니다. 기본값은 리포지토리의 루트입니다.", + "loc.messages.OpenSSLReturnCode": "OpenSSL이 종료되었습니다(반환 코드: %d).", + "loc.messages.OpenSSLFailed": "OpenSSL이 실패했습니다(오류: %s)." +} \ No newline at end of file diff --git a/_generated/DecryptFileV1/Strings/resources.resjson/ru-RU/resources.resjson b/_generated/DecryptFileV1/Strings/resources.resjson/ru-RU/resources.resjson new file mode 100644 index 000000000000..86e17b6c1ea3 --- /dev/null +++ b/_generated/DecryptFileV1/Strings/resources.resjson/ru-RU/resources.resjson @@ -0,0 +1,19 @@ +{ + "loc.friendlyName": "Расшифровка файла (OpenSSL)", + "loc.helpMarkDown": "", + "loc.description": "Расшифровка файла с помощью OpenSSL", + "loc.instanceNameFormat": "Расшифровать $(inFile)", + "loc.group.displayName.advanced": "Дополнительно", + "loc.input.label.cipher": "Шифрование", + "loc.input.help.cipher": "Шифрование, которое следует использовать. Полный список возможных значений см. в разделе [Сipher Suite Names (имена наборов шифрования)] (https://go.microsoft.com/fwlink/?LinkID=627129).", + "loc.input.label.inFile": "Зашифрованный файл", + "loc.input.help.inFile": "Относительный путь к файлу для расшифровки.", + "loc.input.label.passphrase": "Парольная фраза", + "loc.input.help.passphrase": "Парольная фраза, используемая для расшифровки. **Используйте переменную для шифрования парольной фразы.**", + "loc.input.label.outFile": "Путь к расшифрованному файлу", + "loc.input.help.outFile": "Необязательное имя файла для расшифрованного файла. Значение по умолчанию — зашифрованный файл с расширением .out.", + "loc.input.label.cwd": "Рабочий каталог", + "loc.input.help.cwd": "Рабочая папка для расшифровки. Значение по умолчанию — корень репозитория.", + "loc.messages.OpenSSLReturnCode": "openssl завершила работу с кодом возврата: %d", + "loc.messages.OpenSSLFailed": "Сбой openssl с ошибкой %s" +} \ No newline at end of file diff --git a/_generated/DecryptFileV1/Strings/resources.resjson/zh-CN/resources.resjson b/_generated/DecryptFileV1/Strings/resources.resjson/zh-CN/resources.resjson new file mode 100644 index 000000000000..68c8375107a1 --- /dev/null +++ b/_generated/DecryptFileV1/Strings/resources.resjson/zh-CN/resources.resjson @@ -0,0 +1,19 @@ +{ + "loc.friendlyName": "解密文件(OpenSSL)", + "loc.helpMarkDown": "", + "loc.description": "使用 OpenSSL 解密文件", + "loc.instanceNameFormat": "解密 $(inFile)", + "loc.group.displayName.advanced": "高级", + "loc.input.label.cipher": "密码", + "loc.input.help.cipher": "要使用的加密密码。有关可能的值的完整列表,请参阅 [密码组名称](https://go.microsoft.com/fwlink/?LinkID=627129)。", + "loc.input.label.inFile": "已加密文件", + "loc.input.help.inFile": "要解密的文件的相对路径。", + "loc.input.label.passphrase": "密码", + "loc.input.help.passphrase": "将用于解密的密码。**使用一个变量对密码加密。**", + "loc.input.label.outFile": "已解密文件的路径", + "loc.input.help.outFile": "已解密文件的可选文件名。默认为使用 \".out\" 作为扩展名的已加密文件", + "loc.input.label.cwd": "工作目录", + "loc.input.help.cwd": "用于解密的工作目录。默认为存储库的根目录。", + "loc.messages.OpenSSLReturnCode": "openssl 已退出,返回代码为: %d", + "loc.messages.OpenSSLFailed": "openssl 失败,出现错误: %s" +} \ No newline at end of file diff --git a/_generated/DecryptFileV1/Strings/resources.resjson/zh-TW/resources.resjson b/_generated/DecryptFileV1/Strings/resources.resjson/zh-TW/resources.resjson new file mode 100644 index 000000000000..95713ac3e438 --- /dev/null +++ b/_generated/DecryptFileV1/Strings/resources.resjson/zh-TW/resources.resjson @@ -0,0 +1,19 @@ +{ + "loc.friendlyName": "解密檔案 (OpenSSL)", + "loc.helpMarkDown": "", + "loc.description": "使用 OpenSSL 解密檔案", + "loc.instanceNameFormat": "解密 $(inFile)", + "loc.group.displayName.advanced": "進階", + "loc.input.label.cipher": "Cypher", + "loc.input.help.cipher": "要使用的加密 Cypher。如需完整的可能值清單,請參閱 [Cypher 套件名稱](https://go.microsoft.com/fwlink/?LinkID=627129)。", + "loc.input.label.inFile": "加密的檔案", + "loc.input.help.inFile": "要解密的檔案相對路徑。", + "loc.input.label.passphrase": "複雜密碼", + "loc.input.help.passphrase": "用於解密的複雜密碼。**使用變數來加密複雜密碼。**", + "loc.input.label.outFile": "解密的檔案路徑", + "loc.input.help.outFile": "解密檔案的選擇性檔名。預設值為具副檔名 \".out\" 的加密檔案。", + "loc.input.label.cwd": "工作目錄", + "loc.input.help.cwd": "解密的工作目錄。預設值為存放庫的根目錄。", + "loc.messages.OpenSSLReturnCode": "openssl 結束,傳回碼為: %d", + "loc.messages.OpenSSLFailed": "openssl 失敗,發生錯誤: %s" +} \ No newline at end of file diff --git a/_generated/DecryptFileV1/Tests/L0.ts b/_generated/DecryptFileV1/Tests/L0.ts new file mode 100644 index 000000000000..149972c0660d --- /dev/null +++ b/_generated/DecryptFileV1/Tests/L0.ts @@ -0,0 +1,38 @@ +import * as mocktest from 'azure-pipelines-task-lib/mock-test'; +import fs = require('fs'); +import assert = require('assert'); +import path = require('path'); + +describe('DecryptFileV1 Suite', function () { + this.timeout(parseInt(process.env.TASK_TEST_TIMEOUT) || 20000); + + function runValidations(validator: () => void, tr, done) { + try { + validator(); + done(); + } + catch (error) { + console.log("STDERR", tr.stderr); + console.log("STDOUT", tr.stdout); + done(error); + } + } + + it('Successfully decrypt file', (done: Mocha.Done) => { + this.timeout(1000); + + process.env['cipher'] = 'des3'; + process.env['inFile'] = 'encryptedTestFile.txt'; + process.env['outFile'] = 'decryptedTestFile.txt'; + process.env['passphrase'] = 'very-secret-password'; + + let tp: string = path.join(__dirname, 'L0DecryptFile.js'); + let tr: mocktest.MockTestRunner = new mocktest.MockTestRunner(tp); + + tr.run(); + + runValidations(() => { + assert(tr.stdout.indexOf('decrypted test file') > -1); + }, tr, done); + }); +}); diff --git a/_generated/DecryptFileV1/Tests/L0DecryptFile.ts b/_generated/DecryptFileV1/Tests/L0DecryptFile.ts new file mode 100644 index 000000000000..b2c36e7abb4a --- /dev/null +++ b/_generated/DecryptFileV1/Tests/L0DecryptFile.ts @@ -0,0 +1,32 @@ +import mockanswer = require('azure-pipelines-task-lib/mock-answer'); +import mockrun = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'decrypt.js'); +let runner: mockrun.TaskMockRunner = new mockrun.TaskMockRunner(taskPath); + +process.env['SYSTEM_DEFAULTWORKINGDIRECTORY'] = __dirname; + +runner.setInput('cipher', process.env['cipher']); +runner.setInput('inFile', process.env['inFile']); +runner.setInput('outFile', process.env['outFile']); +runner.setInput('passphrase', process.env['passphrase']); + +let a: mockanswer.TaskLibAnswers = { + 'exec': { + "path/to/openssl des3 -d -in encryptedTestFile.txt -out decryptedTestFile.txt -pass pass:very-secret-password": { + "code": 0, + "stdout": "decrypted test file" + } + }, + 'which': { + 'openssl': 'path/to/openssl', + }, + 'checkPath': { + 'path/to/openssl': true + } +}; + +runner.setAnswers(a); + +runner.run(); diff --git a/_generated/DecryptFileV1/Tests/package-lock.json b/_generated/DecryptFileV1/Tests/package-lock.json new file mode 100644 index 000000000000..3063ff7186f4 --- /dev/null +++ b/_generated/DecryptFileV1/Tests/package-lock.json @@ -0,0 +1,14 @@ +{ + "name": "decrypt-file-tests", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/mocha": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", + "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==", + "dev": true + } + } +} diff --git a/_generated/DecryptFileV1/Tests/package.json b/_generated/DecryptFileV1/Tests/package.json new file mode 100644 index 000000000000..28f03b6fd07b --- /dev/null +++ b/_generated/DecryptFileV1/Tests/package.json @@ -0,0 +1,22 @@ +{ + "name": "decrypt-file-tests", + "version": "1.0.0", + "description": "Azure Pipelines Decrypt File V1 Task Tests", + "main": "L0.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/Microsoft/azure-pipelines-tasks.git" + }, + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Microsoft/azure-pipelines-tasks/issues" + }, + "homepage": "https://github.com/Microsoft/azure-pipelines-tasks#readme", + "devDependencies": { + "@types/mocha": "^5.2.0" + } +} diff --git a/_generated/DecryptFileV1/decrypt.ts b/_generated/DecryptFileV1/decrypt.ts new file mode 100644 index 000000000000..8449e9a9c63c --- /dev/null +++ b/_generated/DecryptFileV1/decrypt.ts @@ -0,0 +1,39 @@ +import fs = require('fs'); +import path = require('path'); +import tl = require('azure-pipelines-task-lib/task'); +import trm = require('azure-pipelines-task-lib/toolrunner'); + +async function run() { + try { + tl.setResourcePath(path.join(__dirname, "task.json")); + + //Process working directory + var cwd = tl.getInput('cwd') || tl.getVariable('System.DefaultWorkingDirectory'); + tl.cd(cwd); + + var openssl: trm.ToolRunner = tl.tool(tl.which('openssl', true)); + openssl.arg(tl.getInput('cipher', true)); + + var inFile = tl.getInput('inFile', true); + openssl.arg(['-d', '-in', inFile]); + openssl.arg('-out'); + + var outFile = tl.getPathInput('outFile', false); + if(fs.existsSync(outFile) && fs.lstatSync(outFile).isDirectory()) { + openssl.arg(inFile + '.out'); + } else { + openssl.arg(outFile); + } + + openssl.arg(['-pass','pass:' + tl.getInput('passphrase')]); + + var code: number = await openssl.exec(); + tl.setResult(tl.TaskResult.Succeeded, tl.loc('OpenSSLReturnCode', code)); + } + catch(err) { + tl.error(err.message); + tl.setResult(tl.TaskResult.Failed, tl.loc('OpenSSLFailed', err.message)); + } +} + +run(); diff --git a/_generated/DecryptFileV1/icon.png b/_generated/DecryptFileV1/icon.png new file mode 100644 index 000000000000..21604bb358b9 Binary files /dev/null and b/_generated/DecryptFileV1/icon.png differ diff --git a/_generated/DecryptFileV1/icon.svg b/_generated/DecryptFileV1/icon.svg new file mode 100644 index 000000000000..84d629de599c --- /dev/null +++ b/_generated/DecryptFileV1/icon.svg @@ -0,0 +1,4 @@ + + + + diff --git a/_generated/DecryptFileV1/package-lock.json b/_generated/DecryptFileV1/package-lock.json new file mode 100644 index 000000000000..e0b9ee00d333 --- /dev/null +++ b/_generated/DecryptFileV1/package-lock.json @@ -0,0 +1,488 @@ +{ + "name": "vsts-decrypt-task", + "version": "1.0.1", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/concat-stream": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz", + "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==", + "requires": { + "@types/node": "*" + } + }, + "@types/form-data": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", + "integrity": "sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==", + "requires": { + "@types/node": "*" + } + }, + "@types/mocha": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", + "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==" + }, + "@types/node": { + "version": "16.11.58", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.58.tgz", + "integrity": "sha512-uMVxJ111wpHzkx/vshZFb6Qni3BOMnlWLq7q9jrwej7Yw/KvjsEbpxCCxw+hLKxexFMc8YmpG8J9tnEe/rKsIg==" + }, + "@types/q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.1.tgz", + "integrity": "sha512-eqz8c/0kwNi/OEHQfvIuJVLTst3in0e7uTKeuY+WL/zfKn0xVujOTp42bS/vUUokhK5P2BppLd9JXMOMHcgbjA==" + }, + "@types/qs": { + "version": "6.9.8", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.8.tgz", + "integrity": "sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg==" + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "azure-pipelines-task-lib": { + "version": "5.0.0-preview.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-5.0.0-preview.0.tgz", + "integrity": "sha512-uQJEv+q3/7RD7kgphFd33uXijaPwA1ePYoNkAgZpUhbZUtc2u4JL4ujTT/JJfgXBNW/QQNAiDQ2OC7vOQG/0tg==", + "requires": { + "minimatch": "3.0.5", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "sync-request": "6.1.0", + "uuid": "^3.0.1" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, + "form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + } + }, + "get-port": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", + "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==" + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "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" + }, + "dependencies": { + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==" + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "http-basic": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", + "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", + "requires": { + "caseless": "^0.12.0", + "concat-stream": "^1.6.2", + "http-response-object": "^3.0.1", + "parse-cache-control": "^1.0.1" + } + }, + "http-response-object": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", + "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", + "requires": { + "@types/node": "^10.0.3" + }, + "dependencies": { + "@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + } + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" + }, + "is-core-module": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "requires": { + "has": "^1.0.3" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, + "parse-cache-control": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", + "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "promise": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", + "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", + "requires": { + "asap": "~2.0.6" + } + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==" + }, + "qs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "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" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "requires": { + "resolve": "^1.1.6" + } + }, + "resolve": { + "version": "1.22.6", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.6.tgz", + "integrity": "sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==", + "requires": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" + }, + "shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, + "sync-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", + "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==", + "requires": { + "http-response-object": "^3.0.1", + "sync-rpc": "^1.2.1", + "then-request": "^6.0.0" + } + }, + "sync-rpc": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz", + "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==", + "requires": { + "get-port": "^3.1.0" + } + }, + "then-request": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", + "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", + "requires": { + "@types/concat-stream": "^1.6.0", + "@types/form-data": "0.0.33", + "@types/node": "^8.0.0", + "@types/qs": "^6.2.31", + "caseless": "~0.12.0", + "concat-stream": "^1.6.0", + "form-data": "^2.2.0", + "http-basic": "^8.1.1", + "http-response-object": "^3.0.1", + "promise": "^8.0.0", + "qs": "^6.4.0" + }, + "dependencies": { + "@types/node": { + "version": "8.10.66", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", + "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==" + } + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, + "typescript": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.2.tgz", + "integrity": "sha512-e4ERvRV2wb+rRZ/IQeb3jm2VxBsirQLpQhdxplZ2MEzGvDkkMmPglecnNDfSUBivMjP93vRbngYYDQqQ/78bcQ==", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + } + } +} diff --git a/_generated/DecryptFileV1/package.json b/_generated/DecryptFileV1/package.json new file mode 100644 index 000000000000..0a24f56fbf93 --- /dev/null +++ b/_generated/DecryptFileV1/package.json @@ -0,0 +1,28 @@ +{ + "name": "vsts-decrypt-task", + "version": "1.0.1", + "description": "Azure Pipelines Decrypt Task", + "main": "decrypt.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/Microsoft/azure-pipelines-tasks.git" + }, + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Microsoft/azure-pipelines-tasks/issues" + }, + "homepage": "https://github.com/Microsoft/azure-pipelines-tasks#readme", + "dependencies": { + "@types/node": "^16.11.39", + "@types/mocha": "^5.2.7", + "@types/q": "^1.0.7", + "azure-pipelines-task-lib": "^5.0.0-preview.0" + }, + "devDependencies": { + "typescript": "4.0.2" + } +} diff --git a/_generated/DecryptFileV1/task.json b/_generated/DecryptFileV1/task.json new file mode 100644 index 000000000000..f3afc1e56a1e --- /dev/null +++ b/_generated/DecryptFileV1/task.json @@ -0,0 +1,101 @@ +{ + "id": "7C6A6b71-4355-4AFC-A274-480EAB5678E9", + "name": "DecryptFile", + "friendlyName": "Decrypt file (OpenSSL)", + "description": "Decrypt a file using OpenSSL", + "helpUrl": "https://docs.microsoft.com/azure/devops/pipelines/tasks/utility/decrypt-file", + "helpMarkDown": "", + "category": "Utility", + "visibility": [ + "Build", + "Release" + ], + "runsOn": [ + "Agent", + "DeploymentGroup" + ], + "author": "Microsoft Corporation", + "version": { + "Major": 1, + "Minor": 229, + "Patch": 0 + }, + "minimumAgentVersion": "2.182.1", + "groups": [ + { + "name": "advanced", + "displayName": "Advanced", + "isExpanded": false + } + ], + "instanceNameFormat": "Decrypt $(inFile)", + "inputs": [ + { + "name": "cipher", + "type": "string", + "label": "Cypher", + "defaultValue": "des3", + "required": true, + "helpMarkDown": "Encryption cypher to use. See [cypher suite names](https://go.microsoft.com/fwlink/?LinkID=627129) for a complete list of possible values." + }, + { + "name": "inFile", + "type": "filePath", + "label": "Encrypted file", + "required": true, + "helpMarkDown": "Relative path of file to decrypt." + }, + { + "name": "passphrase", + "type": "string", + "label": "Passphrase", + "required": true, + "helpMarkDown": "Passphrase to use for decryption. **Use a Variable to encrypt the passphrase.**" + }, + { + "name": "outFile", + "type": "filePath", + "label": "Decrypted file path", + "required": false, + "helpMarkDown": "Optional filename for decrypted file. Defaults to the Encrypted File with a \".out\" extension" + }, + { + "name": "cwd", + "aliases": [ + "workingDirectory" + ], + "type": "filePath", + "label": "Working directory", + "defaultValue": "", + "required": false, + "helpMarkDown": "Working directory for decryption. Defaults to the root of the repository.", + "groupName": "advanced" + } + ], + "execution": { + "Node10": { + "target": "decrypt.js", + "argumentFormat": "" + }, + "Node16": { + "target": "decrypt.js", + "argumentFormat": "" + } + }, + "restrictions": { + "commands": { + "mode": "restricted" + }, + "settableVariables": { + "allowed": [] + } + }, + "messages": { + "OpenSSLReturnCode": "openssl exited with return code: %d", + "OpenSSLFailed": "openssl failed with error: %s" + }, + "_buildConfigMapping": { + "Default": "1.229.0", + "Node20-225": "1.229.1" + } +} \ No newline at end of file diff --git a/_generated/DecryptFileV1/task.loc.json b/_generated/DecryptFileV1/task.loc.json new file mode 100644 index 000000000000..097c44bd976f --- /dev/null +++ b/_generated/DecryptFileV1/task.loc.json @@ -0,0 +1,101 @@ +{ + "id": "7C6A6b71-4355-4AFC-A274-480EAB5678E9", + "name": "DecryptFile", + "friendlyName": "ms-resource:loc.friendlyName", + "description": "ms-resource:loc.description", + "helpUrl": "https://docs.microsoft.com/azure/devops/pipelines/tasks/utility/decrypt-file", + "helpMarkDown": "ms-resource:loc.helpMarkDown", + "category": "Utility", + "visibility": [ + "Build", + "Release" + ], + "runsOn": [ + "Agent", + "DeploymentGroup" + ], + "author": "Microsoft Corporation", + "version": { + "Major": 1, + "Minor": 229, + "Patch": 0 + }, + "minimumAgentVersion": "2.182.1", + "groups": [ + { + "name": "advanced", + "displayName": "ms-resource:loc.group.displayName.advanced", + "isExpanded": false + } + ], + "instanceNameFormat": "ms-resource:loc.instanceNameFormat", + "inputs": [ + { + "name": "cipher", + "type": "string", + "label": "ms-resource:loc.input.label.cipher", + "defaultValue": "des3", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.cipher" + }, + { + "name": "inFile", + "type": "filePath", + "label": "ms-resource:loc.input.label.inFile", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.inFile" + }, + { + "name": "passphrase", + "type": "string", + "label": "ms-resource:loc.input.label.passphrase", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.passphrase" + }, + { + "name": "outFile", + "type": "filePath", + "label": "ms-resource:loc.input.label.outFile", + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.outFile" + }, + { + "name": "cwd", + "aliases": [ + "workingDirectory" + ], + "type": "filePath", + "label": "ms-resource:loc.input.label.cwd", + "defaultValue": "", + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.cwd", + "groupName": "advanced" + } + ], + "execution": { + "Node10": { + "target": "decrypt.js", + "argumentFormat": "" + }, + "Node16": { + "target": "decrypt.js", + "argumentFormat": "" + } + }, + "restrictions": { + "commands": { + "mode": "restricted" + }, + "settableVariables": { + "allowed": [] + } + }, + "messages": { + "OpenSSLReturnCode": "ms-resource:loc.messages.OpenSSLReturnCode", + "OpenSSLFailed": "ms-resource:loc.messages.OpenSSLFailed" + }, + "_buildConfigMapping": { + "Default": "1.229.0", + "Node20-225": "1.229.1" + } +} \ No newline at end of file diff --git a/_generated/DecryptFileV1/tsconfig.json b/_generated/DecryptFileV1/tsconfig.json new file mode 100644 index 000000000000..0438b79f69ac --- /dev/null +++ b/_generated/DecryptFileV1/tsconfig.json @@ -0,0 +1,6 @@ +{ + "compilerOptions": { + "target": "ES6", + "module": "commonjs" + } +} \ No newline at end of file diff --git a/_generated/DecryptFileV1_Node20/.npmrc b/_generated/DecryptFileV1_Node20/.npmrc new file mode 100644 index 000000000000..5fca0d518be7 --- /dev/null +++ b/_generated/DecryptFileV1_Node20/.npmrc @@ -0,0 +1 @@ +scripts-prepend-node-path=true diff --git a/_generated/DecryptFileV1_Node20/Strings/resources.resjson/de-DE/resources.resjson b/_generated/DecryptFileV1_Node20/Strings/resources.resjson/de-DE/resources.resjson new file mode 100644 index 000000000000..13d9d730eb41 --- /dev/null +++ b/_generated/DecryptFileV1_Node20/Strings/resources.resjson/de-DE/resources.resjson @@ -0,0 +1,19 @@ +{ + "loc.friendlyName": "Datei entschlüsseln (OpenSSL)", + "loc.helpMarkDown": "", + "loc.description": "Hiermit wird eine Datei mit OpenSSL entschlüsselt.", + "loc.instanceNameFormat": "Entschlüsseln $(inFile)", + "loc.group.displayName.advanced": "Erweitert", + "loc.input.label.cipher": "Verschlüsselungsverfahren", + "loc.input.help.cipher": "Das zu verwendenden Verschlüsselungsverfahren. Eine vollständige Liste der möglichen Werte finden Sie unter \"[Cipher Suite Names](https://go.microsoft.com/fwlink/?LinkID=627129)\".", + "loc.input.label.inFile": "Verschlüsselte Datei", + "loc.input.help.inFile": "Der relative Pfad der zu entschlüsselnden Datei.", + "loc.input.label.passphrase": "Passphrase", + "loc.input.help.passphrase": "Die Passphrase, die für die Entschlüsselung verwendet werden soll. **Verwenden Sie eine Variable zum Verschlüsseln der Passphrase.**", + "loc.input.label.outFile": "Entschlüsselter Dateipfad", + "loc.input.help.outFile": "Der optionale Dateiname für die entschlüsselte Datei. Standardmäßig wird der Name der verschlüsselten Datei mit der Erweiterung \"OUT\" verwendet.", + "loc.input.label.cwd": "Arbeitsverzeichnis", + "loc.input.help.cwd": "Das Arbeitsverzeichnis für die Entschlüsselung. Standardmäßig wird der Stamm des Repositorys verwendet.", + "loc.messages.OpenSSLReturnCode": "openssl wurde mit dem folgenden Rückgabecode beendet: %d", + "loc.messages.OpenSSLFailed": "openssl-Fehler: %s" +} \ No newline at end of file diff --git a/_generated/DecryptFileV1_Node20/Strings/resources.resjson/en-US/resources.resjson b/_generated/DecryptFileV1_Node20/Strings/resources.resjson/en-US/resources.resjson new file mode 100644 index 000000000000..6c4c4afa9a5f --- /dev/null +++ b/_generated/DecryptFileV1_Node20/Strings/resources.resjson/en-US/resources.resjson @@ -0,0 +1,19 @@ +{ + "loc.friendlyName": "Decrypt file (OpenSSL)", + "loc.helpMarkDown": "", + "loc.description": "Decrypt a file using OpenSSL", + "loc.instanceNameFormat": "Decrypt $(inFile)", + "loc.group.displayName.advanced": "Advanced", + "loc.input.label.cipher": "Cypher", + "loc.input.help.cipher": "Encryption cypher to use. See [cypher suite names](https://go.microsoft.com/fwlink/?LinkID=627129) for a complete list of possible values.", + "loc.input.label.inFile": "Encrypted file", + "loc.input.help.inFile": "Relative path of file to decrypt.", + "loc.input.label.passphrase": "Passphrase", + "loc.input.help.passphrase": "Passphrase to use for decryption. **Use a Variable to encrypt the passphrase.**", + "loc.input.label.outFile": "Decrypted file path", + "loc.input.help.outFile": "Optional filename for decrypted file. Defaults to the Encrypted File with a \".out\" extension", + "loc.input.label.cwd": "Working directory", + "loc.input.help.cwd": "Working directory for decryption. Defaults to the root of the repository.", + "loc.messages.OpenSSLReturnCode": "openssl exited with return code: %d", + "loc.messages.OpenSSLFailed": "openssl failed with error: %s" +} \ No newline at end of file diff --git a/_generated/DecryptFileV1_Node20/Strings/resources.resjson/es-ES/resources.resjson b/_generated/DecryptFileV1_Node20/Strings/resources.resjson/es-ES/resources.resjson new file mode 100644 index 000000000000..d3440c8661a7 --- /dev/null +++ b/_generated/DecryptFileV1_Node20/Strings/resources.resjson/es-ES/resources.resjson @@ -0,0 +1,19 @@ +{ + "loc.friendlyName": "Descifrar archivo (OpenSSL)", + "loc.helpMarkDown": "", + "loc.description": "Descifra un archivo con OpenSSL.", + "loc.instanceNameFormat": "Descifrar $(inFile)", + "loc.group.displayName.advanced": "Avanzado", + "loc.input.label.cipher": "Cifrado", + "loc.input.help.cipher": "Cifrados disponibles para su uso. Consulte [nombres de conjuntos de cifrado](https://go.microsoft.com/fwlink/?LinkID=627129) para obtener una lista completa de los posibles valores.", + "loc.input.label.inFile": "Archivo cifrado", + "loc.input.help.inFile": "Ruta relativa del archivo que se va a descifrar.", + "loc.input.label.passphrase": "Frase de contraseña", + "loc.input.help.passphrase": "Frase de contraseña que se usará para el descifrado. **Use una variable para cifrar la frase de contraseña.**", + "loc.input.label.outFile": "Ruta de acceso del archivo descifrado", + "loc.input.help.outFile": "Nombre de archivo opcional para el archivo descifrado. Se establece de manera predeterminada con el nombre del archivo cifrado y la extensión \".out\"", + "loc.input.label.cwd": "Directorio de trabajo", + "loc.input.help.cwd": "Directorio de trabajo para el descifrado. Se establece de manera predeterminada en la raíz del repositorio.", + "loc.messages.OpenSSLReturnCode": "Se cerró openssl con el código de devolución: %d", + "loc.messages.OpenSSLFailed": "Error de openssl: %s" +} \ No newline at end of file diff --git a/_generated/DecryptFileV1_Node20/Strings/resources.resjson/fr-FR/resources.resjson b/_generated/DecryptFileV1_Node20/Strings/resources.resjson/fr-FR/resources.resjson new file mode 100644 index 000000000000..832ef0906f72 --- /dev/null +++ b/_generated/DecryptFileV1_Node20/Strings/resources.resjson/fr-FR/resources.resjson @@ -0,0 +1,19 @@ +{ + "loc.friendlyName": "Déchiffrer un fichier (OpenSSL)", + "loc.helpMarkDown": "", + "loc.description": "Déchiffrer un fichier à l'aide d'OpenSSL", + "loc.instanceNameFormat": "Déchiffrer $(inFile)", + "loc.group.displayName.advanced": "Avancé", + "loc.input.label.cipher": "Code", + "loc.input.help.cipher": "Code de chiffrement à utiliser. Consultez [cipher suite names](https://go.microsoft.com/fwlink/?LinkID=627129) pour obtenir une liste complète des valeurs possibles.", + "loc.input.label.inFile": "Fichier chiffré", + "loc.input.help.inFile": "Chemin relatif du fichier à déchiffrer.", + "loc.input.label.passphrase": "Phrase secrète", + "loc.input.help.passphrase": "Phrase secrète à utiliser pour le déchiffrement. **Utilisez une variable pour chiffrer la phrase secrète.**", + "loc.input.label.outFile": "Chemin du fichier déchiffré", + "loc.input.help.outFile": "Nom facultatif du fichier déchiffré. Le nom par défaut est celui du fichier chiffré avec une extension \".out\"", + "loc.input.label.cwd": "Répertoire de travail", + "loc.input.help.cwd": "Répertoire de travail pour le déchiffrement. Le répertoire par défaut est la racine du dépôt.", + "loc.messages.OpenSSLReturnCode": "Sortie de openssl avec le code de retour : %d", + "loc.messages.OpenSSLFailed": "Échec de openssl avec l'erreur : %s" +} \ No newline at end of file diff --git a/_generated/DecryptFileV1_Node20/Strings/resources.resjson/it-IT/resources.resjson b/_generated/DecryptFileV1_Node20/Strings/resources.resjson/it-IT/resources.resjson new file mode 100644 index 000000000000..b856a7889c5e --- /dev/null +++ b/_generated/DecryptFileV1_Node20/Strings/resources.resjson/it-IT/resources.resjson @@ -0,0 +1,19 @@ +{ + "loc.friendlyName": "Decrittografa file (OpenSSL)", + "loc.helpMarkDown": "", + "loc.description": "Decrittografa un file con OpenSSL", + "loc.instanceNameFormat": "Decrittografa $(inFile)", + "loc.group.displayName.advanced": "Avanzate", + "loc.input.label.cipher": "Crittografia", + "loc.input.help.cipher": "Tipo di crittografia da usare. Per un elenco completo dei possibili valori, vedere la pagina relativa ai [nomi della famiglia di opzioni per cipher](https://go.microsoft.com/fwlink/?LinkID=627129).", + "loc.input.label.inFile": "File crittografato", + "loc.input.help.inFile": "Percorso relativo del file da decrittografare.", + "loc.input.label.passphrase": "Passphrase", + "loc.input.help.passphrase": "Passphrase da usare per la decrittografia. **Usare una variabile per decrittografare la passphrase.**", + "loc.input.label.outFile": "Percorso del file decrittografato", + "loc.input.help.outFile": "Nome file facoltativo del file decrittografato. L'impostazione predefinita è il nome del file crittografato con un'estensione \"out\"", + "loc.input.label.cwd": "Directory di lavoro", + "loc.input.help.cwd": "Directory di lavoro per la decrittografia. L'impostazione predefinita è la radice del repository.", + "loc.messages.OpenSSLReturnCode": "Il comando openssl è stato terminato. Codice restituito: %d", + "loc.messages.OpenSSLFailed": "Il comando openssl non è riuscito. Errore: %s" +} \ No newline at end of file diff --git a/_generated/DecryptFileV1_Node20/Strings/resources.resjson/ja-JP/resources.resjson b/_generated/DecryptFileV1_Node20/Strings/resources.resjson/ja-JP/resources.resjson new file mode 100644 index 000000000000..16fb9e89df6f --- /dev/null +++ b/_generated/DecryptFileV1_Node20/Strings/resources.resjson/ja-JP/resources.resjson @@ -0,0 +1,19 @@ +{ + "loc.friendlyName": "ファイルの暗号化解除 (OpenSSL)", + "loc.helpMarkDown": "", + "loc.description": "OpenSSL を使用してファイルの暗号化を解除します", + "loc.instanceNameFormat": "暗号化解除 $(inFile)", + "loc.group.displayName.advanced": "詳細設定", + "loc.input.label.cipher": "暗号", + "loc.input.help.cipher": "暗号化に使用する暗号。使用可能な値の一覧については、[cypher suite names](https://go.microsoft.com/fwlink/?LinkID=627129) を参照してください。", + "loc.input.label.inFile": "暗号化されたファイル", + "loc.input.help.inFile": "暗号化解除するファイルの相対パス。", + "loc.input.label.passphrase": "パスフレーズ", + "loc.input.help.passphrase": "暗号化解除に使用するパスフレーズ。**変数を使用してパスフレーズを暗号化します。**", + "loc.input.label.outFile": "暗号化解除されたファイル パス", + "loc.input.help.outFile": "暗号化解除されているファイルのファイル名 (省略可能)。既定値は暗号化ファイルの拡張子を \".out\" にしたものです。", + "loc.input.label.cwd": "作業ディレクトリ", + "loc.input.help.cwd": "暗号化解除の作業ディレクトリ。既定値はリポジトリのルートです。", + "loc.messages.OpenSSLReturnCode": "openssl が次のリターン コードで終了しました: %d", + "loc.messages.OpenSSLFailed": "openssl に失敗し、次のエラーが発生しました: %s" +} \ No newline at end of file diff --git a/_generated/DecryptFileV1_Node20/Strings/resources.resjson/ko-KR/resources.resjson b/_generated/DecryptFileV1_Node20/Strings/resources.resjson/ko-KR/resources.resjson new file mode 100644 index 000000000000..ee5546bf3c2e --- /dev/null +++ b/_generated/DecryptFileV1_Node20/Strings/resources.resjson/ko-KR/resources.resjson @@ -0,0 +1,19 @@ +{ + "loc.friendlyName": "파일 암호 해독(OpenSSL)", + "loc.helpMarkDown": "", + "loc.description": "OpenSSL을 사용하여 파일 암호를 해독합니다.", + "loc.instanceNameFormat": "$(inFile) 암호 해독", + "loc.group.displayName.advanced": "고급", + "loc.input.label.cipher": "암호", + "loc.input.help.cipher": "사용할 암호화 암호입니다. 가능한 값의 전체 목록은 [암호 제품군 이름](https://go.microsoft.com/fwlink/?LinkID=627129)을 참조하세요.", + "loc.input.label.inFile": "암호화된 파일", + "loc.input.help.inFile": "암호 해독할 파일의 상대 경로입니다.", + "loc.input.label.passphrase": "암호", + "loc.input.help.passphrase": "암호 해독에 사용할 암호입니다. **암호를 암호화하려면 변수를 사용하세요.**", + "loc.input.label.outFile": "암호 해독된 파일 경로", + "loc.input.help.outFile": "암호 해독된 파일의 선택적 파일 이름입니다. 기본값은 확장명이 \".out\"인 암호화된 파일입니다.", + "loc.input.label.cwd": "작업 디렉터리", + "loc.input.help.cwd": "암호 해독에 사용할 작업 디렉터리입니다. 기본값은 리포지토리의 루트입니다.", + "loc.messages.OpenSSLReturnCode": "OpenSSL이 종료되었습니다(반환 코드: %d).", + "loc.messages.OpenSSLFailed": "OpenSSL이 실패했습니다(오류: %s)." +} \ No newline at end of file diff --git a/_generated/DecryptFileV1_Node20/Strings/resources.resjson/ru-RU/resources.resjson b/_generated/DecryptFileV1_Node20/Strings/resources.resjson/ru-RU/resources.resjson new file mode 100644 index 000000000000..86e17b6c1ea3 --- /dev/null +++ b/_generated/DecryptFileV1_Node20/Strings/resources.resjson/ru-RU/resources.resjson @@ -0,0 +1,19 @@ +{ + "loc.friendlyName": "Расшифровка файла (OpenSSL)", + "loc.helpMarkDown": "", + "loc.description": "Расшифровка файла с помощью OpenSSL", + "loc.instanceNameFormat": "Расшифровать $(inFile)", + "loc.group.displayName.advanced": "Дополнительно", + "loc.input.label.cipher": "Шифрование", + "loc.input.help.cipher": "Шифрование, которое следует использовать. Полный список возможных значений см. в разделе [Сipher Suite Names (имена наборов шифрования)] (https://go.microsoft.com/fwlink/?LinkID=627129).", + "loc.input.label.inFile": "Зашифрованный файл", + "loc.input.help.inFile": "Относительный путь к файлу для расшифровки.", + "loc.input.label.passphrase": "Парольная фраза", + "loc.input.help.passphrase": "Парольная фраза, используемая для расшифровки. **Используйте переменную для шифрования парольной фразы.**", + "loc.input.label.outFile": "Путь к расшифрованному файлу", + "loc.input.help.outFile": "Необязательное имя файла для расшифрованного файла. Значение по умолчанию — зашифрованный файл с расширением .out.", + "loc.input.label.cwd": "Рабочий каталог", + "loc.input.help.cwd": "Рабочая папка для расшифровки. Значение по умолчанию — корень репозитория.", + "loc.messages.OpenSSLReturnCode": "openssl завершила работу с кодом возврата: %d", + "loc.messages.OpenSSLFailed": "Сбой openssl с ошибкой %s" +} \ No newline at end of file diff --git a/_generated/DecryptFileV1_Node20/Strings/resources.resjson/zh-CN/resources.resjson b/_generated/DecryptFileV1_Node20/Strings/resources.resjson/zh-CN/resources.resjson new file mode 100644 index 000000000000..68c8375107a1 --- /dev/null +++ b/_generated/DecryptFileV1_Node20/Strings/resources.resjson/zh-CN/resources.resjson @@ -0,0 +1,19 @@ +{ + "loc.friendlyName": "解密文件(OpenSSL)", + "loc.helpMarkDown": "", + "loc.description": "使用 OpenSSL 解密文件", + "loc.instanceNameFormat": "解密 $(inFile)", + "loc.group.displayName.advanced": "高级", + "loc.input.label.cipher": "密码", + "loc.input.help.cipher": "要使用的加密密码。有关可能的值的完整列表,请参阅 [密码组名称](https://go.microsoft.com/fwlink/?LinkID=627129)。", + "loc.input.label.inFile": "已加密文件", + "loc.input.help.inFile": "要解密的文件的相对路径。", + "loc.input.label.passphrase": "密码", + "loc.input.help.passphrase": "将用于解密的密码。**使用一个变量对密码加密。**", + "loc.input.label.outFile": "已解密文件的路径", + "loc.input.help.outFile": "已解密文件的可选文件名。默认为使用 \".out\" 作为扩展名的已加密文件", + "loc.input.label.cwd": "工作目录", + "loc.input.help.cwd": "用于解密的工作目录。默认为存储库的根目录。", + "loc.messages.OpenSSLReturnCode": "openssl 已退出,返回代码为: %d", + "loc.messages.OpenSSLFailed": "openssl 失败,出现错误: %s" +} \ No newline at end of file diff --git a/_generated/DecryptFileV1_Node20/Strings/resources.resjson/zh-TW/resources.resjson b/_generated/DecryptFileV1_Node20/Strings/resources.resjson/zh-TW/resources.resjson new file mode 100644 index 000000000000..95713ac3e438 --- /dev/null +++ b/_generated/DecryptFileV1_Node20/Strings/resources.resjson/zh-TW/resources.resjson @@ -0,0 +1,19 @@ +{ + "loc.friendlyName": "解密檔案 (OpenSSL)", + "loc.helpMarkDown": "", + "loc.description": "使用 OpenSSL 解密檔案", + "loc.instanceNameFormat": "解密 $(inFile)", + "loc.group.displayName.advanced": "進階", + "loc.input.label.cipher": "Cypher", + "loc.input.help.cipher": "要使用的加密 Cypher。如需完整的可能值清單,請參閱 [Cypher 套件名稱](https://go.microsoft.com/fwlink/?LinkID=627129)。", + "loc.input.label.inFile": "加密的檔案", + "loc.input.help.inFile": "要解密的檔案相對路徑。", + "loc.input.label.passphrase": "複雜密碼", + "loc.input.help.passphrase": "用於解密的複雜密碼。**使用變數來加密複雜密碼。**", + "loc.input.label.outFile": "解密的檔案路徑", + "loc.input.help.outFile": "解密檔案的選擇性檔名。預設值為具副檔名 \".out\" 的加密檔案。", + "loc.input.label.cwd": "工作目錄", + "loc.input.help.cwd": "解密的工作目錄。預設值為存放庫的根目錄。", + "loc.messages.OpenSSLReturnCode": "openssl 結束,傳回碼為: %d", + "loc.messages.OpenSSLFailed": "openssl 失敗,發生錯誤: %s" +} \ No newline at end of file diff --git a/_generated/DecryptFileV1_Node20/Tests/L0.ts b/_generated/DecryptFileV1_Node20/Tests/L0.ts new file mode 100644 index 000000000000..149972c0660d --- /dev/null +++ b/_generated/DecryptFileV1_Node20/Tests/L0.ts @@ -0,0 +1,38 @@ +import * as mocktest from 'azure-pipelines-task-lib/mock-test'; +import fs = require('fs'); +import assert = require('assert'); +import path = require('path'); + +describe('DecryptFileV1 Suite', function () { + this.timeout(parseInt(process.env.TASK_TEST_TIMEOUT) || 20000); + + function runValidations(validator: () => void, tr, done) { + try { + validator(); + done(); + } + catch (error) { + console.log("STDERR", tr.stderr); + console.log("STDOUT", tr.stdout); + done(error); + } + } + + it('Successfully decrypt file', (done: Mocha.Done) => { + this.timeout(1000); + + process.env['cipher'] = 'des3'; + process.env['inFile'] = 'encryptedTestFile.txt'; + process.env['outFile'] = 'decryptedTestFile.txt'; + process.env['passphrase'] = 'very-secret-password'; + + let tp: string = path.join(__dirname, 'L0DecryptFile.js'); + let tr: mocktest.MockTestRunner = new mocktest.MockTestRunner(tp); + + tr.run(); + + runValidations(() => { + assert(tr.stdout.indexOf('decrypted test file') > -1); + }, tr, done); + }); +}); diff --git a/_generated/DecryptFileV1_Node20/Tests/L0DecryptFile.ts b/_generated/DecryptFileV1_Node20/Tests/L0DecryptFile.ts new file mode 100644 index 000000000000..b2c36e7abb4a --- /dev/null +++ b/_generated/DecryptFileV1_Node20/Tests/L0DecryptFile.ts @@ -0,0 +1,32 @@ +import mockanswer = require('azure-pipelines-task-lib/mock-answer'); +import mockrun = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'decrypt.js'); +let runner: mockrun.TaskMockRunner = new mockrun.TaskMockRunner(taskPath); + +process.env['SYSTEM_DEFAULTWORKINGDIRECTORY'] = __dirname; + +runner.setInput('cipher', process.env['cipher']); +runner.setInput('inFile', process.env['inFile']); +runner.setInput('outFile', process.env['outFile']); +runner.setInput('passphrase', process.env['passphrase']); + +let a: mockanswer.TaskLibAnswers = { + 'exec': { + "path/to/openssl des3 -d -in encryptedTestFile.txt -out decryptedTestFile.txt -pass pass:very-secret-password": { + "code": 0, + "stdout": "decrypted test file" + } + }, + 'which': { + 'openssl': 'path/to/openssl', + }, + 'checkPath': { + 'path/to/openssl': true + } +}; + +runner.setAnswers(a); + +runner.run(); diff --git a/_generated/DecryptFileV1_Node20/Tests/package-lock.json b/_generated/DecryptFileV1_Node20/Tests/package-lock.json new file mode 100644 index 000000000000..3063ff7186f4 --- /dev/null +++ b/_generated/DecryptFileV1_Node20/Tests/package-lock.json @@ -0,0 +1,14 @@ +{ + "name": "decrypt-file-tests", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/mocha": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", + "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==", + "dev": true + } + } +} diff --git a/_generated/DecryptFileV1_Node20/Tests/package.json b/_generated/DecryptFileV1_Node20/Tests/package.json new file mode 100644 index 000000000000..28f03b6fd07b --- /dev/null +++ b/_generated/DecryptFileV1_Node20/Tests/package.json @@ -0,0 +1,22 @@ +{ + "name": "decrypt-file-tests", + "version": "1.0.0", + "description": "Azure Pipelines Decrypt File V1 Task Tests", + "main": "L0.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/Microsoft/azure-pipelines-tasks.git" + }, + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Microsoft/azure-pipelines-tasks/issues" + }, + "homepage": "https://github.com/Microsoft/azure-pipelines-tasks#readme", + "devDependencies": { + "@types/mocha": "^5.2.0" + } +} diff --git a/_generated/DecryptFileV1_Node20/decrypt.ts b/_generated/DecryptFileV1_Node20/decrypt.ts new file mode 100644 index 000000000000..8449e9a9c63c --- /dev/null +++ b/_generated/DecryptFileV1_Node20/decrypt.ts @@ -0,0 +1,39 @@ +import fs = require('fs'); +import path = require('path'); +import tl = require('azure-pipelines-task-lib/task'); +import trm = require('azure-pipelines-task-lib/toolrunner'); + +async function run() { + try { + tl.setResourcePath(path.join(__dirname, "task.json")); + + //Process working directory + var cwd = tl.getInput('cwd') || tl.getVariable('System.DefaultWorkingDirectory'); + tl.cd(cwd); + + var openssl: trm.ToolRunner = tl.tool(tl.which('openssl', true)); + openssl.arg(tl.getInput('cipher', true)); + + var inFile = tl.getInput('inFile', true); + openssl.arg(['-d', '-in', inFile]); + openssl.arg('-out'); + + var outFile = tl.getPathInput('outFile', false); + if(fs.existsSync(outFile) && fs.lstatSync(outFile).isDirectory()) { + openssl.arg(inFile + '.out'); + } else { + openssl.arg(outFile); + } + + openssl.arg(['-pass','pass:' + tl.getInput('passphrase')]); + + var code: number = await openssl.exec(); + tl.setResult(tl.TaskResult.Succeeded, tl.loc('OpenSSLReturnCode', code)); + } + catch(err) { + tl.error(err.message); + tl.setResult(tl.TaskResult.Failed, tl.loc('OpenSSLFailed', err.message)); + } +} + +run(); diff --git a/_generated/DecryptFileV1_Node20/icon.png b/_generated/DecryptFileV1_Node20/icon.png new file mode 100644 index 000000000000..21604bb358b9 Binary files /dev/null and b/_generated/DecryptFileV1_Node20/icon.png differ diff --git a/_generated/DecryptFileV1_Node20/icon.svg b/_generated/DecryptFileV1_Node20/icon.svg new file mode 100644 index 000000000000..84d629de599c --- /dev/null +++ b/_generated/DecryptFileV1_Node20/icon.svg @@ -0,0 +1,4 @@ + + + + diff --git a/_generated/DecryptFileV1_Node20/package-lock.json b/_generated/DecryptFileV1_Node20/package-lock.json new file mode 100644 index 000000000000..92a8c2bcf17b --- /dev/null +++ b/_generated/DecryptFileV1_Node20/package-lock.json @@ -0,0 +1,488 @@ +{ + "name": "vsts-decrypt-task", + "version": "1.0.1", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/concat-stream": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz", + "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==", + "requires": { + "@types/node": "*" + } + }, + "@types/form-data": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", + "integrity": "sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==", + "requires": { + "@types/node": "*" + } + }, + "@types/mocha": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", + "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==" + }, + "@types/node": { + "version": "20.7.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.7.0.tgz", + "integrity": "sha512-zI22/pJW2wUZOVyguFaUL1HABdmSVxpXrzIqkjsHmyUjNhPoWM1CKfvVuXfetHhIok4RY573cqS0mZ1SJEnoTg==" + }, + "@types/q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.1.tgz", + "integrity": "sha512-eqz8c/0kwNi/OEHQfvIuJVLTst3in0e7uTKeuY+WL/zfKn0xVujOTp42bS/vUUokhK5P2BppLd9JXMOMHcgbjA==" + }, + "@types/qs": { + "version": "6.9.8", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.8.tgz", + "integrity": "sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg==" + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "azure-pipelines-task-lib": { + "version": "5.0.0-preview.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-5.0.0-preview.0.tgz", + "integrity": "sha512-uQJEv+q3/7RD7kgphFd33uXijaPwA1ePYoNkAgZpUhbZUtc2u4JL4ujTT/JJfgXBNW/QQNAiDQ2OC7vOQG/0tg==", + "requires": { + "minimatch": "3.0.5", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "sync-request": "6.1.0", + "uuid": "^3.0.1" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, + "form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + } + }, + "get-port": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", + "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==" + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "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" + }, + "dependencies": { + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==" + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "http-basic": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", + "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", + "requires": { + "caseless": "^0.12.0", + "concat-stream": "^1.6.2", + "http-response-object": "^3.0.1", + "parse-cache-control": "^1.0.1" + } + }, + "http-response-object": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", + "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", + "requires": { + "@types/node": "^10.0.3" + }, + "dependencies": { + "@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + } + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" + }, + "is-core-module": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "requires": { + "has": "^1.0.3" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, + "parse-cache-control": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", + "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "promise": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", + "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", + "requires": { + "asap": "~2.0.6" + } + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==" + }, + "qs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "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" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "requires": { + "resolve": "^1.1.6" + } + }, + "resolve": { + "version": "1.22.6", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.6.tgz", + "integrity": "sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==", + "requires": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" + }, + "shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, + "sync-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", + "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==", + "requires": { + "http-response-object": "^3.0.1", + "sync-rpc": "^1.2.1", + "then-request": "^6.0.0" + } + }, + "sync-rpc": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz", + "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==", + "requires": { + "get-port": "^3.1.0" + } + }, + "then-request": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", + "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", + "requires": { + "@types/concat-stream": "^1.6.0", + "@types/form-data": "0.0.33", + "@types/node": "^8.0.0", + "@types/qs": "^6.2.31", + "caseless": "~0.12.0", + "concat-stream": "^1.6.0", + "form-data": "^2.2.0", + "http-basic": "^8.1.1", + "http-response-object": "^3.0.1", + "promise": "^8.0.0", + "qs": "^6.4.0" + }, + "dependencies": { + "@types/node": { + "version": "8.10.66", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", + "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==" + } + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, + "typescript": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + } + } +} diff --git a/_generated/DecryptFileV1_Node20/package.json b/_generated/DecryptFileV1_Node20/package.json new file mode 100644 index 000000000000..3ae85c9b340e --- /dev/null +++ b/_generated/DecryptFileV1_Node20/package.json @@ -0,0 +1,28 @@ +{ + "name": "vsts-decrypt-task", + "version": "1.0.1", + "description": "Azure Pipelines Decrypt Task", + "main": "decrypt.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/Microsoft/azure-pipelines-tasks.git" + }, + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Microsoft/azure-pipelines-tasks/issues" + }, + "homepage": "https://github.com/Microsoft/azure-pipelines-tasks#readme", + "dependencies": { + "@types/node": "^20.3.1", + "@types/mocha": "^5.2.7", + "@types/q": "^1.0.7", + "azure-pipelines-task-lib": "^5.0.0-preview.0" + }, + "devDependencies": { + "typescript": "5.1.6" + } +} diff --git a/_generated/DecryptFileV1_Node20/task.json b/_generated/DecryptFileV1_Node20/task.json new file mode 100644 index 000000000000..3fea51aac7e3 --- /dev/null +++ b/_generated/DecryptFileV1_Node20/task.json @@ -0,0 +1,105 @@ +{ + "id": "7C6A6b71-4355-4AFC-A274-480EAB5678E9", + "name": "DecryptFile", + "friendlyName": "Decrypt file (OpenSSL)", + "description": "Decrypt a file using OpenSSL", + "helpUrl": "https://docs.microsoft.com/azure/devops/pipelines/tasks/utility/decrypt-file", + "helpMarkDown": "", + "category": "Utility", + "visibility": [ + "Build", + "Release" + ], + "runsOn": [ + "Agent", + "DeploymentGroup" + ], + "author": "Microsoft Corporation", + "version": { + "Major": 1, + "Minor": 229, + "Patch": 1 + }, + "minimumAgentVersion": "2.182.1", + "groups": [ + { + "name": "advanced", + "displayName": "Advanced", + "isExpanded": false + } + ], + "instanceNameFormat": "Decrypt $(inFile)", + "inputs": [ + { + "name": "cipher", + "type": "string", + "label": "Cypher", + "defaultValue": "des3", + "required": true, + "helpMarkDown": "Encryption cypher to use. See [cypher suite names](https://go.microsoft.com/fwlink/?LinkID=627129) for a complete list of possible values." + }, + { + "name": "inFile", + "type": "filePath", + "label": "Encrypted file", + "required": true, + "helpMarkDown": "Relative path of file to decrypt." + }, + { + "name": "passphrase", + "type": "string", + "label": "Passphrase", + "required": true, + "helpMarkDown": "Passphrase to use for decryption. **Use a Variable to encrypt the passphrase.**" + }, + { + "name": "outFile", + "type": "filePath", + "label": "Decrypted file path", + "required": false, + "helpMarkDown": "Optional filename for decrypted file. Defaults to the Encrypted File with a \".out\" extension" + }, + { + "name": "cwd", + "aliases": [ + "workingDirectory" + ], + "type": "filePath", + "label": "Working directory", + "defaultValue": "", + "required": false, + "helpMarkDown": "Working directory for decryption. Defaults to the root of the repository.", + "groupName": "advanced" + } + ], + "execution": { + "Node10": { + "target": "decrypt.js", + "argumentFormat": "" + }, + "Node16": { + "target": "decrypt.js", + "argumentFormat": "" + }, + "Node20": { + "target": "decrypt.js", + "argumentFormat": "" + } + }, + "restrictions": { + "commands": { + "mode": "restricted" + }, + "settableVariables": { + "allowed": [] + } + }, + "messages": { + "OpenSSLReturnCode": "openssl exited with return code: %d", + "OpenSSLFailed": "openssl failed with error: %s" + }, + "_buildConfigMapping": { + "Default": "1.229.0", + "Node20-225": "1.229.1" + } +} \ No newline at end of file diff --git a/_generated/DecryptFileV1_Node20/task.loc.json b/_generated/DecryptFileV1_Node20/task.loc.json new file mode 100644 index 000000000000..e98460b235ac --- /dev/null +++ b/_generated/DecryptFileV1_Node20/task.loc.json @@ -0,0 +1,105 @@ +{ + "id": "7C6A6b71-4355-4AFC-A274-480EAB5678E9", + "name": "DecryptFile", + "friendlyName": "ms-resource:loc.friendlyName", + "description": "ms-resource:loc.description", + "helpUrl": "https://docs.microsoft.com/azure/devops/pipelines/tasks/utility/decrypt-file", + "helpMarkDown": "ms-resource:loc.helpMarkDown", + "category": "Utility", + "visibility": [ + "Build", + "Release" + ], + "runsOn": [ + "Agent", + "DeploymentGroup" + ], + "author": "Microsoft Corporation", + "version": { + "Major": 1, + "Minor": 229, + "Patch": 1 + }, + "minimumAgentVersion": "2.182.1", + "groups": [ + { + "name": "advanced", + "displayName": "ms-resource:loc.group.displayName.advanced", + "isExpanded": false + } + ], + "instanceNameFormat": "ms-resource:loc.instanceNameFormat", + "inputs": [ + { + "name": "cipher", + "type": "string", + "label": "ms-resource:loc.input.label.cipher", + "defaultValue": "des3", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.cipher" + }, + { + "name": "inFile", + "type": "filePath", + "label": "ms-resource:loc.input.label.inFile", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.inFile" + }, + { + "name": "passphrase", + "type": "string", + "label": "ms-resource:loc.input.label.passphrase", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.passphrase" + }, + { + "name": "outFile", + "type": "filePath", + "label": "ms-resource:loc.input.label.outFile", + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.outFile" + }, + { + "name": "cwd", + "aliases": [ + "workingDirectory" + ], + "type": "filePath", + "label": "ms-resource:loc.input.label.cwd", + "defaultValue": "", + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.cwd", + "groupName": "advanced" + } + ], + "execution": { + "Node10": { + "target": "decrypt.js", + "argumentFormat": "" + }, + "Node16": { + "target": "decrypt.js", + "argumentFormat": "" + }, + "Node20": { + "target": "decrypt.js", + "argumentFormat": "" + } + }, + "restrictions": { + "commands": { + "mode": "restricted" + }, + "settableVariables": { + "allowed": [] + } + }, + "messages": { + "OpenSSLReturnCode": "ms-resource:loc.messages.OpenSSLReturnCode", + "OpenSSLFailed": "ms-resource:loc.messages.OpenSSLFailed" + }, + "_buildConfigMapping": { + "Default": "1.229.0", + "Node20-225": "1.229.1" + } +} \ No newline at end of file diff --git a/_generated/DecryptFileV1_Node20/tsconfig.json b/_generated/DecryptFileV1_Node20/tsconfig.json new file mode 100644 index 000000000000..0438b79f69ac --- /dev/null +++ b/_generated/DecryptFileV1_Node20/tsconfig.json @@ -0,0 +1,6 @@ +{ + "compilerOptions": { + "target": "ES6", + "module": "commonjs" + } +} \ No newline at end of file diff --git a/_generated/DeleteFilesV1.versionmap.txt b/_generated/DeleteFilesV1.versionmap.txt new file mode 100644 index 000000000000..f74febd08e1e --- /dev/null +++ b/_generated/DeleteFilesV1.versionmap.txt @@ -0,0 +1,2 @@ +Default|1.229.0 +Node20-225|1.229.1 diff --git a/_generated/DeleteFilesV1/Strings/resources.resjson/de-DE/resources.resjson b/_generated/DeleteFilesV1/Strings/resources.resjson/de-DE/resources.resjson new file mode 100644 index 000000000000..7ad1f501a90d --- /dev/null +++ b/_generated/DeleteFilesV1/Strings/resources.resjson/de-DE/resources.resjson @@ -0,0 +1,18 @@ +{ + "loc.friendlyName": "Dateien löschen", + "loc.helpMarkDown": "[Weitere Informationen zu dieser Aufgabe](https://go.microsoft.com/fwlink/?LinkID=722333)", + "loc.description": "Hiermit werden Ordner oder Dateien gelöscht, die einem Muster entsprechen.", + "loc.instanceNameFormat": "Dateien aus \"$(SourceFolder)\" löschen", + "loc.group.displayName.advanced": "Erweitert", + "loc.input.label.SourceFolder": "Quellordner", + "loc.input.help.SourceFolder": "Der Quellordner, aus dem mindestens ein Löschvorgang ausgeführt wird. \"Empty\" ist der Stamm des Repositorys. Verwenden Sie [Variablen](https://go.microsoft.com/fwlink/?LinkID=550988), wenn sich Dateien nicht im Repository befinden, z. B. \"$(agent.builddirectory)\".", + "loc.input.label.Contents": "Inhalte", + "loc.input.help.Contents": "Die zu löschenden Datei-/Ordnerpfade. Mehrere Zeilen von Minimatchmustern werden unterstützt. [Weitere Informationen](https://go.microsoft.com/fwlink/?LinkID=722333)", + "loc.input.label.RemoveSourceFolder": "SourceFolder entfernen", + "loc.input.help.RemoveSourceFolder": "Versuchen Sie, auch den Quellordner zu entfernen.", + "loc.input.label.RemoveDotFiles": "Dateien entfernen, die mit einem Punkt beginnen", + "loc.input.help.RemoveDotFiles": "Löschen Sie Dateien, beginnend mit einem Punkt (GIT, DOCKERFILE). Diese Dateien werden weggelassen, wenn sie nicht explizit angegeben werden (z. B. \"/.*\"). Weitere Informationen finden Sie unter [Link](https://github.com/isaacs/minimatch#dot)", + "loc.messages.CantDeleteFiles": "Mindestens eine Datei konnte nicht gelöscht werden.", + "loc.messages.SkippingSymbolStore": "Der Löschvorgang für die Symbolspeicher-Dateifreigabe wird übersprungen: %s", + "loc.messages.NoFiles": "Es sind keine zu löschenden Dateien vorhanden." +} \ No newline at end of file diff --git a/_generated/DeleteFilesV1/Strings/resources.resjson/en-US/resources.resjson b/_generated/DeleteFilesV1/Strings/resources.resjson/en-US/resources.resjson new file mode 100644 index 000000000000..ed6d0001ca15 --- /dev/null +++ b/_generated/DeleteFilesV1/Strings/resources.resjson/en-US/resources.resjson @@ -0,0 +1,18 @@ +{ + "loc.friendlyName": "Delete files", + "loc.helpMarkDown": "[Learn more about this task](https://go.microsoft.com/fwlink/?LinkID=722333)", + "loc.description": "Delete folders, or files matching a pattern", + "loc.instanceNameFormat": "Delete files from $(SourceFolder)", + "loc.group.displayName.advanced": "Advanced", + "loc.input.label.SourceFolder": "Source Folder", + "loc.input.help.SourceFolder": "The source folder that the deletion(s) will be run from. Empty is the root of the repo. Use [variables](https://go.microsoft.com/fwlink/?LinkID=550988) if files are not in the repo. Example: $(agent.builddirectory)", + "loc.input.label.Contents": "Contents", + "loc.input.help.Contents": "File/folder paths to delete. Supports multiple lines of minimatch patterns. [More Information](https://go.microsoft.com/fwlink/?LinkID=722333)", + "loc.input.label.RemoveSourceFolder": "Remove SourceFolder", + "loc.input.help.RemoveSourceFolder": "Attempt to remove the source folder as well.", + "loc.input.label.RemoveDotFiles": "Remove files starting with a dot", + "loc.input.help.RemoveDotFiles": "Delete files starting with a dot (.git, .dockerfile). Omits these files if it's not specified explicitly (for example, '/.*'). Please see this [link](https://github.com/isaacs/minimatch#dot) for more info", + "loc.messages.CantDeleteFiles": "Couldn't delete one or more files", + "loc.messages.SkippingSymbolStore": "Skipping delete for symbol store file share: %s", + "loc.messages.NoFiles": "No files to delete." +} \ No newline at end of file diff --git a/_generated/DeleteFilesV1/Strings/resources.resjson/es-ES/resources.resjson b/_generated/DeleteFilesV1/Strings/resources.resjson/es-ES/resources.resjson new file mode 100644 index 000000000000..ad67f59b8eef --- /dev/null +++ b/_generated/DeleteFilesV1/Strings/resources.resjson/es-ES/resources.resjson @@ -0,0 +1,18 @@ +{ + "loc.friendlyName": "Eliminar archivos", + "loc.helpMarkDown": "[Obtener más información acerca de esta tarea](https://go.microsoft.com/fwlink/?LinkID=722333)", + "loc.description": "Elimina las carpetas o archivos que coinciden con un patrón.", + "loc.instanceNameFormat": "Eliminar archivos de $(SourceFolder)", + "loc.group.displayName.advanced": "Avanzado", + "loc.input.label.SourceFolder": "Carpeta de origen", + "loc.input.help.SourceFolder": "La carpeta de origen desde la que se ejecutarán las eliminaciones. La raíz del repositorio está vacía. Use [variables](https://go.microsoft.com/fwlink/?LinkID=550988) si los archivos no están en el repositorio. Ejemplo: $(agent.builddirectory)", + "loc.input.label.Contents": "Contenido", + "loc.input.help.Contents": "Rutas de archivo o carpeta que se eliminarán. Admite varias líneas de patrones de minimatch. [Más información](https://go.microsoft.com/fwlink/?LinkID=722333)", + "loc.input.label.RemoveSourceFolder": "Quitar SourceFolder", + "loc.input.help.RemoveSourceFolder": "Intente quitar también la carpeta de origen.", + "loc.input.label.RemoveDotFiles": "Quitar archivos que comiencen con un punto", + "loc.input.help.RemoveDotFiles": "Elimine los archivos que empiecen por un punto (.git,. dockerfile). Omita estos archivos si no se especifican explícitamente (por ejemplo, \"/. *\"). Para obtener más información, consulte este [vínculo] (https://github.com/isaacs/minimatch#dot)", + "loc.messages.CantDeleteFiles": "No se han podido eliminar uno o varios archivos", + "loc.messages.SkippingSymbolStore": "Se omitirá la eliminación del recurso compartido de archivos de símbolos: %s", + "loc.messages.NoFiles": "No hay archivos que se deban eliminar." +} \ No newline at end of file diff --git a/_generated/DeleteFilesV1/Strings/resources.resjson/fr-FR/resources.resjson b/_generated/DeleteFilesV1/Strings/resources.resjson/fr-FR/resources.resjson new file mode 100644 index 000000000000..265258f8ecbd --- /dev/null +++ b/_generated/DeleteFilesV1/Strings/resources.resjson/fr-FR/resources.resjson @@ -0,0 +1,18 @@ +{ + "loc.friendlyName": "Supprimer des fichiers", + "loc.helpMarkDown": "[En savoir plus sur cette tâche](https://go.microsoft.com/fwlink/?LinkID=722333)", + "loc.description": "Supprimer des dossiers ou des fichiers correspondant à un modèle", + "loc.instanceNameFormat": "Supprimer les fichiers de $(SourceFolder)", + "loc.group.displayName.advanced": "Avancé", + "loc.input.label.SourceFolder": "Dossier source", + "loc.input.help.SourceFolder": "Dossier source à partir duquel la ou les suppressions sont exécutées. Si aucune valeur n'est spécifiée, la racine du dépôt est utilisée. Utilisez des [variables](https://go.microsoft.com/fwlink/?LinkID=550988), si les fichiers ne sont pas dans le dépôt. Exemple : $(agent.builddirectory)", + "loc.input.label.Contents": "Contenu", + "loc.input.help.Contents": "Chemins des fichiers/dossiers à supprimer. Prend en charge plusieurs lignes de modèles minimatch. [Plus d'informations](https://go.microsoft.com/fwlink/?LinkID=722333)", + "loc.input.label.RemoveSourceFolder": "Supprimer SourceFolder", + "loc.input.help.RemoveSourceFolder": "Essayez également de supprimer le dossier source.", + "loc.input.label.RemoveDotFiles": "Supprimer des fichiers à partir d’un point", + "loc.input.help.RemoveDotFiles": "Supprimez les fichiers en commençant par un point (.git, .dockerfile). Omette ces fichiers s’ils ne sont pas spécifiés de manière explicite (par exemple, « /.* »). Pour plus d’informations, voir ce [lien](https://github.com/isaacs/minimatch#dot)", + "loc.messages.CantDeleteFiles": "Impossible de supprimer un ou plusieurs fichiers", + "loc.messages.SkippingSymbolStore": "Suppression ignorée du partage de fichiers du magasin de symboles : %s", + "loc.messages.NoFiles": "Aucun fichier à supprimer." +} \ No newline at end of file diff --git a/_generated/DeleteFilesV1/Strings/resources.resjson/it-IT/resources.resjson b/_generated/DeleteFilesV1/Strings/resources.resjson/it-IT/resources.resjson new file mode 100644 index 000000000000..560d870fd0f0 --- /dev/null +++ b/_generated/DeleteFilesV1/Strings/resources.resjson/it-IT/resources.resjson @@ -0,0 +1,18 @@ +{ + "loc.friendlyName": "Elimina file", + "loc.helpMarkDown": "[Altre informazioni su questa attività](https://go.microsoft.com/fwlink/?LinkID=722333)", + "loc.description": "Elimina cartelle o file corrispondenti a un criterio", + "loc.instanceNameFormat": "Elimina file da $(SourceFolder)", + "loc.group.displayName.advanced": "Avanzate", + "loc.input.label.SourceFolder": "Cartella di origine", + "loc.input.help.SourceFolder": "Cartella di origine da cui verranno eseguite le eliminazioni. Il valore vuoto corrisponde alla radice del repository. Usare le [variabili](https://go.microsoft.com/fwlink/?LinkID=550988) se i file non sono presenti nel repository. Esempio: $(agent.builddirectory)", + "loc.input.label.Contents": "Contenuti", + "loc.input.help.Contents": "Percorsi di file/cartella da eliminare. Sono supportate più righe di criteri di corrispondenza minima. [Altre informazioni](https://go.microsoft.com/fwlink/?LinkID=722333)", + "loc.input.label.RemoveSourceFolder": "Rimuovi cartella di origine", + "loc.input.help.RemoveSourceFolder": "Verrà effettuato un tentativo di rimuovere anche la cartella di origine.", + "loc.input.label.RemoveDotFiles": "Rimuovi i file che iniziano con un punto", + "loc.input.help.RemoveDotFiles": "È possibile eliminare i file che iniziano con un punto (.git, .dockerfile). Questi file vengono omessi, se non vengono specificati in modo esplicito, ad esempio '/.*'. Vedere questo [collegamento] (https://github.com/isaacs/minimatch#dot) per altre informazioni", + "loc.messages.CantDeleteFiles": "Non è stato possibile eliminare uno o più file", + "loc.messages.SkippingSymbolStore": "L'eliminazione per la condivisione file dell'archivio simboli verrà ignorata: %s", + "loc.messages.NoFiles": "Non ci sono file da eliminare." +} \ No newline at end of file diff --git a/_generated/DeleteFilesV1/Strings/resources.resjson/ja-JP/resources.resjson b/_generated/DeleteFilesV1/Strings/resources.resjson/ja-JP/resources.resjson new file mode 100644 index 000000000000..8702f95ad507 --- /dev/null +++ b/_generated/DeleteFilesV1/Strings/resources.resjson/ja-JP/resources.resjson @@ -0,0 +1,18 @@ +{ + "loc.friendlyName": "ファイルの削除", + "loc.helpMarkDown": "[このタスクの詳細を表示](https://go.microsoft.com/fwlink/?LinkID=722333)", + "loc.description": "パターンに一致するフォルダーまたはファイルを削除します", + "loc.instanceNameFormat": "ファイルを $(SourceFolder) から削除する", + "loc.group.displayName.advanced": "詳細", + "loc.input.label.SourceFolder": "ソース フォルダー", + "loc.input.help.SourceFolder": "削除の実行元のソース フォルダー。空白の場合、リポジトリのルートになります。ファイルがリポジトリにない場合は、[変数](https://go.microsoft.com/fwlink/?LinkID=550988) を使用します。例: $(agent.builddirectory)", + "loc.input.label.Contents": "コンテンツ", + "loc.input.help.Contents": "削除するファイル/ファルダーのパス。minimatch パターンの複数行をサポートします。[詳細](https://go.microsoft.com/fwlink/?LinkID=722333)", + "loc.input.label.RemoveSourceFolder": "SourceFolder の削除", + "loc.input.help.RemoveSourceFolder": "ソース フォルダーの削除も試行します。", + "loc.input.label.RemoveDotFiles": "ドットで始まるファイルを削除します", + "loc.input.help.RemoveDotFiles": "ドットで始まるファイル (.git、.dockerfile) を削除します。明示的に指定されていない場合は、これらのファイルを省略します (例: '/. * ')。詳細については、この [リンク] を参照してください (https://github.com/isaacs/minimatch#dot)", + "loc.messages.CantDeleteFiles": "1 つ以上のファイルを削除できませんでした", + "loc.messages.SkippingSymbolStore": "シンボル ストアのファイル共有の削除をスキップしています: %s", + "loc.messages.NoFiles": "削除できるファイルはありません。" +} \ No newline at end of file diff --git a/_generated/DeleteFilesV1/Strings/resources.resjson/ko-KR/resources.resjson b/_generated/DeleteFilesV1/Strings/resources.resjson/ko-KR/resources.resjson new file mode 100644 index 000000000000..900e23e3165a --- /dev/null +++ b/_generated/DeleteFilesV1/Strings/resources.resjson/ko-KR/resources.resjson @@ -0,0 +1,18 @@ +{ + "loc.friendlyName": "파일 삭제", + "loc.helpMarkDown": "[이 작업에 대한 자세한 정보](https://go.microsoft.com/fwlink/?LinkID=722333)", + "loc.description": "패턴과 일치하는 폴더 또는 파일을 삭제합니다.", + "loc.instanceNameFormat": "$(SourceFolder)에서 파일 삭제", + "loc.group.displayName.advanced": "고급", + "loc.input.label.SourceFolder": "소스 폴더", + "loc.input.help.SourceFolder": "삭제 작업이 실행될 소스 폴더입니다. 리포지토리의 루트는 [비어 있음]입니다. 파일이 리포지토리에 없으면 [변수](https://go.microsoft.com/fwlink/?LinkID=550988)를 사용하세요. 예: $(agent.builddirectory)", + "loc.input.label.Contents": "콘텐츠", + "loc.input.help.Contents": "삭제할 파일/폴더 경로입니다. 여러 줄의 minimatch 패턴을 지원합니다. [자세한 정보](https://go.microsoft.com/fwlink/?LinkID=722333)", + "loc.input.label.RemoveSourceFolder": "SourceFolder 제거", + "loc.input.help.RemoveSourceFolder": "소스 폴더도 제거하려고 합니다.", + "loc.input.label.RemoveDotFiles": "점으로 시작하는 파일 제거", + "loc.input.help.RemoveDotFiles": "점(git, dockerfile)으로 시작하는 파일을 삭제합니다. 이 파일이 명시적으로 지정되지 않은 경우(예: '/.*') 이러한 파일을 생략합니다. 자세한 내용은 이 [링크] (https://github.com/isaacs/minimatch#dot)를 참조하세요", + "loc.messages.CantDeleteFiles": "하나 이상의 파일을 삭제할 수 없습니다.", + "loc.messages.SkippingSymbolStore": "기호 저장소 파일 공유에 대해 건너뛰면 삭제됨: %s", + "loc.messages.NoFiles": "삭제할 파일이 없습니다." +} \ No newline at end of file diff --git a/_generated/DeleteFilesV1/Strings/resources.resjson/ru-RU/resources.resjson b/_generated/DeleteFilesV1/Strings/resources.resjson/ru-RU/resources.resjson new file mode 100644 index 000000000000..7bca97bf2e9a --- /dev/null +++ b/_generated/DeleteFilesV1/Strings/resources.resjson/ru-RU/resources.resjson @@ -0,0 +1,18 @@ +{ + "loc.friendlyName": "Удалить файлы", + "loc.helpMarkDown": "[См. дополнительные сведения об этой задаче](https://go.microsoft.com/fwlink/?LinkID=722333)", + "loc.description": "Удалить папки или файлы, соответствующие шаблону", + "loc.instanceNameFormat": "Удалить файлы из $(SourceFolder)", + "loc.group.displayName.advanced": "Дополнительно", + "loc.input.label.SourceFolder": "Исходная папка", + "loc.input.help.SourceFolder": "Исходная папка, из которой будет запускаться удаление. Если значение не указано, используется корень репозитория. Если в репозитории нет файлов, используйте [переменные] (https://go.microsoft.com/fwlink/?LinkID=550988). Например, $(agent.builddirectory)", + "loc.input.label.Contents": "Содержимое", + "loc.input.help.Contents": "Пути к удаляемым файлам или папкам. Поддерживает несколько строк шаблонов minimatch. [Подробнее...] (https://go.microsoft.com/fwlink/?LinkID=722333)", + "loc.input.label.RemoveSourceFolder": "Удалить SourceFolder", + "loc.input.help.RemoveSourceFolder": "Попробуйте удалить и исходную папку.", + "loc.input.label.RemoveDotFiles": "Удалить файлы, имена которых начинаются с точки", + "loc.input.help.RemoveDotFiles": "Удаление файлов, имена которых начинаются с точки (.git, .dockerfile). Эти файлы пропускаются, если не указано явно (например, \"/.*\"). Дополнительные сведения можно найти по [ссылке](https://github.com/isaacs/minimatch#dot)", + "loc.messages.CantDeleteFiles": "Не удалось удалить один или несколько файлов", + "loc.messages.SkippingSymbolStore": "Пропускается удаление общей папки хранилища символов: %s.", + "loc.messages.NoFiles": "Нет файлов для удаления." +} \ No newline at end of file diff --git a/_generated/DeleteFilesV1/Strings/resources.resjson/zh-CN/resources.resjson b/_generated/DeleteFilesV1/Strings/resources.resjson/zh-CN/resources.resjson new file mode 100644 index 000000000000..1c91f5408435 --- /dev/null +++ b/_generated/DeleteFilesV1/Strings/resources.resjson/zh-CN/resources.resjson @@ -0,0 +1,18 @@ +{ + "loc.friendlyName": "删除文件", + "loc.helpMarkDown": "[详细了解此任务](https://go.microsoft.com/fwlink/?LinkID=722333)", + "loc.description": "删除文件夹或与模式匹配的文件", + "loc.instanceNameFormat": "从 $(SourceFolder) 中删除文件", + "loc.group.displayName.advanced": "高级", + "loc.input.label.SourceFolder": "源文件夹", + "loc.input.help.SourceFolder": "将从其中运行删除的源文件夹。为空表示存储库的根。如果文件不在存储库中,请使用[变量](https://go.microsoft.com/fwlink/?LinkID=550988)。示例: $(agent.builddirectory)", + "loc.input.label.Contents": "内容", + "loc.input.help.Contents": "要删除的文件/文件夹路径。支持多行的最小匹配模式。[详细信息](https://go.microsoft.com/fwlink/?LinkID=722333)", + "loc.input.label.RemoveSourceFolder": "删除 SourceFolder", + "loc.input.help.RemoveSourceFolder": "同时尝试删除源文件夹。", + "loc.input.label.RemoveDotFiles": "删除以点开头的文件", + "loc.input.help.RemoveDotFiles": "删除以点(.git、.dockerfile)开头的文件。如果未明确指定这些文件(例如,“/.*”),则省略这些文件。请参阅此[链接](https://github.com/isaacs/minimatch#dot)以了解详细信息", + "loc.messages.CantDeleteFiles": "无法删除一个或多个文件", + "loc.messages.SkippingSymbolStore": "跳过删除符号存储文件共享: %s", + "loc.messages.NoFiles": "没有任何要删除的文件。" +} \ No newline at end of file diff --git a/_generated/DeleteFilesV1/Strings/resources.resjson/zh-TW/resources.resjson b/_generated/DeleteFilesV1/Strings/resources.resjson/zh-TW/resources.resjson new file mode 100644 index 000000000000..b493b5db8226 --- /dev/null +++ b/_generated/DeleteFilesV1/Strings/resources.resjson/zh-TW/resources.resjson @@ -0,0 +1,18 @@ +{ + "loc.friendlyName": "刪除檔案", + "loc.helpMarkDown": "[深入了解此工作](https://go.microsoft.com/fwlink/?LinkID=722333)", + "loc.description": "刪除符合模式的資料夾或檔案", + "loc.instanceNameFormat": "從 $(SourceFolder) 刪除檔案", + "loc.group.displayName.advanced": "進階", + "loc.input.label.SourceFolder": "來源資料夾", + "loc.input.help.SourceFolder": "要執行刪除作業的來源資料夾。如果保留空白,即為存放庫根目錄。如果存放庫中沒有檔案,請使用[變數](https://go.microsoft.com/fwlink/?LinkID=550988),例如: $(agent.builddirectory)", + "loc.input.label.Contents": "內容", + "loc.input.help.Contents": "要刪除的檔案/資料夾路徑。支援多行 minimatch 模式。[詳細資訊](https://go.microsoft.com/fwlink/?LinkID=722333)", + "loc.input.label.RemoveSourceFolder": "移除 SourceFolder", + "loc.input.help.RemoveSourceFolder": "嘗試一併移除來源資料夾。", + "loc.input.label.RemoveDotFiles": "移除以點開頭的檔案", + "loc.input.help.RemoveDotFiles": "刪除以點 (.git、.dockerfile) 開頭的檔案。如果未明確指定 (例如 '/.*'),請省略這些檔案。如需詳細資訊,請參閱此 [連結](https://github.com/isaacs/minimatch#dot)", + "loc.messages.CantDeleteFiles": "無法刪除一或多個檔案", + "loc.messages.SkippingSymbolStore": "正在略過刪除符號存放區檔案共用: %s", + "loc.messages.NoFiles": "沒有要刪除的檔案。" +} \ No newline at end of file diff --git a/_generated/DeleteFilesV1/Tests/L0.ts b/_generated/DeleteFilesV1/Tests/L0.ts new file mode 100644 index 000000000000..59e87745e67d --- /dev/null +++ b/_generated/DeleteFilesV1/Tests/L0.ts @@ -0,0 +1,248 @@ +import assert = require('assert'); +import path = require('path'); +import fs = require('fs'); +import * as ttm from 'azure-pipelines-task-lib/mock-test'; + +const testRoot = path.join(__dirname, 'test_structure'); + +const removeFolder = function(curPath) { + if (fs.existsSync(curPath)) { + fs.readdirSync(curPath).forEach((file, index) => { + const newPath = path.join(curPath, file); + if (fs.lstatSync(newPath).isDirectory()) { + removeFolder(newPath); + } else { + fs.unlinkSync(newPath); + } + }); + fs.rmdirSync(curPath); + } +} + +describe('DeleteFiles Suite', function () { + this.timeout(60000); + + before(() => { + removeFolder(testRoot); + fs.mkdirSync(testRoot); + }) + + function runValidations(validator: () => void, tr, done) { + try { + validator(); + done(); + } + catch (error) { + console.log("STDERR", tr.stderr); + console.log("STDOUT", tr.stdout); + done(error); + } + } + + it('Deletes multiple nested folders', (done: Mocha.Done) => { + this.timeout(5000); + + const root = path.join(testRoot, 'nested'); + fs.mkdirSync(root); + + fs.mkdirSync(path.join(root, 'A')); + fs.writeFileSync(path.join(root, 'A', 'test.txt'), 'test'); + fs.mkdirSync(path.join(root, 'A', 'A')); + fs.writeFileSync(path.join(root, 'A', 'A', 'test2.txt'), 'test2'); + fs.writeFileSync(path.join(root, 'A', 'A', 'test3.txt'), 'test3'); + fs.mkdirSync(path.join(root, 'B')); + fs.writeFileSync(path.join(root, 'B', 'test4.txt'), 'test4'); + fs.mkdirSync(path.join(root, 'C')); + fs.writeFileSync(path.join(root, 'C', 'dontDelete.txt'), 'dont delete'); + + let tp: string = path.join(__dirname, 'L0Nested.js'); + let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + runValidations(() => { + assert(!fs.existsSync(path.join(root, 'A'))); + assert(!fs.existsSync(path.join(root, 'B'))); + assert(fs.existsSync(path.join(root, 'C'))); + assert(fs.existsSync(path.join(root, 'C', 'dontDelete.txt'))); + }, tr, done); + }); + + it('Deletes files with negate pattern', (done: Mocha.Done) => { + this.timeout(5000); + + const root = path.join(testRoot, 'negate'); + fs.mkdirSync(root); + + fs.mkdirSync(path.join(root, 'A')); + fs.writeFileSync(path.join(root, 'A', 'test1.js'), 'test1'); + fs.writeFileSync(path.join(root, 'A', 'test2.css'), 'test2'); + + let tp: string = path.join(__dirname, 'L0Negate.js'); + let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + runValidations(() => { + assert(!fs.existsSync(path.join(root, 'A', 'test2.css'))); + assert(fs.existsSync(path.join(root, 'A', 'test1.js'))); + }, tr, done); + }); + + it('Deletes files starting with a dot', (done: Mocha.Done) => { + const root = path.join(testRoot, 'removeDotFiles'); + fs.mkdirSync(root); + + fs.mkdirSync(path.join(root, 'A')); + fs.writeFileSync(path.join(root, 'A', '.txt'), 'test1'); + fs.writeFileSync(path.join(root, 'A', '.sample.txt'), 'test2'); + + let tp: string = path.join(__dirname, 'L0RemoveDotFiles.js'); + let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + runValidations(() => { + assert(!fs.existsSync(path.join(root, 'A', '.txt'))); + assert(!fs.existsSync(path.join(root, 'A', '.sample.txt'))); + }, tr, done); + }); + + it('Doesnt delete files starting with a dot', (done: Mocha.Done) => { + const root = path.join(testRoot, 'DoesntRemoveDotFiles'); + fs.mkdirSync(root); + + fs.mkdirSync(path.join(root, 'A')); + fs.writeFileSync(path.join(root, 'A', '.txt'), 'test1'); + fs.writeFileSync(path.join(root, 'A', '.sample.txt'), 'test2'); + + let tp: string = path.join(__dirname, 'L0DoesntRemoveDotFiles.js'); + let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + runValidations(() => { + assert(fs.existsSync(path.join(root, 'A', '.txt'))); + assert(fs.existsSync(path.join(root, 'A', '.sample.txt'))); + }, tr, done); + }); + + it('Deletes files using braces statement', (done: Mocha.Done) => { + this.timeout(5000); + + const root = path.join(testRoot, 'braces'); + fs.mkdirSync(root); + + fs.mkdirSync(path.join(root, 'A')); + fs.writeFileSync(path.join(root, 'A', 'one.txt'), 'test1'); + fs.writeFileSync(path.join(root, 'A', 'two.txt'), 'test2'); + fs.writeFileSync(path.join(root, 'A', 'three.txt'), 'test3'); + fs.writeFileSync(path.join(root, 'A', 'four.txt'), 'test4'); + + let tp: string = path.join(__dirname, 'L0Braces.js'); + let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + runValidations(() => { + assert(!fs.existsSync(path.join(root, 'A', 'one.txt'))); + assert(!fs.existsSync(path.join(root, 'A', 'two.txt'))); + assert(fs.existsSync(path.join(root, 'A', 'three.txt'))); + assert(fs.existsSync(path.join(root, 'A', 'four.txt'))); + }, tr, done); + }); + + it('Deletes a single file', (done: Mocha.Done) => { + this.timeout(5000); + + const root = path.join(testRoot, 'singleFile'); + fs.mkdirSync(root); + + fs.mkdirSync(path.join(root, 'A')); + fs.writeFileSync(path.join(root, 'A', 'test.txt'), 'test'); + fs.mkdirSync(path.join(root, 'A', 'A')); + fs.writeFileSync(path.join(root, 'A', 'A', 'test.txt'), 'test2'); + fs.writeFileSync(path.join(root, 'A', 'A', 'test2.txt'), 'test3'); + + let tp: string = path.join(__dirname, 'L0SingleFile.js'); + let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + runValidations(() => { + assert(fs.existsSync(path.join(root, 'A'))); + assert(!fs.existsSync(path.join(root, 'A', 'test.txt'))); + assert(fs.existsSync(path.join(root, 'A', 'A'))); + assert(fs.existsSync(path.join(root, 'A', 'A', 'test.txt'))); + assert(fs.existsSync(path.join(root, 'A', 'A', 'test2.txt'))); + }, tr, done); + }); + + it('Removes the source folder if its empty', (done: Mocha.Done) => { + this.timeout(5000); + + const root = path.join(testRoot, 'rmSource'); + fs.mkdirSync(root); + + fs.mkdirSync(path.join(root, 'A')); + fs.writeFileSync(path.join(root, 'A', 'test.txt'), 'test'); + fs.mkdirSync(path.join(root, 'A', 'A')); + fs.writeFileSync(path.join(root, 'A', 'A', 'test2.txt'), 'test2'); + fs.writeFileSync(path.join(root, 'A', 'A', 'test3.txt'), 'test3'); + + let tp: string = path.join(__dirname, 'L0RmSource.js'); + let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + runValidations(() => { + assert(!fs.existsSync(root)); + }, tr, done); + }); + + it('Doesnt remove folder outside the root', (done: Mocha.Done) => { + this.timeout(5000); + + const root = path.join(testRoot, 'insideRoot'); + const outsideRoot = path.join(testRoot, 'outsideRoot'); + fs.mkdirSync(root); + fs.mkdirSync(outsideRoot); + + fs.writeFileSync(path.join(outsideRoot, 'test.txt'), 'test'); + + let tp: string = path.join(__dirname, 'L0OutsideRoot.js'); + let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + runValidations(() => { + assert(fs.existsSync(path.join(outsideRoot, 'test.txt'))); + }, tr, done); + }); + + it('Removes folder with locked file', (done: Mocha.Done) => { + this.timeout(5000); + + const root = path.join(testRoot, 'locked'); + fs.mkdirSync(root); + fs.mkdirSync(path.join(root, 'A')); + fs.appendFileSync(path.join(root, 'A', 'test.txt'), 'test'); + var fd = fs.openSync(path.join(root, 'A', 'test.txt'), 'r'); + + let tp: string = path.join(__dirname, 'L0Locked.js'); + let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + try { + tr.run(); + } + catch (err) {} + finally { + fs.closeSync(fd); + } + + runValidations(() => { + assert(!fs.existsSync(path.join(root, 'A'))); + assert(tr.succeeded); + }, tr, done); + }); +}); diff --git a/_generated/DeleteFilesV1/Tests/L0Braces.ts b/_generated/DeleteFilesV1/Tests/L0Braces.ts new file mode 100644 index 000000000000..68048838913c --- /dev/null +++ b/_generated/DeleteFilesV1/Tests/L0Braces.ts @@ -0,0 +1,12 @@ +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'deletefiles.js'); +let tmr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +const testRoot: string = path.join(__dirname, "test_structure", "braces"); + +tmr.setInput('Contents', '/**/{one.txt,two.txt}'); +tmr.setInput('SourceFolder', testRoot); + +tmr.run(true); \ No newline at end of file diff --git a/_generated/DeleteFilesV1/Tests/L0DoesntRemoveDotFiles.ts b/_generated/DeleteFilesV1/Tests/L0DoesntRemoveDotFiles.ts new file mode 100644 index 000000000000..06826920f66c --- /dev/null +++ b/_generated/DeleteFilesV1/Tests/L0DoesntRemoveDotFiles.ts @@ -0,0 +1,12 @@ +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'deletefiles.js'); +let tmr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +const testRoot: string = path.join(__dirname, "test_structure", "DoesntRemoveDotFiles"); + +tmr.setInput('Contents', '/**/*.txt'); +tmr.setInput('SourceFolder', testRoot); + +tmr.run(true); diff --git a/_generated/DeleteFilesV1/Tests/L0Locked.ts b/_generated/DeleteFilesV1/Tests/L0Locked.ts new file mode 100644 index 000000000000..f62d669571f9 --- /dev/null +++ b/_generated/DeleteFilesV1/Tests/L0Locked.ts @@ -0,0 +1,12 @@ +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'deletefiles.js'); +let tmr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +const testRoot: string = path.join(__dirname, "test_structure", "locked"); + +tmr.setInput('Contents', 'A'); +tmr.setInput('SourceFolder', testRoot); + +tmr.run(true); \ No newline at end of file diff --git a/_generated/DeleteFilesV1/Tests/L0Negate.ts b/_generated/DeleteFilesV1/Tests/L0Negate.ts new file mode 100644 index 000000000000..f66f16ffb218 --- /dev/null +++ b/_generated/DeleteFilesV1/Tests/L0Negate.ts @@ -0,0 +1,12 @@ +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'deletefiles.js'); +let tmr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +const testRoot: string = path.join(__dirname, "test_structure", "negate"); + +tmr.setInput('Contents', '/**/!(*.js)'); +tmr.setInput('SourceFolder', testRoot); + +tmr.run(true); \ No newline at end of file diff --git a/_generated/DeleteFilesV1/Tests/L0Nested.ts b/_generated/DeleteFilesV1/Tests/L0Nested.ts new file mode 100644 index 000000000000..3e4282958bb2 --- /dev/null +++ b/_generated/DeleteFilesV1/Tests/L0Nested.ts @@ -0,0 +1,12 @@ +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'deletefiles.js'); +let tmr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +const testRoot: string = path.join(__dirname, "test_structure", "nested"); + +tmr.setInput('Contents', 'A*\nB*'); +tmr.setInput('SourceFolder', testRoot); + +tmr.run(true); \ No newline at end of file diff --git a/_generated/DeleteFilesV1/Tests/L0OutsideRoot.ts b/_generated/DeleteFilesV1/Tests/L0OutsideRoot.ts new file mode 100644 index 000000000000..840de90fcdff --- /dev/null +++ b/_generated/DeleteFilesV1/Tests/L0OutsideRoot.ts @@ -0,0 +1,12 @@ +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'deletefiles.js'); +let tmr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +const testRoot: string = path.join(__dirname, "test_structure", "insideRoot"); + +tmr.setInput('Contents', '../outsideRoot/test.txt'); +tmr.setInput('SourceFolder', testRoot); + +tmr.run(true); \ No newline at end of file diff --git a/_generated/DeleteFilesV1/Tests/L0RemoveDotFiles.ts b/_generated/DeleteFilesV1/Tests/L0RemoveDotFiles.ts new file mode 100644 index 000000000000..af10b8cde5d6 --- /dev/null +++ b/_generated/DeleteFilesV1/Tests/L0RemoveDotFiles.ts @@ -0,0 +1,13 @@ +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'deletefiles.js'); +let tmr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +const testRoot: string = path.join(__dirname, "test_structure", "removeDotFiles"); + +tmr.setInput('Contents', '/**/*.txt'); +tmr.setInput('SourceFolder', testRoot); +tmr.setInput('RemoveDotFiles', "true"); + +tmr.run(true); diff --git a/_generated/DeleteFilesV1/Tests/L0RmSource.ts b/_generated/DeleteFilesV1/Tests/L0RmSource.ts new file mode 100644 index 000000000000..64293c03b929 --- /dev/null +++ b/_generated/DeleteFilesV1/Tests/L0RmSource.ts @@ -0,0 +1,13 @@ +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'deletefiles.js'); +let tmr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +const testRoot: string = path.join(__dirname, "test_structure", "rmSource"); + +tmr.setInput('Contents', 'A*'); +tmr.setInput('SourceFolder', testRoot); +tmr.setInput('RemoveSourceFolder', "true"); + +tmr.run(true); \ No newline at end of file diff --git a/_generated/DeleteFilesV1/Tests/L0SingleFile.ts b/_generated/DeleteFilesV1/Tests/L0SingleFile.ts new file mode 100644 index 000000000000..ac5baf9312fc --- /dev/null +++ b/_generated/DeleteFilesV1/Tests/L0SingleFile.ts @@ -0,0 +1,12 @@ +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'deletefiles.js'); +let tmr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +const testRoot: string = path.join(__dirname, "test_structure", "singleFile"); + +tmr.setInput('Contents', 'A/test.txt'); +tmr.setInput('SourceFolder', testRoot); + +tmr.run(true); \ No newline at end of file diff --git a/_generated/DeleteFilesV1/deletefiles.ts b/_generated/DeleteFilesV1/deletefiles.ts new file mode 100644 index 000000000000..8ef44d7a9516 --- /dev/null +++ b/_generated/DeleteFilesV1/deletefiles.ts @@ -0,0 +1,170 @@ +import path = require('path'); +import os = require('os'); +import tl = require('azure-pipelines-task-lib/task'); +tl.setResourcePath(path.join(__dirname, 'task.json')); + +(() => { + // contents is a multiline input containing glob patterns + let patterns: string[] = tl.getDelimitedInput('Contents', '\n', true); + + let sourceFolder: string = tl.getPathInput('SourceFolder', true, false); + + const removeSourceFolder: boolean = tl.getBoolInput('RemoveSourceFolder', false); + const removeDotFiles: boolean = tl.getBoolInput('RemoveDotFiles', false); + + // Input that is used for backward compatibility with pre-sprint 95 symbol store artifacts. + // Pre-95 symbol store artifacts were simply file path artifacts, so we need to make sure + // not to delete the artifact share if it's a symbol store. + let buildCleanup: boolean = tl.getBoolInput('BuildCleanup'); + + // trim whitespace and root each pattern + patterns = patterns + .map((pattern: string) => pattern.trim()) + .filter((pattern: string) => pattern != '') + .map((pattern: string) => joinPattern(sourceFolder, pattern)); + tl.debug(`patterns: ${patterns}`); + + // short-circuit if no patterns + if (!patterns.length) { + tl.debug('no patterns specified'); + return; + } + + // find all files + let foundPaths: string[] = tl.find(sourceFolder, { + allowBrokenSymbolicLinks: true, + followSpecifiedSymbolicLink: true, + followSymbolicLinks: true + }); + + // short-circuit if not exists + if (!foundPaths.length) { + tl.debug('source folder not found. nothing to delete.'); + tl.setResult(tl.TaskResult.Succeeded, tl.loc("NoFiles")); + return; + } + + // Don't delete symbol store shares if this is a cleanup job for file-path artifacts. + // + // This check needs to be made based on the result of tl.find(). Otherwise intermittent network + // issues could result in a false assertion that the share is not a symbol store share. + // + // Opted to check each item name rather than the full path. Although it would suffice to check + // for 000Admin at the root of the share, it is difficult to accurately make a determination + // based on the full path. The problem is that the input share path would need to be run through + // a normalization function that could be trusted 100% to match the format produced by tl.find(). + // For example if the input contains "\\\share", it would need to be normalized as "\\share". To + // avoid worrying about catching every normalization edge case, checking the item name suffices instead. + if (buildCleanup && + foundPaths.some((itemPath: string) => path.basename(itemPath).toLowerCase() == '000admin')) { + + tl.warning(tl.loc('SkippingSymbolStore', sourceFolder)) + return; + } + + // minimatch options + let matchOptions = { matchBase: true }; + if (removeDotFiles) { + matchOptions["dot"] = true; + } + + if (os.type().match(/^Win/)) { + matchOptions["nocase"] = true; + } + + // apply the match patterns + let matches: string[] = matchPatterns(foundPaths, patterns, matchOptions); + + // sort by length (descending) so files are deleted before folders + matches = matches.sort((a: string, b: string) => { + if (a.length == b.length) { + return 0; + } + + return a.length > b.length ? -1 : 1; + }); + + // try to delete all files/folders, even if one errs + let errorHappened: boolean = false; + for (let itemPath of matches) { + try { + tl.rmRF(itemPath); + } + catch (err) { + tl.error(err); + errorHappened = true; + } + } + + // if there wasn't an error, check if there's anything in the folder tree other than folders + // if not, delete the root as well + if (removeSourceFolder && !errorHappened) { + foundPaths = tl.find(sourceFolder); + + if (foundPaths.length === 1) { + try { + tl.rmRF(sourceFolder); + } + catch (err) { + tl.error(err); + errorHappened = true; + } + } + } + + if (errorHappened) { + tl.setResult(tl.TaskResult.Failed, tl.loc("CantDeleteFiles")); + } +})(); + +/** + * Return number of negate marks at the beginning of the string + * + * @param {string} str - Input string + * @param {number} [startIndex] - Index to start from + * @return {number} Number of negate marks + */ +function getNegateMarksNumber(str: string, startIndex: number = 0): number { + let negateMarks = 0; + while(str[startIndex + negateMarks] === '!'){ + negateMarks++; + } + return negateMarks; +} + +/** + * Join the source path with the pattern moving negate marks to the beginning of the string + * + * @param {string} sourcePath - Source path string + * @param {string} pattern - Pattern string + * @return {string} Joining result + */ +function joinPattern(sourcePath: string, pattern: string): string { + const negateMarks = getNegateMarksNumber(pattern); + return path.join(pattern.slice(0, negateMarks) + sourcePath, pattern.slice(negateMarks)); +} + +/** + * Return those paths that match the list of patterns + * + * @param {string[]} paths - All found paths + * @param {string[]} patterns - List of patterns + * @param {Object} options - Match options + * @return {string[]} Result matches + */ +function matchPatterns(paths: string[], patterns: string[], options: any): string[] { + const allMatches = tl.match(paths, patterns, null, options); + + const hasExcludePatterns = patterns.find(pattern => { + const negateMarkIndex = pattern.indexOf('!'); + return negateMarkIndex > -1 && getNegateMarksNumber(pattern, negateMarkIndex) % 2 === 1; + }) + if(!hasExcludePatterns){ + return allMatches; + } + + const excludedPaths = paths.filter(path => !~allMatches.indexOf(path)); + return allMatches.filter(match => { + return !excludedPaths.find(excludedPath => excludedPath.indexOf(match) === 0); + }) +} \ No newline at end of file diff --git a/_generated/DeleteFilesV1/icon.png b/_generated/DeleteFilesV1/icon.png new file mode 100644 index 000000000000..98bd662d9e26 Binary files /dev/null and b/_generated/DeleteFilesV1/icon.png differ diff --git a/_generated/DeleteFilesV1/icon.svg b/_generated/DeleteFilesV1/icon.svg new file mode 100644 index 000000000000..1b2b611bca33 --- /dev/null +++ b/_generated/DeleteFilesV1/icon.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/_generated/DeleteFilesV1/package-lock.json b/_generated/DeleteFilesV1/package-lock.json new file mode 100644 index 000000000000..cd823b1284d5 --- /dev/null +++ b/_generated/DeleteFilesV1/package-lock.json @@ -0,0 +1,483 @@ +{ + "name": "vsts-deletefiles-tasks", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/concat-stream": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz", + "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==", + "requires": { + "@types/node": "*" + } + }, + "@types/form-data": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", + "integrity": "sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==", + "requires": { + "@types/node": "*" + } + }, + "@types/mocha": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", + "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==" + }, + "@types/node": { + "version": "16.11.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.60.tgz", + "integrity": "sha512-kYIYa1D1L+HDv5M5RXQeEu1o0FKA6yedZIoyugm/MBPROkLpX4L7HRxMrPVyo8bnvjpW/wDlqFNGzXNMb7AdRw==" + }, + "@types/qs": { + "version": "6.9.8", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.8.tgz", + "integrity": "sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg==" + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "azure-pipelines-task-lib": { + "version": "5.0.0-preview.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-5.0.0-preview.0.tgz", + "integrity": "sha512-uQJEv+q3/7RD7kgphFd33uXijaPwA1ePYoNkAgZpUhbZUtc2u4JL4ujTT/JJfgXBNW/QQNAiDQ2OC7vOQG/0tg==", + "requires": { + "minimatch": "3.0.5", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "sync-request": "6.1.0", + "uuid": "^3.0.1" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, + "form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + } + }, + "get-port": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", + "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==" + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "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" + }, + "dependencies": { + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==" + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "http-basic": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", + "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", + "requires": { + "caseless": "^0.12.0", + "concat-stream": "^1.6.2", + "http-response-object": "^3.0.1", + "parse-cache-control": "^1.0.1" + } + }, + "http-response-object": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", + "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", + "requires": { + "@types/node": "^10.0.3" + }, + "dependencies": { + "@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + } + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" + }, + "is-core-module": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "requires": { + "has": "^1.0.3" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, + "parse-cache-control": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", + "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "promise": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", + "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", + "requires": { + "asap": "~2.0.6" + } + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==" + }, + "qs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "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" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "requires": { + "resolve": "^1.1.6" + } + }, + "resolve": { + "version": "1.22.6", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.6.tgz", + "integrity": "sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==", + "requires": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" + }, + "shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, + "sync-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", + "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==", + "requires": { + "http-response-object": "^3.0.1", + "sync-rpc": "^1.2.1", + "then-request": "^6.0.0" + } + }, + "sync-rpc": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz", + "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==", + "requires": { + "get-port": "^3.1.0" + } + }, + "then-request": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", + "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", + "requires": { + "@types/concat-stream": "^1.6.0", + "@types/form-data": "0.0.33", + "@types/node": "^8.0.0", + "@types/qs": "^6.2.31", + "caseless": "~0.12.0", + "concat-stream": "^1.6.0", + "form-data": "^2.2.0", + "http-basic": "^8.1.1", + "http-response-object": "^3.0.1", + "promise": "^8.0.0", + "qs": "^6.4.0" + }, + "dependencies": { + "@types/node": { + "version": "8.10.66", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", + "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==" + } + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, + "typescript": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.2.tgz", + "integrity": "sha512-e4ERvRV2wb+rRZ/IQeb3jm2VxBsirQLpQhdxplZ2MEzGvDkkMmPglecnNDfSUBivMjP93vRbngYYDQqQ/78bcQ==", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + } + } +} diff --git a/_generated/DeleteFilesV1/package.json b/_generated/DeleteFilesV1/package.json new file mode 100644 index 000000000000..d788e10bd222 --- /dev/null +++ b/_generated/DeleteFilesV1/package.json @@ -0,0 +1,27 @@ +{ + "name": "vsts-deletefiles-tasks", + "version": "1.0.0", + "description": "Azure Pipelines DeleteFiles Task", + "main": "deletefiles.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/Microsoft/azure-pipelines-tasks.git" + }, + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Microsoft/azure-pipelines-tasks/issues" + }, + "homepage": "https://github.com/Microsoft/azure-pipelines-tasks#readme", + "dependencies": { + "@types/node": "^16.11.59", + "@types/mocha": "^5.2.7", + "azure-pipelines-task-lib": "^5.0.0-preview.0" + }, + "devDependencies": { + "typescript": "4.0.2" + } +} diff --git a/_generated/DeleteFilesV1/task.json b/_generated/DeleteFilesV1/task.json new file mode 100644 index 000000000000..dd66847e78ff --- /dev/null +++ b/_generated/DeleteFilesV1/task.json @@ -0,0 +1,94 @@ +{ + "id": "B7E8B412-0437-4065-9371-EDC5881DE25B", + "name": "DeleteFiles", + "friendlyName": "Delete files", + "description": "Delete folders, or files matching a pattern", + "helpUrl": "https://docs.microsoft.com/azure/devops/pipelines/tasks/utility/delete-files", + "helpMarkDown": "[Learn more about this task](https://go.microsoft.com/fwlink/?LinkID=722333)", + "category": "Utility", + "visibility": [ + "Build" + ], + "runsOn": [ + "Agent", + "DeploymentGroup" + ], + "author": "Microsoft Corporation", + "version": { + "Major": 1, + "Minor": 229, + "Patch": 0 + }, + "demands": [], + "minimumAgentVersion": "2.182.1", + "groups": [ + { + "name": "advanced", + "displayName": "Advanced", + "isExpanded": false + } + ], + "inputs": [ + { + "name": "SourceFolder", + "type": "filePath", + "label": "Source Folder", + "defaultValue": "", + "required": false, + "helpMarkDown": "The source folder that the deletion(s) will be run from. Empty is the root of the repo. Use [variables](https://go.microsoft.com/fwlink/?LinkID=550988) if files are not in the repo. Example: $(agent.builddirectory)" + }, + { + "name": "Contents", + "type": "multiLine", + "label": "Contents", + "defaultValue": "myFileShare", + "required": true, + "helpMarkDown": "File/folder paths to delete. Supports multiple lines of minimatch patterns. [More Information](https://go.microsoft.com/fwlink/?LinkID=722333)" + }, + { + "name": "RemoveSourceFolder", + "type": "boolean", + "label": "Remove SourceFolder", + "defaultValue": false, + "required": false, + "helpMarkDown": "Attempt to remove the source folder as well." + }, + { + "name": "RemoveDotFiles", + "type": "boolean", + "label": "Remove files starting with a dot", + "defaultValue": false, + "required": false, + "helpMarkDown": "Delete files starting with a dot (.git, .dockerfile). Omits these files if it's not specified explicitly (for example, '/.*'). Please see this [link](https://github.com/isaacs/minimatch#dot) for more info", + "groupName": "advanced" + } + ], + "instanceNameFormat": "Delete files from $(SourceFolder)", + "execution": { + "Node10": { + "target": "deletefiles.js", + "argumentFormat": "" + }, + "Node16": { + "target": "deletefiles.js", + "argumentFormat": "" + } + }, + "restrictions": { + "commands": { + "mode": "restricted" + }, + "settableVariables": { + "allowed": [] + } + }, + "messages": { + "CantDeleteFiles": "Couldn't delete one or more files", + "SkippingSymbolStore": "Skipping delete for symbol store file share: %s", + "NoFiles": "No files to delete." + }, + "_buildConfigMapping": { + "Default": "1.229.0", + "Node20-225": "1.229.1" + } +} \ No newline at end of file diff --git a/_generated/DeleteFilesV1/task.loc.json b/_generated/DeleteFilesV1/task.loc.json new file mode 100644 index 000000000000..74322788bcbe --- /dev/null +++ b/_generated/DeleteFilesV1/task.loc.json @@ -0,0 +1,94 @@ +{ + "id": "B7E8B412-0437-4065-9371-EDC5881DE25B", + "name": "DeleteFiles", + "friendlyName": "ms-resource:loc.friendlyName", + "description": "ms-resource:loc.description", + "helpUrl": "https://docs.microsoft.com/azure/devops/pipelines/tasks/utility/delete-files", + "helpMarkDown": "ms-resource:loc.helpMarkDown", + "category": "Utility", + "visibility": [ + "Build" + ], + "runsOn": [ + "Agent", + "DeploymentGroup" + ], + "author": "Microsoft Corporation", + "version": { + "Major": 1, + "Minor": 229, + "Patch": 0 + }, + "demands": [], + "minimumAgentVersion": "2.182.1", + "groups": [ + { + "name": "advanced", + "displayName": "ms-resource:loc.group.displayName.advanced", + "isExpanded": false + } + ], + "inputs": [ + { + "name": "SourceFolder", + "type": "filePath", + "label": "ms-resource:loc.input.label.SourceFolder", + "defaultValue": "", + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.SourceFolder" + }, + { + "name": "Contents", + "type": "multiLine", + "label": "ms-resource:loc.input.label.Contents", + "defaultValue": "myFileShare", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.Contents" + }, + { + "name": "RemoveSourceFolder", + "type": "boolean", + "label": "ms-resource:loc.input.label.RemoveSourceFolder", + "defaultValue": false, + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.RemoveSourceFolder" + }, + { + "name": "RemoveDotFiles", + "type": "boolean", + "label": "ms-resource:loc.input.label.RemoveDotFiles", + "defaultValue": false, + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.RemoveDotFiles", + "groupName": "advanced" + } + ], + "instanceNameFormat": "ms-resource:loc.instanceNameFormat", + "execution": { + "Node10": { + "target": "deletefiles.js", + "argumentFormat": "" + }, + "Node16": { + "target": "deletefiles.js", + "argumentFormat": "" + } + }, + "restrictions": { + "commands": { + "mode": "restricted" + }, + "settableVariables": { + "allowed": [] + } + }, + "messages": { + "CantDeleteFiles": "ms-resource:loc.messages.CantDeleteFiles", + "SkippingSymbolStore": "ms-resource:loc.messages.SkippingSymbolStore", + "NoFiles": "ms-resource:loc.messages.NoFiles" + }, + "_buildConfigMapping": { + "Default": "1.229.0", + "Node20-225": "1.229.1" + } +} \ No newline at end of file diff --git a/_generated/DeleteFilesV1/tsconfig.json b/_generated/DeleteFilesV1/tsconfig.json new file mode 100644 index 000000000000..0438b79f69ac --- /dev/null +++ b/_generated/DeleteFilesV1/tsconfig.json @@ -0,0 +1,6 @@ +{ + "compilerOptions": { + "target": "ES6", + "module": "commonjs" + } +} \ No newline at end of file diff --git a/_generated/DeleteFilesV1_Node20/.npmrc b/_generated/DeleteFilesV1_Node20/.npmrc new file mode 100644 index 000000000000..5fca0d518be7 --- /dev/null +++ b/_generated/DeleteFilesV1_Node20/.npmrc @@ -0,0 +1 @@ +scripts-prepend-node-path=true diff --git a/_generated/DeleteFilesV1_Node20/Strings/resources.resjson/de-DE/resources.resjson b/_generated/DeleteFilesV1_Node20/Strings/resources.resjson/de-DE/resources.resjson new file mode 100644 index 000000000000..7ad1f501a90d --- /dev/null +++ b/_generated/DeleteFilesV1_Node20/Strings/resources.resjson/de-DE/resources.resjson @@ -0,0 +1,18 @@ +{ + "loc.friendlyName": "Dateien löschen", + "loc.helpMarkDown": "[Weitere Informationen zu dieser Aufgabe](https://go.microsoft.com/fwlink/?LinkID=722333)", + "loc.description": "Hiermit werden Ordner oder Dateien gelöscht, die einem Muster entsprechen.", + "loc.instanceNameFormat": "Dateien aus \"$(SourceFolder)\" löschen", + "loc.group.displayName.advanced": "Erweitert", + "loc.input.label.SourceFolder": "Quellordner", + "loc.input.help.SourceFolder": "Der Quellordner, aus dem mindestens ein Löschvorgang ausgeführt wird. \"Empty\" ist der Stamm des Repositorys. Verwenden Sie [Variablen](https://go.microsoft.com/fwlink/?LinkID=550988), wenn sich Dateien nicht im Repository befinden, z. B. \"$(agent.builddirectory)\".", + "loc.input.label.Contents": "Inhalte", + "loc.input.help.Contents": "Die zu löschenden Datei-/Ordnerpfade. Mehrere Zeilen von Minimatchmustern werden unterstützt. [Weitere Informationen](https://go.microsoft.com/fwlink/?LinkID=722333)", + "loc.input.label.RemoveSourceFolder": "SourceFolder entfernen", + "loc.input.help.RemoveSourceFolder": "Versuchen Sie, auch den Quellordner zu entfernen.", + "loc.input.label.RemoveDotFiles": "Dateien entfernen, die mit einem Punkt beginnen", + "loc.input.help.RemoveDotFiles": "Löschen Sie Dateien, beginnend mit einem Punkt (GIT, DOCKERFILE). Diese Dateien werden weggelassen, wenn sie nicht explizit angegeben werden (z. B. \"/.*\"). Weitere Informationen finden Sie unter [Link](https://github.com/isaacs/minimatch#dot)", + "loc.messages.CantDeleteFiles": "Mindestens eine Datei konnte nicht gelöscht werden.", + "loc.messages.SkippingSymbolStore": "Der Löschvorgang für die Symbolspeicher-Dateifreigabe wird übersprungen: %s", + "loc.messages.NoFiles": "Es sind keine zu löschenden Dateien vorhanden." +} \ No newline at end of file diff --git a/_generated/DeleteFilesV1_Node20/Strings/resources.resjson/en-US/resources.resjson b/_generated/DeleteFilesV1_Node20/Strings/resources.resjson/en-US/resources.resjson new file mode 100644 index 000000000000..ed6d0001ca15 --- /dev/null +++ b/_generated/DeleteFilesV1_Node20/Strings/resources.resjson/en-US/resources.resjson @@ -0,0 +1,18 @@ +{ + "loc.friendlyName": "Delete files", + "loc.helpMarkDown": "[Learn more about this task](https://go.microsoft.com/fwlink/?LinkID=722333)", + "loc.description": "Delete folders, or files matching a pattern", + "loc.instanceNameFormat": "Delete files from $(SourceFolder)", + "loc.group.displayName.advanced": "Advanced", + "loc.input.label.SourceFolder": "Source Folder", + "loc.input.help.SourceFolder": "The source folder that the deletion(s) will be run from. Empty is the root of the repo. Use [variables](https://go.microsoft.com/fwlink/?LinkID=550988) if files are not in the repo. Example: $(agent.builddirectory)", + "loc.input.label.Contents": "Contents", + "loc.input.help.Contents": "File/folder paths to delete. Supports multiple lines of minimatch patterns. [More Information](https://go.microsoft.com/fwlink/?LinkID=722333)", + "loc.input.label.RemoveSourceFolder": "Remove SourceFolder", + "loc.input.help.RemoveSourceFolder": "Attempt to remove the source folder as well.", + "loc.input.label.RemoveDotFiles": "Remove files starting with a dot", + "loc.input.help.RemoveDotFiles": "Delete files starting with a dot (.git, .dockerfile). Omits these files if it's not specified explicitly (for example, '/.*'). Please see this [link](https://github.com/isaacs/minimatch#dot) for more info", + "loc.messages.CantDeleteFiles": "Couldn't delete one or more files", + "loc.messages.SkippingSymbolStore": "Skipping delete for symbol store file share: %s", + "loc.messages.NoFiles": "No files to delete." +} \ No newline at end of file diff --git a/_generated/DeleteFilesV1_Node20/Strings/resources.resjson/es-ES/resources.resjson b/_generated/DeleteFilesV1_Node20/Strings/resources.resjson/es-ES/resources.resjson new file mode 100644 index 000000000000..ad67f59b8eef --- /dev/null +++ b/_generated/DeleteFilesV1_Node20/Strings/resources.resjson/es-ES/resources.resjson @@ -0,0 +1,18 @@ +{ + "loc.friendlyName": "Eliminar archivos", + "loc.helpMarkDown": "[Obtener más información acerca de esta tarea](https://go.microsoft.com/fwlink/?LinkID=722333)", + "loc.description": "Elimina las carpetas o archivos que coinciden con un patrón.", + "loc.instanceNameFormat": "Eliminar archivos de $(SourceFolder)", + "loc.group.displayName.advanced": "Avanzado", + "loc.input.label.SourceFolder": "Carpeta de origen", + "loc.input.help.SourceFolder": "La carpeta de origen desde la que se ejecutarán las eliminaciones. La raíz del repositorio está vacía. Use [variables](https://go.microsoft.com/fwlink/?LinkID=550988) si los archivos no están en el repositorio. Ejemplo: $(agent.builddirectory)", + "loc.input.label.Contents": "Contenido", + "loc.input.help.Contents": "Rutas de archivo o carpeta que se eliminarán. Admite varias líneas de patrones de minimatch. [Más información](https://go.microsoft.com/fwlink/?LinkID=722333)", + "loc.input.label.RemoveSourceFolder": "Quitar SourceFolder", + "loc.input.help.RemoveSourceFolder": "Intente quitar también la carpeta de origen.", + "loc.input.label.RemoveDotFiles": "Quitar archivos que comiencen con un punto", + "loc.input.help.RemoveDotFiles": "Elimine los archivos que empiecen por un punto (.git,. dockerfile). Omita estos archivos si no se especifican explícitamente (por ejemplo, \"/. *\"). Para obtener más información, consulte este [vínculo] (https://github.com/isaacs/minimatch#dot)", + "loc.messages.CantDeleteFiles": "No se han podido eliminar uno o varios archivos", + "loc.messages.SkippingSymbolStore": "Se omitirá la eliminación del recurso compartido de archivos de símbolos: %s", + "loc.messages.NoFiles": "No hay archivos que se deban eliminar." +} \ No newline at end of file diff --git a/_generated/DeleteFilesV1_Node20/Strings/resources.resjson/fr-FR/resources.resjson b/_generated/DeleteFilesV1_Node20/Strings/resources.resjson/fr-FR/resources.resjson new file mode 100644 index 000000000000..265258f8ecbd --- /dev/null +++ b/_generated/DeleteFilesV1_Node20/Strings/resources.resjson/fr-FR/resources.resjson @@ -0,0 +1,18 @@ +{ + "loc.friendlyName": "Supprimer des fichiers", + "loc.helpMarkDown": "[En savoir plus sur cette tâche](https://go.microsoft.com/fwlink/?LinkID=722333)", + "loc.description": "Supprimer des dossiers ou des fichiers correspondant à un modèle", + "loc.instanceNameFormat": "Supprimer les fichiers de $(SourceFolder)", + "loc.group.displayName.advanced": "Avancé", + "loc.input.label.SourceFolder": "Dossier source", + "loc.input.help.SourceFolder": "Dossier source à partir duquel la ou les suppressions sont exécutées. Si aucune valeur n'est spécifiée, la racine du dépôt est utilisée. Utilisez des [variables](https://go.microsoft.com/fwlink/?LinkID=550988), si les fichiers ne sont pas dans le dépôt. Exemple : $(agent.builddirectory)", + "loc.input.label.Contents": "Contenu", + "loc.input.help.Contents": "Chemins des fichiers/dossiers à supprimer. Prend en charge plusieurs lignes de modèles minimatch. [Plus d'informations](https://go.microsoft.com/fwlink/?LinkID=722333)", + "loc.input.label.RemoveSourceFolder": "Supprimer SourceFolder", + "loc.input.help.RemoveSourceFolder": "Essayez également de supprimer le dossier source.", + "loc.input.label.RemoveDotFiles": "Supprimer des fichiers à partir d’un point", + "loc.input.help.RemoveDotFiles": "Supprimez les fichiers en commençant par un point (.git, .dockerfile). Omette ces fichiers s’ils ne sont pas spécifiés de manière explicite (par exemple, « /.* »). Pour plus d’informations, voir ce [lien](https://github.com/isaacs/minimatch#dot)", + "loc.messages.CantDeleteFiles": "Impossible de supprimer un ou plusieurs fichiers", + "loc.messages.SkippingSymbolStore": "Suppression ignorée du partage de fichiers du magasin de symboles : %s", + "loc.messages.NoFiles": "Aucun fichier à supprimer." +} \ No newline at end of file diff --git a/_generated/DeleteFilesV1_Node20/Strings/resources.resjson/it-IT/resources.resjson b/_generated/DeleteFilesV1_Node20/Strings/resources.resjson/it-IT/resources.resjson new file mode 100644 index 000000000000..560d870fd0f0 --- /dev/null +++ b/_generated/DeleteFilesV1_Node20/Strings/resources.resjson/it-IT/resources.resjson @@ -0,0 +1,18 @@ +{ + "loc.friendlyName": "Elimina file", + "loc.helpMarkDown": "[Altre informazioni su questa attività](https://go.microsoft.com/fwlink/?LinkID=722333)", + "loc.description": "Elimina cartelle o file corrispondenti a un criterio", + "loc.instanceNameFormat": "Elimina file da $(SourceFolder)", + "loc.group.displayName.advanced": "Avanzate", + "loc.input.label.SourceFolder": "Cartella di origine", + "loc.input.help.SourceFolder": "Cartella di origine da cui verranno eseguite le eliminazioni. Il valore vuoto corrisponde alla radice del repository. Usare le [variabili](https://go.microsoft.com/fwlink/?LinkID=550988) se i file non sono presenti nel repository. Esempio: $(agent.builddirectory)", + "loc.input.label.Contents": "Contenuti", + "loc.input.help.Contents": "Percorsi di file/cartella da eliminare. Sono supportate più righe di criteri di corrispondenza minima. [Altre informazioni](https://go.microsoft.com/fwlink/?LinkID=722333)", + "loc.input.label.RemoveSourceFolder": "Rimuovi cartella di origine", + "loc.input.help.RemoveSourceFolder": "Verrà effettuato un tentativo di rimuovere anche la cartella di origine.", + "loc.input.label.RemoveDotFiles": "Rimuovi i file che iniziano con un punto", + "loc.input.help.RemoveDotFiles": "È possibile eliminare i file che iniziano con un punto (.git, .dockerfile). Questi file vengono omessi, se non vengono specificati in modo esplicito, ad esempio '/.*'. Vedere questo [collegamento] (https://github.com/isaacs/minimatch#dot) per altre informazioni", + "loc.messages.CantDeleteFiles": "Non è stato possibile eliminare uno o più file", + "loc.messages.SkippingSymbolStore": "L'eliminazione per la condivisione file dell'archivio simboli verrà ignorata: %s", + "loc.messages.NoFiles": "Non ci sono file da eliminare." +} \ No newline at end of file diff --git a/_generated/DeleteFilesV1_Node20/Strings/resources.resjson/ja-JP/resources.resjson b/_generated/DeleteFilesV1_Node20/Strings/resources.resjson/ja-JP/resources.resjson new file mode 100644 index 000000000000..8702f95ad507 --- /dev/null +++ b/_generated/DeleteFilesV1_Node20/Strings/resources.resjson/ja-JP/resources.resjson @@ -0,0 +1,18 @@ +{ + "loc.friendlyName": "ファイルの削除", + "loc.helpMarkDown": "[このタスクの詳細を表示](https://go.microsoft.com/fwlink/?LinkID=722333)", + "loc.description": "パターンに一致するフォルダーまたはファイルを削除します", + "loc.instanceNameFormat": "ファイルを $(SourceFolder) から削除する", + "loc.group.displayName.advanced": "詳細", + "loc.input.label.SourceFolder": "ソース フォルダー", + "loc.input.help.SourceFolder": "削除の実行元のソース フォルダー。空白の場合、リポジトリのルートになります。ファイルがリポジトリにない場合は、[変数](https://go.microsoft.com/fwlink/?LinkID=550988) を使用します。例: $(agent.builddirectory)", + "loc.input.label.Contents": "コンテンツ", + "loc.input.help.Contents": "削除するファイル/ファルダーのパス。minimatch パターンの複数行をサポートします。[詳細](https://go.microsoft.com/fwlink/?LinkID=722333)", + "loc.input.label.RemoveSourceFolder": "SourceFolder の削除", + "loc.input.help.RemoveSourceFolder": "ソース フォルダーの削除も試行します。", + "loc.input.label.RemoveDotFiles": "ドットで始まるファイルを削除します", + "loc.input.help.RemoveDotFiles": "ドットで始まるファイル (.git、.dockerfile) を削除します。明示的に指定されていない場合は、これらのファイルを省略します (例: '/. * ')。詳細については、この [リンク] を参照してください (https://github.com/isaacs/minimatch#dot)", + "loc.messages.CantDeleteFiles": "1 つ以上のファイルを削除できませんでした", + "loc.messages.SkippingSymbolStore": "シンボル ストアのファイル共有の削除をスキップしています: %s", + "loc.messages.NoFiles": "削除できるファイルはありません。" +} \ No newline at end of file diff --git a/_generated/DeleteFilesV1_Node20/Strings/resources.resjson/ko-KR/resources.resjson b/_generated/DeleteFilesV1_Node20/Strings/resources.resjson/ko-KR/resources.resjson new file mode 100644 index 000000000000..900e23e3165a --- /dev/null +++ b/_generated/DeleteFilesV1_Node20/Strings/resources.resjson/ko-KR/resources.resjson @@ -0,0 +1,18 @@ +{ + "loc.friendlyName": "파일 삭제", + "loc.helpMarkDown": "[이 작업에 대한 자세한 정보](https://go.microsoft.com/fwlink/?LinkID=722333)", + "loc.description": "패턴과 일치하는 폴더 또는 파일을 삭제합니다.", + "loc.instanceNameFormat": "$(SourceFolder)에서 파일 삭제", + "loc.group.displayName.advanced": "고급", + "loc.input.label.SourceFolder": "소스 폴더", + "loc.input.help.SourceFolder": "삭제 작업이 실행될 소스 폴더입니다. 리포지토리의 루트는 [비어 있음]입니다. 파일이 리포지토리에 없으면 [변수](https://go.microsoft.com/fwlink/?LinkID=550988)를 사용하세요. 예: $(agent.builddirectory)", + "loc.input.label.Contents": "콘텐츠", + "loc.input.help.Contents": "삭제할 파일/폴더 경로입니다. 여러 줄의 minimatch 패턴을 지원합니다. [자세한 정보](https://go.microsoft.com/fwlink/?LinkID=722333)", + "loc.input.label.RemoveSourceFolder": "SourceFolder 제거", + "loc.input.help.RemoveSourceFolder": "소스 폴더도 제거하려고 합니다.", + "loc.input.label.RemoveDotFiles": "점으로 시작하는 파일 제거", + "loc.input.help.RemoveDotFiles": "점(git, dockerfile)으로 시작하는 파일을 삭제합니다. 이 파일이 명시적으로 지정되지 않은 경우(예: '/.*') 이러한 파일을 생략합니다. 자세한 내용은 이 [링크] (https://github.com/isaacs/minimatch#dot)를 참조하세요", + "loc.messages.CantDeleteFiles": "하나 이상의 파일을 삭제할 수 없습니다.", + "loc.messages.SkippingSymbolStore": "기호 저장소 파일 공유에 대해 건너뛰면 삭제됨: %s", + "loc.messages.NoFiles": "삭제할 파일이 없습니다." +} \ No newline at end of file diff --git a/_generated/DeleteFilesV1_Node20/Strings/resources.resjson/ru-RU/resources.resjson b/_generated/DeleteFilesV1_Node20/Strings/resources.resjson/ru-RU/resources.resjson new file mode 100644 index 000000000000..7bca97bf2e9a --- /dev/null +++ b/_generated/DeleteFilesV1_Node20/Strings/resources.resjson/ru-RU/resources.resjson @@ -0,0 +1,18 @@ +{ + "loc.friendlyName": "Удалить файлы", + "loc.helpMarkDown": "[См. дополнительные сведения об этой задаче](https://go.microsoft.com/fwlink/?LinkID=722333)", + "loc.description": "Удалить папки или файлы, соответствующие шаблону", + "loc.instanceNameFormat": "Удалить файлы из $(SourceFolder)", + "loc.group.displayName.advanced": "Дополнительно", + "loc.input.label.SourceFolder": "Исходная папка", + "loc.input.help.SourceFolder": "Исходная папка, из которой будет запускаться удаление. Если значение не указано, используется корень репозитория. Если в репозитории нет файлов, используйте [переменные] (https://go.microsoft.com/fwlink/?LinkID=550988). Например, $(agent.builddirectory)", + "loc.input.label.Contents": "Содержимое", + "loc.input.help.Contents": "Пути к удаляемым файлам или папкам. Поддерживает несколько строк шаблонов minimatch. [Подробнее...] (https://go.microsoft.com/fwlink/?LinkID=722333)", + "loc.input.label.RemoveSourceFolder": "Удалить SourceFolder", + "loc.input.help.RemoveSourceFolder": "Попробуйте удалить и исходную папку.", + "loc.input.label.RemoveDotFiles": "Удалить файлы, имена которых начинаются с точки", + "loc.input.help.RemoveDotFiles": "Удаление файлов, имена которых начинаются с точки (.git, .dockerfile). Эти файлы пропускаются, если не указано явно (например, \"/.*\"). Дополнительные сведения можно найти по [ссылке](https://github.com/isaacs/minimatch#dot)", + "loc.messages.CantDeleteFiles": "Не удалось удалить один или несколько файлов", + "loc.messages.SkippingSymbolStore": "Пропускается удаление общей папки хранилища символов: %s.", + "loc.messages.NoFiles": "Нет файлов для удаления." +} \ No newline at end of file diff --git a/_generated/DeleteFilesV1_Node20/Strings/resources.resjson/zh-CN/resources.resjson b/_generated/DeleteFilesV1_Node20/Strings/resources.resjson/zh-CN/resources.resjson new file mode 100644 index 000000000000..1c91f5408435 --- /dev/null +++ b/_generated/DeleteFilesV1_Node20/Strings/resources.resjson/zh-CN/resources.resjson @@ -0,0 +1,18 @@ +{ + "loc.friendlyName": "删除文件", + "loc.helpMarkDown": "[详细了解此任务](https://go.microsoft.com/fwlink/?LinkID=722333)", + "loc.description": "删除文件夹或与模式匹配的文件", + "loc.instanceNameFormat": "从 $(SourceFolder) 中删除文件", + "loc.group.displayName.advanced": "高级", + "loc.input.label.SourceFolder": "源文件夹", + "loc.input.help.SourceFolder": "将从其中运行删除的源文件夹。为空表示存储库的根。如果文件不在存储库中,请使用[变量](https://go.microsoft.com/fwlink/?LinkID=550988)。示例: $(agent.builddirectory)", + "loc.input.label.Contents": "内容", + "loc.input.help.Contents": "要删除的文件/文件夹路径。支持多行的最小匹配模式。[详细信息](https://go.microsoft.com/fwlink/?LinkID=722333)", + "loc.input.label.RemoveSourceFolder": "删除 SourceFolder", + "loc.input.help.RemoveSourceFolder": "同时尝试删除源文件夹。", + "loc.input.label.RemoveDotFiles": "删除以点开头的文件", + "loc.input.help.RemoveDotFiles": "删除以点(.git、.dockerfile)开头的文件。如果未明确指定这些文件(例如,“/.*”),则省略这些文件。请参阅此[链接](https://github.com/isaacs/minimatch#dot)以了解详细信息", + "loc.messages.CantDeleteFiles": "无法删除一个或多个文件", + "loc.messages.SkippingSymbolStore": "跳过删除符号存储文件共享: %s", + "loc.messages.NoFiles": "没有任何要删除的文件。" +} \ No newline at end of file diff --git a/_generated/DeleteFilesV1_Node20/Strings/resources.resjson/zh-TW/resources.resjson b/_generated/DeleteFilesV1_Node20/Strings/resources.resjson/zh-TW/resources.resjson new file mode 100644 index 000000000000..b493b5db8226 --- /dev/null +++ b/_generated/DeleteFilesV1_Node20/Strings/resources.resjson/zh-TW/resources.resjson @@ -0,0 +1,18 @@ +{ + "loc.friendlyName": "刪除檔案", + "loc.helpMarkDown": "[深入了解此工作](https://go.microsoft.com/fwlink/?LinkID=722333)", + "loc.description": "刪除符合模式的資料夾或檔案", + "loc.instanceNameFormat": "從 $(SourceFolder) 刪除檔案", + "loc.group.displayName.advanced": "進階", + "loc.input.label.SourceFolder": "來源資料夾", + "loc.input.help.SourceFolder": "要執行刪除作業的來源資料夾。如果保留空白,即為存放庫根目錄。如果存放庫中沒有檔案,請使用[變數](https://go.microsoft.com/fwlink/?LinkID=550988),例如: $(agent.builddirectory)", + "loc.input.label.Contents": "內容", + "loc.input.help.Contents": "要刪除的檔案/資料夾路徑。支援多行 minimatch 模式。[詳細資訊](https://go.microsoft.com/fwlink/?LinkID=722333)", + "loc.input.label.RemoveSourceFolder": "移除 SourceFolder", + "loc.input.help.RemoveSourceFolder": "嘗試一併移除來源資料夾。", + "loc.input.label.RemoveDotFiles": "移除以點開頭的檔案", + "loc.input.help.RemoveDotFiles": "刪除以點 (.git、.dockerfile) 開頭的檔案。如果未明確指定 (例如 '/.*'),請省略這些檔案。如需詳細資訊,請參閱此 [連結](https://github.com/isaacs/minimatch#dot)", + "loc.messages.CantDeleteFiles": "無法刪除一或多個檔案", + "loc.messages.SkippingSymbolStore": "正在略過刪除符號存放區檔案共用: %s", + "loc.messages.NoFiles": "沒有要刪除的檔案。" +} \ No newline at end of file diff --git a/_generated/DeleteFilesV1_Node20/Tests/L0.ts b/_generated/DeleteFilesV1_Node20/Tests/L0.ts new file mode 100644 index 000000000000..59e87745e67d --- /dev/null +++ b/_generated/DeleteFilesV1_Node20/Tests/L0.ts @@ -0,0 +1,248 @@ +import assert = require('assert'); +import path = require('path'); +import fs = require('fs'); +import * as ttm from 'azure-pipelines-task-lib/mock-test'; + +const testRoot = path.join(__dirname, 'test_structure'); + +const removeFolder = function(curPath) { + if (fs.existsSync(curPath)) { + fs.readdirSync(curPath).forEach((file, index) => { + const newPath = path.join(curPath, file); + if (fs.lstatSync(newPath).isDirectory()) { + removeFolder(newPath); + } else { + fs.unlinkSync(newPath); + } + }); + fs.rmdirSync(curPath); + } +} + +describe('DeleteFiles Suite', function () { + this.timeout(60000); + + before(() => { + removeFolder(testRoot); + fs.mkdirSync(testRoot); + }) + + function runValidations(validator: () => void, tr, done) { + try { + validator(); + done(); + } + catch (error) { + console.log("STDERR", tr.stderr); + console.log("STDOUT", tr.stdout); + done(error); + } + } + + it('Deletes multiple nested folders', (done: Mocha.Done) => { + this.timeout(5000); + + const root = path.join(testRoot, 'nested'); + fs.mkdirSync(root); + + fs.mkdirSync(path.join(root, 'A')); + fs.writeFileSync(path.join(root, 'A', 'test.txt'), 'test'); + fs.mkdirSync(path.join(root, 'A', 'A')); + fs.writeFileSync(path.join(root, 'A', 'A', 'test2.txt'), 'test2'); + fs.writeFileSync(path.join(root, 'A', 'A', 'test3.txt'), 'test3'); + fs.mkdirSync(path.join(root, 'B')); + fs.writeFileSync(path.join(root, 'B', 'test4.txt'), 'test4'); + fs.mkdirSync(path.join(root, 'C')); + fs.writeFileSync(path.join(root, 'C', 'dontDelete.txt'), 'dont delete'); + + let tp: string = path.join(__dirname, 'L0Nested.js'); + let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + runValidations(() => { + assert(!fs.existsSync(path.join(root, 'A'))); + assert(!fs.existsSync(path.join(root, 'B'))); + assert(fs.existsSync(path.join(root, 'C'))); + assert(fs.existsSync(path.join(root, 'C', 'dontDelete.txt'))); + }, tr, done); + }); + + it('Deletes files with negate pattern', (done: Mocha.Done) => { + this.timeout(5000); + + const root = path.join(testRoot, 'negate'); + fs.mkdirSync(root); + + fs.mkdirSync(path.join(root, 'A')); + fs.writeFileSync(path.join(root, 'A', 'test1.js'), 'test1'); + fs.writeFileSync(path.join(root, 'A', 'test2.css'), 'test2'); + + let tp: string = path.join(__dirname, 'L0Negate.js'); + let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + runValidations(() => { + assert(!fs.existsSync(path.join(root, 'A', 'test2.css'))); + assert(fs.existsSync(path.join(root, 'A', 'test1.js'))); + }, tr, done); + }); + + it('Deletes files starting with a dot', (done: Mocha.Done) => { + const root = path.join(testRoot, 'removeDotFiles'); + fs.mkdirSync(root); + + fs.mkdirSync(path.join(root, 'A')); + fs.writeFileSync(path.join(root, 'A', '.txt'), 'test1'); + fs.writeFileSync(path.join(root, 'A', '.sample.txt'), 'test2'); + + let tp: string = path.join(__dirname, 'L0RemoveDotFiles.js'); + let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + runValidations(() => { + assert(!fs.existsSync(path.join(root, 'A', '.txt'))); + assert(!fs.existsSync(path.join(root, 'A', '.sample.txt'))); + }, tr, done); + }); + + it('Doesnt delete files starting with a dot', (done: Mocha.Done) => { + const root = path.join(testRoot, 'DoesntRemoveDotFiles'); + fs.mkdirSync(root); + + fs.mkdirSync(path.join(root, 'A')); + fs.writeFileSync(path.join(root, 'A', '.txt'), 'test1'); + fs.writeFileSync(path.join(root, 'A', '.sample.txt'), 'test2'); + + let tp: string = path.join(__dirname, 'L0DoesntRemoveDotFiles.js'); + let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + runValidations(() => { + assert(fs.existsSync(path.join(root, 'A', '.txt'))); + assert(fs.existsSync(path.join(root, 'A', '.sample.txt'))); + }, tr, done); + }); + + it('Deletes files using braces statement', (done: Mocha.Done) => { + this.timeout(5000); + + const root = path.join(testRoot, 'braces'); + fs.mkdirSync(root); + + fs.mkdirSync(path.join(root, 'A')); + fs.writeFileSync(path.join(root, 'A', 'one.txt'), 'test1'); + fs.writeFileSync(path.join(root, 'A', 'two.txt'), 'test2'); + fs.writeFileSync(path.join(root, 'A', 'three.txt'), 'test3'); + fs.writeFileSync(path.join(root, 'A', 'four.txt'), 'test4'); + + let tp: string = path.join(__dirname, 'L0Braces.js'); + let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + runValidations(() => { + assert(!fs.existsSync(path.join(root, 'A', 'one.txt'))); + assert(!fs.existsSync(path.join(root, 'A', 'two.txt'))); + assert(fs.existsSync(path.join(root, 'A', 'three.txt'))); + assert(fs.existsSync(path.join(root, 'A', 'four.txt'))); + }, tr, done); + }); + + it('Deletes a single file', (done: Mocha.Done) => { + this.timeout(5000); + + const root = path.join(testRoot, 'singleFile'); + fs.mkdirSync(root); + + fs.mkdirSync(path.join(root, 'A')); + fs.writeFileSync(path.join(root, 'A', 'test.txt'), 'test'); + fs.mkdirSync(path.join(root, 'A', 'A')); + fs.writeFileSync(path.join(root, 'A', 'A', 'test.txt'), 'test2'); + fs.writeFileSync(path.join(root, 'A', 'A', 'test2.txt'), 'test3'); + + let tp: string = path.join(__dirname, 'L0SingleFile.js'); + let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + runValidations(() => { + assert(fs.existsSync(path.join(root, 'A'))); + assert(!fs.existsSync(path.join(root, 'A', 'test.txt'))); + assert(fs.existsSync(path.join(root, 'A', 'A'))); + assert(fs.existsSync(path.join(root, 'A', 'A', 'test.txt'))); + assert(fs.existsSync(path.join(root, 'A', 'A', 'test2.txt'))); + }, tr, done); + }); + + it('Removes the source folder if its empty', (done: Mocha.Done) => { + this.timeout(5000); + + const root = path.join(testRoot, 'rmSource'); + fs.mkdirSync(root); + + fs.mkdirSync(path.join(root, 'A')); + fs.writeFileSync(path.join(root, 'A', 'test.txt'), 'test'); + fs.mkdirSync(path.join(root, 'A', 'A')); + fs.writeFileSync(path.join(root, 'A', 'A', 'test2.txt'), 'test2'); + fs.writeFileSync(path.join(root, 'A', 'A', 'test3.txt'), 'test3'); + + let tp: string = path.join(__dirname, 'L0RmSource.js'); + let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + runValidations(() => { + assert(!fs.existsSync(root)); + }, tr, done); + }); + + it('Doesnt remove folder outside the root', (done: Mocha.Done) => { + this.timeout(5000); + + const root = path.join(testRoot, 'insideRoot'); + const outsideRoot = path.join(testRoot, 'outsideRoot'); + fs.mkdirSync(root); + fs.mkdirSync(outsideRoot); + + fs.writeFileSync(path.join(outsideRoot, 'test.txt'), 'test'); + + let tp: string = path.join(__dirname, 'L0OutsideRoot.js'); + let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + runValidations(() => { + assert(fs.existsSync(path.join(outsideRoot, 'test.txt'))); + }, tr, done); + }); + + it('Removes folder with locked file', (done: Mocha.Done) => { + this.timeout(5000); + + const root = path.join(testRoot, 'locked'); + fs.mkdirSync(root); + fs.mkdirSync(path.join(root, 'A')); + fs.appendFileSync(path.join(root, 'A', 'test.txt'), 'test'); + var fd = fs.openSync(path.join(root, 'A', 'test.txt'), 'r'); + + let tp: string = path.join(__dirname, 'L0Locked.js'); + let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + try { + tr.run(); + } + catch (err) {} + finally { + fs.closeSync(fd); + } + + runValidations(() => { + assert(!fs.existsSync(path.join(root, 'A'))); + assert(tr.succeeded); + }, tr, done); + }); +}); diff --git a/_generated/DeleteFilesV1_Node20/Tests/L0Braces.ts b/_generated/DeleteFilesV1_Node20/Tests/L0Braces.ts new file mode 100644 index 000000000000..68048838913c --- /dev/null +++ b/_generated/DeleteFilesV1_Node20/Tests/L0Braces.ts @@ -0,0 +1,12 @@ +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'deletefiles.js'); +let tmr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +const testRoot: string = path.join(__dirname, "test_structure", "braces"); + +tmr.setInput('Contents', '/**/{one.txt,two.txt}'); +tmr.setInput('SourceFolder', testRoot); + +tmr.run(true); \ No newline at end of file diff --git a/_generated/DeleteFilesV1_Node20/Tests/L0DoesntRemoveDotFiles.ts b/_generated/DeleteFilesV1_Node20/Tests/L0DoesntRemoveDotFiles.ts new file mode 100644 index 000000000000..06826920f66c --- /dev/null +++ b/_generated/DeleteFilesV1_Node20/Tests/L0DoesntRemoveDotFiles.ts @@ -0,0 +1,12 @@ +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'deletefiles.js'); +let tmr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +const testRoot: string = path.join(__dirname, "test_structure", "DoesntRemoveDotFiles"); + +tmr.setInput('Contents', '/**/*.txt'); +tmr.setInput('SourceFolder', testRoot); + +tmr.run(true); diff --git a/_generated/DeleteFilesV1_Node20/Tests/L0Locked.ts b/_generated/DeleteFilesV1_Node20/Tests/L0Locked.ts new file mode 100644 index 000000000000..f62d669571f9 --- /dev/null +++ b/_generated/DeleteFilesV1_Node20/Tests/L0Locked.ts @@ -0,0 +1,12 @@ +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'deletefiles.js'); +let tmr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +const testRoot: string = path.join(__dirname, "test_structure", "locked"); + +tmr.setInput('Contents', 'A'); +tmr.setInput('SourceFolder', testRoot); + +tmr.run(true); \ No newline at end of file diff --git a/_generated/DeleteFilesV1_Node20/Tests/L0Negate.ts b/_generated/DeleteFilesV1_Node20/Tests/L0Negate.ts new file mode 100644 index 000000000000..f66f16ffb218 --- /dev/null +++ b/_generated/DeleteFilesV1_Node20/Tests/L0Negate.ts @@ -0,0 +1,12 @@ +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'deletefiles.js'); +let tmr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +const testRoot: string = path.join(__dirname, "test_structure", "negate"); + +tmr.setInput('Contents', '/**/!(*.js)'); +tmr.setInput('SourceFolder', testRoot); + +tmr.run(true); \ No newline at end of file diff --git a/_generated/DeleteFilesV1_Node20/Tests/L0Nested.ts b/_generated/DeleteFilesV1_Node20/Tests/L0Nested.ts new file mode 100644 index 000000000000..3e4282958bb2 --- /dev/null +++ b/_generated/DeleteFilesV1_Node20/Tests/L0Nested.ts @@ -0,0 +1,12 @@ +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'deletefiles.js'); +let tmr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +const testRoot: string = path.join(__dirname, "test_structure", "nested"); + +tmr.setInput('Contents', 'A*\nB*'); +tmr.setInput('SourceFolder', testRoot); + +tmr.run(true); \ No newline at end of file diff --git a/_generated/DeleteFilesV1_Node20/Tests/L0OutsideRoot.ts b/_generated/DeleteFilesV1_Node20/Tests/L0OutsideRoot.ts new file mode 100644 index 000000000000..840de90fcdff --- /dev/null +++ b/_generated/DeleteFilesV1_Node20/Tests/L0OutsideRoot.ts @@ -0,0 +1,12 @@ +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'deletefiles.js'); +let tmr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +const testRoot: string = path.join(__dirname, "test_structure", "insideRoot"); + +tmr.setInput('Contents', '../outsideRoot/test.txt'); +tmr.setInput('SourceFolder', testRoot); + +tmr.run(true); \ No newline at end of file diff --git a/_generated/DeleteFilesV1_Node20/Tests/L0RemoveDotFiles.ts b/_generated/DeleteFilesV1_Node20/Tests/L0RemoveDotFiles.ts new file mode 100644 index 000000000000..af10b8cde5d6 --- /dev/null +++ b/_generated/DeleteFilesV1_Node20/Tests/L0RemoveDotFiles.ts @@ -0,0 +1,13 @@ +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'deletefiles.js'); +let tmr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +const testRoot: string = path.join(__dirname, "test_structure", "removeDotFiles"); + +tmr.setInput('Contents', '/**/*.txt'); +tmr.setInput('SourceFolder', testRoot); +tmr.setInput('RemoveDotFiles', "true"); + +tmr.run(true); diff --git a/_generated/DeleteFilesV1_Node20/Tests/L0RmSource.ts b/_generated/DeleteFilesV1_Node20/Tests/L0RmSource.ts new file mode 100644 index 000000000000..64293c03b929 --- /dev/null +++ b/_generated/DeleteFilesV1_Node20/Tests/L0RmSource.ts @@ -0,0 +1,13 @@ +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'deletefiles.js'); +let tmr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +const testRoot: string = path.join(__dirname, "test_structure", "rmSource"); + +tmr.setInput('Contents', 'A*'); +tmr.setInput('SourceFolder', testRoot); +tmr.setInput('RemoveSourceFolder', "true"); + +tmr.run(true); \ No newline at end of file diff --git a/_generated/DeleteFilesV1_Node20/Tests/L0SingleFile.ts b/_generated/DeleteFilesV1_Node20/Tests/L0SingleFile.ts new file mode 100644 index 000000000000..ac5baf9312fc --- /dev/null +++ b/_generated/DeleteFilesV1_Node20/Tests/L0SingleFile.ts @@ -0,0 +1,12 @@ +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'deletefiles.js'); +let tmr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +const testRoot: string = path.join(__dirname, "test_structure", "singleFile"); + +tmr.setInput('Contents', 'A/test.txt'); +tmr.setInput('SourceFolder', testRoot); + +tmr.run(true); \ No newline at end of file diff --git a/_generated/DeleteFilesV1_Node20/deletefiles.ts b/_generated/DeleteFilesV1_Node20/deletefiles.ts new file mode 100644 index 000000000000..8ef44d7a9516 --- /dev/null +++ b/_generated/DeleteFilesV1_Node20/deletefiles.ts @@ -0,0 +1,170 @@ +import path = require('path'); +import os = require('os'); +import tl = require('azure-pipelines-task-lib/task'); +tl.setResourcePath(path.join(__dirname, 'task.json')); + +(() => { + // contents is a multiline input containing glob patterns + let patterns: string[] = tl.getDelimitedInput('Contents', '\n', true); + + let sourceFolder: string = tl.getPathInput('SourceFolder', true, false); + + const removeSourceFolder: boolean = tl.getBoolInput('RemoveSourceFolder', false); + const removeDotFiles: boolean = tl.getBoolInput('RemoveDotFiles', false); + + // Input that is used for backward compatibility with pre-sprint 95 symbol store artifacts. + // Pre-95 symbol store artifacts were simply file path artifacts, so we need to make sure + // not to delete the artifact share if it's a symbol store. + let buildCleanup: boolean = tl.getBoolInput('BuildCleanup'); + + // trim whitespace and root each pattern + patterns = patterns + .map((pattern: string) => pattern.trim()) + .filter((pattern: string) => pattern != '') + .map((pattern: string) => joinPattern(sourceFolder, pattern)); + tl.debug(`patterns: ${patterns}`); + + // short-circuit if no patterns + if (!patterns.length) { + tl.debug('no patterns specified'); + return; + } + + // find all files + let foundPaths: string[] = tl.find(sourceFolder, { + allowBrokenSymbolicLinks: true, + followSpecifiedSymbolicLink: true, + followSymbolicLinks: true + }); + + // short-circuit if not exists + if (!foundPaths.length) { + tl.debug('source folder not found. nothing to delete.'); + tl.setResult(tl.TaskResult.Succeeded, tl.loc("NoFiles")); + return; + } + + // Don't delete symbol store shares if this is a cleanup job for file-path artifacts. + // + // This check needs to be made based on the result of tl.find(). Otherwise intermittent network + // issues could result in a false assertion that the share is not a symbol store share. + // + // Opted to check each item name rather than the full path. Although it would suffice to check + // for 000Admin at the root of the share, it is difficult to accurately make a determination + // based on the full path. The problem is that the input share path would need to be run through + // a normalization function that could be trusted 100% to match the format produced by tl.find(). + // For example if the input contains "\\\share", it would need to be normalized as "\\share". To + // avoid worrying about catching every normalization edge case, checking the item name suffices instead. + if (buildCleanup && + foundPaths.some((itemPath: string) => path.basename(itemPath).toLowerCase() == '000admin')) { + + tl.warning(tl.loc('SkippingSymbolStore', sourceFolder)) + return; + } + + // minimatch options + let matchOptions = { matchBase: true }; + if (removeDotFiles) { + matchOptions["dot"] = true; + } + + if (os.type().match(/^Win/)) { + matchOptions["nocase"] = true; + } + + // apply the match patterns + let matches: string[] = matchPatterns(foundPaths, patterns, matchOptions); + + // sort by length (descending) so files are deleted before folders + matches = matches.sort((a: string, b: string) => { + if (a.length == b.length) { + return 0; + } + + return a.length > b.length ? -1 : 1; + }); + + // try to delete all files/folders, even if one errs + let errorHappened: boolean = false; + for (let itemPath of matches) { + try { + tl.rmRF(itemPath); + } + catch (err) { + tl.error(err); + errorHappened = true; + } + } + + // if there wasn't an error, check if there's anything in the folder tree other than folders + // if not, delete the root as well + if (removeSourceFolder && !errorHappened) { + foundPaths = tl.find(sourceFolder); + + if (foundPaths.length === 1) { + try { + tl.rmRF(sourceFolder); + } + catch (err) { + tl.error(err); + errorHappened = true; + } + } + } + + if (errorHappened) { + tl.setResult(tl.TaskResult.Failed, tl.loc("CantDeleteFiles")); + } +})(); + +/** + * Return number of negate marks at the beginning of the string + * + * @param {string} str - Input string + * @param {number} [startIndex] - Index to start from + * @return {number} Number of negate marks + */ +function getNegateMarksNumber(str: string, startIndex: number = 0): number { + let negateMarks = 0; + while(str[startIndex + negateMarks] === '!'){ + negateMarks++; + } + return negateMarks; +} + +/** + * Join the source path with the pattern moving negate marks to the beginning of the string + * + * @param {string} sourcePath - Source path string + * @param {string} pattern - Pattern string + * @return {string} Joining result + */ +function joinPattern(sourcePath: string, pattern: string): string { + const negateMarks = getNegateMarksNumber(pattern); + return path.join(pattern.slice(0, negateMarks) + sourcePath, pattern.slice(negateMarks)); +} + +/** + * Return those paths that match the list of patterns + * + * @param {string[]} paths - All found paths + * @param {string[]} patterns - List of patterns + * @param {Object} options - Match options + * @return {string[]} Result matches + */ +function matchPatterns(paths: string[], patterns: string[], options: any): string[] { + const allMatches = tl.match(paths, patterns, null, options); + + const hasExcludePatterns = patterns.find(pattern => { + const negateMarkIndex = pattern.indexOf('!'); + return negateMarkIndex > -1 && getNegateMarksNumber(pattern, negateMarkIndex) % 2 === 1; + }) + if(!hasExcludePatterns){ + return allMatches; + } + + const excludedPaths = paths.filter(path => !~allMatches.indexOf(path)); + return allMatches.filter(match => { + return !excludedPaths.find(excludedPath => excludedPath.indexOf(match) === 0); + }) +} \ No newline at end of file diff --git a/_generated/DeleteFilesV1_Node20/icon.png b/_generated/DeleteFilesV1_Node20/icon.png new file mode 100644 index 000000000000..98bd662d9e26 Binary files /dev/null and b/_generated/DeleteFilesV1_Node20/icon.png differ diff --git a/_generated/DeleteFilesV1_Node20/icon.svg b/_generated/DeleteFilesV1_Node20/icon.svg new file mode 100644 index 000000000000..1b2b611bca33 --- /dev/null +++ b/_generated/DeleteFilesV1_Node20/icon.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/_generated/DeleteFilesV1_Node20/package-lock.json b/_generated/DeleteFilesV1_Node20/package-lock.json new file mode 100644 index 000000000000..c8662c2ef8e2 --- /dev/null +++ b/_generated/DeleteFilesV1_Node20/package-lock.json @@ -0,0 +1,483 @@ +{ + "name": "vsts-deletefiles-tasks", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/concat-stream": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz", + "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==", + "requires": { + "@types/node": "*" + } + }, + "@types/form-data": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", + "integrity": "sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==", + "requires": { + "@types/node": "*" + } + }, + "@types/mocha": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", + "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==" + }, + "@types/node": { + "version": "20.7.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.7.0.tgz", + "integrity": "sha512-zI22/pJW2wUZOVyguFaUL1HABdmSVxpXrzIqkjsHmyUjNhPoWM1CKfvVuXfetHhIok4RY573cqS0mZ1SJEnoTg==" + }, + "@types/qs": { + "version": "6.9.8", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.8.tgz", + "integrity": "sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg==" + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "azure-pipelines-task-lib": { + "version": "5.0.0-preview.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-5.0.0-preview.0.tgz", + "integrity": "sha512-uQJEv+q3/7RD7kgphFd33uXijaPwA1ePYoNkAgZpUhbZUtc2u4JL4ujTT/JJfgXBNW/QQNAiDQ2OC7vOQG/0tg==", + "requires": { + "minimatch": "3.0.5", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "sync-request": "6.1.0", + "uuid": "^3.0.1" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, + "form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + } + }, + "get-port": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", + "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==" + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "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" + }, + "dependencies": { + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==" + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "http-basic": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", + "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", + "requires": { + "caseless": "^0.12.0", + "concat-stream": "^1.6.2", + "http-response-object": "^3.0.1", + "parse-cache-control": "^1.0.1" + } + }, + "http-response-object": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", + "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", + "requires": { + "@types/node": "^10.0.3" + }, + "dependencies": { + "@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + } + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" + }, + "is-core-module": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "requires": { + "has": "^1.0.3" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, + "parse-cache-control": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", + "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "promise": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", + "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", + "requires": { + "asap": "~2.0.6" + } + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==" + }, + "qs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "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" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "requires": { + "resolve": "^1.1.6" + } + }, + "resolve": { + "version": "1.22.6", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.6.tgz", + "integrity": "sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==", + "requires": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" + }, + "shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, + "sync-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", + "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==", + "requires": { + "http-response-object": "^3.0.1", + "sync-rpc": "^1.2.1", + "then-request": "^6.0.0" + } + }, + "sync-rpc": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz", + "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==", + "requires": { + "get-port": "^3.1.0" + } + }, + "then-request": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", + "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", + "requires": { + "@types/concat-stream": "^1.6.0", + "@types/form-data": "0.0.33", + "@types/node": "^8.0.0", + "@types/qs": "^6.2.31", + "caseless": "~0.12.0", + "concat-stream": "^1.6.0", + "form-data": "^2.2.0", + "http-basic": "^8.1.1", + "http-response-object": "^3.0.1", + "promise": "^8.0.0", + "qs": "^6.4.0" + }, + "dependencies": { + "@types/node": { + "version": "8.10.66", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", + "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==" + } + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, + "typescript": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + } + } +} diff --git a/_generated/DeleteFilesV1_Node20/package.json b/_generated/DeleteFilesV1_Node20/package.json new file mode 100644 index 000000000000..5f56f1aa9500 --- /dev/null +++ b/_generated/DeleteFilesV1_Node20/package.json @@ -0,0 +1,27 @@ +{ + "name": "vsts-deletefiles-tasks", + "version": "1.0.0", + "description": "Azure Pipelines DeleteFiles Task", + "main": "deletefiles.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/Microsoft/azure-pipelines-tasks.git" + }, + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Microsoft/azure-pipelines-tasks/issues" + }, + "homepage": "https://github.com/Microsoft/azure-pipelines-tasks#readme", + "dependencies": { + "@types/node": "^20.3.1", + "@types/mocha": "^5.2.7", + "azure-pipelines-task-lib": "^5.0.0-preview.0" + }, + "devDependencies": { + "typescript": "5.1.6" + } +} diff --git a/_generated/DeleteFilesV1_Node20/task.json b/_generated/DeleteFilesV1_Node20/task.json new file mode 100644 index 000000000000..66d9034b4455 --- /dev/null +++ b/_generated/DeleteFilesV1_Node20/task.json @@ -0,0 +1,98 @@ +{ + "id": "B7E8B412-0437-4065-9371-EDC5881DE25B", + "name": "DeleteFiles", + "friendlyName": "Delete files", + "description": "Delete folders, or files matching a pattern", + "helpUrl": "https://docs.microsoft.com/azure/devops/pipelines/tasks/utility/delete-files", + "helpMarkDown": "[Learn more about this task](https://go.microsoft.com/fwlink/?LinkID=722333)", + "category": "Utility", + "visibility": [ + "Build" + ], + "runsOn": [ + "Agent", + "DeploymentGroup" + ], + "author": "Microsoft Corporation", + "version": { + "Major": 1, + "Minor": 229, + "Patch": 1 + }, + "demands": [], + "minimumAgentVersion": "2.182.1", + "groups": [ + { + "name": "advanced", + "displayName": "Advanced", + "isExpanded": false + } + ], + "inputs": [ + { + "name": "SourceFolder", + "type": "filePath", + "label": "Source Folder", + "defaultValue": "", + "required": false, + "helpMarkDown": "The source folder that the deletion(s) will be run from. Empty is the root of the repo. Use [variables](https://go.microsoft.com/fwlink/?LinkID=550988) if files are not in the repo. Example: $(agent.builddirectory)" + }, + { + "name": "Contents", + "type": "multiLine", + "label": "Contents", + "defaultValue": "myFileShare", + "required": true, + "helpMarkDown": "File/folder paths to delete. Supports multiple lines of minimatch patterns. [More Information](https://go.microsoft.com/fwlink/?LinkID=722333)" + }, + { + "name": "RemoveSourceFolder", + "type": "boolean", + "label": "Remove SourceFolder", + "defaultValue": false, + "required": false, + "helpMarkDown": "Attempt to remove the source folder as well." + }, + { + "name": "RemoveDotFiles", + "type": "boolean", + "label": "Remove files starting with a dot", + "defaultValue": false, + "required": false, + "helpMarkDown": "Delete files starting with a dot (.git, .dockerfile). Omits these files if it's not specified explicitly (for example, '/.*'). Please see this [link](https://github.com/isaacs/minimatch#dot) for more info", + "groupName": "advanced" + } + ], + "instanceNameFormat": "Delete files from $(SourceFolder)", + "execution": { + "Node10": { + "target": "deletefiles.js", + "argumentFormat": "" + }, + "Node16": { + "target": "deletefiles.js", + "argumentFormat": "" + }, + "Node20": { + "target": "deletefiles.js", + "argumentFormat": "" + } + }, + "restrictions": { + "commands": { + "mode": "restricted" + }, + "settableVariables": { + "allowed": [] + } + }, + "messages": { + "CantDeleteFiles": "Couldn't delete one or more files", + "SkippingSymbolStore": "Skipping delete for symbol store file share: %s", + "NoFiles": "No files to delete." + }, + "_buildConfigMapping": { + "Default": "1.229.0", + "Node20-225": "1.229.1" + } +} \ No newline at end of file diff --git a/_generated/DeleteFilesV1_Node20/task.loc.json b/_generated/DeleteFilesV1_Node20/task.loc.json new file mode 100644 index 000000000000..88295a402226 --- /dev/null +++ b/_generated/DeleteFilesV1_Node20/task.loc.json @@ -0,0 +1,98 @@ +{ + "id": "B7E8B412-0437-4065-9371-EDC5881DE25B", + "name": "DeleteFiles", + "friendlyName": "ms-resource:loc.friendlyName", + "description": "ms-resource:loc.description", + "helpUrl": "https://docs.microsoft.com/azure/devops/pipelines/tasks/utility/delete-files", + "helpMarkDown": "ms-resource:loc.helpMarkDown", + "category": "Utility", + "visibility": [ + "Build" + ], + "runsOn": [ + "Agent", + "DeploymentGroup" + ], + "author": "Microsoft Corporation", + "version": { + "Major": 1, + "Minor": 229, + "Patch": 1 + }, + "demands": [], + "minimumAgentVersion": "2.182.1", + "groups": [ + { + "name": "advanced", + "displayName": "ms-resource:loc.group.displayName.advanced", + "isExpanded": false + } + ], + "inputs": [ + { + "name": "SourceFolder", + "type": "filePath", + "label": "ms-resource:loc.input.label.SourceFolder", + "defaultValue": "", + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.SourceFolder" + }, + { + "name": "Contents", + "type": "multiLine", + "label": "ms-resource:loc.input.label.Contents", + "defaultValue": "myFileShare", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.Contents" + }, + { + "name": "RemoveSourceFolder", + "type": "boolean", + "label": "ms-resource:loc.input.label.RemoveSourceFolder", + "defaultValue": false, + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.RemoveSourceFolder" + }, + { + "name": "RemoveDotFiles", + "type": "boolean", + "label": "ms-resource:loc.input.label.RemoveDotFiles", + "defaultValue": false, + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.RemoveDotFiles", + "groupName": "advanced" + } + ], + "instanceNameFormat": "ms-resource:loc.instanceNameFormat", + "execution": { + "Node10": { + "target": "deletefiles.js", + "argumentFormat": "" + }, + "Node16": { + "target": "deletefiles.js", + "argumentFormat": "" + }, + "Node20": { + "target": "deletefiles.js", + "argumentFormat": "" + } + }, + "restrictions": { + "commands": { + "mode": "restricted" + }, + "settableVariables": { + "allowed": [] + } + }, + "messages": { + "CantDeleteFiles": "ms-resource:loc.messages.CantDeleteFiles", + "SkippingSymbolStore": "ms-resource:loc.messages.SkippingSymbolStore", + "NoFiles": "ms-resource:loc.messages.NoFiles" + }, + "_buildConfigMapping": { + "Default": "1.229.0", + "Node20-225": "1.229.1" + } +} \ No newline at end of file diff --git a/_generated/DeleteFilesV1_Node20/tsconfig.json b/_generated/DeleteFilesV1_Node20/tsconfig.json new file mode 100644 index 000000000000..0438b79f69ac --- /dev/null +++ b/_generated/DeleteFilesV1_Node20/tsconfig.json @@ -0,0 +1,6 @@ +{ + "compilerOptions": { + "target": "ES6", + "module": "commonjs" + } +} \ No newline at end of file diff --git a/_generated/DownloadSecureFileV1.versionmap.txt b/_generated/DownloadSecureFileV1.versionmap.txt new file mode 100644 index 000000000000..f74febd08e1e --- /dev/null +++ b/_generated/DownloadSecureFileV1.versionmap.txt @@ -0,0 +1,2 @@ +Default|1.229.0 +Node20-225|1.229.1 diff --git a/_generated/DownloadSecureFileV1/Strings/resources.resjson/de-DE/resources.resjson b/_generated/DownloadSecureFileV1/Strings/resources.resjson/de-DE/resources.resjson new file mode 100644 index 000000000000..135d94dd18d3 --- /dev/null +++ b/_generated/DownloadSecureFileV1/Strings/resources.resjson/de-DE/resources.resjson @@ -0,0 +1,12 @@ +{ + "loc.friendlyName": "Sichere Datei herunterladen", + "loc.helpMarkDown": "[Weitere Informationen zu dieser Aufgabe](https://go.microsoft.com/fwlink/?LinkID=862069)", + "loc.description": "Hiermit wird eine sichere Datei auf den Agentcomputer heruntergeladen.", + "loc.instanceNameFormat": "Sichere Datei herunterladen", + "loc.input.label.secureFile": "Sichere Datei", + "loc.input.help.secureFile": "Der Dateiname oder die GUID der sicheren Datei, die auf den Agentcomputer heruntergeladen werden soll. Die Datei wird gelöscht, nachdem die Pipeline ausgeführt wurde.", + "loc.input.label.retryCount": "Wiederholungsanzahl", + "loc.input.help.retryCount": "Optionale Anzahl von Wiederholungsversuchen zum Herunterladen einer sicheren Datei, wenn der Download nicht erfolgreich ist.", + "loc.input.label.socketTimeout": "Zeitlimit für Socket", + "loc.input.help.socketTimeout": "Optionales Zeitlimit in Millisekunden für einen Socket, der der Anforderung zum Herunterladen der sicheren Datei zugeordnet ist." +} \ No newline at end of file diff --git a/_generated/DownloadSecureFileV1/Strings/resources.resjson/en-US/resources.resjson b/_generated/DownloadSecureFileV1/Strings/resources.resjson/en-US/resources.resjson new file mode 100644 index 000000000000..ad928f71c12f --- /dev/null +++ b/_generated/DownloadSecureFileV1/Strings/resources.resjson/en-US/resources.resjson @@ -0,0 +1,12 @@ +{ + "loc.friendlyName": "Download secure file", + "loc.helpMarkDown": "[Learn more about this task](https://go.microsoft.com/fwlink/?LinkID=862069)", + "loc.description": "Download a secure file to the agent machine", + "loc.instanceNameFormat": "Download secure file", + "loc.input.label.secureFile": "Secure File", + "loc.input.help.secureFile": "The file name or GUID of the secure file to download to the agent machine. The file will be deleted after the pipeline runs.", + "loc.input.label.retryCount": "Retry Count", + "loc.input.help.retryCount": "Optional number of times to retry downloading a secure file if the download fails.", + "loc.input.label.socketTimeout": "Socket Timeout", + "loc.input.help.socketTimeout": "Optional timeout for a socket associated with downloading secure file request in ms." +} \ No newline at end of file diff --git a/_generated/DownloadSecureFileV1/Strings/resources.resjson/es-ES/resources.resjson b/_generated/DownloadSecureFileV1/Strings/resources.resjson/es-ES/resources.resjson new file mode 100644 index 000000000000..c424ff529e81 --- /dev/null +++ b/_generated/DownloadSecureFileV1/Strings/resources.resjson/es-ES/resources.resjson @@ -0,0 +1,12 @@ +{ + "loc.friendlyName": "Descargar archivo seguro", + "loc.helpMarkDown": "[Obtener más información acerca de esta tarea](https://go.microsoft.com/fwlink/?LinkID=862069)", + "loc.description": "Descarga un archivo seguro a la máquina del agente.", + "loc.instanceNameFormat": "Descargar archivo seguro", + "loc.input.label.secureFile": "Archivo seguro", + "loc.input.help.secureFile": "El nombre de archivo o el GUID del archivo seguro que se va a descargar en la máquina del agente. El archivo se eliminará después de que se ejecute la canalización.", + "loc.input.label.retryCount": "Número de reintentos", + "loc.input.help.retryCount": "Número opcional de reintentos de descarga de un archivo seguro, en caso de error de la descarga.", + "loc.input.label.socketTimeout": "Tiempo de espera del socket", + "loc.input.help.socketTimeout": "Tiempo de espera opcional para un socket asociado a la descarga de una solicitud de archivo seguro, en milisegundos." +} \ No newline at end of file diff --git a/_generated/DownloadSecureFileV1/Strings/resources.resjson/fr-FR/resources.resjson b/_generated/DownloadSecureFileV1/Strings/resources.resjson/fr-FR/resources.resjson new file mode 100644 index 000000000000..b0e64c8586b0 --- /dev/null +++ b/_generated/DownloadSecureFileV1/Strings/resources.resjson/fr-FR/resources.resjson @@ -0,0 +1,12 @@ +{ + "loc.friendlyName": "Télécharger un fichier sécurisé", + "loc.helpMarkDown": "[En savoir plus sur cette tâche](https://go.microsoft.com/fwlink/?LinkID=862069)", + "loc.description": "Télécharger un fichier sécurisé sur la machine d'agent", + "loc.instanceNameFormat": "Télécharger un fichier sécurisé", + "loc.input.label.secureFile": "Fichier sécurisé", + "loc.input.help.secureFile": "Nom de fichier ou GUID du fichier sécurisé à télécharger sur la machine d'agent. Le fichier est supprimé après l'exécution du pipeline.", + "loc.input.label.retryCount": "Nombre de nouvelles tentatives", + "loc.input.help.retryCount": "Nombre facultatif de nouvelles tentatives de téléchargement d'un fichier sécurisé en cas d'échec du téléchargement.", + "loc.input.label.socketTimeout": "Délai d'expiration du socket", + "loc.input.help.socketTimeout": "Délai d'expiration facultatif (en ms) pour un socket associé à une demande de téléchargement de fichier sécurisé." +} \ No newline at end of file diff --git a/_generated/DownloadSecureFileV1/Strings/resources.resjson/it-IT/resources.resjson b/_generated/DownloadSecureFileV1/Strings/resources.resjson/it-IT/resources.resjson new file mode 100644 index 000000000000..34d05bc884e2 --- /dev/null +++ b/_generated/DownloadSecureFileV1/Strings/resources.resjson/it-IT/resources.resjson @@ -0,0 +1,12 @@ +{ + "loc.friendlyName": "Scarica file protetto", + "loc.helpMarkDown": "[Altre informazioni su questa attività](https://go.microsoft.com/fwlink/?LinkID=862069)", + "loc.description": "Scarica un file protetto nel computer agente", + "loc.instanceNameFormat": "Scarica file protetto", + "loc.input.label.secureFile": "File protetto", + "loc.input.help.secureFile": "Nome o GUID del file protetto da scaricare nel computer agente. Il file verrà eliminato al termine dell'esecuzione della pipeline.", + "loc.input.label.retryCount": "Numero di tentativi", + "loc.input.help.retryCount": "Numero facoltativo di tentativi di download di un file protetto se il download non riesce.", + "loc.input.label.socketTimeout": "Timeout socket", + "loc.input.help.socketTimeout": "Timeout facoltativo in ms per un socket associato alla richiesta di download del file protetto." +} \ No newline at end of file diff --git a/_generated/DownloadSecureFileV1/Strings/resources.resjson/ja-JP/resources.resjson b/_generated/DownloadSecureFileV1/Strings/resources.resjson/ja-JP/resources.resjson new file mode 100644 index 000000000000..b5d630f43e5e --- /dev/null +++ b/_generated/DownloadSecureFileV1/Strings/resources.resjson/ja-JP/resources.resjson @@ -0,0 +1,12 @@ +{ + "loc.friendlyName": "セキュア ファイルのダウンロード", + "loc.helpMarkDown": "[このタスクの詳細を表示](https://go.microsoft.com/fwlink/?LinkID=862069)", + "loc.description": "セキュア ファイルをエージェント マシンにダウンロードします", + "loc.instanceNameFormat": "セキュア ファイルのダウンロード", + "loc.input.label.secureFile": "セキュア ファイル", + "loc.input.help.secureFile": "エージェント マシンにダウンロードするセキュア ファイルのファイル名または GUID。ファイルはパイプライン実行後に削除されます。", + "loc.input.label.retryCount": "再試行の回数", + "loc.input.help.retryCount": "セキュア ファイルのダウンロードが失敗した場合に、ダウンロードを再試行する回数 (省略可能)。", + "loc.input.label.socketTimeout": "ソケットのタイムアウト", + "loc.input.help.socketTimeout": "セキュア ファイル要求のダウンロードに関連付けられているソケットの省略可能なタイムアウト (ms)。" +} \ No newline at end of file diff --git a/_generated/DownloadSecureFileV1/Strings/resources.resjson/ko-KR/resources.resjson b/_generated/DownloadSecureFileV1/Strings/resources.resjson/ko-KR/resources.resjson new file mode 100644 index 000000000000..6fc08fbb561a --- /dev/null +++ b/_generated/DownloadSecureFileV1/Strings/resources.resjson/ko-KR/resources.resjson @@ -0,0 +1,12 @@ +{ + "loc.friendlyName": "보안 파일 다운로드", + "loc.helpMarkDown": "[이 작업에 대한 자세한 정보](https://go.microsoft.com/fwlink/?LinkID=862069)", + "loc.description": "에이전트 머신에 보안 파일을 다운로드합니다.", + "loc.instanceNameFormat": "보안 파일 다운로드", + "loc.input.label.secureFile": "보안 파일", + "loc.input.help.secureFile": "에이전트 컴퓨터에 다운로드할 보안 파일의 파일 이름 또는 GUID입니다. 파이프라인을 실행하면 파일이 삭제됩니다.", + "loc.input.label.retryCount": "재시도 횟수", + "loc.input.help.retryCount": "다운로드가 실패할 경우 보안 파일 다운로드를 다시 시도하는 선택적 횟수입니다.", + "loc.input.label.socketTimeout": "소켓 시간 제한", + "loc.input.help.socketTimeout": "보안 파일 요청 다운로드와 연결된 소켓에 대한 선택적 시간 제한(ms)입니다." +} \ No newline at end of file diff --git a/_generated/DownloadSecureFileV1/Strings/resources.resjson/ru-RU/resources.resjson b/_generated/DownloadSecureFileV1/Strings/resources.resjson/ru-RU/resources.resjson new file mode 100644 index 000000000000..6040850adc7d --- /dev/null +++ b/_generated/DownloadSecureFileV1/Strings/resources.resjson/ru-RU/resources.resjson @@ -0,0 +1,12 @@ +{ + "loc.friendlyName": "Скачать защищенный файл", + "loc.helpMarkDown": "[См. дополнительные сведения об этой задаче](https://go.microsoft.com/fwlink/?LinkID=862069)", + "loc.description": "Скачать защитный файл на компьютер агента", + "loc.instanceNameFormat": "Скачать защищенный файл", + "loc.input.label.secureFile": "Защитный файл", + "loc.input.help.secureFile": "Имя или идентификатор GUID защитного файла, скачиваемого на компьютер агента. Файл будет удален после выполнения конвейера.", + "loc.input.label.retryCount": "Число повторных попыток", + "loc.input.help.retryCount": "Необязательное число повторных попыток скачивания защитного файла в случае сбоя скачивания.", + "loc.input.label.socketTimeout": "Время ожидания сокета", + "loc.input.help.socketTimeout": "Необязательное время ожидания сокета, связанное с запросом на скачивание защищенного файла, в мс." +} \ No newline at end of file diff --git a/_generated/DownloadSecureFileV1/Strings/resources.resjson/zh-CN/resources.resjson b/_generated/DownloadSecureFileV1/Strings/resources.resjson/zh-CN/resources.resjson new file mode 100644 index 000000000000..e242fc7520de --- /dev/null +++ b/_generated/DownloadSecureFileV1/Strings/resources.resjson/zh-CN/resources.resjson @@ -0,0 +1,12 @@ +{ + "loc.friendlyName": "下载安全文件", + "loc.helpMarkDown": "[详细了解此任务](https://go.microsoft.com/fwlink/?LinkID=862069)", + "loc.description": "将安全文件下载到代理计算机", + "loc.instanceNameFormat": "下载安全文件", + "loc.input.label.secureFile": "安全文件", + "loc.input.help.secureFile": "要下载到代理计算机的安全文件的文件名或 GUID。将在管道运行后删除该文件。", + "loc.input.label.retryCount": "重试次数", + "loc.input.help.retryCount": "下载失败时重试下载安全文件的次数(可选)。", + "loc.input.label.socketTimeout": "套接字超时", + "loc.input.help.socketTimeout": "(可选)与下载安全文件请求关联的套接字的超时,以毫秒为单位。" +} \ No newline at end of file diff --git a/_generated/DownloadSecureFileV1/Strings/resources.resjson/zh-TW/resources.resjson b/_generated/DownloadSecureFileV1/Strings/resources.resjson/zh-TW/resources.resjson new file mode 100644 index 000000000000..04dac4b4f11f --- /dev/null +++ b/_generated/DownloadSecureFileV1/Strings/resources.resjson/zh-TW/resources.resjson @@ -0,0 +1,12 @@ +{ + "loc.friendlyName": "下載安全檔案", + "loc.helpMarkDown": "[深入了解此工作](https://go.microsoft.com/fwlink/?LinkID=862069)", + "loc.description": "將安全檔案下載至代理程式電腦", + "loc.instanceNameFormat": "下載安全檔案", + "loc.input.label.secureFile": "安全檔案", + "loc.input.help.secureFile": "要下載至代理程式電腦的安全檔案名稱或 GUID。此檔案會在管線執行後刪除。", + "loc.input.label.retryCount": "重試計數", + "loc.input.help.retryCount": "下載失敗時選用的安全檔案下載重試次數。", + "loc.input.label.socketTimeout": "通訊端逾時", + "loc.input.help.socketTimeout": "與下載安全檔案要求建立關聯之通訊端的選用逾時 (以毫秒為單位)。" +} \ No newline at end of file diff --git a/_generated/DownloadSecureFileV1/Tests/L0.ts b/_generated/DownloadSecureFileV1/Tests/L0.ts new file mode 100644 index 000000000000..3a9a1090d92d --- /dev/null +++ b/_generated/DownloadSecureFileV1/Tests/L0.ts @@ -0,0 +1,64 @@ +import fs = require('fs'); +import assert = require('assert'); +import path = require('path'); +import * as ttm from 'azure-pipelines-task-lib/mock-test'; + +describe('DownloadSecureFile Suite', function () { + before(() => { + }); + + after(() => { + }); + + it('Defaults: download secure file', function() { + this.timeout(parseInt(process.env.TASK_TEST_TIMEOUT) || 20000); + + let tp: string = path.join(__dirname, 'L0SecureFile.js'); + let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.stderr.length === 0, 'should not have written to stderr'); + assert(tr.stdOutContained('##vso[task.debug]Mock SecureFileHelpers retry count set to: 8'), 'task should have used default retry count of 8'); + assert(tr.succeeded, 'task should have succeeded'); + }); + + it('Uses input retry count', function() { + this.timeout(parseInt(process.env.TASK_TEST_TIMEOUT) || 20000); + + let tp: string = path.join(__dirname, 'L0ValidRetryCount.js'); + let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.stderr.length === 0, 'should not have written to stderr'); + assert(tr.stdOutContained('##vso[task.debug]Mock SecureFileHelpers retry count set to: 7'), 'task should have used the input retry count of 7'); + assert(tr.succeeded, 'task should have succeeded'); + }); + + it('Invalid retry count defaults to 8', function() { + this.timeout(parseInt(process.env.TASK_TEST_TIMEOUT) || 20000); + + let tp: string = path.join(__dirname, 'L0InvalidRetryCount.js'); + let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.stderr.length === 0, 'should not have written to stderr'); + assert(tr.stdOutContained('##vso[task.debug]Mock SecureFileHelpers retry count set to: 8'), 'task should have used default retry count of 8'); + assert(tr.succeeded, 'task should have succeeded'); + }); + + it('Negative retry count defaults to 8', function() { + this.timeout(parseInt(process.env.TASK_TEST_TIMEOUT) || 20000); + + let tp: string = path.join(__dirname, 'L0NegativeRetryCount.js'); + let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.stderr.length === 0, 'should not have written to stderr'); + assert(tr.stdOutContained('##vso[task.debug]Mock SecureFileHelpers retry count set to: 8'), 'task should have used default retry count of 8'); + assert(tr.succeeded, 'task should have succeeded'); + }); +}); \ No newline at end of file diff --git a/_generated/DownloadSecureFileV1/Tests/L0InvalidRetryCount.ts b/_generated/DownloadSecureFileV1/Tests/L0InvalidRetryCount.ts new file mode 100644 index 000000000000..0e0bfbe02c6f --- /dev/null +++ b/_generated/DownloadSecureFileV1/Tests/L0InvalidRetryCount.ts @@ -0,0 +1,32 @@ +import * as ma from 'azure-pipelines-task-lib/mock-answer'; +import * as tmrm from 'azure-pipelines-task-lib/mock-run'; +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'predownloadsecurefile.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('secureFile', 'mySecureFileId'); +tr.setInput('retryCount', 'not a number'); + +process.env['AGENT_VERSION'] = '2.116.0'; +process.env['HOME'] = '/users/test'; + +let secureFileHelperMock = require('azure-pipelines-tasks-securefiles-common/securefiles-common-mock'); +tr.registerMock('azure-pipelines-tasks-securefiles-common/securefiles-common', secureFileHelperMock); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "cp": "/bin/cp" + }, + "checkPath": { + "/bin/cp": true + }, + "exist": { + "/build/temp/mySecureFileId.filename": true + } +}; +tr.setAnswers(a); + +tr.run(); + diff --git a/_generated/DownloadSecureFileV1/Tests/L0NegativeRetryCount.ts b/_generated/DownloadSecureFileV1/Tests/L0NegativeRetryCount.ts new file mode 100644 index 000000000000..a06c6931360a --- /dev/null +++ b/_generated/DownloadSecureFileV1/Tests/L0NegativeRetryCount.ts @@ -0,0 +1,32 @@ +import * as ma from 'azure-pipelines-task-lib/mock-answer'; +import * as tmrm from 'azure-pipelines-task-lib/mock-run'; +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'predownloadsecurefile.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('secureFile', 'mySecureFileId'); +tr.setInput('retryCount', '-1'); + +process.env['AGENT_VERSION'] = '2.116.0'; +process.env['HOME'] = '/users/test'; + +let secureFileHelperMock = require('azure-pipelines-tasks-securefiles-common/securefiles-common-mock'); +tr.registerMock('azure-pipelines-tasks-securefiles-common/securefiles-common', secureFileHelperMock); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "cp": "/bin/cp" + }, + "checkPath": { + "/bin/cp": true + }, + "exist": { + "/build/temp/mySecureFileId.filename": true + } +}; +tr.setAnswers(a); + +tr.run(); + diff --git a/_generated/DownloadSecureFileV1/Tests/L0SecureFile.ts b/_generated/DownloadSecureFileV1/Tests/L0SecureFile.ts new file mode 100644 index 000000000000..72343fc31230 --- /dev/null +++ b/_generated/DownloadSecureFileV1/Tests/L0SecureFile.ts @@ -0,0 +1,31 @@ +import * as ma from 'azure-pipelines-task-lib/mock-answer'; +import * as tmrm from 'azure-pipelines-task-lib/mock-run'; +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'predownloadsecurefile.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('secureFile', 'mySecureFileId'); + +process.env['AGENT_VERSION'] = '2.116.0'; +process.env['HOME'] = '/users/test'; + +let secureFileHelperMock = require('azure-pipelines-tasks-securefiles-common/securefiles-common-mock'); +tr.registerMock('azure-pipelines-tasks-securefiles-common/securefiles-common', secureFileHelperMock); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "cp": "/bin/cp" + }, + "checkPath": { + "/bin/cp": true + }, + "exist": { + "/build/temp/mySecureFileId.filename": true + } +}; +tr.setAnswers(a); + +tr.run(); + diff --git a/_generated/DownloadSecureFileV1/Tests/L0ValidRetryCount.ts b/_generated/DownloadSecureFileV1/Tests/L0ValidRetryCount.ts new file mode 100644 index 000000000000..de81743d5d6d --- /dev/null +++ b/_generated/DownloadSecureFileV1/Tests/L0ValidRetryCount.ts @@ -0,0 +1,32 @@ +import * as ma from 'azure-pipelines-task-lib/mock-answer'; +import * as tmrm from 'azure-pipelines-task-lib/mock-run'; +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'predownloadsecurefile.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('secureFile', 'mySecureFileId'); +tr.setInput('retryCount', '7'); + +process.env['AGENT_VERSION'] = '2.116.0'; +process.env['HOME'] = '/users/test'; + +let secureFileHelperMock = require('azure-pipelines-tasks-securefiles-common/securefiles-common-mock'); +tr.registerMock('azure-pipelines-tasks-securefiles-common/securefiles-common', secureFileHelperMock); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "cp": "/bin/cp" + }, + "checkPath": { + "/bin/cp": true + }, + "exist": { + "/build/temp/mySecureFileId.filename": true + } +}; +tr.setAnswers(a); + +tr.run(); + diff --git a/_generated/DownloadSecureFileV1/Tests/package-lock.json b/_generated/DownloadSecureFileV1/Tests/package-lock.json new file mode 100644 index 000000000000..3126521ed43b --- /dev/null +++ b/_generated/DownloadSecureFileV1/Tests/package-lock.json @@ -0,0 +1,14 @@ +{ + "name": "vsts-tasks-downloadsecurefile-tests", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/mocha": { + "version": "5.2.5", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.5.tgz", + "integrity": "sha512-lAVp+Kj54ui/vLUFxsJTMtWvZraZxum3w3Nwkble2dNuV5VnPA+Mi2oGX9XYJAaIvZi3tn3cbjS/qcJXRb6Bww==", + "dev": true + } + } +} diff --git a/_generated/DownloadSecureFileV1/Tests/package.json b/_generated/DownloadSecureFileV1/Tests/package.json new file mode 100644 index 000000000000..6dacc0eb5120 --- /dev/null +++ b/_generated/DownloadSecureFileV1/Tests/package.json @@ -0,0 +1,22 @@ +{ + "name": "vsts-tasks-downloadsecurefile-tests", + "version": "1.0.0", + "description": "VSTS Download Secure File Task Tests", + "main": "L0.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/Microsoft/azure-pipelines-tasks.git" + }, + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Microsoft/azure-pipelines-tasks/issues" + }, + "homepage": "https://github.com/Microsoft/azure-pipelines-tasks#readme", + "devDependencies": { + "@types/mocha": "^5.2.0" + } +} diff --git a/_generated/DownloadSecureFileV1/ThirdPartyNotice.txt b/_generated/DownloadSecureFileV1/ThirdPartyNotice.txt new file mode 100644 index 000000000000..5dc2382b0f63 --- /dev/null +++ b/_generated/DownloadSecureFileV1/ThirdPartyNotice.txt @@ -0,0 +1,459 @@ + +THIRD-PARTY SOFTWARE NOTICES AND INFORMATION +Do Not Translate or Localize + +This Azure DevOps extension (DownloadSecureFileV1) is based on or incorporates material from the projects listed below (Third Party IP). The original copyright notice and the license under which Microsoft received such Third Party IP, are set forth below. Such licenses and notices are provided for informational purposes only. Microsoft licenses the Third Party IP to you under the licensing terms for the Azure DevOps extension. Microsoft reserves all other rights not expressly granted under this agreement, whether by implication, estoppel or otherwise. + +1. @types/mocha (git+https://github.com/DefinitelyTyped/DefinitelyTyped.git) +2. @types/node (git+https://github.com/DefinitelyTyped/DefinitelyTyped.git) +3. balanced-match (git://github.com/juliangruber/balanced-match.git) +4. brace-expansion (git://github.com/juliangruber/brace-expansion.git) +5. concat-map (git://github.com/substack/node-concat-map.git) +6. minimatch (git://github.com/isaacs/minimatch.git) +7. mockery (git://github.com/mfncooper/mockery.git) +8. q (git://github.com/kriskowal/q.git) +9. semver (git+https://github.com/npm/node-semver.git) +10. shelljs (git://github.com/arturadib/shelljs.git) +11. tunnel (git+https://github.com/koichik/node-tunnel.git) +12. typed-rest-client (git+https://github.com/Microsoft/typed-rest-client.git) +13. underscore (git://github.com/jashkenas/underscore.git) +14. uuid (git+https://github.com/kelektiv/node-uuid.git) +15. vso-node-api (git+https://github.com/Microsoft/vso-node-api.git) +16. vsts-task-lib (git+https://github.com/Microsoft/vsts-task-lib.git) +17. vsts-task-lib (git+https://github.com/Microsoft/vsts-task-lib.git) + + +%% @types/mocha NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +MIT License + + Copyright (c) Microsoft Corporation. All rights reserved. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE +========================================= +END OF @types/mocha NOTICES, INFORMATION, AND LICENSE + +%% @types/node NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +MIT License + + Copyright (c) Microsoft Corporation. All rights reserved. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE +========================================= +END OF @types/node NOTICES, INFORMATION, AND LICENSE + +%% balanced-match NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +(MIT) + +Copyright (c) 2013 Julian Gruber <julian@juliangruber.com> + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +========================================= +END OF balanced-match NOTICES, INFORMATION, AND LICENSE + +%% brace-expansion NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +MIT License + +Copyright (c) 2013 Julian Gruber + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +========================================= +END OF brace-expansion NOTICES, INFORMATION, AND LICENSE + +%% concat-map NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +This software is released under the MIT license: + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF concat-map NOTICES, INFORMATION, AND LICENSE + +%% minimatch NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF minimatch NOTICES, INFORMATION, AND LICENSE + +%% mockery NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyrights for code authored by Yahoo! Inc. is licensed under the following + terms: + + MIT License + + Copyright (c) 2011 Yahoo! Inc. All Rights Reserved. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to + deal in the Software without restriction, including without limitation the + rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. +========================================= +END OF mockery NOTICES, INFORMATION, AND LICENSE + +%% q NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright 2009–2017 Kristopher Michael Kowal. All rights reserved. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. +========================================= +END OF q NOTICES, INFORMATION, AND LICENSE + +%% semver NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF semver NOTICES, INFORMATION, AND LICENSE + +%% shelljs NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) 2012, Artur Adib +All rights reserved. + +You may use this project under the terms of the New BSD license as follows: + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of Artur Adib nor the + names of the contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL ARTUR ADIB BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +========================================= +END OF shelljs NOTICES, INFORMATION, AND LICENSE + +%% tunnel NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) 2012 Koichi Kobayashi + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF tunnel NOTICES, INFORMATION, AND LICENSE + +%% typed-rest-client NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Visual Studio Team Services Client for Node.js + +Copyright (c) Microsoft Corporation + +All rights reserved. + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and +associated documentation files (the "Software"), to deal in the Software without restriction, +including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT +LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF typed-rest-client NOTICES, INFORMATION, AND LICENSE + +%% underscore NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative +Reporters & Editors + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF underscore NOTICES, INFORMATION, AND LICENSE + +%% uuid NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) 2010-2016 Robert Kieffer and other contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +========================================= +END OF uuid NOTICES, INFORMATION, AND LICENSE + +%% vso-node-api NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Visual Studio Team Services Client for Node.js + +Copyright (c) Microsoft Corporation + +All rights reserved. + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and +associated documentation files (the "Software"), to deal in the Software without restriction, +including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT +LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF vso-node-api NOTICES, INFORMATION, AND LICENSE + +%% vsts-task-lib NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) Microsoft Corporation. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +========================================= +END OF vsts-task-lib NOTICES, INFORMATION, AND LICENSE + +%% vsts-task-lib NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) Microsoft Corporation. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +========================================= +END OF vsts-task-lib NOTICES, INFORMATION, AND LICENSE + diff --git a/_generated/DownloadSecureFileV1/icon.png b/_generated/DownloadSecureFileV1/icon.png new file mode 100644 index 000000000000..21295cb86003 Binary files /dev/null and b/_generated/DownloadSecureFileV1/icon.png differ diff --git a/_generated/DownloadSecureFileV1/icon.svg b/_generated/DownloadSecureFileV1/icon.svg new file mode 100644 index 000000000000..94013abffa1e --- /dev/null +++ b/_generated/DownloadSecureFileV1/icon.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/_generated/DownloadSecureFileV1/make.json b/_generated/DownloadSecureFileV1/make.json new file mode 100644 index 000000000000..4188c590d806 --- /dev/null +++ b/_generated/DownloadSecureFileV1/make.json @@ -0,0 +1,11 @@ +{ + "rm": [ + { + "items": [ + "node_modules/azure-pipelines-tasks-securefiles-common/node_modules/azure-pipelines-task-lib", + "node_modules/mockery" + ], + "options": "-Rf" + } + ] +} \ No newline at end of file diff --git a/_generated/DownloadSecureFileV1/package-lock.json b/_generated/DownloadSecureFileV1/package-lock.json new file mode 100644 index 000000000000..9701193fd151 --- /dev/null +++ b/_generated/DownloadSecureFileV1/package-lock.json @@ -0,0 +1,548 @@ +{ + "name": "vsts-tasks-downloadsecurefile", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/concat-stream": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz", + "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==", + "requires": { + "@types/node": "*" + } + }, + "@types/form-data": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", + "integrity": "sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==", + "requires": { + "@types/node": "*" + } + }, + "@types/mocha": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", + "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==" + }, + "@types/node": { + "version": "16.11.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.60.tgz", + "integrity": "sha512-kYIYa1D1L+HDv5M5RXQeEu1o0FKA6yedZIoyugm/MBPROkLpX4L7HRxMrPVyo8bnvjpW/wDlqFNGzXNMb7AdRw==" + }, + "@types/q": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.5.tgz", + "integrity": "sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ==" + }, + "@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "azure-devops-node-api": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/azure-devops-node-api/-/azure-devops-node-api-10.2.2.tgz", + "integrity": "sha512-4TVv2X7oNStT0vLaEfExmy3J4/CzfuXolEcQl/BRUmvGySqKStTG2O55/hUQ0kM7UJlZBLgniM0SBq4d/WkKow==", + "requires": { + "tunnel": "0.0.6", + "typed-rest-client": "^1.8.4" + } + }, + "azure-pipelines-task-lib": { + "version": "5.0.0-preview.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-5.0.0-preview.0.tgz", + "integrity": "sha512-uQJEv+q3/7RD7kgphFd33uXijaPwA1ePYoNkAgZpUhbZUtc2u4JL4ujTT/JJfgXBNW/QQNAiDQ2OC7vOQG/0tg==", + "requires": { + "minimatch": "3.0.5", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "sync-request": "6.1.0", + "uuid": "^3.0.1" + } + }, + "azure-pipelines-tasks-securefiles-common": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-tasks-securefiles-common/-/azure-pipelines-tasks-securefiles-common-2.1.0.tgz", + "integrity": "sha512-oE7VscWFZD+Ku0WM6e2b5Y0eDom4DTZvER/mSh3m/z9V0yN9JUahNR0Dye9NIj0BSIyfgcaxxNWBCzqJMsirIQ==", + "requires": { + "@types/node": "^10.17.0", + "@types/q": "^1.5.4", + "azure-devops-node-api": "10.2.2", + "azure-pipelines-task-lib": "^3.1.0" + }, + "dependencies": { + "@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + }, + "azure-pipelines-task-lib": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-3.3.1.tgz", + "integrity": "sha512-56ZAr4MHIoa24VNVuwPL4iUQ5MKaigPoYXkBG8E8fiVmh8yZdatUo25meNoQwg77vDY22F63Q44UzXoMWmy7ag==", + "requires": { + "minimatch": "3.0.5", + "mockery": "^1.7.0", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "sync-request": "6.1.0", + "uuid": "^3.0.1" + } + } + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, + "form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-intrinsic": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", + "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + } + }, + "get-port": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", + "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==" + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "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" + }, + "dependencies": { + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "http-basic": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", + "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", + "requires": { + "caseless": "^0.12.0", + "concat-stream": "^1.6.2", + "http-response-object": "^3.0.1", + "parse-cache-control": "^1.0.1" + } + }, + "http-response-object": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", + "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", + "requires": { + "@types/node": "^10.0.3" + }, + "dependencies": { + "@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + } + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" + }, + "is-core-module": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", + "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", + "requires": { + "has": "^1.0.3" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "mockery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/mockery/-/mockery-1.7.0.tgz", + "integrity": "sha512-gUQA33ayi0tuAhr/rJNZPr7Q7uvlBt4gyJPbi0CDcAfIzIrDu1YgGMFgmAu3stJqBpK57m7+RxUbcS+pt59fKQ==" + }, + "object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, + "parse-cache-control": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", + "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "promise": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.2.0.tgz", + "integrity": "sha512-+CMAlLHqwRYwBMXKCP+o8ns7DN+xHDUiI+0nArsiJ9y+kJVPLFxEaSw6Ha9s9H0tftxg2Yzl25wqj9G7m5wLZg==", + "requires": { + "asap": "~2.0.6" + } + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==" + }, + "qs": { + "version": "6.11.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.1.tgz", + "integrity": "sha512-0wsrzgTz/kAVIeuxSjnpGC56rzYtr6JT/2BwEvMaPhFIoYa1aGO8LbzuU1R0uUYQkLpWBTOj0l/CLAJB64J6nQ==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "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" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "requires": { + "resolve": "^1.1.6" + } + }, + "resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "requires": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, + "sync-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", + "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==", + "requires": { + "http-response-object": "^3.0.1", + "sync-rpc": "^1.2.1", + "then-request": "^6.0.0" + } + }, + "sync-rpc": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz", + "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==", + "requires": { + "get-port": "^3.1.0" + } + }, + "then-request": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", + "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", + "requires": { + "@types/concat-stream": "^1.6.0", + "@types/form-data": "0.0.33", + "@types/node": "^8.0.0", + "@types/qs": "^6.2.31", + "caseless": "~0.12.0", + "concat-stream": "^1.6.0", + "form-data": "^2.2.0", + "http-basic": "^8.1.1", + "http-response-object": "^3.0.1", + "promise": "^8.0.0", + "qs": "^6.4.0" + }, + "dependencies": { + "@types/node": { + "version": "8.10.66", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", + "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==" + } + } + }, + "tunnel": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", + "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==" + }, + "typed-rest-client": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.8.5.tgz", + "integrity": "sha512-952/Aegu3lTqUAI1anbDLbewojnF/gh8at9iy1CIrfS1h/+MtNjB1Y9z6ZF5n2kZd+97em56lZ9uu7Zz3y/pwg==", + "requires": { + "qs": "^6.9.1", + "tunnel": "0.0.6", + "underscore": "^1.12.1" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, + "typescript": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.2.tgz", + "integrity": "sha512-e4ERvRV2wb+rRZ/IQeb3jm2VxBsirQLpQhdxplZ2MEzGvDkkMmPglecnNDfSUBivMjP93vRbngYYDQqQ/78bcQ==", + "dev": true + }, + "underscore": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.1.tgz", + "integrity": "sha512-hzSoAVtJF+3ZtiFX0VgfFPHEDRm7Y/QPjGyNo4TVdnDTdft3tr8hEkD25a1jC+TjTuE7tkHGKkhwCgs9dgBB2g==" + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + } + } +} diff --git a/_generated/DownloadSecureFileV1/package.json b/_generated/DownloadSecureFileV1/package.json new file mode 100644 index 000000000000..25c6f9963a4a --- /dev/null +++ b/_generated/DownloadSecureFileV1/package.json @@ -0,0 +1,28 @@ +{ + "name": "vsts-tasks-downloadsecurefile", + "version": "1.0.0", + "description": "Azure Pipelines Download Secure File Task", + "main": "predownloadsecurefile.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/Microsoft/azure-pipelines-tasks.git" + }, + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Microsoft/azure-pipelines-tasks/issues" + }, + "homepage": "https://github.com/Microsoft/azure-pipelines-tasks#readme", + "dependencies": { + "@types/node": "^16.11.39", + "@types/mocha": "^5.2.7", + "azure-pipelines-task-lib": "^5.0.0-preview.0", + "azure-pipelines-tasks-securefiles-common": "^2.1.0" + }, + "devDependencies": { + "typescript": "4.0.2" + } +} diff --git a/_generated/DownloadSecureFileV1/predownloadsecurefile.ts b/_generated/DownloadSecureFileV1/predownloadsecurefile.ts new file mode 100644 index 000000000000..2b8591948641 --- /dev/null +++ b/_generated/DownloadSecureFileV1/predownloadsecurefile.ts @@ -0,0 +1,36 @@ +import path = require('path'); +import secureFilesCommon = require('azure-pipelines-tasks-securefiles-common/securefiles-common'); +import tl = require('azure-pipelines-task-lib/task'); + +async function run() { + let secureFileId: string; + let secureFileHelpers: secureFilesCommon.SecureFileHelpers; + + try { + tl.setResourcePath(path.join(__dirname, 'task.json')); + + let retryCount = parseInt(tl.getInput('retryCount')); + let socketTimeout = parseInt(tl.getInput('socketTimeout')); + if (isNaN(retryCount) || retryCount < 0) { + retryCount = 8; + } + + if (isNaN(socketTimeout) || socketTimeout < 0) { + socketTimeout = undefined; + } + + // download decrypted contents + secureFileId = tl.getInput('secureFile', true); + secureFileHelpers = new secureFilesCommon.SecureFileHelpers(retryCount, socketTimeout); + let secureFilePath: string = await secureFileHelpers.downloadSecureFile(secureFileId); + + if (tl.exist(secureFilePath)) { + // set the secure file output variable. + tl.setVariable('secureFilePath', secureFilePath); + } + } catch (err) { + tl.setResult(tl.TaskResult.Failed, err); + } +} + +run(); \ No newline at end of file diff --git a/_generated/DownloadSecureFileV1/task.json b/_generated/DownloadSecureFileV1/task.json new file mode 100644 index 000000000000..0e8c8cc1bc0e --- /dev/null +++ b/_generated/DownloadSecureFileV1/task.json @@ -0,0 +1,83 @@ +{ + "id": "2a6ca863-f2ce-4f4d-8bcb-15e64608ec4b", + "name": "DownloadSecureFile", + "friendlyName": "Download secure file", + "description": "Download a secure file to the agent machine", + "helpUrl": "https://docs.microsoft.com/azure/devops/pipelines/tasks/utility/download-secure-file", + "helpMarkDown": "[Learn more about this task](https://go.microsoft.com/fwlink/?LinkID=862069)", + "category": "Utility", + "visibility": [ + "Build", + "Release" + ], + "author": "Microsoft Corporation", + "version": { + "Major": 1, + "Minor": 229, + "Patch": 0 + }, + "runsOn": [ + "Agent", + "DeploymentGroup" + ], + "demands": [], + "minimumAgentVersion": "2.182.1", + "instanceNameFormat": "Download secure file", + "inputs": [ + { + "name": "secureFile", + "type": "secureFile", + "label": "Secure File", + "defaultValue": "", + "required": true, + "helpMarkDown": "The file name or GUID of the secure file to download to the agent machine. The file will be deleted after the pipeline runs." + }, + { + "name": "retryCount", + "type": "string", + "label": "Retry Count", + "defaultValue": "8", + "required": "false", + "helpMarkDown": "Optional number of times to retry downloading a secure file if the download fails." + }, + { + "name": "socketTimeout", + "type": "string", + "label": "Socket Timeout", + "defaultValue": "", + "required": "false", + "helpMarkDown": "Optional timeout for a socket associated with downloading secure file request in ms." + } + ], + "outputVariables": [ + { + "name": "secureFilePath", + "description": "The location of the secure file that was downloaded." + } + ], + "prejobexecution": { + "Node10": { + "target": "predownloadsecurefile.js", + "argumentFormat": "" + }, + "Node16": { + "target": "predownloadsecurefile.js", + "argumentFormat": "" + } + }, + "restrictions": { + "commands": { + "mode": "restricted" + }, + "settableVariables": { + "allowed": [ + "secureFilePath" + ] + } + }, + "messages": {}, + "_buildConfigMapping": { + "Default": "1.229.0", + "Node20-225": "1.229.1" + } +} \ No newline at end of file diff --git a/_generated/DownloadSecureFileV1/task.loc.json b/_generated/DownloadSecureFileV1/task.loc.json new file mode 100644 index 000000000000..6b6886e1dd14 --- /dev/null +++ b/_generated/DownloadSecureFileV1/task.loc.json @@ -0,0 +1,83 @@ +{ + "id": "2a6ca863-f2ce-4f4d-8bcb-15e64608ec4b", + "name": "DownloadSecureFile", + "friendlyName": "ms-resource:loc.friendlyName", + "description": "ms-resource:loc.description", + "helpUrl": "https://docs.microsoft.com/azure/devops/pipelines/tasks/utility/download-secure-file", + "helpMarkDown": "ms-resource:loc.helpMarkDown", + "category": "Utility", + "visibility": [ + "Build", + "Release" + ], + "author": "Microsoft Corporation", + "version": { + "Major": 1, + "Minor": 229, + "Patch": 0 + }, + "runsOn": [ + "Agent", + "DeploymentGroup" + ], + "demands": [], + "minimumAgentVersion": "2.182.1", + "instanceNameFormat": "ms-resource:loc.instanceNameFormat", + "inputs": [ + { + "name": "secureFile", + "type": "secureFile", + "label": "ms-resource:loc.input.label.secureFile", + "defaultValue": "", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.secureFile" + }, + { + "name": "retryCount", + "type": "string", + "label": "ms-resource:loc.input.label.retryCount", + "defaultValue": "8", + "required": "false", + "helpMarkDown": "ms-resource:loc.input.help.retryCount" + }, + { + "name": "socketTimeout", + "type": "string", + "label": "ms-resource:loc.input.label.socketTimeout", + "defaultValue": "", + "required": "false", + "helpMarkDown": "ms-resource:loc.input.help.socketTimeout" + } + ], + "outputVariables": [ + { + "name": "secureFilePath", + "description": "The location of the secure file that was downloaded." + } + ], + "prejobexecution": { + "Node10": { + "target": "predownloadsecurefile.js", + "argumentFormat": "" + }, + "Node16": { + "target": "predownloadsecurefile.js", + "argumentFormat": "" + } + }, + "restrictions": { + "commands": { + "mode": "restricted" + }, + "settableVariables": { + "allowed": [ + "secureFilePath" + ] + } + }, + "messages": {}, + "_buildConfigMapping": { + "Default": "1.229.0", + "Node20-225": "1.229.1" + } +} \ No newline at end of file diff --git a/_generated/DownloadSecureFileV1/tsconfig.json b/_generated/DownloadSecureFileV1/tsconfig.json new file mode 100644 index 000000000000..0438b79f69ac --- /dev/null +++ b/_generated/DownloadSecureFileV1/tsconfig.json @@ -0,0 +1,6 @@ +{ + "compilerOptions": { + "target": "ES6", + "module": "commonjs" + } +} \ No newline at end of file diff --git a/_generated/DownloadSecureFileV1_Node20/.npmrc b/_generated/DownloadSecureFileV1_Node20/.npmrc new file mode 100644 index 000000000000..5fca0d518be7 --- /dev/null +++ b/_generated/DownloadSecureFileV1_Node20/.npmrc @@ -0,0 +1 @@ +scripts-prepend-node-path=true diff --git a/_generated/DownloadSecureFileV1_Node20/Strings/resources.resjson/de-DE/resources.resjson b/_generated/DownloadSecureFileV1_Node20/Strings/resources.resjson/de-DE/resources.resjson new file mode 100644 index 000000000000..135d94dd18d3 --- /dev/null +++ b/_generated/DownloadSecureFileV1_Node20/Strings/resources.resjson/de-DE/resources.resjson @@ -0,0 +1,12 @@ +{ + "loc.friendlyName": "Sichere Datei herunterladen", + "loc.helpMarkDown": "[Weitere Informationen zu dieser Aufgabe](https://go.microsoft.com/fwlink/?LinkID=862069)", + "loc.description": "Hiermit wird eine sichere Datei auf den Agentcomputer heruntergeladen.", + "loc.instanceNameFormat": "Sichere Datei herunterladen", + "loc.input.label.secureFile": "Sichere Datei", + "loc.input.help.secureFile": "Der Dateiname oder die GUID der sicheren Datei, die auf den Agentcomputer heruntergeladen werden soll. Die Datei wird gelöscht, nachdem die Pipeline ausgeführt wurde.", + "loc.input.label.retryCount": "Wiederholungsanzahl", + "loc.input.help.retryCount": "Optionale Anzahl von Wiederholungsversuchen zum Herunterladen einer sicheren Datei, wenn der Download nicht erfolgreich ist.", + "loc.input.label.socketTimeout": "Zeitlimit für Socket", + "loc.input.help.socketTimeout": "Optionales Zeitlimit in Millisekunden für einen Socket, der der Anforderung zum Herunterladen der sicheren Datei zugeordnet ist." +} \ No newline at end of file diff --git a/_generated/DownloadSecureFileV1_Node20/Strings/resources.resjson/en-US/resources.resjson b/_generated/DownloadSecureFileV1_Node20/Strings/resources.resjson/en-US/resources.resjson new file mode 100644 index 000000000000..ad928f71c12f --- /dev/null +++ b/_generated/DownloadSecureFileV1_Node20/Strings/resources.resjson/en-US/resources.resjson @@ -0,0 +1,12 @@ +{ + "loc.friendlyName": "Download secure file", + "loc.helpMarkDown": "[Learn more about this task](https://go.microsoft.com/fwlink/?LinkID=862069)", + "loc.description": "Download a secure file to the agent machine", + "loc.instanceNameFormat": "Download secure file", + "loc.input.label.secureFile": "Secure File", + "loc.input.help.secureFile": "The file name or GUID of the secure file to download to the agent machine. The file will be deleted after the pipeline runs.", + "loc.input.label.retryCount": "Retry Count", + "loc.input.help.retryCount": "Optional number of times to retry downloading a secure file if the download fails.", + "loc.input.label.socketTimeout": "Socket Timeout", + "loc.input.help.socketTimeout": "Optional timeout for a socket associated with downloading secure file request in ms." +} \ No newline at end of file diff --git a/_generated/DownloadSecureFileV1_Node20/Strings/resources.resjson/es-ES/resources.resjson b/_generated/DownloadSecureFileV1_Node20/Strings/resources.resjson/es-ES/resources.resjson new file mode 100644 index 000000000000..c424ff529e81 --- /dev/null +++ b/_generated/DownloadSecureFileV1_Node20/Strings/resources.resjson/es-ES/resources.resjson @@ -0,0 +1,12 @@ +{ + "loc.friendlyName": "Descargar archivo seguro", + "loc.helpMarkDown": "[Obtener más información acerca de esta tarea](https://go.microsoft.com/fwlink/?LinkID=862069)", + "loc.description": "Descarga un archivo seguro a la máquina del agente.", + "loc.instanceNameFormat": "Descargar archivo seguro", + "loc.input.label.secureFile": "Archivo seguro", + "loc.input.help.secureFile": "El nombre de archivo o el GUID del archivo seguro que se va a descargar en la máquina del agente. El archivo se eliminará después de que se ejecute la canalización.", + "loc.input.label.retryCount": "Número de reintentos", + "loc.input.help.retryCount": "Número opcional de reintentos de descarga de un archivo seguro, en caso de error de la descarga.", + "loc.input.label.socketTimeout": "Tiempo de espera del socket", + "loc.input.help.socketTimeout": "Tiempo de espera opcional para un socket asociado a la descarga de una solicitud de archivo seguro, en milisegundos." +} \ No newline at end of file diff --git a/_generated/DownloadSecureFileV1_Node20/Strings/resources.resjson/fr-FR/resources.resjson b/_generated/DownloadSecureFileV1_Node20/Strings/resources.resjson/fr-FR/resources.resjson new file mode 100644 index 000000000000..b0e64c8586b0 --- /dev/null +++ b/_generated/DownloadSecureFileV1_Node20/Strings/resources.resjson/fr-FR/resources.resjson @@ -0,0 +1,12 @@ +{ + "loc.friendlyName": "Télécharger un fichier sécurisé", + "loc.helpMarkDown": "[En savoir plus sur cette tâche](https://go.microsoft.com/fwlink/?LinkID=862069)", + "loc.description": "Télécharger un fichier sécurisé sur la machine d'agent", + "loc.instanceNameFormat": "Télécharger un fichier sécurisé", + "loc.input.label.secureFile": "Fichier sécurisé", + "loc.input.help.secureFile": "Nom de fichier ou GUID du fichier sécurisé à télécharger sur la machine d'agent. Le fichier est supprimé après l'exécution du pipeline.", + "loc.input.label.retryCount": "Nombre de nouvelles tentatives", + "loc.input.help.retryCount": "Nombre facultatif de nouvelles tentatives de téléchargement d'un fichier sécurisé en cas d'échec du téléchargement.", + "loc.input.label.socketTimeout": "Délai d'expiration du socket", + "loc.input.help.socketTimeout": "Délai d'expiration facultatif (en ms) pour un socket associé à une demande de téléchargement de fichier sécurisé." +} \ No newline at end of file diff --git a/_generated/DownloadSecureFileV1_Node20/Strings/resources.resjson/it-IT/resources.resjson b/_generated/DownloadSecureFileV1_Node20/Strings/resources.resjson/it-IT/resources.resjson new file mode 100644 index 000000000000..34d05bc884e2 --- /dev/null +++ b/_generated/DownloadSecureFileV1_Node20/Strings/resources.resjson/it-IT/resources.resjson @@ -0,0 +1,12 @@ +{ + "loc.friendlyName": "Scarica file protetto", + "loc.helpMarkDown": "[Altre informazioni su questa attività](https://go.microsoft.com/fwlink/?LinkID=862069)", + "loc.description": "Scarica un file protetto nel computer agente", + "loc.instanceNameFormat": "Scarica file protetto", + "loc.input.label.secureFile": "File protetto", + "loc.input.help.secureFile": "Nome o GUID del file protetto da scaricare nel computer agente. Il file verrà eliminato al termine dell'esecuzione della pipeline.", + "loc.input.label.retryCount": "Numero di tentativi", + "loc.input.help.retryCount": "Numero facoltativo di tentativi di download di un file protetto se il download non riesce.", + "loc.input.label.socketTimeout": "Timeout socket", + "loc.input.help.socketTimeout": "Timeout facoltativo in ms per un socket associato alla richiesta di download del file protetto." +} \ No newline at end of file diff --git a/_generated/DownloadSecureFileV1_Node20/Strings/resources.resjson/ja-JP/resources.resjson b/_generated/DownloadSecureFileV1_Node20/Strings/resources.resjson/ja-JP/resources.resjson new file mode 100644 index 000000000000..b5d630f43e5e --- /dev/null +++ b/_generated/DownloadSecureFileV1_Node20/Strings/resources.resjson/ja-JP/resources.resjson @@ -0,0 +1,12 @@ +{ + "loc.friendlyName": "セキュア ファイルのダウンロード", + "loc.helpMarkDown": "[このタスクの詳細を表示](https://go.microsoft.com/fwlink/?LinkID=862069)", + "loc.description": "セキュア ファイルをエージェント マシンにダウンロードします", + "loc.instanceNameFormat": "セキュア ファイルのダウンロード", + "loc.input.label.secureFile": "セキュア ファイル", + "loc.input.help.secureFile": "エージェント マシンにダウンロードするセキュア ファイルのファイル名または GUID。ファイルはパイプライン実行後に削除されます。", + "loc.input.label.retryCount": "再試行の回数", + "loc.input.help.retryCount": "セキュア ファイルのダウンロードが失敗した場合に、ダウンロードを再試行する回数 (省略可能)。", + "loc.input.label.socketTimeout": "ソケットのタイムアウト", + "loc.input.help.socketTimeout": "セキュア ファイル要求のダウンロードに関連付けられているソケットの省略可能なタイムアウト (ms)。" +} \ No newline at end of file diff --git a/_generated/DownloadSecureFileV1_Node20/Strings/resources.resjson/ko-KR/resources.resjson b/_generated/DownloadSecureFileV1_Node20/Strings/resources.resjson/ko-KR/resources.resjson new file mode 100644 index 000000000000..6fc08fbb561a --- /dev/null +++ b/_generated/DownloadSecureFileV1_Node20/Strings/resources.resjson/ko-KR/resources.resjson @@ -0,0 +1,12 @@ +{ + "loc.friendlyName": "보안 파일 다운로드", + "loc.helpMarkDown": "[이 작업에 대한 자세한 정보](https://go.microsoft.com/fwlink/?LinkID=862069)", + "loc.description": "에이전트 머신에 보안 파일을 다운로드합니다.", + "loc.instanceNameFormat": "보안 파일 다운로드", + "loc.input.label.secureFile": "보안 파일", + "loc.input.help.secureFile": "에이전트 컴퓨터에 다운로드할 보안 파일의 파일 이름 또는 GUID입니다. 파이프라인을 실행하면 파일이 삭제됩니다.", + "loc.input.label.retryCount": "재시도 횟수", + "loc.input.help.retryCount": "다운로드가 실패할 경우 보안 파일 다운로드를 다시 시도하는 선택적 횟수입니다.", + "loc.input.label.socketTimeout": "소켓 시간 제한", + "loc.input.help.socketTimeout": "보안 파일 요청 다운로드와 연결된 소켓에 대한 선택적 시간 제한(ms)입니다." +} \ No newline at end of file diff --git a/_generated/DownloadSecureFileV1_Node20/Strings/resources.resjson/ru-RU/resources.resjson b/_generated/DownloadSecureFileV1_Node20/Strings/resources.resjson/ru-RU/resources.resjson new file mode 100644 index 000000000000..6040850adc7d --- /dev/null +++ b/_generated/DownloadSecureFileV1_Node20/Strings/resources.resjson/ru-RU/resources.resjson @@ -0,0 +1,12 @@ +{ + "loc.friendlyName": "Скачать защищенный файл", + "loc.helpMarkDown": "[См. дополнительные сведения об этой задаче](https://go.microsoft.com/fwlink/?LinkID=862069)", + "loc.description": "Скачать защитный файл на компьютер агента", + "loc.instanceNameFormat": "Скачать защищенный файл", + "loc.input.label.secureFile": "Защитный файл", + "loc.input.help.secureFile": "Имя или идентификатор GUID защитного файла, скачиваемого на компьютер агента. Файл будет удален после выполнения конвейера.", + "loc.input.label.retryCount": "Число повторных попыток", + "loc.input.help.retryCount": "Необязательное число повторных попыток скачивания защитного файла в случае сбоя скачивания.", + "loc.input.label.socketTimeout": "Время ожидания сокета", + "loc.input.help.socketTimeout": "Необязательное время ожидания сокета, связанное с запросом на скачивание защищенного файла, в мс." +} \ No newline at end of file diff --git a/_generated/DownloadSecureFileV1_Node20/Strings/resources.resjson/zh-CN/resources.resjson b/_generated/DownloadSecureFileV1_Node20/Strings/resources.resjson/zh-CN/resources.resjson new file mode 100644 index 000000000000..e242fc7520de --- /dev/null +++ b/_generated/DownloadSecureFileV1_Node20/Strings/resources.resjson/zh-CN/resources.resjson @@ -0,0 +1,12 @@ +{ + "loc.friendlyName": "下载安全文件", + "loc.helpMarkDown": "[详细了解此任务](https://go.microsoft.com/fwlink/?LinkID=862069)", + "loc.description": "将安全文件下载到代理计算机", + "loc.instanceNameFormat": "下载安全文件", + "loc.input.label.secureFile": "安全文件", + "loc.input.help.secureFile": "要下载到代理计算机的安全文件的文件名或 GUID。将在管道运行后删除该文件。", + "loc.input.label.retryCount": "重试次数", + "loc.input.help.retryCount": "下载失败时重试下载安全文件的次数(可选)。", + "loc.input.label.socketTimeout": "套接字超时", + "loc.input.help.socketTimeout": "(可选)与下载安全文件请求关联的套接字的超时,以毫秒为单位。" +} \ No newline at end of file diff --git a/_generated/DownloadSecureFileV1_Node20/Strings/resources.resjson/zh-TW/resources.resjson b/_generated/DownloadSecureFileV1_Node20/Strings/resources.resjson/zh-TW/resources.resjson new file mode 100644 index 000000000000..04dac4b4f11f --- /dev/null +++ b/_generated/DownloadSecureFileV1_Node20/Strings/resources.resjson/zh-TW/resources.resjson @@ -0,0 +1,12 @@ +{ + "loc.friendlyName": "下載安全檔案", + "loc.helpMarkDown": "[深入了解此工作](https://go.microsoft.com/fwlink/?LinkID=862069)", + "loc.description": "將安全檔案下載至代理程式電腦", + "loc.instanceNameFormat": "下載安全檔案", + "loc.input.label.secureFile": "安全檔案", + "loc.input.help.secureFile": "要下載至代理程式電腦的安全檔案名稱或 GUID。此檔案會在管線執行後刪除。", + "loc.input.label.retryCount": "重試計數", + "loc.input.help.retryCount": "下載失敗時選用的安全檔案下載重試次數。", + "loc.input.label.socketTimeout": "通訊端逾時", + "loc.input.help.socketTimeout": "與下載安全檔案要求建立關聯之通訊端的選用逾時 (以毫秒為單位)。" +} \ No newline at end of file diff --git a/_generated/DownloadSecureFileV1_Node20/Tests/L0.ts b/_generated/DownloadSecureFileV1_Node20/Tests/L0.ts new file mode 100644 index 000000000000..3a9a1090d92d --- /dev/null +++ b/_generated/DownloadSecureFileV1_Node20/Tests/L0.ts @@ -0,0 +1,64 @@ +import fs = require('fs'); +import assert = require('assert'); +import path = require('path'); +import * as ttm from 'azure-pipelines-task-lib/mock-test'; + +describe('DownloadSecureFile Suite', function () { + before(() => { + }); + + after(() => { + }); + + it('Defaults: download secure file', function() { + this.timeout(parseInt(process.env.TASK_TEST_TIMEOUT) || 20000); + + let tp: string = path.join(__dirname, 'L0SecureFile.js'); + let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.stderr.length === 0, 'should not have written to stderr'); + assert(tr.stdOutContained('##vso[task.debug]Mock SecureFileHelpers retry count set to: 8'), 'task should have used default retry count of 8'); + assert(tr.succeeded, 'task should have succeeded'); + }); + + it('Uses input retry count', function() { + this.timeout(parseInt(process.env.TASK_TEST_TIMEOUT) || 20000); + + let tp: string = path.join(__dirname, 'L0ValidRetryCount.js'); + let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.stderr.length === 0, 'should not have written to stderr'); + assert(tr.stdOutContained('##vso[task.debug]Mock SecureFileHelpers retry count set to: 7'), 'task should have used the input retry count of 7'); + assert(tr.succeeded, 'task should have succeeded'); + }); + + it('Invalid retry count defaults to 8', function() { + this.timeout(parseInt(process.env.TASK_TEST_TIMEOUT) || 20000); + + let tp: string = path.join(__dirname, 'L0InvalidRetryCount.js'); + let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.stderr.length === 0, 'should not have written to stderr'); + assert(tr.stdOutContained('##vso[task.debug]Mock SecureFileHelpers retry count set to: 8'), 'task should have used default retry count of 8'); + assert(tr.succeeded, 'task should have succeeded'); + }); + + it('Negative retry count defaults to 8', function() { + this.timeout(parseInt(process.env.TASK_TEST_TIMEOUT) || 20000); + + let tp: string = path.join(__dirname, 'L0NegativeRetryCount.js'); + let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.stderr.length === 0, 'should not have written to stderr'); + assert(tr.stdOutContained('##vso[task.debug]Mock SecureFileHelpers retry count set to: 8'), 'task should have used default retry count of 8'); + assert(tr.succeeded, 'task should have succeeded'); + }); +}); \ No newline at end of file diff --git a/_generated/DownloadSecureFileV1_Node20/Tests/L0InvalidRetryCount.ts b/_generated/DownloadSecureFileV1_Node20/Tests/L0InvalidRetryCount.ts new file mode 100644 index 000000000000..0e0bfbe02c6f --- /dev/null +++ b/_generated/DownloadSecureFileV1_Node20/Tests/L0InvalidRetryCount.ts @@ -0,0 +1,32 @@ +import * as ma from 'azure-pipelines-task-lib/mock-answer'; +import * as tmrm from 'azure-pipelines-task-lib/mock-run'; +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'predownloadsecurefile.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('secureFile', 'mySecureFileId'); +tr.setInput('retryCount', 'not a number'); + +process.env['AGENT_VERSION'] = '2.116.0'; +process.env['HOME'] = '/users/test'; + +let secureFileHelperMock = require('azure-pipelines-tasks-securefiles-common/securefiles-common-mock'); +tr.registerMock('azure-pipelines-tasks-securefiles-common/securefiles-common', secureFileHelperMock); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "cp": "/bin/cp" + }, + "checkPath": { + "/bin/cp": true + }, + "exist": { + "/build/temp/mySecureFileId.filename": true + } +}; +tr.setAnswers(a); + +tr.run(); + diff --git a/_generated/DownloadSecureFileV1_Node20/Tests/L0NegativeRetryCount.ts b/_generated/DownloadSecureFileV1_Node20/Tests/L0NegativeRetryCount.ts new file mode 100644 index 000000000000..a06c6931360a --- /dev/null +++ b/_generated/DownloadSecureFileV1_Node20/Tests/L0NegativeRetryCount.ts @@ -0,0 +1,32 @@ +import * as ma from 'azure-pipelines-task-lib/mock-answer'; +import * as tmrm from 'azure-pipelines-task-lib/mock-run'; +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'predownloadsecurefile.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('secureFile', 'mySecureFileId'); +tr.setInput('retryCount', '-1'); + +process.env['AGENT_VERSION'] = '2.116.0'; +process.env['HOME'] = '/users/test'; + +let secureFileHelperMock = require('azure-pipelines-tasks-securefiles-common/securefiles-common-mock'); +tr.registerMock('azure-pipelines-tasks-securefiles-common/securefiles-common', secureFileHelperMock); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "cp": "/bin/cp" + }, + "checkPath": { + "/bin/cp": true + }, + "exist": { + "/build/temp/mySecureFileId.filename": true + } +}; +tr.setAnswers(a); + +tr.run(); + diff --git a/_generated/DownloadSecureFileV1_Node20/Tests/L0SecureFile.ts b/_generated/DownloadSecureFileV1_Node20/Tests/L0SecureFile.ts new file mode 100644 index 000000000000..72343fc31230 --- /dev/null +++ b/_generated/DownloadSecureFileV1_Node20/Tests/L0SecureFile.ts @@ -0,0 +1,31 @@ +import * as ma from 'azure-pipelines-task-lib/mock-answer'; +import * as tmrm from 'azure-pipelines-task-lib/mock-run'; +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'predownloadsecurefile.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('secureFile', 'mySecureFileId'); + +process.env['AGENT_VERSION'] = '2.116.0'; +process.env['HOME'] = '/users/test'; + +let secureFileHelperMock = require('azure-pipelines-tasks-securefiles-common/securefiles-common-mock'); +tr.registerMock('azure-pipelines-tasks-securefiles-common/securefiles-common', secureFileHelperMock); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "cp": "/bin/cp" + }, + "checkPath": { + "/bin/cp": true + }, + "exist": { + "/build/temp/mySecureFileId.filename": true + } +}; +tr.setAnswers(a); + +tr.run(); + diff --git a/_generated/DownloadSecureFileV1_Node20/Tests/L0ValidRetryCount.ts b/_generated/DownloadSecureFileV1_Node20/Tests/L0ValidRetryCount.ts new file mode 100644 index 000000000000..de81743d5d6d --- /dev/null +++ b/_generated/DownloadSecureFileV1_Node20/Tests/L0ValidRetryCount.ts @@ -0,0 +1,32 @@ +import * as ma from 'azure-pipelines-task-lib/mock-answer'; +import * as tmrm from 'azure-pipelines-task-lib/mock-run'; +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'predownloadsecurefile.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('secureFile', 'mySecureFileId'); +tr.setInput('retryCount', '7'); + +process.env['AGENT_VERSION'] = '2.116.0'; +process.env['HOME'] = '/users/test'; + +let secureFileHelperMock = require('azure-pipelines-tasks-securefiles-common/securefiles-common-mock'); +tr.registerMock('azure-pipelines-tasks-securefiles-common/securefiles-common', secureFileHelperMock); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "cp": "/bin/cp" + }, + "checkPath": { + "/bin/cp": true + }, + "exist": { + "/build/temp/mySecureFileId.filename": true + } +}; +tr.setAnswers(a); + +tr.run(); + diff --git a/_generated/DownloadSecureFileV1_Node20/Tests/package-lock.json b/_generated/DownloadSecureFileV1_Node20/Tests/package-lock.json new file mode 100644 index 000000000000..3126521ed43b --- /dev/null +++ b/_generated/DownloadSecureFileV1_Node20/Tests/package-lock.json @@ -0,0 +1,14 @@ +{ + "name": "vsts-tasks-downloadsecurefile-tests", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/mocha": { + "version": "5.2.5", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.5.tgz", + "integrity": "sha512-lAVp+Kj54ui/vLUFxsJTMtWvZraZxum3w3Nwkble2dNuV5VnPA+Mi2oGX9XYJAaIvZi3tn3cbjS/qcJXRb6Bww==", + "dev": true + } + } +} diff --git a/_generated/DownloadSecureFileV1_Node20/Tests/package.json b/_generated/DownloadSecureFileV1_Node20/Tests/package.json new file mode 100644 index 000000000000..6dacc0eb5120 --- /dev/null +++ b/_generated/DownloadSecureFileV1_Node20/Tests/package.json @@ -0,0 +1,22 @@ +{ + "name": "vsts-tasks-downloadsecurefile-tests", + "version": "1.0.0", + "description": "VSTS Download Secure File Task Tests", + "main": "L0.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/Microsoft/azure-pipelines-tasks.git" + }, + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Microsoft/azure-pipelines-tasks/issues" + }, + "homepage": "https://github.com/Microsoft/azure-pipelines-tasks#readme", + "devDependencies": { + "@types/mocha": "^5.2.0" + } +} diff --git a/_generated/DownloadSecureFileV1_Node20/ThirdPartyNotice.txt b/_generated/DownloadSecureFileV1_Node20/ThirdPartyNotice.txt new file mode 100644 index 000000000000..5dc2382b0f63 --- /dev/null +++ b/_generated/DownloadSecureFileV1_Node20/ThirdPartyNotice.txt @@ -0,0 +1,459 @@ + +THIRD-PARTY SOFTWARE NOTICES AND INFORMATION +Do Not Translate or Localize + +This Azure DevOps extension (DownloadSecureFileV1) is based on or incorporates material from the projects listed below (Third Party IP). The original copyright notice and the license under which Microsoft received such Third Party IP, are set forth below. Such licenses and notices are provided for informational purposes only. Microsoft licenses the Third Party IP to you under the licensing terms for the Azure DevOps extension. Microsoft reserves all other rights not expressly granted under this agreement, whether by implication, estoppel or otherwise. + +1. @types/mocha (git+https://github.com/DefinitelyTyped/DefinitelyTyped.git) +2. @types/node (git+https://github.com/DefinitelyTyped/DefinitelyTyped.git) +3. balanced-match (git://github.com/juliangruber/balanced-match.git) +4. brace-expansion (git://github.com/juliangruber/brace-expansion.git) +5. concat-map (git://github.com/substack/node-concat-map.git) +6. minimatch (git://github.com/isaacs/minimatch.git) +7. mockery (git://github.com/mfncooper/mockery.git) +8. q (git://github.com/kriskowal/q.git) +9. semver (git+https://github.com/npm/node-semver.git) +10. shelljs (git://github.com/arturadib/shelljs.git) +11. tunnel (git+https://github.com/koichik/node-tunnel.git) +12. typed-rest-client (git+https://github.com/Microsoft/typed-rest-client.git) +13. underscore (git://github.com/jashkenas/underscore.git) +14. uuid (git+https://github.com/kelektiv/node-uuid.git) +15. vso-node-api (git+https://github.com/Microsoft/vso-node-api.git) +16. vsts-task-lib (git+https://github.com/Microsoft/vsts-task-lib.git) +17. vsts-task-lib (git+https://github.com/Microsoft/vsts-task-lib.git) + + +%% @types/mocha NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +MIT License + + Copyright (c) Microsoft Corporation. All rights reserved. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE +========================================= +END OF @types/mocha NOTICES, INFORMATION, AND LICENSE + +%% @types/node NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +MIT License + + Copyright (c) Microsoft Corporation. All rights reserved. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE +========================================= +END OF @types/node NOTICES, INFORMATION, AND LICENSE + +%% balanced-match NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +(MIT) + +Copyright (c) 2013 Julian Gruber <julian@juliangruber.com> + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +========================================= +END OF balanced-match NOTICES, INFORMATION, AND LICENSE + +%% brace-expansion NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +MIT License + +Copyright (c) 2013 Julian Gruber + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +========================================= +END OF brace-expansion NOTICES, INFORMATION, AND LICENSE + +%% concat-map NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +This software is released under the MIT license: + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF concat-map NOTICES, INFORMATION, AND LICENSE + +%% minimatch NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF minimatch NOTICES, INFORMATION, AND LICENSE + +%% mockery NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyrights for code authored by Yahoo! Inc. is licensed under the following + terms: + + MIT License + + Copyright (c) 2011 Yahoo! Inc. All Rights Reserved. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to + deal in the Software without restriction, including without limitation the + rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. +========================================= +END OF mockery NOTICES, INFORMATION, AND LICENSE + +%% q NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright 2009–2017 Kristopher Michael Kowal. All rights reserved. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. +========================================= +END OF q NOTICES, INFORMATION, AND LICENSE + +%% semver NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +========================================= +END OF semver NOTICES, INFORMATION, AND LICENSE + +%% shelljs NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) 2012, Artur Adib +All rights reserved. + +You may use this project under the terms of the New BSD license as follows: + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of Artur Adib nor the + names of the contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL ARTUR ADIB BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +========================================= +END OF shelljs NOTICES, INFORMATION, AND LICENSE + +%% tunnel NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) 2012 Koichi Kobayashi + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +========================================= +END OF tunnel NOTICES, INFORMATION, AND LICENSE + +%% typed-rest-client NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Visual Studio Team Services Client for Node.js + +Copyright (c) Microsoft Corporation + +All rights reserved. + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and +associated documentation files (the "Software"), to deal in the Software without restriction, +including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT +LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF typed-rest-client NOTICES, INFORMATION, AND LICENSE + +%% underscore NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Copyright (c) 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative +Reporters & Editors + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF underscore NOTICES, INFORMATION, AND LICENSE + +%% uuid NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) 2010-2016 Robert Kieffer and other contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +========================================= +END OF uuid NOTICES, INFORMATION, AND LICENSE + +%% vso-node-api NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +Visual Studio Team Services Client for Node.js + +Copyright (c) Microsoft Corporation + +All rights reserved. + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and +associated documentation files (the "Software"), to deal in the Software without restriction, +including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT +LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +========================================= +END OF vso-node-api NOTICES, INFORMATION, AND LICENSE + +%% vsts-task-lib NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) Microsoft Corporation. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +========================================= +END OF vsts-task-lib NOTICES, INFORMATION, AND LICENSE + +%% vsts-task-lib NOTICES, INFORMATION, AND LICENSE BEGIN HERE +========================================= +The MIT License (MIT) + +Copyright (c) Microsoft Corporation. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +========================================= +END OF vsts-task-lib NOTICES, INFORMATION, AND LICENSE + diff --git a/_generated/DownloadSecureFileV1_Node20/icon.png b/_generated/DownloadSecureFileV1_Node20/icon.png new file mode 100644 index 000000000000..21295cb86003 Binary files /dev/null and b/_generated/DownloadSecureFileV1_Node20/icon.png differ diff --git a/_generated/DownloadSecureFileV1_Node20/icon.svg b/_generated/DownloadSecureFileV1_Node20/icon.svg new file mode 100644 index 000000000000..94013abffa1e --- /dev/null +++ b/_generated/DownloadSecureFileV1_Node20/icon.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/_generated/DownloadSecureFileV1_Node20/make.json b/_generated/DownloadSecureFileV1_Node20/make.json new file mode 100644 index 000000000000..4188c590d806 --- /dev/null +++ b/_generated/DownloadSecureFileV1_Node20/make.json @@ -0,0 +1,11 @@ +{ + "rm": [ + { + "items": [ + "node_modules/azure-pipelines-tasks-securefiles-common/node_modules/azure-pipelines-task-lib", + "node_modules/mockery" + ], + "options": "-Rf" + } + ] +} \ No newline at end of file diff --git a/_generated/DownloadSecureFileV1_Node20/package-lock.json b/_generated/DownloadSecureFileV1_Node20/package-lock.json new file mode 100644 index 000000000000..6b423ed00df8 --- /dev/null +++ b/_generated/DownloadSecureFileV1_Node20/package-lock.json @@ -0,0 +1,548 @@ +{ + "name": "vsts-tasks-downloadsecurefile", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/concat-stream": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz", + "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==", + "requires": { + "@types/node": "*" + } + }, + "@types/form-data": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", + "integrity": "sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==", + "requires": { + "@types/node": "*" + } + }, + "@types/mocha": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", + "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==" + }, + "@types/node": { + "version": "20.7.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.7.0.tgz", + "integrity": "sha512-zI22/pJW2wUZOVyguFaUL1HABdmSVxpXrzIqkjsHmyUjNhPoWM1CKfvVuXfetHhIok4RY573cqS0mZ1SJEnoTg==" + }, + "@types/q": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.5.tgz", + "integrity": "sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ==" + }, + "@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "azure-devops-node-api": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/azure-devops-node-api/-/azure-devops-node-api-10.2.2.tgz", + "integrity": "sha512-4TVv2X7oNStT0vLaEfExmy3J4/CzfuXolEcQl/BRUmvGySqKStTG2O55/hUQ0kM7UJlZBLgniM0SBq4d/WkKow==", + "requires": { + "tunnel": "0.0.6", + "typed-rest-client": "^1.8.4" + } + }, + "azure-pipelines-task-lib": { + "version": "5.0.0-preview.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-5.0.0-preview.0.tgz", + "integrity": "sha512-uQJEv+q3/7RD7kgphFd33uXijaPwA1ePYoNkAgZpUhbZUtc2u4JL4ujTT/JJfgXBNW/QQNAiDQ2OC7vOQG/0tg==", + "requires": { + "minimatch": "3.0.5", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "sync-request": "6.1.0", + "uuid": "^3.0.1" + } + }, + "azure-pipelines-tasks-securefiles-common": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-tasks-securefiles-common/-/azure-pipelines-tasks-securefiles-common-2.1.0.tgz", + "integrity": "sha512-oE7VscWFZD+Ku0WM6e2b5Y0eDom4DTZvER/mSh3m/z9V0yN9JUahNR0Dye9NIj0BSIyfgcaxxNWBCzqJMsirIQ==", + "requires": { + "@types/node": "^10.17.0", + "@types/q": "^1.5.4", + "azure-devops-node-api": "10.2.2", + "azure-pipelines-task-lib": "^3.1.0" + }, + "dependencies": { + "@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + }, + "azure-pipelines-task-lib": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-3.3.1.tgz", + "integrity": "sha512-56ZAr4MHIoa24VNVuwPL4iUQ5MKaigPoYXkBG8E8fiVmh8yZdatUo25meNoQwg77vDY22F63Q44UzXoMWmy7ag==", + "requires": { + "minimatch": "3.0.5", + "mockery": "^1.7.0", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "sync-request": "6.1.0", + "uuid": "^3.0.1" + } + } + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, + "form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-intrinsic": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", + "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + } + }, + "get-port": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", + "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==" + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "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" + }, + "dependencies": { + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "http-basic": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", + "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", + "requires": { + "caseless": "^0.12.0", + "concat-stream": "^1.6.2", + "http-response-object": "^3.0.1", + "parse-cache-control": "^1.0.1" + } + }, + "http-response-object": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", + "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", + "requires": { + "@types/node": "^10.0.3" + }, + "dependencies": { + "@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + } + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" + }, + "is-core-module": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", + "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", + "requires": { + "has": "^1.0.3" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "mockery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/mockery/-/mockery-1.7.0.tgz", + "integrity": "sha512-gUQA33ayi0tuAhr/rJNZPr7Q7uvlBt4gyJPbi0CDcAfIzIrDu1YgGMFgmAu3stJqBpK57m7+RxUbcS+pt59fKQ==" + }, + "object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, + "parse-cache-control": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", + "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "promise": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.2.0.tgz", + "integrity": "sha512-+CMAlLHqwRYwBMXKCP+o8ns7DN+xHDUiI+0nArsiJ9y+kJVPLFxEaSw6Ha9s9H0tftxg2Yzl25wqj9G7m5wLZg==", + "requires": { + "asap": "~2.0.6" + } + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==" + }, + "qs": { + "version": "6.11.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.1.tgz", + "integrity": "sha512-0wsrzgTz/kAVIeuxSjnpGC56rzYtr6JT/2BwEvMaPhFIoYa1aGO8LbzuU1R0uUYQkLpWBTOj0l/CLAJB64J6nQ==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "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" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "requires": { + "resolve": "^1.1.6" + } + }, + "resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "requires": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, + "sync-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", + "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==", + "requires": { + "http-response-object": "^3.0.1", + "sync-rpc": "^1.2.1", + "then-request": "^6.0.0" + } + }, + "sync-rpc": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz", + "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==", + "requires": { + "get-port": "^3.1.0" + } + }, + "then-request": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", + "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", + "requires": { + "@types/concat-stream": "^1.6.0", + "@types/form-data": "0.0.33", + "@types/node": "^8.0.0", + "@types/qs": "^6.2.31", + "caseless": "~0.12.0", + "concat-stream": "^1.6.0", + "form-data": "^2.2.0", + "http-basic": "^8.1.1", + "http-response-object": "^3.0.1", + "promise": "^8.0.0", + "qs": "^6.4.0" + }, + "dependencies": { + "@types/node": { + "version": "8.10.66", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", + "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==" + } + } + }, + "tunnel": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", + "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==" + }, + "typed-rest-client": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.8.5.tgz", + "integrity": "sha512-952/Aegu3lTqUAI1anbDLbewojnF/gh8at9iy1CIrfS1h/+MtNjB1Y9z6ZF5n2kZd+97em56lZ9uu7Zz3y/pwg==", + "requires": { + "qs": "^6.9.1", + "tunnel": "0.0.6", + "underscore": "^1.12.1" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, + "typescript": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "dev": true + }, + "underscore": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.1.tgz", + "integrity": "sha512-hzSoAVtJF+3ZtiFX0VgfFPHEDRm7Y/QPjGyNo4TVdnDTdft3tr8hEkD25a1jC+TjTuE7tkHGKkhwCgs9dgBB2g==" + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + } + } +} diff --git a/_generated/DownloadSecureFileV1_Node20/package.json b/_generated/DownloadSecureFileV1_Node20/package.json new file mode 100644 index 000000000000..eff93eb05910 --- /dev/null +++ b/_generated/DownloadSecureFileV1_Node20/package.json @@ -0,0 +1,28 @@ +{ + "name": "vsts-tasks-downloadsecurefile", + "version": "1.0.0", + "description": "Azure Pipelines Download Secure File Task", + "main": "predownloadsecurefile.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/Microsoft/azure-pipelines-tasks.git" + }, + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Microsoft/azure-pipelines-tasks/issues" + }, + "homepage": "https://github.com/Microsoft/azure-pipelines-tasks#readme", + "dependencies": { + "@types/node": "^20.3.1", + "@types/mocha": "^5.2.7", + "azure-pipelines-task-lib": "^5.0.0-preview.0", + "azure-pipelines-tasks-securefiles-common": "^2.1.0" + }, + "devDependencies": { + "typescript": "5.1.6" + } +} diff --git a/_generated/DownloadSecureFileV1_Node20/predownloadsecurefile.ts b/_generated/DownloadSecureFileV1_Node20/predownloadsecurefile.ts new file mode 100644 index 000000000000..2b8591948641 --- /dev/null +++ b/_generated/DownloadSecureFileV1_Node20/predownloadsecurefile.ts @@ -0,0 +1,36 @@ +import path = require('path'); +import secureFilesCommon = require('azure-pipelines-tasks-securefiles-common/securefiles-common'); +import tl = require('azure-pipelines-task-lib/task'); + +async function run() { + let secureFileId: string; + let secureFileHelpers: secureFilesCommon.SecureFileHelpers; + + try { + tl.setResourcePath(path.join(__dirname, 'task.json')); + + let retryCount = parseInt(tl.getInput('retryCount')); + let socketTimeout = parseInt(tl.getInput('socketTimeout')); + if (isNaN(retryCount) || retryCount < 0) { + retryCount = 8; + } + + if (isNaN(socketTimeout) || socketTimeout < 0) { + socketTimeout = undefined; + } + + // download decrypted contents + secureFileId = tl.getInput('secureFile', true); + secureFileHelpers = new secureFilesCommon.SecureFileHelpers(retryCount, socketTimeout); + let secureFilePath: string = await secureFileHelpers.downloadSecureFile(secureFileId); + + if (tl.exist(secureFilePath)) { + // set the secure file output variable. + tl.setVariable('secureFilePath', secureFilePath); + } + } catch (err) { + tl.setResult(tl.TaskResult.Failed, err); + } +} + +run(); \ No newline at end of file diff --git a/_generated/DownloadSecureFileV1_Node20/task.json b/_generated/DownloadSecureFileV1_Node20/task.json new file mode 100644 index 000000000000..75190dd5bba1 --- /dev/null +++ b/_generated/DownloadSecureFileV1_Node20/task.json @@ -0,0 +1,87 @@ +{ + "id": "2a6ca863-f2ce-4f4d-8bcb-15e64608ec4b", + "name": "DownloadSecureFile", + "friendlyName": "Download secure file", + "description": "Download a secure file to the agent machine", + "helpUrl": "https://docs.microsoft.com/azure/devops/pipelines/tasks/utility/download-secure-file", + "helpMarkDown": "[Learn more about this task](https://go.microsoft.com/fwlink/?LinkID=862069)", + "category": "Utility", + "visibility": [ + "Build", + "Release" + ], + "author": "Microsoft Corporation", + "version": { + "Major": 1, + "Minor": 229, + "Patch": 1 + }, + "runsOn": [ + "Agent", + "DeploymentGroup" + ], + "demands": [], + "minimumAgentVersion": "2.182.1", + "instanceNameFormat": "Download secure file", + "inputs": [ + { + "name": "secureFile", + "type": "secureFile", + "label": "Secure File", + "defaultValue": "", + "required": true, + "helpMarkDown": "The file name or GUID of the secure file to download to the agent machine. The file will be deleted after the pipeline runs." + }, + { + "name": "retryCount", + "type": "string", + "label": "Retry Count", + "defaultValue": "8", + "required": "false", + "helpMarkDown": "Optional number of times to retry downloading a secure file if the download fails." + }, + { + "name": "socketTimeout", + "type": "string", + "label": "Socket Timeout", + "defaultValue": "", + "required": "false", + "helpMarkDown": "Optional timeout for a socket associated with downloading secure file request in ms." + } + ], + "outputVariables": [ + { + "name": "secureFilePath", + "description": "The location of the secure file that was downloaded." + } + ], + "prejobexecution": { + "Node10": { + "target": "predownloadsecurefile.js", + "argumentFormat": "" + }, + "Node16": { + "target": "predownloadsecurefile.js", + "argumentFormat": "" + }, + "Node20": { + "target": "predownloadsecurefile.js", + "argumentFormat": "" + } + }, + "restrictions": { + "commands": { + "mode": "restricted" + }, + "settableVariables": { + "allowed": [ + "secureFilePath" + ] + } + }, + "messages": {}, + "_buildConfigMapping": { + "Default": "1.229.0", + "Node20-225": "1.229.1" + } +} \ No newline at end of file diff --git a/_generated/DownloadSecureFileV1_Node20/task.loc.json b/_generated/DownloadSecureFileV1_Node20/task.loc.json new file mode 100644 index 000000000000..31b4c8e4e025 --- /dev/null +++ b/_generated/DownloadSecureFileV1_Node20/task.loc.json @@ -0,0 +1,87 @@ +{ + "id": "2a6ca863-f2ce-4f4d-8bcb-15e64608ec4b", + "name": "DownloadSecureFile", + "friendlyName": "ms-resource:loc.friendlyName", + "description": "ms-resource:loc.description", + "helpUrl": "https://docs.microsoft.com/azure/devops/pipelines/tasks/utility/download-secure-file", + "helpMarkDown": "ms-resource:loc.helpMarkDown", + "category": "Utility", + "visibility": [ + "Build", + "Release" + ], + "author": "Microsoft Corporation", + "version": { + "Major": 1, + "Minor": 229, + "Patch": 1 + }, + "runsOn": [ + "Agent", + "DeploymentGroup" + ], + "demands": [], + "minimumAgentVersion": "2.182.1", + "instanceNameFormat": "ms-resource:loc.instanceNameFormat", + "inputs": [ + { + "name": "secureFile", + "type": "secureFile", + "label": "ms-resource:loc.input.label.secureFile", + "defaultValue": "", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.secureFile" + }, + { + "name": "retryCount", + "type": "string", + "label": "ms-resource:loc.input.label.retryCount", + "defaultValue": "8", + "required": "false", + "helpMarkDown": "ms-resource:loc.input.help.retryCount" + }, + { + "name": "socketTimeout", + "type": "string", + "label": "ms-resource:loc.input.label.socketTimeout", + "defaultValue": "", + "required": "false", + "helpMarkDown": "ms-resource:loc.input.help.socketTimeout" + } + ], + "outputVariables": [ + { + "name": "secureFilePath", + "description": "The location of the secure file that was downloaded." + } + ], + "prejobexecution": { + "Node10": { + "target": "predownloadsecurefile.js", + "argumentFormat": "" + }, + "Node16": { + "target": "predownloadsecurefile.js", + "argumentFormat": "" + }, + "Node20": { + "target": "predownloadsecurefile.js", + "argumentFormat": "" + } + }, + "restrictions": { + "commands": { + "mode": "restricted" + }, + "settableVariables": { + "allowed": [ + "secureFilePath" + ] + } + }, + "messages": {}, + "_buildConfigMapping": { + "Default": "1.229.0", + "Node20-225": "1.229.1" + } +} \ No newline at end of file diff --git a/_generated/DownloadSecureFileV1_Node20/tsconfig.json b/_generated/DownloadSecureFileV1_Node20/tsconfig.json new file mode 100644 index 000000000000..0438b79f69ac --- /dev/null +++ b/_generated/DownloadSecureFileV1_Node20/tsconfig.json @@ -0,0 +1,6 @@ +{ + "compilerOptions": { + "target": "ES6", + "module": "commonjs" + } +} \ No newline at end of file diff --git a/_generated/ExtractFilesV1.versionmap.txt b/_generated/ExtractFilesV1.versionmap.txt new file mode 100644 index 000000000000..f74febd08e1e --- /dev/null +++ b/_generated/ExtractFilesV1.versionmap.txt @@ -0,0 +1,2 @@ +Default|1.229.0 +Node20-225|1.229.1 diff --git a/_generated/ExtractFilesV1/Strings/resources.resjson/de-DE/resources.resjson b/_generated/ExtractFilesV1/Strings/resources.resjson/de-DE/resources.resjson new file mode 100644 index 000000000000..c7b6a396bbe3 --- /dev/null +++ b/_generated/ExtractFilesV1/Strings/resources.resjson/de-DE/resources.resjson @@ -0,0 +1,40 @@ +{ + "loc.friendlyName": "Dateien extrahieren", + "loc.helpMarkDown": "[Weitere Informationen zu dieser Aufgabe](https://go.microsoft.com/fwlink/?LinkId=800269)", + "loc.description": "Hiermit werden verschiedene Archiv- und Komprimierungsdateien extrahiert, z. B. 7z, RAR, TAR.GZ und ZIP.", + "loc.instanceNameFormat": "Dateien extrahieren $(message)", + "loc.input.label.archiveFilePatterns": "Archivdateimuster", + "loc.input.help.archiveFilePatterns": "Dateipfade oder Muster der zu extrahierenden Archivdateien. Unterstützt mehrere Zeilen von Minimatchmustern. [Weitere Informationen](https://go.microsoft.com/fwlink/?LinkId=800269)", + "loc.input.label.destinationFolder": "Zielordner", + "loc.input.help.destinationFolder": "Der Zielordner, in den Archivdateien extrahiert werden sollen. Verwenden Sie [Variablen](https://go.microsoft.com/fwlink/?LinkID=550988), wenn Dateien nicht im Repository vorhanden sind. Beispiel: $(agent.builddirectory)", + "loc.input.label.cleanDestinationFolder": "Zielordner vor dem Extrahieren bereinigen", + "loc.input.help.cleanDestinationFolder": "Wählen Sie diese Option aus, um das Zielverzeichnis zu bereinigen, bevor Archivinhalte in dieses extrahiert werden.", + "loc.input.label.overwriteExistingFiles": "Vorhandene Dateien überschreiben", + "loc.input.help.overwriteExistingFiles": "Wählen Sie diese Option aus, um vorhandene Dateien im Zielverzeichnis zu überschreiben.", + "loc.input.label.pathToSevenZipTool": "Pfad zum 7z-Hilfsprogramm", + "loc.input.help.pathToSevenZipTool": "Sie können einen benutzerdefinierten Pfad zum 7z-Hilfsprogramm angeben. Beispiel: \"C:\\7z\\7z.exe\" unter Windows und \"/usr/local/bin/7z\" unter MacOS/Ubuntu.", + "loc.messages.ExtractDirFailedinFindFiles": "Die angegebene Archivdatei \"%s\" kann nicht extrahiert werden, weil es sich nicht um ein Verzeichnis handelt.", + "loc.messages.ExtractNotFileFailed": "Die angegebene Archivdatei \"%s\" kann nicht extrahiert werden, weil es sich nicht um eine Datei handelt.", + "loc.messages.ExtractNotAccessibleFile": "Die angegebene Archivdatei \"%s\" kann nicht extrahiert werden, weil nicht auf sie zugegriffen werden kann: %s", + "loc.messages.SearchInDir": "Die Suche nach \"%s\" im Verzeichnis \"%s\" wird durchgeführt.", + "loc.messages.SearchNonExistDir": "Fehler bei der Suche, weil das angegebene Suchverzeichnis \"%s\" nicht vorhanden ist.", + "loc.messages.SearchNonDir": "Fehler bei der Suche, weil das angegebene Suchverzeichnis \"%s\" kein Verzeichnis ist.", + "loc.messages.NoSearchPatternPath": "Es wurde kein Pfad für das Suchmuster \"%s\" angegeben. Der Standardwert \"%s\" wird verwendet.", + "loc.messages.ResolveRelativePath": "Relativer Pfad \"%s\" wird aufgelöst in \"%s\".", + "loc.messages.UnzipExtractFile": "Die Datei wird extrahiert: %s", + "loc.messages.SevenZipExtractFile": "Die Datei wird extrahiert: %s", + "loc.messages.TarExtractFile": "Die Datei wird extrahiert: %s", + "loc.messages.ExtractFileFailedMsg": "Fehler beim Extrahieren der Datei: %s \nCode: %d \nstdout: %s \nstderr: %s \nFehler: %s;", + "loc.messages.ExtractNonExistFile": "Fehler beim Extrahieren der Datei \"%s\", weil die Datei nicht vorhanden ist.", + "loc.messages.ExtractDirFailed": "Fehler beim Extrahieren der Datei \"%s\", weil es sich um einen Ordner handelt.", + "loc.messages.CreateTempDir": "Der temporäre Ordner \"%s\" für die Dekomprimierung wird erstellt: %s", + "loc.messages.TempDir": "tempFolder = %s", + "loc.messages.DecompressedTempTar": "Die temporäre TAR-Datei wurde von \"%s\" nach \"%s\" dekomprimiert.", + "loc.messages.RemoveTempDir": "Der temporäre Ordner wird entfernt: %s", + "loc.messages.ExtractFailedCannotCreate": "Fehler beim Extrahieren der Datei \"%s\", weil der temporäre Speicherort nicht erstellt werden konnte: %s", + "loc.messages.NoFilesFound": "Über die angegebenen Dateimuster wurden keine Archive gefunden.", + "loc.messages.FoundFiles": "%d Dateien zum Extrahieren gefunden:", + "loc.messages.CleanDestDir": "Der Zielordner wird vor dem Extrahieren bereinigt: %s", + "loc.messages.CreateDestDir": "Der Zielordner wird erstellt: %s", + "loc.messages.SucceedMsg": "Alle Dateien wurden erfolgreich extrahiert." +} \ No newline at end of file diff --git a/_generated/ExtractFilesV1/Strings/resources.resjson/en-US/resources.resjson b/_generated/ExtractFilesV1/Strings/resources.resjson/en-US/resources.resjson new file mode 100644 index 000000000000..ae298d0210b2 --- /dev/null +++ b/_generated/ExtractFilesV1/Strings/resources.resjson/en-US/resources.resjson @@ -0,0 +1,40 @@ +{ + "loc.friendlyName": "Extract files", + "loc.helpMarkDown": "[Learn more about this task](https://go.microsoft.com/fwlink/?LinkId=800269)", + "loc.description": "Extract a variety of archive and compression files such as .7z, .rar, .tar.gz, and .zip", + "loc.instanceNameFormat": "Extract files $(message)", + "loc.input.label.archiveFilePatterns": "Archive file patterns", + "loc.input.help.archiveFilePatterns": "File paths or patterns of the archive files to extract. Supports multiple lines of minimatch patterns. [More Information](https://go.microsoft.com/fwlink/?LinkId=800269)", + "loc.input.label.destinationFolder": "Destination folder", + "loc.input.help.destinationFolder": "Destination folder into which archive files should be extracted. Use [variables](https://go.microsoft.com/fwlink/?LinkID=550988) if files are not in the repo. Example: $(agent.builddirectory)", + "loc.input.label.cleanDestinationFolder": "Clean destination folder before extracting", + "loc.input.help.cleanDestinationFolder": "Select this option to clean the destination directory before archive contents are extracted into it.", + "loc.input.label.overwriteExistingFiles": "Overwrite existing files", + "loc.input.help.overwriteExistingFiles": "Select this option to overwrite existing files in the destination directory.", + "loc.input.label.pathToSevenZipTool": "Path to 7z utility", + "loc.input.help.pathToSevenZipTool": "You can specify custom path to 7z utility. For example, \"C:\\7z\\7z.exe\" on Windows and \"/usr/local/bin/7z\" on MacOS/Ubuntu.", + "loc.messages.ExtractDirFailedinFindFiles": "Specified archive: %s can not be extracted because it is a directory.", + "loc.messages.ExtractNotFileFailed": "Specified archive: %s can not be extracted because it is not a file.", + "loc.messages.ExtractNotAccessibleFile": "Specified archive: %s can not be extracted because it can not be accessed: %s", + "loc.messages.SearchInDir": "Searching for: %s under directory: %s", + "loc.messages.SearchNonExistDir": "Search failed because the specified search directory: %s does not exist.", + "loc.messages.SearchNonDir": "Search failed because the specified search directory: %s is not a directory.", + "loc.messages.NoSearchPatternPath": "No path specified for search pattern: %s defaulting to: %s", + "loc.messages.ResolveRelativePath": "Relative file path: %s resolving to: %s", + "loc.messages.UnzipExtractFile": "Extracting file: %s", + "loc.messages.SevenZipExtractFile": "Extracting file: %s", + "loc.messages.TarExtractFile": "Extracting file: %s", + "loc.messages.ExtractFileFailedMsg": "Extraction failed for file: %s \ncode: %d \nstdout: %s \nstderr: %s \nerror: %s;", + "loc.messages.ExtractNonExistFile": "Extraction failed for file: %s because it does not exist.", + "loc.messages.ExtractDirFailed": "Extraction failed for file: %s because it is a directory.", + "loc.messages.CreateTempDir": "Creating temp folder: %s to decompress: %s", + "loc.messages.TempDir": "tempFolder = %s", + "loc.messages.DecompressedTempTar": "Decompressed temporary tar from: %s to: %s", + "loc.messages.RemoveTempDir": "Removing temp folder: %s", + "loc.messages.ExtractFailedCannotCreate": "Extraction failed for file: %s because temporary location could not be created: %s", + "loc.messages.NoFilesFound": "No archives were found using specified file patterns", + "loc.messages.FoundFiles": "Found: %d files to extract:", + "loc.messages.CleanDestDir": "Cleaning destination folder before extraction: %s", + "loc.messages.CreateDestDir": "Creating destination folder: %s", + "loc.messages.SucceedMsg": "Successfully extracted all files." +} \ No newline at end of file diff --git a/_generated/ExtractFilesV1/Strings/resources.resjson/es-ES/resources.resjson b/_generated/ExtractFilesV1/Strings/resources.resjson/es-ES/resources.resjson new file mode 100644 index 000000000000..eacd7390f0f5 --- /dev/null +++ b/_generated/ExtractFilesV1/Strings/resources.resjson/es-ES/resources.resjson @@ -0,0 +1,40 @@ +{ + "loc.friendlyName": "Extraer archivos", + "loc.helpMarkDown": "[Obtener más información acerca de esta tarea](https://go.microsoft.com/fwlink/?LinkId=800269)", + "loc.description": "Extrae una gran variedad de archivos comprimidos y de almacenamiento, como .7z, .rar, .tar.gz y .zip.", + "loc.instanceNameFormat": "Extraer archivos $(message)", + "loc.input.label.archiveFilePatterns": "Patrones de archivo de almacenamiento", + "loc.input.help.archiveFilePatterns": "Rutas de acceso de archivo o patrones de los archivos de almacenamiento que se deben extraer. Admite varias líneas de patrones de minimatch patterns. [Más información](https://go.microsoft.com/fwlink/?LinkId=800269)", + "loc.input.label.destinationFolder": "Carpeta de destino", + "loc.input.help.destinationFolder": "Carpeta de destino donde deben extraerse los archivos de almacenamiento. Use [variables](https://go.microsoft.com/fwlink/?LinkID=550988) si los archivos no están en el repositorio. Ejemplo: $(agent.builddirectory)", + "loc.input.label.cleanDestinationFolder": "Limpiar la carpeta de destino antes de la extracción", + "loc.input.help.cleanDestinationFolder": "Seleccione esta opción para limpiar el directorio de destino antes de extraer en él el contenido del archivo de almacenamiento.", + "loc.input.label.overwriteExistingFiles": "Sobrescribir los archivos existentes", + "loc.input.help.overwriteExistingFiles": "Seleccione esta opción para sobrescribir los archivos existentes en el directorio de destino.", + "loc.input.label.pathToSevenZipTool": "Ruta de acceso a la utilidad 7z", + "loc.input.help.pathToSevenZipTool": "Puede especificar una ruta de acceso personalizada para la utilidad 7z. Por ejemplo: \"C:\\7z\\7z.exe\" en Windows y \"/usr/local/bin/7z\" en MacOS/Ubuntu.", + "loc.messages.ExtractDirFailedinFindFiles": "El archivo especificado: %s no se puede extraer porque es un directorio.", + "loc.messages.ExtractNotFileFailed": "El archivo especificado: %s no se puede extraer porque no es un archivo.", + "loc.messages.ExtractNotAccessibleFile": "El archivo especificado: %s no se puede extraer porque no es posible tener acceso a él: %s", + "loc.messages.SearchInDir": "Buscando: %s en el directorio: %s", + "loc.messages.SearchNonExistDir": "Error en la búsqueda porque el directorio de búsqueda especificado: %s no existe.", + "loc.messages.SearchNonDir": "Error en la búsqueda porque el directorio de búsqueda especificado: %s no es un directorio.", + "loc.messages.NoSearchPatternPath": "No se especificó ruta de acceso para el patrón de búsqueda: %s y se estableció de manera predeterminada en: %s", + "loc.messages.ResolveRelativePath": "Ruta de acceso relativa a archivo: %s se resuelve en: %s", + "loc.messages.UnzipExtractFile": "Extrayendo archivo: %s", + "loc.messages.SevenZipExtractFile": "Extrayendo archivo: %s", + "loc.messages.TarExtractFile": "Extrayendo archivo: %s", + "loc.messages.ExtractFileFailedMsg": "Error al extraer el archivo: %s \nCódigo: %d \nStdOut: %s \nStdErr: %s \nError: %s;", + "loc.messages.ExtractNonExistFile": "Error al extraer el archivo: %s porque no existe.", + "loc.messages.ExtractDirFailed": "Error al extraer el archivo: %s porque es un directorio.", + "loc.messages.CreateTempDir": "Creando la carpeta temporal: %s para descomprimir: %s", + "loc.messages.TempDir": "tempFolder = %s", + "loc.messages.DecompressedTempTar": "Archivo tar temporal descomprimido de: %s a: %s", + "loc.messages.RemoveTempDir": "Quitando la carpeta temporal: %s", + "loc.messages.ExtractFailedCannotCreate": "Error al extraer el archivo: %s porque no se pudo crear la ubicación temporal: %s", + "loc.messages.NoFilesFound": "No se encontró ningún archivo con los patrones de archivo especificados.", + "loc.messages.FoundFiles": "Se encontraron: %d archivos para extraer:", + "loc.messages.CleanDestDir": "Limpiando la carpeta de destino antes de la extracción: %s", + "loc.messages.CreateDestDir": "Creando la carpeta de destino: %s", + "loc.messages.SucceedMsg": "Todos los archivos se extrajeron correctamente." +} \ No newline at end of file diff --git a/_generated/ExtractFilesV1/Strings/resources.resjson/fr-FR/resources.resjson b/_generated/ExtractFilesV1/Strings/resources.resjson/fr-FR/resources.resjson new file mode 100644 index 000000000000..fa81c04c0889 --- /dev/null +++ b/_generated/ExtractFilesV1/Strings/resources.resjson/fr-FR/resources.resjson @@ -0,0 +1,40 @@ +{ + "loc.friendlyName": "Extraire des fichiers", + "loc.helpMarkDown": "[En savoir plus sur cette tâche](https://go.microsoft.com/fwlink/?LinkId=800269)", + "loc.description": "Extrayez divers fichiers d'archives et fichiers de compression tels que .7z, .rar, .tar.gz et .zip", + "loc.instanceNameFormat": "Extraire les fichiers $(message)", + "loc.input.label.archiveFilePatterns": "Archiver les modèles de fichiers", + "loc.input.help.archiveFilePatterns": "Chemins de fichiers ou modèles des fichiers d'archives à extraire. Prend en charge plusieurs lignes de modèles minimatch. [Plus d'informations](https://go.microsoft.com/fwlink/?LinkId=800269)", + "loc.input.label.destinationFolder": "Dossier de destination", + "loc.input.help.destinationFolder": "Dossier de destination dans lequel les fichiers d'archives doivent être extraits. Utilisez des [variables](https://go.microsoft.com/fwlink/?LinkID=550988), si les fichiers ne sont pas dans le dépôt. Exemple : $(agent.builddirectory)", + "loc.input.label.cleanDestinationFolder": "Nettoyer le dossier de destination avant l'extraction", + "loc.input.help.cleanDestinationFolder": "Sélectionnez cette option pour nettoyer le répertoire de destination avant d'y extraire le contenu d'archive.", + "loc.input.label.overwriteExistingFiles": "Remplacer les fichiers existants", + "loc.input.help.overwriteExistingFiles": "Sélectionnez cette option pour remplacer les fichiers existants dans le répertoire de destination.", + "loc.input.label.pathToSevenZipTool": "Chemin d’accès à l’utilitaire 7z", + "loc.input.help.pathToSevenZipTool": "Vous pouvez spécifier un chemin personnalisé pour l’utilitaire 7z. Par exemple, « C:\\7z\\7z.exe » sur Windows et « /usr/local/bin/7z » sur MacOS/Ugrouptu.", + "loc.messages.ExtractDirFailedinFindFiles": "Archive spécifiée : %s ne peut pas être extrait, car il s'agit d'un répertoire.", + "loc.messages.ExtractNotFileFailed": "L'archive spécifiée %s ne peut pas être extraite, car il ne s'agit pas d'un fichier.", + "loc.messages.ExtractNotAccessibleFile": "L'archive spécifiée %s ne peut pas être extraite, car elle n'est pas accessible : %s", + "loc.messages.SearchInDir": "Recherche de %s sous le répertoire %s", + "loc.messages.SearchNonExistDir": "La recherche a échoué, car le répertoire de recherche spécifié %s n'existe pas.", + "loc.messages.SearchNonDir": "La recherche a échoué, car le répertoire de recherche spécifié %s n'est pas un répertoire.", + "loc.messages.NoSearchPatternPath": "Aucun chemin spécifié pour le modèle de recherche : %s. Chemin par défaut : %s", + "loc.messages.ResolveRelativePath": "Chemin relatif du fichier %s résolu en %s", + "loc.messages.UnzipExtractFile": "Extraction du fichier : %s", + "loc.messages.SevenZipExtractFile": "Extraction du fichier : %s", + "loc.messages.TarExtractFile": "Extraction du fichier : %s", + "loc.messages.ExtractFileFailedMsg": "Échec de l'extraction pour le fichier %s \nCode : %d \nstdout : %s \nstderr : %s \nErreur : %s;", + "loc.messages.ExtractNonExistFile": "Échec de l'extraction du fichier %s , car il n'existe pas.", + "loc.messages.ExtractDirFailed": "Échec de l'extraction du fichier %s, car il s'agit d'un répertoire.", + "loc.messages.CreateTempDir": "Création du dossier temporaire %s à décompresser : %s", + "loc.messages.TempDir": "tempFolder = %s", + "loc.messages.DecompressedTempTar": "Fichier temporaire .tar décompressé de %s à %s", + "loc.messages.RemoveTempDir": "Suppression du fichier temporaire : %s", + "loc.messages.ExtractFailedCannotCreate": "Échec de l'extraction du fichier %s, car l'emplacement temporaire n'a pas pu être créé : %s", + "loc.messages.NoFilesFound": "Aucune archive n'a été trouvée à l'aide des modèles de fichier spécifiés", + "loc.messages.FoundFiles": "%d fichiers à extraire trouvés :", + "loc.messages.CleanDestDir": "Nettoyage du dossier de destination avant l'extraction : %s", + "loc.messages.CreateDestDir": "Création du dossier de destination : %s", + "loc.messages.SucceedMsg": "Extraction réussie de tous les fichiers." +} \ No newline at end of file diff --git a/_generated/ExtractFilesV1/Strings/resources.resjson/it-IT/resources.resjson b/_generated/ExtractFilesV1/Strings/resources.resjson/it-IT/resources.resjson new file mode 100644 index 000000000000..54dd4554350f --- /dev/null +++ b/_generated/ExtractFilesV1/Strings/resources.resjson/it-IT/resources.resjson @@ -0,0 +1,40 @@ +{ + "loc.friendlyName": "Estrai file", + "loc.helpMarkDown": "[Altre informazioni su questa attività](https://go.microsoft.com/fwlink/?LinkId=800269)", + "loc.description": "Consente di estrarre una vasta gamma di file di archivio e di compressione, come .7z, .rar, .tar.gz e .zip", + "loc.instanceNameFormat": "Estrai file $(message)", + "loc.input.label.archiveFilePatterns": "Criteri dei file di archivio", + "loc.input.help.archiveFilePatterns": "Criteri o percorsi dei file di archivio da estrarre. Sono supportate più righe di criteri di corrispondenza minima. [Altre informazioni](https://go.microsoft.com/fwlink/?LinkId=800269)", + "loc.input.label.destinationFolder": "Cartella di destinazione", + "loc.input.help.destinationFolder": "Cartella di destinazione in cui devono essere estratti i file di archivio. Usare [variabili](https://go.microsoft.com/fwlink/?LinkID=550988) se i file non sono presenti nel repository. Esempio: $(agent.builddirectory)", + "loc.input.label.cleanDestinationFolder": "Pulisci la cartella di destinazione prima dell'estrazione", + "loc.input.help.cleanDestinationFolder": "Selezionare questa opzione per pulire la directory di destinazione prima di estrarvi il contenuto dell'archivio.", + "loc.input.label.overwriteExistingFiles": "Sovrascrivi file esistenti", + "loc.input.help.overwriteExistingFiles": "Selezionare questa opzione per sovrascrivere i file esistenti nella directory di destinazione.", + "loc.input.label.pathToSevenZipTool": "Percorso dell'utilità 7z", + "loc.input.help.pathToSevenZipTool": "È possibile specificare un percorso personalizzato per l'utilità 7z. Ad esempio, \"C:\\7z\\7z.exe\" on Windows and \"/usr/local/bin/7z\" in MacOS/Ubuntu.", + "loc.messages.ExtractDirFailedinFindFiles": "Non è possibile estrarre l'archivio specificato %s perché è una directory.", + "loc.messages.ExtractNotFileFailed": "Non è possibile estrarre l'archivio specificato %s perché non è un file.", + "loc.messages.ExtractNotAccessibleFile": "Non è possibile estrarre l'archivio specificato %s perché non è accessibile: %s", + "loc.messages.SearchInDir": "Ricerca di %s nella directory %s", + "loc.messages.SearchNonExistDir": "La ricerca non è riuscita perché la directory di ricerca specificata %s non esiste.", + "loc.messages.SearchNonDir": "La ricerca non è riuscita perché la directory di ricerca specificata %s non è una directory.", + "loc.messages.NoSearchPatternPath": "Non è stato specificato alcun percorso per i criteri di ricerca: %s. Per impostazione predefinita verrà usato %s", + "loc.messages.ResolveRelativePath": "Risoluzione del percorso relativo del file %s in %s", + "loc.messages.UnzipExtractFile": "Estrazione del file: %s", + "loc.messages.SevenZipExtractFile": "Estrazione del file: %s", + "loc.messages.TarExtractFile": "Estrazione del file: %s", + "loc.messages.ExtractFileFailedMsg": "L'estrazione del file %s non è riuscita\nCodice: %d \nStdout: %s \nStderr: %s \nErrore: %s;", + "loc.messages.ExtractNonExistFile": "L'estrazione del file %s non è riuscita perché non esiste.", + "loc.messages.ExtractDirFailed": "L'estrazione del file %s non è riuscita perché è una directory.", + "loc.messages.CreateTempDir": "Creazione della cartella temporanea %s per la decompressione di %s", + "loc.messages.TempDir": "tempFolder = %s", + "loc.messages.DecompressedTempTar": "Il file TAR temporaneo è stato decompresso da %s in %s", + "loc.messages.RemoveTempDir": "Rimozione della cartella temporanea: %s", + "loc.messages.ExtractFailedCannotCreate": "L'estrazione del file %s perché non è stato possibile trovare il percorso temporaneo: %s", + "loc.messages.NoFilesFound": "Non è stato trovato alcun archivio usando i criteri dei file specificati", + "loc.messages.FoundFiles": "Sono stati trovati %d file da estrarre:", + "loc.messages.CleanDestDir": "Pulizia della cartella di destinazione prima dell'estrazione: %s", + "loc.messages.CreateDestDir": "Creazione della cartella di destinazione: %s", + "loc.messages.SucceedMsg": "Sono stati estratti tutti i file." +} \ No newline at end of file diff --git a/_generated/ExtractFilesV1/Strings/resources.resjson/ja-JP/resources.resjson b/_generated/ExtractFilesV1/Strings/resources.resjson/ja-JP/resources.resjson new file mode 100644 index 000000000000..755c1f24b527 --- /dev/null +++ b/_generated/ExtractFilesV1/Strings/resources.resjson/ja-JP/resources.resjson @@ -0,0 +1,40 @@ +{ + "loc.friendlyName": "ファイルの抽出", + "loc.helpMarkDown": "[このタスクの詳細を表示](https://go.microsoft.com/fwlink/?LinkId=800269)", + "loc.description": ".7z、.rar、.tar.gz、.zip などのさまざまなアーカイブ ファイルと圧縮ファイルを抽出します", + "loc.instanceNameFormat": "ファイルの抽出 $(message)", + "loc.input.label.archiveFilePatterns": "アーカイブ ファイルのパターン", + "loc.input.help.archiveFilePatterns": "抽出するアーカイブ ファイルのファイル パスまたはパターン。複数行の minimatch パターンをサポートします。[詳細情報](https://go.microsoft.com/fwlink/?LinkId=800269)", + "loc.input.label.destinationFolder": "宛先フォルダー", + "loc.input.help.destinationFolder": "アーカイブ ファイルを抽出する宛先フォルダー。ファイルがリポジトリにない場合には [variables](https://go.microsoft.com/fwlink/?LinkID=550988) を使用します。例: $(agent.builddirectory)", + "loc.input.label.cleanDestinationFolder": "抽出前に宛先フォルダーを空にする", + "loc.input.help.cleanDestinationFolder": "アーカイブの内容を抽出する前に宛先ディレクトリを空にする場合、このオプションを選択します。", + "loc.input.label.overwriteExistingFiles": "既存のファイルを上書きする", + "loc.input.help.overwriteExistingFiles": "宛先ディレクトリ内の既存のファイルを上書きするには、このオプションを選択します。", + "loc.input.label.pathToSevenZipTool": ".7z ユーティリティへのパス", + "loc.input.help.pathToSevenZipTool": ".7z ユーティリティへのカスタムパスを指定できます。例: Windows 上の \"C:\\7z\\7z.exe\"、MacOS/Ubuntu 上の \"/usr/local/bin/7z\"。", + "loc.messages.ExtractDirFailedinFindFiles": "指定されたアーカイブ %s はディレクトリなので抽出できません。", + "loc.messages.ExtractNotFileFailed": "指定されたアーカイブ %s は、ファイルではないので抽出できません。", + "loc.messages.ExtractNotAccessibleFile": "指定されたアーカイブ %s は、アクセスできないので抽出できません: %s", + "loc.messages.SearchInDir": "次のディレクトリ下で %s を検索しています: %s", + "loc.messages.SearchNonExistDir": "指定された検索ディレクトリ %s がないので、検索できませんでした。", + "loc.messages.SearchNonDir": "指定された検索ディレクトリ %s はディレクトリではないので、検索できませんでした。", + "loc.messages.NoSearchPatternPath": "次を既定とする検索パターン %s に関するパスが指定されていません: %s", + "loc.messages.ResolveRelativePath": "相対ファイル パス %s の解決先: %s", + "loc.messages.UnzipExtractFile": "次のファイルを抽出しています: %s", + "loc.messages.SevenZipExtractFile": "次のファイルを抽出しています: %s", + "loc.messages.TarExtractFile": "次のファイルを抽出しています: %s", + "loc.messages.ExtractFileFailedMsg": "次のファイルを抽出できませんでした: %s \ncode: %d \nstdout: %s \nstderr: %s \nerror: %s;", + "loc.messages.ExtractNonExistFile": "ファイル %s がないので抽出できませんでした。", + "loc.messages.ExtractDirFailed": "ファイル: %s はディレクトリなので抽出できませんでした。", + "loc.messages.CreateTempDir": "展開するための一時フォルダー %s を作成しています: %s", + "loc.messages.TempDir": "tempFolder = %s", + "loc.messages.DecompressedTempTar": "一時 tar を %s から %s に展開しました", + "loc.messages.RemoveTempDir": "一時フォルダーを削除しています: %s", + "loc.messages.ExtractFailedCannotCreate": "一時保存場所を作成できなかったので、ファイル %s を抽出できませんでした: %s", + "loc.messages.NoFilesFound": "指定されたファイル パターンを使用しているアーカイブは見つかりませんでした", + "loc.messages.FoundFiles": "抽出対象の %d 個のファイルが見つかりました:", + "loc.messages.CleanDestDir": "抽出前に宛先フォルダーをクリーニングしています: %s", + "loc.messages.CreateDestDir": "宛先フォルダーを作成しています: %s", + "loc.messages.SucceedMsg": "すべてのファイルが正常に抽出されました。" +} \ No newline at end of file diff --git a/_generated/ExtractFilesV1/Strings/resources.resjson/ko-KR/resources.resjson b/_generated/ExtractFilesV1/Strings/resources.resjson/ko-KR/resources.resjson new file mode 100644 index 000000000000..247f5ce1a464 --- /dev/null +++ b/_generated/ExtractFilesV1/Strings/resources.resjson/ko-KR/resources.resjson @@ -0,0 +1,40 @@ +{ + "loc.friendlyName": "파일 추출", + "loc.helpMarkDown": "[이 작업에 대한 자세한 정보](https://go.microsoft.com/fwlink/?LinkId=800269)", + "loc.description": ".7z, .rar, .tar.gz, .zip 등의 다양한 보관 파일 및 압축 파일을 추출합니다.", + "loc.instanceNameFormat": "파일 풀기 $(message)", + "loc.input.label.archiveFilePatterns": "보관 파일 패턴", + "loc.input.help.archiveFilePatterns": "풀고자 하는 보관 파일의 파일 경로 또는 패턴입니다. 여러 줄로 된 minimatch 패턴을 지원합니다. [자세한 정보](https://go.microsoft.com/fwlink/?LinkId=800269)", + "loc.input.label.destinationFolder": "대상 폴더", + "loc.input.help.destinationFolder": "보관 파일을 풀게 될 대상 폴더입니다. 파일이 리포에 없으면 [변수](https://go.microsoft.com/fwlink/?LinkID=550988)를 사용하세요. 예: $(agent.builddirectory)", + "loc.input.label.cleanDestinationFolder": "풀기 전에 대상 폴더 정리", + "loc.input.help.cleanDestinationFolder": "보관 파일 콘텐츠를 대상 디렉터리에 풀기 전에 대상 디렉터리를 정리하려면 이 옵션을 선택합니다.", + "loc.input.label.overwriteExistingFiles": "기존 파일 덮어쓰기", + "loc.input.help.overwriteExistingFiles": "대상 디렉터리에 있는 기존 파일을 덮어쓰려면 이 옵션을 선택합니다.", + "loc.input.label.pathToSevenZipTool": "7z 유틸리티 경로", + "loc.input.help.pathToSevenZipTool": "7z 유틸리티에 대한 사용자 지정 경로를 지정할 수 있습니다. 예를 들면, Windows의 \"C:\\7z\\7z.exe\" 및 MacOS/Ubuntu의 “/usr/local/bin/7z\"입니다.", + "loc.messages.ExtractDirFailedinFindFiles": "지정된 보관 파일 %s은(는) 디렉터리이므로 압축할 수 없습니다.", + "loc.messages.ExtractNotFileFailed": "지정한 보관 파일 %s은(는) 파일이 아니므로 압축할 수 없습니다.", + "loc.messages.ExtractNotAccessibleFile": "지정한 보관 파일 %s은(는) 액세스할 수 없으므로 압축할 수 없습니다. %s", + "loc.messages.SearchInDir": "%s을(를) %s 디렉터리에서 검색하는 중입니다.", + "loc.messages.SearchNonExistDir": "지정한 검색 디렉터리 %s이(가) 없어서 검색하지 못했습니다.", + "loc.messages.SearchNonDir": "지정한 검색 디렉터리 %s이(가) 디렉터리가 아니어서 검색하지 못했습니다.", + "loc.messages.NoSearchPatternPath": "%s 검색 패턴의 경로를 지정하지 않아서 기본 설정 %s이(가) 사용됩니다.", + "loc.messages.ResolveRelativePath": "상대 파일 경로 %s을(를) %s(으)로 확인하는 중입니다.", + "loc.messages.UnzipExtractFile": "파일 압축을 푸는 중: %s", + "loc.messages.SevenZipExtractFile": "파일 압축을 푸는 중: %s", + "loc.messages.TarExtractFile": "파일 압축을 푸는 중: %s", + "loc.messages.ExtractFileFailedMsg": "%s 파일을 압축하지 못했습니다. \n코드: %d \nstdout: %s \nstderr: %s \n오류: %s;", + "loc.messages.ExtractNonExistFile": "%s 파일은 없으므로 압축하지 못했습니다.", + "loc.messages.ExtractDirFailed": "%s 파일은 디렉터리이므로 압축을 풀지 못했습니다.", + "loc.messages.CreateTempDir": "압축을 풀 임시 폴더 %s을(를) 만드는 중입니다. %s", + "loc.messages.TempDir": "tempFolder = %s", + "loc.messages.DecompressedTempTar": "%s에 있는 임시 tar 파일의 압축을 %s(으)로 풀었습니다.", + "loc.messages.RemoveTempDir": "임시 폴더를 제거하는 중입니다. %s", + "loc.messages.ExtractFailedCannotCreate": "임시 위치를 만들 수 없으므로 %s 파일을 압축하지 못했습니다. %s", + "loc.messages.NoFilesFound": "지정된 파일 패턴을 사용하여 보관 파일을 찾을 수 없음", + "loc.messages.FoundFiles": "압축할 %d개 파일을 찾았습니다.", + "loc.messages.CleanDestDir": "압축 전에 대상 폴더를 지우는 중입니다. %s", + "loc.messages.CreateDestDir": "대상 폴더를 지우는 중입니다. %s", + "loc.messages.SucceedMsg": "모든 파일을 압축했습니다." +} \ No newline at end of file diff --git a/_generated/ExtractFilesV1/Strings/resources.resjson/ru-RU/resources.resjson b/_generated/ExtractFilesV1/Strings/resources.resjson/ru-RU/resources.resjson new file mode 100644 index 000000000000..61554982c421 --- /dev/null +++ b/_generated/ExtractFilesV1/Strings/resources.resjson/ru-RU/resources.resjson @@ -0,0 +1,40 @@ +{ + "loc.friendlyName": "Извлечь файлы", + "loc.helpMarkDown": "[См. дополнительные сведения об этой задаче](https://go.microsoft.com/fwlink/?LinkId=800269)", + "loc.description": "Извлечение различных файлов архивов и сжатых файлов, таких как 7Z, RAR, TAR.GZ и ZIP", + "loc.instanceNameFormat": "Извлечь файлы $(message)", + "loc.input.label.archiveFilePatterns": "Шаблоны файлов архивов", + "loc.input.help.archiveFilePatterns": "Пути к файлам или шаблоны файлов архивов для извлечения. Поддерживает несколько строк шаблонов minimatch. [Подробнее...](https://go.microsoft.com/fwlink/?LinkId=800269)", + "loc.input.label.destinationFolder": "Папка назначения", + "loc.input.help.destinationFolder": "Папка назначения, в которую будут извлечены файлы архива. Если в репозитории нет файлов, используйте [переменные](https://go.microsoft.com/fwlink/?LinkID=550988). Пример: $(agent.builddirectory)", + "loc.input.label.cleanDestinationFolder": "Очистить папку назначения перед извлечением", + "loc.input.help.cleanDestinationFolder": "Выберите этот параметр, чтобы очистить каталог назначения до извлечения в него содержимого архива.", + "loc.input.label.overwriteExistingFiles": "Переписать существующие файлы", + "loc.input.help.overwriteExistingFiles": "Выберите этот параметр, чтобы перезаписать существующие файлы в целевом каталоге.", + "loc.input.label.pathToSevenZipTool": "Путь к служебной программе 7z", + "loc.input.help.pathToSevenZipTool": "Вы можете указать пользовательский путь к служебной программе 7z. Например, \"C:\\7z\\7z.exe\" в Windows и \"/usr/local/bin/7z\" в MacOS/Ubuntu.", + "loc.messages.ExtractDirFailedinFindFiles": "Указанный архив %s невозможно извлечь, так как он является каталогом.", + "loc.messages.ExtractNotFileFailed": "Указанный архив %s невозможно извлечь, так как он не является файлом.", + "loc.messages.ExtractNotAccessibleFile": "Указанный архив %s невозможно извлечь, так как он недоступен: %s", + "loc.messages.SearchInDir": "Поиск %s в каталоге: %s", + "loc.messages.SearchNonExistDir": "Произошел сбой поиска; указанный каталог поиска не существует: %s", + "loc.messages.SearchNonDir": "Произошел сбой поиска; указанный каталог поиска не является каталогом: %s", + "loc.messages.NoSearchPatternPath": "Не указан путь для шаблона поиска: %s, по умолчанию используется %s", + "loc.messages.ResolveRelativePath": "Относительный путь файла: %s разрешается в: %s", + "loc.messages.UnzipExtractFile": "Извлекается файл: %s", + "loc.messages.SevenZipExtractFile": "Извлекается файл: %s", + "loc.messages.TarExtractFile": "Извлекается файл: %s", + "loc.messages.ExtractFileFailedMsg": "Сбой извлечения файла: %s \ncode: %d \nstdout: %s \nstderr: %s \nerror: %s;", + "loc.messages.ExtractNonExistFile": "Произошел сбой извлечения файла: %s, так как он не существует.", + "loc.messages.ExtractDirFailed": "Произошел сбой извлечения файла: %s, так как он является каталогом.", + "loc.messages.CreateTempDir": "Создание временной папки: %s для распаковки: %s", + "loc.messages.TempDir": "tempFolder = %s", + "loc.messages.DecompressedTempTar": "Распакован временный TAR-файл из: %s в: %s", + "loc.messages.RemoveTempDir": "Удаление временной папки: %s", + "loc.messages.ExtractFailedCannotCreate": "Произошел сбой извлечения файла: %s, так как не удалось создать временное расположение: %s", + "loc.messages.NoFilesFound": "Архивы для указанных шаблонов файлов не найдены.", + "loc.messages.FoundFiles": "Найдены файлы для извлечения (%d):", + "loc.messages.CleanDestDir": "Очистка папки назначения перед извлечением: %s", + "loc.messages.CreateDestDir": "Создание папки назначения: %s", + "loc.messages.SucceedMsg": "Все файлы успешно извлечены." +} \ No newline at end of file diff --git a/_generated/ExtractFilesV1/Strings/resources.resjson/zh-CN/resources.resjson b/_generated/ExtractFilesV1/Strings/resources.resjson/zh-CN/resources.resjson new file mode 100644 index 000000000000..5fd054047ef2 --- /dev/null +++ b/_generated/ExtractFilesV1/Strings/resources.resjson/zh-CN/resources.resjson @@ -0,0 +1,40 @@ +{ + "loc.friendlyName": "提取文件", + "loc.helpMarkDown": "[详细了解此任务](https://go.microsoft.com/fwlink/?LinkId=800269)", + "loc.description": "提取各种存档和压缩文件,例如 .7z、.rar、.tar.gz 和 .zip", + "loc.instanceNameFormat": "提取文件 $(message)", + "loc.input.label.archiveFilePatterns": "存档文件模式", + "loc.input.help.archiveFilePatterns": "要提取的存档文件的文件路径或模式。支持多行最小匹配模式。[详细信息](https://go.microsoft.com/fwlink/?LinkId=800269)", + "loc.input.label.destinationFolder": "目标文件夹", + "loc.input.help.destinationFolder": "应将存档文件提取到的目标文件夹。如果文件不位于存储库中,请使用[变量](https://go.microsoft.com/fwlink/?LinkID=550988)。示例: $(agent.builddirectory)", + "loc.input.label.cleanDestinationFolder": "在提取前清理目标文件夹", + "loc.input.help.cleanDestinationFolder": "选择此选项,在将存档文件内容提取到目标目录之前清除该目录。", + "loc.input.label.overwriteExistingFiles": "覆盖现有文件", + "loc.input.help.overwriteExistingFiles": "选择此选项可覆盖目标目录中的现有文件。", + "loc.input.label.pathToSevenZipTool": "指向 7z 实用工具的路径", + "loc.input.help.pathToSevenZipTool": "你可以指定指向 7z 实用工具的自定义路径。例如,Windows 上的 “C: \\7z\\7z.exe” 和 MacOS/Ubuntu 上的 “/usr/local/bin/7z”。", + "loc.messages.ExtractDirFailedinFindFiles": "无法提取指定的存档 %s,因为它是一个目录。", + "loc.messages.ExtractNotFileFailed": "无法提取指定的存档 %s,因为它不是文件。", + "loc.messages.ExtractNotAccessibleFile": "无法提取指定的存档 %s,因为无法访问它: %s", + "loc.messages.SearchInDir": "正在搜索: %s (位于目录 %s 中)", + "loc.messages.SearchNonExistDir": "搜索失败,因为指定的搜索目录 %s 不存在。", + "loc.messages.SearchNonDir": "搜索失败,因为指定的搜索目录 %s 不是一个目录。", + "loc.messages.NoSearchPatternPath": "搜索模式 %s 未指定任何路径,默认值为: %s", + "loc.messages.ResolveRelativePath": "相对文件路径: %s 解析为: %s", + "loc.messages.UnzipExtractFile": "正在提取文件: %s", + "loc.messages.SevenZipExtractFile": "正在提取文件: %s", + "loc.messages.TarExtractFile": "正在提取文件: %s", + "loc.messages.ExtractFileFailedMsg": "文件 %s 提取失败 \n代码: %d \nStdOut: %s \nstderr: %s \n错误: %s;", + "loc.messages.ExtractNonExistFile": "文件 %s 提取失败,因为它不存在。", + "loc.messages.ExtractDirFailed": "文件 %s 提取失败,因为该文件是一个目录。", + "loc.messages.CreateTempDir": "创建临时文件夹 %s 以解压缩 %s", + "loc.messages.TempDir": "tempFolder = %s", + "loc.messages.DecompressedTempTar": "已将临时 tar 从 %s 解压缩到 %s", + "loc.messages.RemoveTempDir": "正在删除临时文件夹: %s", + "loc.messages.ExtractFailedCannotCreate": "文件 %s 提取失败,因为无法创建临时位置 %s", + "loc.messages.NoFilesFound": "找不到使用指定文件模式的存档", + "loc.messages.FoundFiles": "发现 %d 个要提取的文件:", + "loc.messages.CleanDestDir": "提取前需清理目标文件夹: %s", + "loc.messages.CreateDestDir": "创建目标文件夹: %s", + "loc.messages.SucceedMsg": "已成功提取所有文件。" +} \ No newline at end of file diff --git a/_generated/ExtractFilesV1/Strings/resources.resjson/zh-TW/resources.resjson b/_generated/ExtractFilesV1/Strings/resources.resjson/zh-TW/resources.resjson new file mode 100644 index 000000000000..99d0ef3cd9c7 --- /dev/null +++ b/_generated/ExtractFilesV1/Strings/resources.resjson/zh-TW/resources.resjson @@ -0,0 +1,40 @@ +{ + "loc.friendlyName": "解壓縮檔案", + "loc.helpMarkDown": "[深入了解此工作](https://go.microsoft.com/fwlink/?LinkId=800269)", + "loc.description": "解壓縮各種封存檔與壓縮檔,例如 .7z、.rar、.tar.gz 及 .zip", + "loc.instanceNameFormat": "解壓縮檔案 $(message)", + "loc.input.label.archiveFilePatterns": "封存檔樣式", + "loc.input.help.archiveFilePatterns": "要解壓縮之封存檔的檔案路徑或樣式。支援多行的 minimatch 樣式。[詳細資訊](https://go.microsoft.com/fwlink/?LinkId=800269)", + "loc.input.label.destinationFolder": "目的資料夾", + "loc.input.help.destinationFolder": "用以解壓縮後之封存檔的目的資料夾。若檔案不在存放庫中,請使用 [變數](https://go.microsoft.com/fwlink/?LinkID=550988)。例如: $(agent.builddirectory)", + "loc.input.label.cleanDestinationFolder": "清理目的地資料後再解壓縮", + "loc.input.help.cleanDestinationFolder": "選取此選項可先清理目的地目錄,然後再將封存檔內容解壓縮到其中。", + "loc.input.label.overwriteExistingFiles": "覆寫現有的檔案", + "loc.input.help.overwriteExistingFiles": "選取此選項可覆寫目的地目錄中的現有檔案。", + "loc.input.label.pathToSevenZipTool": "7z 公用程式的路徑", + "loc.input.help.pathToSevenZipTool": "您可以指定 7z 公用程式的自訂路徑。例如,在 Windows 上為 \"C:\\7z\\7z.exe\",在 MacOS/Ubuntu 上為 \"/usr/local/bin/7z\"。", + "loc.messages.ExtractDirFailedinFindFiles": "因為指定的封存 %s 為目錄,所以解壓縮失敗。", + "loc.messages.ExtractNotFileFailed": "因為指定的封存 %s 不是檔案,所以無法予以解壓縮。", + "loc.messages.ExtractNotAccessibleFile": "因為無法存取指定的封存 %s,所以無法予以解壓縮: %s", + "loc.messages.SearchInDir": "正在搜尋 %s,於目錄 %s 下", + "loc.messages.SearchNonExistDir": "因為指定的搜尋目錄 %s 不存在,所以搜尋失敗。", + "loc.messages.SearchNonDir": "因為指定的搜尋目錄 %s 不是目錄,所以搜尋失敗。", + "loc.messages.NoSearchPatternPath": "搜尋模式 %s 沒有指定的路徑,將預設為: %s", + "loc.messages.ResolveRelativePath": "正在將相對檔案路徑 %s 解析為 %s", + "loc.messages.UnzipExtractFile": "正在解壓縮檔案: %s", + "loc.messages.SevenZipExtractFile": "正在解壓縮檔案: %s", + "loc.messages.TarExtractFile": "正在解壓縮檔案: %s", + "loc.messages.ExtractFileFailedMsg": "檔案 %s 解壓縮失敗\n代碼: %d\nStdOut: %s\nSTDERR: %s\n錯誤: %s;", + "loc.messages.ExtractNonExistFile": "因為檔案 %s 不存在,所以解壓縮失敗。", + "loc.messages.ExtractDirFailed": "因為檔案 %s 為目錄,所以解壓縮失敗。", + "loc.messages.CreateTempDir": "正在建立暫存資料夾 %s 以解壓縮 %s", + "loc.messages.TempDir": "tempFolder = %s", + "loc.messages.DecompressedTempTar": "已將暫存 tar 從 %s 解壓縮至 %s", + "loc.messages.RemoveTempDir": "正在移除暫存資料夾: %s", + "loc.messages.ExtractFailedCannotCreate": "因為無法建立暫存位置,所以檔案 %s 解壓縮失敗: %s", + "loc.messages.NoFilesFound": "使用指定的檔案模式找不到任何封存", + "loc.messages.FoundFiles": "找到 %d 個可解壓縮的檔案:", + "loc.messages.CleanDestDir": "正於擷取前清理目的地資料夾: %s", + "loc.messages.CreateDestDir": "正在建立目的地資料夾: %s", + "loc.messages.SucceedMsg": "已成功解壓縮所有檔案。" +} \ No newline at end of file diff --git a/_generated/ExtractFilesV1/Tests/L0.ts b/_generated/ExtractFilesV1/Tests/L0.ts new file mode 100644 index 000000000000..35a002b1fa0c --- /dev/null +++ b/_generated/ExtractFilesV1/Tests/L0.ts @@ -0,0 +1,171 @@ +import assert = require('assert'); +import path = require('path'); +import * as ttm from 'azure-pipelines-task-lib/mock-test'; + + +describe('ExtractFile Suite', function () { + this.timeout(60000); + + function runValidations(validator: () => void, tr, done) { + try { + validator(); + done(); + } + catch (error) { + console.log("STDERR", tr.stderr); + console.log("STDOUT", tr.stdout); + done(error); + } + } + + it('Successfully extracts a single zip', (done: Mocha.Done) => { + this.timeout(5000); + process.env['archiveFilePatterns'] = 'zip1.zip'; + process.env['overwriteExistingFiles'] = 'true'; + delete process.env['cleanDestinationFolder']; + + let tp: string = path.join(__dirname, 'L0Extract.js'); + let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + runValidations(() => { + assert(tr.stdout.indexOf('extracted zip1') > -1); + }, tr, done); + }); + + it('Successfully extracts multiple zips', (done: Mocha.Done) => { + this.timeout(5000); + process.env['archiveFilePatterns'] = 'zip1.zip\nzip2.zip'; + process.env['overwriteExistingFiles'] = 'true'; + delete process.env['cleanDestinationFolder']; + + let tp: string = path.join(__dirname, 'L0Extract.js'); + let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + runValidations(() => { + assert(tr.stdout.indexOf('extracted zip1') > -1); + assert(tr.stdout.indexOf('extracted zip2') > -1); + }, tr, done); + }); + + it('Successfully extracts a tar', (done: Mocha.Done) => { + this.timeout(5000); + process.env['archiveFilePatterns'] = 'tar.tar'; + process.env['overwriteExistingFiles'] = 'true'; + delete process.env['cleanDestinationFolder']; + + let tp: string = path.join(__dirname, 'L0Extract.js'); + let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + runValidations(() => { + assert(tr.stdout.indexOf('extracted tar') > -1); + }, tr, done); + }); + + it('Successfully cleans destination', (done: Mocha.Done) => { + this.timeout(5000); + process.env['archiveFilePatterns'] = 'zip1.zip'; + process.env['overwriteExistingFiles'] = 'true'; + process.env['cleanDestinationFolder'] = 'true'; + + let tp: string = path.join(__dirname, 'L0Extract.js'); + let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + runValidations(() => { + assert(tr.stdout.indexOf('extracted zip1') > -1); + assert(tr.stdout.indexOf('Removing ' + __dirname) > -1); + }, tr, done); + }); + + it('Successfully overwrites files from zip in output directory', (done: Mocha.Done) => { + this.timeout(5000); + process.env['archiveFilePatterns'] = 'zip1.zip'; + process.env['overwriteExistingFiles'] = 'true'; + delete process.env['cleanDestinationFolder']; + + let tp: string = path.join(__dirname, 'L0Extract.js'); + let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + // run it twice to check files that was created during first run will be overwritten + tr.run(); + tr.run(); + + runValidations(() => { + assert(tr.stdout.indexOf('extracted zip1') > -1); + }, tr, done); + }); + + it('Successfully overwrites files from tar in output directory', (done: Mocha.Done) => { + this.timeout(5000); + process.env['archiveFilePatterns'] = 'tar.tar'; + process.env['overwriteExistingFiles'] = 'true'; + delete process.env['cleanDestinationFolder']; + + let tp: string = path.join(__dirname, 'L0Extract.js'); + let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + // run it twice to check files that was created during first run will be overwritten + tr.run(); + tr.run(); + + runValidations(() => { + assert(tr.stdout.indexOf('extracted tar') > -1); + }, tr, done); + }); + + it('Successfully extracts a 7z', (done: Mocha.Done) => { + this.timeout(5000); + process.env['archiveFilePatterns'] = 'zip3.7z'; + process.env['overwriteExistingFiles'] = 'true'; + delete process.env['cleanDestinationFolder']; + + let tp: string = path.join(__dirname, 'L0Extract.js'); + let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + runValidations(() => { + assert(tr.stdout.indexOf('extracted 7z') > -1); + }, tr, done); + }); + + it('User is able to setup custom path to 7z', (done: Mocha.Done) => { + this.timeout(5000); + process.env['archiveFilePatterns'] = 'zip3.7z'; + process.env['overwriteExistingFiles'] = 'true'; + delete process.env['cleanDestinationFolder']; + process.env['pathToSevenZipTool'] = 'custom/7z/path'; + + let tp: string = path.join(__dirname, 'L07zFromDifferentLocations.js'); + let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + runValidations(() => { + assert(tr.stderr.length == 0, tr.stderr); + }, tr, done); + }); + + it('Default path is used for 7z tool', (done: Mocha.Done) => { + this.timeout(5000); + process.env['archiveFilePatterns'] = 'zip3.7z'; + process.env['overwriteExistingFiles'] = 'true'; + delete process.env['cleanDestinationFolder']; + + let tp: string = path.join(__dirname, 'L07zFromDifferentLocations.js'); + let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + runValidations(() => { + assert(tr.stderr.length == 0, tr.stderr); + }, tr, done); + }); +}); diff --git a/_generated/ExtractFilesV1/Tests/L07zFromDifferentLocations.ts b/_generated/ExtractFilesV1/Tests/L07zFromDifferentLocations.ts new file mode 100644 index 000000000000..140ed31a8b07 --- /dev/null +++ b/_generated/ExtractFilesV1/Tests/L07zFromDifferentLocations.ts @@ -0,0 +1,106 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import fs = require('fs'); +import path = require('path'); +import os = require('os'); + +enum Platform { + Windows = 0, + MacOS = 1, + Linux = 2 +} + +let taskPath = path.join(__dirname, '..', 'extractfilestask.js'); +let tmr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +process.env['SYSTEM_DEFAULTWORKINGDIRECTORY'] = __dirname; + +tmr.setInput('archiveFilePatterns', process.env['archiveFilePatterns']); +tmr.setInput('destinationFolder', __dirname); +tmr.setInput('cleanDestinationFolder', process.env['cleanDestinationFolder']); +tmr.setInput('overwriteExistingFiles', process.env['overwriteExistingFiles']); +tmr.setInput('pathToSevenZipTool', process.env['pathToSevenZipTool']); + +let osType: Platform; +switch (os.type()) { + case 'Linux': + osType = Platform.Linux; + break; + case 'Darwin': + osType = Platform.MacOS; + break; + case 'Windows_NT': + osType = Platform.Windows; + break; + default: + throw Error("Unknown OS type"); +} +const isWindows: boolean = osType == Platform.Windows; + +//Create osType, stats mocks, support not added in this version of task-lib +const tl = require('azure-pipelines-task-lib/mock-task'); +const tlClone = Object.assign({}, tl); +tlClone.getPlatform = function() { + return osType; +}; +tlClone.stats = function(path) { + return fs.statSync(path); +}; +tlClone.exist = function(path) { + // Copied from task-lib + var exist = false; + try { + exist = !!(path && fs.statSync(path) != null); + } catch (err) { + if (err && err.code === 'ENOENT') { + exist = false; + } else { + throw err; + } + } + return exist; +}; +tlClone.rmRF = function(path) { + console.log('Removing ' + path); +}; +tmr.registerMock('azure-pipelines-task-lib/mock-task', tlClone); + +let zipExecutable = path.join(__dirname, '..', '7zip', '7z.exe'); +let sevenZip1Command: string = `${process.env['pathToSevenZipTool']} -aoa x -o${__dirname} ${path.join(__dirname, 'zip3.7z')}`; +let sevenZip2Command: string = `${zipExecutable} -aoa x -o${__dirname} ${path.join(__dirname, 'zip3.7z')}`; +if (!isWindows) { + zipExecutable = 'path/to/7z' + sevenZip1Command = `${process.env['pathToSevenZipTool']} -aoa x -o${__dirname} ${path.join(__dirname, 'zip3.7z')}`; + sevenZip2Command = `${zipExecutable} -aoa x -o${__dirname} ${path.join(__dirname, 'zip3.7z')}`; +} + +let a: ma.TaskLibAnswers; +if (isWindows) { + a = { + 'exec': {} + }; +} else { + a = { + 'exec': {}, + 'which': { + '7z': 'path/to/7z' + }, + 'checkPath': { + 'path/to/7z': true + } + }; +} + +// Need to add these as seperate string since they are dynamic +a['exec'][sevenZip1Command] = { + "code": 0, + "stdout": "extracted zip3.7z" +} +a['exec'][sevenZip2Command] = { + "code": 0, + "stdout": "extracted zip3.7z" +} + +tmr.setAnswers(a); + +tmr.run(); diff --git a/_generated/ExtractFilesV1/Tests/L0Extract.ts b/_generated/ExtractFilesV1/Tests/L0Extract.ts new file mode 100644 index 000000000000..41f941435a11 --- /dev/null +++ b/_generated/ExtractFilesV1/Tests/L0Extract.ts @@ -0,0 +1,114 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import fs = require('fs'); +import path = require('path'); +import os = require('os'); + +enum Platform { + Windows = 0, + MacOS = 1, + Linux = 2 +} + +let taskPath = path.join(__dirname, '..', 'extractfilestask.js'); +let tmr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +process.env['SYSTEM_DEFAULTWORKINGDIRECTORY'] = __dirname; + +tmr.setInput('archiveFilePatterns', process.env['archiveFilePatterns']); +tmr.setInput('destinationFolder', __dirname); +tmr.setInput('cleanDestinationFolder', process.env['cleanDestinationFolder']); +tmr.setInput('overwriteExistingFiles', process.env['overwriteExistingFiles']); + +let osType: Platform; +switch (os.type()) { + case 'Linux': + osType = Platform.Linux; + break; + case 'Darwin': + osType = Platform.MacOS; + break; + case 'Windows_NT': + osType = Platform.Windows; + break; + default: + throw Error("Unknown OS type"); +} +const isWindows: boolean = osType == Platform.Windows; + +//Create osType, stats mocks, support not added in this version of task-lib +const tl = require('azure-pipelines-task-lib/mock-task'); +const tlClone = Object.assign({}, tl); +tlClone.getPlatform = function() { + return osType; +}; +tlClone.stats = function(path) { + return fs.statSync(path); +}; +tlClone.exist = function(path) { + // Copied from task-lib + var exist = false; + try { + exist = !!(path && fs.statSync(path) != null); + } catch (err) { + if (err && err.code === 'ENOENT') { + exist = false; + } else { + throw err; + } + } + return exist; +}; +tlClone.rmRF = function(path) { + console.log('Removing ' + path); +}; +tmr.registerMock('azure-pipelines-task-lib/mock-task', tlClone); + +let zipExecutable = path.join(__dirname, '..', '7zip', '7z.exe'); +let sevenZip1Command: string = `path/to/7z -aoa x -o${__dirname} ${path.join(__dirname, 'zip1.zip')}`; +let sevenZip2Command: string = `path/to/7z -aoa x -o${__dirname} ${path.join(__dirname, 'zip2.zip')}`; +let sevenZip3Command: string = `path/to/7z -aoa x -o${__dirname} ${path.join(__dirname, 'zip3.7z')}`; +let tarCommand = `path/to/7z -aoa x -o${__dirname} ${path.join(__dirname, 'tar.tar')}`; +if (!isWindows) { + zipExecutable = 'path/to/unzip' + sevenZip1Command = `${zipExecutable} -o ${path.join(__dirname, 'zip1.zip')} -d ${__dirname}`; + sevenZip2Command = `${zipExecutable} -o ${path.join(__dirname, 'zip2.zip')} -d ${__dirname}`; + sevenZip3Command = `path/to/7z -aoa x -o${__dirname} ${path.join(__dirname, 'zip3.7z')}`; + tarCommand = `path/to/tar -xvf ${path.join(__dirname, 'tar.tar')} -C ${__dirname}`; +} + +let a: ma.TaskLibAnswers = { + 'exec': {}, + 'which': { + 'unzip': 'path/to/unzip', + 'tar': 'path/to/tar', + '7z': 'path/to/7z' + }, + 'checkPath': { + 'path/to/unzip': true, + 'path/to/tar': true, + 'path/to/7z': true + } +}; + +// Need to add these as seperate string since they are dynamic +a['exec'][sevenZip1Command] = { + "code": 0, + "stdout": "extracted zip1" +} +a['exec'][sevenZip2Command] = { + "code": 0, + "stdout": "extracted zip2" +} +a['exec'][tarCommand] = { + "code": 0, + "stdout": "extracted tar" +} +a['exec'][sevenZip3Command] = { + "code": 0, + "stdout": "extracted 7z" +} + +tmr.setAnswers(a); + +tmr.run(); diff --git a/_generated/ExtractFilesV1/Tests/tar.tar b/_generated/ExtractFilesV1/Tests/tar.tar new file mode 100644 index 000000000000..bb7028571361 Binary files /dev/null and b/_generated/ExtractFilesV1/Tests/tar.tar differ diff --git a/_generated/ExtractFilesV1/Tests/zip1.zip b/_generated/ExtractFilesV1/Tests/zip1.zip new file mode 100644 index 000000000000..bb7028571361 Binary files /dev/null and b/_generated/ExtractFilesV1/Tests/zip1.zip differ diff --git a/_generated/ExtractFilesV1/Tests/zip2.zip b/_generated/ExtractFilesV1/Tests/zip2.zip new file mode 100644 index 000000000000..bb7028571361 Binary files /dev/null and b/_generated/ExtractFilesV1/Tests/zip2.zip differ diff --git a/_generated/ExtractFilesV1/Tests/zip3.7z b/_generated/ExtractFilesV1/Tests/zip3.7z new file mode 100644 index 000000000000..91c170648989 Binary files /dev/null and b/_generated/ExtractFilesV1/Tests/zip3.7z differ diff --git a/_generated/ExtractFilesV1/ThirdPartyNotices.txt b/_generated/ExtractFilesV1/ThirdPartyNotices.txt new file mode 100644 index 000000000000..999441b2416f --- /dev/null +++ b/_generated/ExtractFilesV1/ThirdPartyNotices.txt @@ -0,0 +1,172 @@ +---------------------------------START OF ENTRY FOR THE THIRD PARTY NOTICES---------------------------------------- + 7-Zip + ~~~~~ + License for use and distribution + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + 7-Zip Copyright (C) 1999-2016 Igor Pavlov. + + Licenses for files are: + + 1) 7z.dll: GNU LGPL + unRAR restriction + 2) All other files: GNU LGPL + + The GNU LGPL + unRAR restriction means that you must follow both + GNU LGPL rules and unRAR restriction rules. + + + Note: + You can use 7-Zip on any computer, including a computer in a commercial + organization. You don't need to register or pay for 7-Zip. + + + GNU LGPL information + -------------------- + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You can receive a copy of the GNU Lesser General Public License from + http://www.gnu.org/ + + + unRAR restriction + ----------------- + + The decompression engine for RAR archives was developed using source + code of unRAR program. + All copyrights to original unRAR code are owned by Alexander Roshal. + + The license for original unRAR code has the following restriction: + + The unRAR sources cannot be used to re-create the RAR compression algorithm, + which is proprietary. Distribution of modified unRAR sources in separate form + or as a part of other software is permitted, provided that it is clearly + stated in the documentation and source comments that the code may + not be used to develop a RAR (WinRAR) compatible archiver. + +GNU Lesser General Public License + +Version 2.1, February 1999 + +Copyright (C) 1991, 1999 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. +[This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] + +Preamble + +The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. +This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. +When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. +To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. +For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. +We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. +To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. +Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. +Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. +When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. +We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. +For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. +In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. +Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. +The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. + +TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + +0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". +A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. +The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) +"Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. +Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. + +1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. +You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. + +2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: +a) The modified work must itself be a software library. +b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. +c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. +d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. +(For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) +These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. +Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. +In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. + +3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. +Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. +This option is useful when you wish to copy part of the code of the Library into a program that is not a library. + +4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. +If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. + +5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. +However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. +When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. +If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) +Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. + +6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. +You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: +a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) +b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. +c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. +d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. +e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. +For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. +It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. + +7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: +a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. +b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. + +8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. + +9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. + +10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. + +11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. +If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. +It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. +This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. + +12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. + +13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. +Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. + +14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. + +NO WARRANTY + +15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + +16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +END OF TERMS AND CONDITIONS + +How to Apply These Terms to Your New Libraries + +If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). +To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. + Copyright (C) +This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. +This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. +You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +Also add information on how to contact you by electronic and paper mail. +You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: +Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. + +signature of Ty Coon, 1 April 1990 +Ty Coon, President of Vice + +That's all there is to it! + +----------------------------------------------- END OF ENTRY FOR THE THIRD PARTY NOTICES ---------------------------------------- + diff --git a/_generated/ExtractFilesV1/extractfilestask.ts b/_generated/ExtractFilesV1/extractfilestask.ts new file mode 100644 index 000000000000..00224eb90ca7 --- /dev/null +++ b/_generated/ExtractFilesV1/extractfilestask.ts @@ -0,0 +1,360 @@ +import path = require('path'); +import tl = require('azure-pipelines-task-lib/task'); +import tr = require('azure-pipelines-task-lib/toolrunner'); +import minimatch = require('minimatch'); +import os = require('os'); + +// archiveFilePatterns is a multiline input containing glob patterns +var archiveFilePatterns: string[] = tl.getDelimitedInput('archiveFilePatterns', '\n', true); +var destinationFolder: string = path.normalize(tl.getPathInput('destinationFolder', true, false).trim()); +var cleanDestinationFolder: boolean = tl.getBoolInput('cleanDestinationFolder', false); +var overwriteExistingFiles: boolean = tl.getBoolInput('overwriteExistingFiles', false); +const customPathToSevenZipTool: string = tl.getInput('pathToSevenZipTool', false); + +var repoRoot: string = tl.getVariable('System.DefaultWorkingDirectory'); +tl.debug('repoRoot: ' + repoRoot); + +const win: boolean = tl.getPlatform() == tl.Platform.Windows; +tl.debug('win: ' + win); + +// extractors +var xpTarLocation: string; +var xpUnzipLocation: string; +// 7zip +let sevenZipLocation: string; +let defaultWinSevenZipLocation: string = path.join(__dirname, '7zip/7z.exe'); + +function getSevenZipLocation(): string { + if (customPathToSevenZipTool) { + tl.debug('Get 7z tool from user defined location'); + return customPathToSevenZipTool; + } + + if (win) { + if (!sevenZipLocation) { + tl.debug('Try to resolve preinstalled 7z location'); + // we avoid check of tool existence to not fail the task if 7z is not preinstalled in system + sevenZipLocation = tl.which('7z', false); + } + + // return default location of the 7z which is bundled with the task in case the user didn't pass a custom path or the agent doesn't contain a preinstalled tool + return sevenZipLocation || defaultWinSevenZipLocation; + } + + if (!sevenZipLocation) { + tl.debug('Try to resolve preinstalled 7z location'); + sevenZipLocation = tl.which('7z', true); + } + + return sevenZipLocation; +} + +function findFiles(): string[] { + tl.debug('using: ' + archiveFilePatterns.length + ' archiveFilePatterns: ' + archiveFilePatterns + ' to search for archives.'); + + // minimatch options + var matchOptions = { matchBase: true }; + if (win) { + matchOptions["nocase"] = true; + } + + // use a set to avoid duplicates + var Set = require('collections/set'); + var matchingFilesSet = new Set(); + + for (var i = 0; i < archiveFilePatterns.length; i++) { + tl.debug('searching for archives, pattern[' + i + ']: ' + archiveFilePatterns[i]); + + var normalizedPattern: string = path.normalize(archiveFilePatterns[i]); + tl.debug('normalizedPattern= ' + normalizedPattern); + + var parseResult = parsePattern(normalizedPattern); + + if (parseResult.file != null) { + try { + var stats = tl.stats(parseResult.file); + if (stats.isFile()) { + if (matchingFilesSet.add(parseResult.file)) { + tl.debug('adding file: ' + parseResult.file); + } + matchingFilesSet.add(parseResult.file); + } else if (stats.isDirectory()) { // most likely error scenario is user specified a directory + failTask(tl.loc('ExtractDirFailedinFindFiles', parseResult.file)); + } else { // other error scenarios -- less likely + failTask(tl.loc('ExtractNotFileFailed', parseResult.file)); + } + } catch (e) { // typically because it does not exist + failTask(tl.loc('ExtractNotAccessibleFile', parseResult.file, e)); + } + } else { + console.log(tl.loc('SearchInDir', parseResult.search, parseResult.directory)); + + var stats = tl.stats(parseResult.directory); + + if (!stats) { + failTask(tl.loc('SearchNonExistDir', parseResult.directory)); + } else if (!stats.isDirectory()) { + failTask(tl.loc('SearchNonDir', parseResult.directory)); + } + + var allFiles = tl.find(parseResult.directory); + tl.debug('Candidates found for match: ' + allFiles.length); + + var matched = minimatch.match(allFiles, path.join(parseResult.directory, parseResult.search), matchOptions); + + // ensure only files are added, since our search results may include directories + for (var j = 0; j < matched.length; j++) { + var match = path.normalize(matched[j]); + var stats = tl.stats(match); + if (stats.isFile()) { + if (matchingFilesSet.add(match)) { + tl.debug('adding file: ' + match); + } + } + } + } + } + + return matchingFilesSet.toArray(); +} + +function parsePattern(normalizedPattern: string): { file: string, directory: string, search: string } { + tl.debug('parsePattern: ' + normalizedPattern); + + // the first occurance of a wild card, * or ? + var firstWildIndex = normalizedPattern.indexOf('*'); + var questionIndex = normalizedPattern.indexOf('?'); + if (questionIndex > -1 && (firstWildIndex == -1 || questionIndex < firstWildIndex)) { + firstWildIndex = questionIndex; + } + + // no wildcards + if (firstWildIndex == -1) { + return { + file: makeAbsolute(normalizedPattern), + directory: null, + search: null + }; + } + + // search backwards from the first wild card char for the nearest path separator + for (var i = firstWildIndex - 1; i > -1; i--) { + if (normalizedPattern.charAt(i) == path.sep) { + return { + file: null, + directory: makeAbsolute(normalizedPattern.substring(0, i + 1)), + search: normalizedPattern.substring(i + 1, normalizedPattern.length) + }; + } + } + + console.log(tl.loc('NoSearchPatternPath', normalizedPattern, repoRoot)); + + return { + file: null, + directory: repoRoot, + search: normalizedPattern + }; +} + +function makeAbsolute(normalizedPath: string): string { + tl.debug('makeAbsolute:' + normalizedPath); + + var result = normalizedPath; + if (!path.isAbsolute(normalizedPath)) { + result = path.join(repoRoot, normalizedPath); + console.log(tl.loc('ResolveRelativePath', normalizedPath, result)); + } + return result; +} + +// This check only pertains to linux where the native unzip command is used instead of 7zip +function isZip(file) { + return file.endsWith('.zip') + || file.endsWith('.jar') + || file.endsWith('.war') + || file.endsWith('.ear'); +} + +// This check pertains to linux so the native tar command is used, and on windows so the archive is decompressed and untared in two steps using 7zip. +function isTar(file) { + var name = win ? file.toLowerCase() : file; + // standard gnu-tar extension formats with recognized auto compression formats + // https://www.gnu.org/software/tar/manual/html_section/tar_69.html + return name.endsWith('.tar') // no compression + || name.endsWith('.tar.gz') // gzip + || name.endsWith('.tgz') // gzip + || name.endsWith('.taz') // gzip + || name.endsWith('.tar.Z') // compress + || (win && name.endsWith('tar.z')) // no case comparison for win + || name.endsWith('.taZ') // compress // no case for win already handled above + || name.endsWith('.tar.bz2') // bzip2 + || name.endsWith('.tz2') // bzip2 + || name.endsWith('.tbz2') // bzip2 + || name.endsWith('.tbz') // bzip2 + || name.endsWith('.tar.lz') // lzip + || name.endsWith('.tar.lzma') // lzma + || name.endsWith('.tlz') // lzma + || name.endsWith('.tar.lzo') // lzop + || name.endsWith('.tar.xz') // xz + || name.endsWith('.txz'); // xz +} + +function unzipExtract(file, destinationFolder) { + console.log(tl.loc('UnzipExtractFile', file)); + if (typeof xpUnzipLocation == "undefined") { + xpUnzipLocation = tl.which('unzip', true); + } + var unzip = tl.tool(xpUnzipLocation); + if (overwriteExistingFiles) { + unzip.arg('-o'); + } + unzip.arg(file); + unzip.arg('-d'); + unzip.arg(destinationFolder); + return handleExecResult(unzip.execSync(), file); +} + +function sevenZipExtract(file, destinationFolder) { + console.log(tl.loc('SevenZipExtractFile', file)); + var sevenZip = tl.tool(getSevenZipLocation()); + if (overwriteExistingFiles) { + sevenZip.arg('-aoa'); + } + sevenZip.arg('x'); + sevenZip.arg('-o' + destinationFolder); + sevenZip.arg(file); + return handleExecResult(sevenZip.execSync(), file); +} + +function tarExtract(file, destinationFolder) { + console.log(tl.loc('TarExtractFile', file)); + if (typeof xpTarLocation == "undefined") { + xpTarLocation = tl.which('tar', true); + } + var tar = tl.tool(xpTarLocation); + if (overwriteExistingFiles) { + tar.arg('-xvf'); // tar will correctly handle compression types outlined in isTar() + } else { + tar.arg('-xvkf'); + } + tar.arg(file); + tar.arg('-C'); + tar.arg(destinationFolder); + return handleExecResult(tar.execSync(), file); +} + +function handleExecResult(execResult: tr.IExecSyncResult, file) { + if (execResult.code != tl.TaskResult.Succeeded) { + tl.debug('execResult: ' + JSON.stringify(execResult)); + failTask(tl.loc('ExtractFileFailedMsg', file, execResult.code, execResult.stdout, execResult.stderr, execResult.error)); + } +} + +function failTask(message: string) { + throw new FailTaskError(message); +} + +export class FailTaskError extends Error { +} + +function extractFiles(files: string[]) { + // Extract the archive files on a single thread for two reasons: + // 1 - Multiple threads munge the log messages + // 2 - Everything is going to be blocked by I/O anyway. + for (var i = 0; i < files.length; i++) { + var file = files[i]; + var stats = tl.stats(file); + if (!stats) { + failTask(tl.loc('ExtractNonExistFile', file)); + } else if (stats.isDirectory()) { + failTask(tl.loc('ExtractDirFailed', file)); + } + + if (win) { + if (isTar(file)) { + if (file.endsWith('.tar')) { // a simple tar + sevenZipExtract(file, destinationFolder); + } else { // a compressed tar, e.g. 'fullFilePath/test.tar.bz2' + // 7zip can not decompress and expand in one step, so it is necessary + // to do this in multiple steps as follows: + // 0. create a temporary location to decompress the tar to + // 1. decompress the tar to the temporary location + // 2. expand the decompressed tar to the output folder + // 3. remove the temporary location + + // e.g. 'fullFilePath/test.tar.bz2' --> 'test.tar.bz2' + var shortFileName = file.substring(file.lastIndexOf(path.sep) + 1, file.length); + // e.g. 'destinationFolder/_test.tar.bz2_' + var tempFolder = path.normalize(destinationFolder + path.sep + '_' + shortFileName + '_'); + if (!tl.exist(tempFolder)) { + console.log(tl.loc('CreateTempDir', tempFolder, file)); + // 0 create temp folder + tl.mkdirP(tempFolder); + // 1 extract compressed tar + sevenZipExtract(file, tempFolder); + console.log(tl.loc('TempDir', tempFolder)); + var tempTar = tempFolder + path.sep + tl.ls('-A', [tempFolder])[0]; // should be only one + console.log(tl.loc('DecompressedTempTar', file, tempTar)); + // 2 expand extracted tar + sevenZipExtract(tempTar, destinationFolder); + // 3 cleanup temp folder + console.log(tl.loc('RemoveTempDir', tempFolder)); + tl.rmRF(tempFolder); + } else { + failTask(tl.loc('ExtractFailedCannotCreate', file, tempFolder)); + } + } + } else { // not a tar, so use sevenZip + sevenZipExtract(file, destinationFolder); + } + } else { // not windows + if (isTar(file)) { + tarExtract(file, destinationFolder); + } else if (isZip(file)) { + unzipExtract(file, destinationFolder); + } else { // fall through and use sevenZip + sevenZipExtract(file, destinationFolder) + } + } + } +} + +function doWork() { + try { + tl.setResourcePath(path.join( __dirname, 'task.json')); + + // Find matching archive files + var files: string[] = findFiles(); + + if (files.length === 0) { + tl.warning(tl.loc('NoFilesFound')); + } + + console.log(tl.loc('FoundFiles', files.length)); + for (var i = 0; i < files.length; i++) { + console.log(files[i]); + } + + // Clean the destination folder before extraction? + if (cleanDestinationFolder && tl.exist(destinationFolder)) { + console.log(tl.loc('CleanDestDir', destinationFolder)); + tl.rmRF(destinationFolder); + } + + // Create the destination folder if it doesn't exist + if (!tl.exist(destinationFolder)) { + console.log(tl.loc('CreateDestDir', destinationFolder)); + tl.mkdirP(destinationFolder); + } + + extractFiles(files); + tl.setResult(tl.TaskResult.Succeeded, tl.loc('SucceedMsg')); + } catch (e) { + tl.debug(e.message); + process.stderr.write(e + os.EOL); + tl.setResult(tl.TaskResult.Failed, e.message); + } +} + +doWork(); \ No newline at end of file diff --git a/_generated/ExtractFilesV1/icon.png b/_generated/ExtractFilesV1/icon.png new file mode 100644 index 000000000000..942dc8ed754e Binary files /dev/null and b/_generated/ExtractFilesV1/icon.png differ diff --git a/_generated/ExtractFilesV1/icon.svg b/_generated/ExtractFilesV1/icon.svg new file mode 100644 index 000000000000..c3daaa283b0c --- /dev/null +++ b/_generated/ExtractFilesV1/icon.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/_generated/ExtractFilesV1/make.json b/_generated/ExtractFilesV1/make.json new file mode 100644 index 000000000000..f57f912f88bc --- /dev/null +++ b/_generated/ExtractFilesV1/make.json @@ -0,0 +1,10 @@ +{ + "externals": { + "archivePackages": [ + { + "url": "https://vstsagenttools.blob.core.windows.net/tools/7zip/4/7zip.zip", + "dest": "./" + } + ] + } +} \ No newline at end of file diff --git a/_generated/ExtractFilesV1/package-lock.json b/_generated/ExtractFilesV1/package-lock.json new file mode 100644 index 000000000000..d9a34fdbed69 --- /dev/null +++ b/_generated/ExtractFilesV1/package-lock.json @@ -0,0 +1,511 @@ +{ + "name": "ExtractFiles", + "version": "1.0.2", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/concat-stream": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz", + "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==", + "requires": { + "@types/node": "*" + } + }, + "@types/form-data": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", + "integrity": "sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==", + "requires": { + "@types/node": "*" + } + }, + "@types/mocha": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.1.1.tgz", + "integrity": "sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==" + }, + "@types/node": { + "version": "16.11.58", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.58.tgz", + "integrity": "sha512-uMVxJ111wpHzkx/vshZFb6Qni3BOMnlWLq7q9jrwej7Yw/KvjsEbpxCCxw+hLKxexFMc8YmpG8J9tnEe/rKsIg==" + }, + "@types/q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.1.tgz", + "integrity": "sha512-eqz8c/0kwNi/OEHQfvIuJVLTst3in0e7uTKeuY+WL/zfKn0xVujOTp42bS/vUUokhK5P2BppLd9JXMOMHcgbjA==" + }, + "@types/qs": { + "version": "6.9.8", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.8.tgz", + "integrity": "sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg==" + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "azure-pipelines-task-lib": { + "version": "5.0.0-preview.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-5.0.0-preview.0.tgz", + "integrity": "sha512-uQJEv+q3/7RD7kgphFd33uXijaPwA1ePYoNkAgZpUhbZUtc2u4JL4ujTT/JJfgXBNW/QQNAiDQ2OC7vOQG/0tg==", + "requires": { + "minimatch": "3.0.5", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "sync-request": "6.1.0", + "uuid": "^3.0.1" + }, + "dependencies": { + "minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "brace-expansion": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", + "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + }, + "collections": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/collections/-/collections-3.0.0.tgz", + "integrity": "sha1-J+OJTfGyTO38VaG7sMDaEvaLqzE=", + "requires": { + "weak-map": "~1.0.x" + } + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, + "form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + } + }, + "get-port": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", + "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==" + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "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" + }, + "dependencies": { + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==" + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "http-basic": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", + "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", + "requires": { + "caseless": "^0.12.0", + "concat-stream": "^1.6.2", + "http-response-object": "^3.0.1", + "parse-cache-control": "^1.0.1" + } + }, + "http-response-object": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", + "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", + "requires": { + "@types/node": "^10.0.3" + }, + "dependencies": { + "@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + } + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" + }, + "is-core-module": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "requires": { + "has": "^1.0.3" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, + "parse-cache-control": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", + "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "promise": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", + "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", + "requires": { + "asap": "~2.0.6" + } + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==" + }, + "qs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "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" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "requires": { + "resolve": "^1.1.6" + } + }, + "resolve": { + "version": "1.22.6", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.6.tgz", + "integrity": "sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==", + "requires": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" + }, + "shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, + "sync-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", + "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==", + "requires": { + "http-response-object": "^3.0.1", + "sync-rpc": "^1.2.1", + "then-request": "^6.0.0" + } + }, + "sync-rpc": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz", + "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==", + "requires": { + "get-port": "^3.1.0" + } + }, + "then-request": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", + "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", + "requires": { + "@types/concat-stream": "^1.6.0", + "@types/form-data": "0.0.33", + "@types/node": "^8.0.0", + "@types/qs": "^6.2.31", + "caseless": "~0.12.0", + "concat-stream": "^1.6.0", + "form-data": "^2.2.0", + "http-basic": "^8.1.1", + "http-response-object": "^3.0.1", + "promise": "^8.0.0", + "qs": "^6.4.0" + }, + "dependencies": { + "@types/node": { + "version": "8.10.66", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", + "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==" + } + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, + "typescript": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.2.tgz", + "integrity": "sha512-e4ERvRV2wb+rRZ/IQeb3jm2VxBsirQLpQhdxplZ2MEzGvDkkMmPglecnNDfSUBivMjP93vRbngYYDQqQ/78bcQ==", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + }, + "weak-map": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/weak-map/-/weak-map-1.0.5.tgz", + "integrity": "sha1-eWkVhNmGB/UHC9O3CkDmuyLkAes=" + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + } + } +} diff --git a/_generated/ExtractFilesV1/package.json b/_generated/ExtractFilesV1/package.json new file mode 100644 index 000000000000..359f795a29bf --- /dev/null +++ b/_generated/ExtractFilesV1/package.json @@ -0,0 +1,27 @@ +{ + "name": "ExtractFiles", + "version": "1.0.2", + "description": "Extract Files Task", + "main": "extractfilestask.js", + "repository": { + "type": "git", + "url": "git+https://github.com/Microsoft/azure-pipelines-tasks.git" + }, + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Microsoft/azure-pipelines-tasks/issues" + }, + "homepage": "https://github.com/Microsoft/azure-pipelines-tasks#readme", + "dependencies": { + "@types/q": "^1.0.7", + "@types/node": "^16.11.39", + "@types/mocha": "^9.1.1", + "azure-pipelines-task-lib": "^5.0.0-preview.0", + "collections": "3.0.0", + "minimatch": "^3.0.4" + }, + "devDependencies": { + "typescript": "4.0.2" + } +} diff --git a/_generated/ExtractFilesV1/task.json b/_generated/ExtractFilesV1/task.json new file mode 100644 index 000000000000..17f2002e2bce --- /dev/null +++ b/_generated/ExtractFilesV1/task.json @@ -0,0 +1,120 @@ +{ + "id": "5e1e3830-fbfb-11e5-aab1-090c92bc4988", + "name": "ExtractFiles", + "friendlyName": "Extract files", + "description": "Extract a variety of archive and compression files such as .7z, .rar, .tar.gz, and .zip", + "author": "Microsoft Corporation", + "helpUrl": "https://docs.microsoft.com/azure/devops/pipelines/tasks/utility/extract-files", + "helpMarkDown": "[Learn more about this task](https://go.microsoft.com/fwlink/?LinkId=800269)", + "category": "Utility", + "visibility": [ + "Build", + "Release" + ], + "runsOn": [ + "Agent", + "DeploymentGroup" + ], + "demands": [], + "minimumAgentVersion": "2.182.1", + "version": { + "Major": 1, + "Minor": 229, + "Patch": 0 + }, + "instanceNameFormat": "Extract files $(message)", + "inputs": [ + { + "name": "archiveFilePatterns", + "type": "multiLine", + "label": "Archive file patterns", + "defaultValue": "**/*.zip", + "required": true, + "helpMarkDown": "File paths or patterns of the archive files to extract. Supports multiple lines of minimatch patterns. [More Information](https://go.microsoft.com/fwlink/?LinkId=800269)", + "properties": { + "resizable": "true", + "rows": "4" + } + }, + { + "name": "destinationFolder", + "type": "filePath", + "label": "Destination folder", + "defaultValue": "", + "required": true, + "helpMarkDown": "Destination folder into which archive files should be extracted. Use [variables](https://go.microsoft.com/fwlink/?LinkID=550988) if files are not in the repo. Example: $(agent.builddirectory)" + }, + { + "name": "cleanDestinationFolder", + "type": "boolean", + "label": "Clean destination folder before extracting", + "required": true, + "defaultValue": "true", + "helpMarkDown": "Select this option to clean the destination directory before archive contents are extracted into it." + }, + { + "name": "overwriteExistingFiles", + "type": "boolean", + "label": "Overwrite existing files", + "required": true, + "defaultValue": "false", + "helpMarkDown": "Select this option to overwrite existing files in the destination directory." + }, + { + "name": "pathToSevenZipTool", + "type": "string", + "defaultValue": "", + "label": "Path to 7z utility", + "required": false, + "helpMarkDown": "You can specify custom path to 7z utility. For example, \"C:\\7z\\7z.exe\" on Windows and \"/usr/local/bin/7z\" on MacOS/Ubuntu." + } + ], + "execution": { + "Node10": { + "target": "extractfilestask.js", + "argumentFormat": "" + }, + "Node16": { + "target": "extractfilestask.js", + "argumentFormat": "" + } + }, + "restrictions": { + "commands": { + "mode": "restricted" + }, + "settableVariables": { + "allowed": [] + } + }, + "messages": { + "ExtractDirFailedinFindFiles": "Specified archive: %s can not be extracted because it is a directory.", + "ExtractNotFileFailed": "Specified archive: %s can not be extracted because it is not a file.", + "ExtractNotAccessibleFile": "Specified archive: %s can not be extracted because it can not be accessed: %s", + "SearchInDir": "Searching for: %s under directory: %s", + "SearchNonExistDir": "Search failed because the specified search directory: %s does not exist.", + "SearchNonDir": "Search failed because the specified search directory: %s is not a directory.", + "NoSearchPatternPath": "No path specified for search pattern: %s defaulting to: %s", + "ResolveRelativePath": "Relative file path: %s resolving to: %s", + "UnzipExtractFile": "Extracting file: %s", + "SevenZipExtractFile": "Extracting file: %s", + "TarExtractFile": "Extracting file: %s", + "ExtractFileFailedMsg": "Extraction failed for file: %s \ncode: %d \nstdout: %s \nstderr: %s \nerror: %s;", + "ExtractNonExistFile": "Extraction failed for file: %s because it does not exist.", + "ExtractDirFailed": "Extraction failed for file: %s because it is a directory.", + "CreateTempDir": "Creating temp folder: %s to decompress: %s", + "TempDir": "tempFolder = %s", + "DecompressedTempTar": "Decompressed temporary tar from: %s to: %s", + "RemoveTempDir": "Removing temp folder: %s", + "ExtractFailedCannotCreate": "Extraction failed for file: %s because temporary location could not be created: %s", + "NoFilesFound": "No archives were found using specified file patterns", + "FoundFiles": "Found: %d files to extract:", + "CleanDestDir": "Cleaning destination folder before extraction: %s", + "CreateDestDir": "Creating destination folder: %s", + "SucceedMsg": "Successfully extracted all files." + }, + "_buildConfigMapping": { + "Default": "1.229.0", + "Node20-225": "1.229.1" + } +} \ No newline at end of file diff --git a/_generated/ExtractFilesV1/task.loc.json b/_generated/ExtractFilesV1/task.loc.json new file mode 100644 index 000000000000..b1b37a01011f --- /dev/null +++ b/_generated/ExtractFilesV1/task.loc.json @@ -0,0 +1,120 @@ +{ + "id": "5e1e3830-fbfb-11e5-aab1-090c92bc4988", + "name": "ExtractFiles", + "friendlyName": "ms-resource:loc.friendlyName", + "description": "ms-resource:loc.description", + "author": "Microsoft Corporation", + "helpUrl": "https://docs.microsoft.com/azure/devops/pipelines/tasks/utility/extract-files", + "helpMarkDown": "ms-resource:loc.helpMarkDown", + "category": "Utility", + "visibility": [ + "Build", + "Release" + ], + "runsOn": [ + "Agent", + "DeploymentGroup" + ], + "demands": [], + "minimumAgentVersion": "2.182.1", + "version": { + "Major": 1, + "Minor": 229, + "Patch": 0 + }, + "instanceNameFormat": "ms-resource:loc.instanceNameFormat", + "inputs": [ + { + "name": "archiveFilePatterns", + "type": "multiLine", + "label": "ms-resource:loc.input.label.archiveFilePatterns", + "defaultValue": "**/*.zip", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.archiveFilePatterns", + "properties": { + "resizable": "true", + "rows": "4" + } + }, + { + "name": "destinationFolder", + "type": "filePath", + "label": "ms-resource:loc.input.label.destinationFolder", + "defaultValue": "", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.destinationFolder" + }, + { + "name": "cleanDestinationFolder", + "type": "boolean", + "label": "ms-resource:loc.input.label.cleanDestinationFolder", + "required": true, + "defaultValue": "true", + "helpMarkDown": "ms-resource:loc.input.help.cleanDestinationFolder" + }, + { + "name": "overwriteExistingFiles", + "type": "boolean", + "label": "ms-resource:loc.input.label.overwriteExistingFiles", + "required": true, + "defaultValue": "false", + "helpMarkDown": "ms-resource:loc.input.help.overwriteExistingFiles" + }, + { + "name": "pathToSevenZipTool", + "type": "string", + "defaultValue": "", + "label": "ms-resource:loc.input.label.pathToSevenZipTool", + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.pathToSevenZipTool" + } + ], + "execution": { + "Node10": { + "target": "extractfilestask.js", + "argumentFormat": "" + }, + "Node16": { + "target": "extractfilestask.js", + "argumentFormat": "" + } + }, + "restrictions": { + "commands": { + "mode": "restricted" + }, + "settableVariables": { + "allowed": [] + } + }, + "messages": { + "ExtractDirFailedinFindFiles": "ms-resource:loc.messages.ExtractDirFailedinFindFiles", + "ExtractNotFileFailed": "ms-resource:loc.messages.ExtractNotFileFailed", + "ExtractNotAccessibleFile": "ms-resource:loc.messages.ExtractNotAccessibleFile", + "SearchInDir": "ms-resource:loc.messages.SearchInDir", + "SearchNonExistDir": "ms-resource:loc.messages.SearchNonExistDir", + "SearchNonDir": "ms-resource:loc.messages.SearchNonDir", + "NoSearchPatternPath": "ms-resource:loc.messages.NoSearchPatternPath", + "ResolveRelativePath": "ms-resource:loc.messages.ResolveRelativePath", + "UnzipExtractFile": "ms-resource:loc.messages.UnzipExtractFile", + "SevenZipExtractFile": "ms-resource:loc.messages.SevenZipExtractFile", + "TarExtractFile": "ms-resource:loc.messages.TarExtractFile", + "ExtractFileFailedMsg": "ms-resource:loc.messages.ExtractFileFailedMsg", + "ExtractNonExistFile": "ms-resource:loc.messages.ExtractNonExistFile", + "ExtractDirFailed": "ms-resource:loc.messages.ExtractDirFailed", + "CreateTempDir": "ms-resource:loc.messages.CreateTempDir", + "TempDir": "ms-resource:loc.messages.TempDir", + "DecompressedTempTar": "ms-resource:loc.messages.DecompressedTempTar", + "RemoveTempDir": "ms-resource:loc.messages.RemoveTempDir", + "ExtractFailedCannotCreate": "ms-resource:loc.messages.ExtractFailedCannotCreate", + "NoFilesFound": "ms-resource:loc.messages.NoFilesFound", + "FoundFiles": "ms-resource:loc.messages.FoundFiles", + "CleanDestDir": "ms-resource:loc.messages.CleanDestDir", + "CreateDestDir": "ms-resource:loc.messages.CreateDestDir", + "SucceedMsg": "ms-resource:loc.messages.SucceedMsg" + }, + "_buildConfigMapping": { + "Default": "1.229.0", + "Node20-225": "1.229.1" + } +} \ No newline at end of file diff --git a/_generated/ExtractFilesV1/tsconfig.json b/_generated/ExtractFilesV1/tsconfig.json new file mode 100644 index 000000000000..0438b79f69ac --- /dev/null +++ b/_generated/ExtractFilesV1/tsconfig.json @@ -0,0 +1,6 @@ +{ + "compilerOptions": { + "target": "ES6", + "module": "commonjs" + } +} \ No newline at end of file diff --git a/_generated/ExtractFilesV1_Node20/.npmrc b/_generated/ExtractFilesV1_Node20/.npmrc new file mode 100644 index 000000000000..5fca0d518be7 --- /dev/null +++ b/_generated/ExtractFilesV1_Node20/.npmrc @@ -0,0 +1 @@ +scripts-prepend-node-path=true diff --git a/_generated/ExtractFilesV1_Node20/Strings/resources.resjson/de-DE/resources.resjson b/_generated/ExtractFilesV1_Node20/Strings/resources.resjson/de-DE/resources.resjson new file mode 100644 index 000000000000..c7b6a396bbe3 --- /dev/null +++ b/_generated/ExtractFilesV1_Node20/Strings/resources.resjson/de-DE/resources.resjson @@ -0,0 +1,40 @@ +{ + "loc.friendlyName": "Dateien extrahieren", + "loc.helpMarkDown": "[Weitere Informationen zu dieser Aufgabe](https://go.microsoft.com/fwlink/?LinkId=800269)", + "loc.description": "Hiermit werden verschiedene Archiv- und Komprimierungsdateien extrahiert, z. B. 7z, RAR, TAR.GZ und ZIP.", + "loc.instanceNameFormat": "Dateien extrahieren $(message)", + "loc.input.label.archiveFilePatterns": "Archivdateimuster", + "loc.input.help.archiveFilePatterns": "Dateipfade oder Muster der zu extrahierenden Archivdateien. Unterstützt mehrere Zeilen von Minimatchmustern. [Weitere Informationen](https://go.microsoft.com/fwlink/?LinkId=800269)", + "loc.input.label.destinationFolder": "Zielordner", + "loc.input.help.destinationFolder": "Der Zielordner, in den Archivdateien extrahiert werden sollen. Verwenden Sie [Variablen](https://go.microsoft.com/fwlink/?LinkID=550988), wenn Dateien nicht im Repository vorhanden sind. Beispiel: $(agent.builddirectory)", + "loc.input.label.cleanDestinationFolder": "Zielordner vor dem Extrahieren bereinigen", + "loc.input.help.cleanDestinationFolder": "Wählen Sie diese Option aus, um das Zielverzeichnis zu bereinigen, bevor Archivinhalte in dieses extrahiert werden.", + "loc.input.label.overwriteExistingFiles": "Vorhandene Dateien überschreiben", + "loc.input.help.overwriteExistingFiles": "Wählen Sie diese Option aus, um vorhandene Dateien im Zielverzeichnis zu überschreiben.", + "loc.input.label.pathToSevenZipTool": "Pfad zum 7z-Hilfsprogramm", + "loc.input.help.pathToSevenZipTool": "Sie können einen benutzerdefinierten Pfad zum 7z-Hilfsprogramm angeben. Beispiel: \"C:\\7z\\7z.exe\" unter Windows und \"/usr/local/bin/7z\" unter MacOS/Ubuntu.", + "loc.messages.ExtractDirFailedinFindFiles": "Die angegebene Archivdatei \"%s\" kann nicht extrahiert werden, weil es sich nicht um ein Verzeichnis handelt.", + "loc.messages.ExtractNotFileFailed": "Die angegebene Archivdatei \"%s\" kann nicht extrahiert werden, weil es sich nicht um eine Datei handelt.", + "loc.messages.ExtractNotAccessibleFile": "Die angegebene Archivdatei \"%s\" kann nicht extrahiert werden, weil nicht auf sie zugegriffen werden kann: %s", + "loc.messages.SearchInDir": "Die Suche nach \"%s\" im Verzeichnis \"%s\" wird durchgeführt.", + "loc.messages.SearchNonExistDir": "Fehler bei der Suche, weil das angegebene Suchverzeichnis \"%s\" nicht vorhanden ist.", + "loc.messages.SearchNonDir": "Fehler bei der Suche, weil das angegebene Suchverzeichnis \"%s\" kein Verzeichnis ist.", + "loc.messages.NoSearchPatternPath": "Es wurde kein Pfad für das Suchmuster \"%s\" angegeben. Der Standardwert \"%s\" wird verwendet.", + "loc.messages.ResolveRelativePath": "Relativer Pfad \"%s\" wird aufgelöst in \"%s\".", + "loc.messages.UnzipExtractFile": "Die Datei wird extrahiert: %s", + "loc.messages.SevenZipExtractFile": "Die Datei wird extrahiert: %s", + "loc.messages.TarExtractFile": "Die Datei wird extrahiert: %s", + "loc.messages.ExtractFileFailedMsg": "Fehler beim Extrahieren der Datei: %s \nCode: %d \nstdout: %s \nstderr: %s \nFehler: %s;", + "loc.messages.ExtractNonExistFile": "Fehler beim Extrahieren der Datei \"%s\", weil die Datei nicht vorhanden ist.", + "loc.messages.ExtractDirFailed": "Fehler beim Extrahieren der Datei \"%s\", weil es sich um einen Ordner handelt.", + "loc.messages.CreateTempDir": "Der temporäre Ordner \"%s\" für die Dekomprimierung wird erstellt: %s", + "loc.messages.TempDir": "tempFolder = %s", + "loc.messages.DecompressedTempTar": "Die temporäre TAR-Datei wurde von \"%s\" nach \"%s\" dekomprimiert.", + "loc.messages.RemoveTempDir": "Der temporäre Ordner wird entfernt: %s", + "loc.messages.ExtractFailedCannotCreate": "Fehler beim Extrahieren der Datei \"%s\", weil der temporäre Speicherort nicht erstellt werden konnte: %s", + "loc.messages.NoFilesFound": "Über die angegebenen Dateimuster wurden keine Archive gefunden.", + "loc.messages.FoundFiles": "%d Dateien zum Extrahieren gefunden:", + "loc.messages.CleanDestDir": "Der Zielordner wird vor dem Extrahieren bereinigt: %s", + "loc.messages.CreateDestDir": "Der Zielordner wird erstellt: %s", + "loc.messages.SucceedMsg": "Alle Dateien wurden erfolgreich extrahiert." +} \ No newline at end of file diff --git a/_generated/ExtractFilesV1_Node20/Strings/resources.resjson/en-US/resources.resjson b/_generated/ExtractFilesV1_Node20/Strings/resources.resjson/en-US/resources.resjson new file mode 100644 index 000000000000..ae298d0210b2 --- /dev/null +++ b/_generated/ExtractFilesV1_Node20/Strings/resources.resjson/en-US/resources.resjson @@ -0,0 +1,40 @@ +{ + "loc.friendlyName": "Extract files", + "loc.helpMarkDown": "[Learn more about this task](https://go.microsoft.com/fwlink/?LinkId=800269)", + "loc.description": "Extract a variety of archive and compression files such as .7z, .rar, .tar.gz, and .zip", + "loc.instanceNameFormat": "Extract files $(message)", + "loc.input.label.archiveFilePatterns": "Archive file patterns", + "loc.input.help.archiveFilePatterns": "File paths or patterns of the archive files to extract. Supports multiple lines of minimatch patterns. [More Information](https://go.microsoft.com/fwlink/?LinkId=800269)", + "loc.input.label.destinationFolder": "Destination folder", + "loc.input.help.destinationFolder": "Destination folder into which archive files should be extracted. Use [variables](https://go.microsoft.com/fwlink/?LinkID=550988) if files are not in the repo. Example: $(agent.builddirectory)", + "loc.input.label.cleanDestinationFolder": "Clean destination folder before extracting", + "loc.input.help.cleanDestinationFolder": "Select this option to clean the destination directory before archive contents are extracted into it.", + "loc.input.label.overwriteExistingFiles": "Overwrite existing files", + "loc.input.help.overwriteExistingFiles": "Select this option to overwrite existing files in the destination directory.", + "loc.input.label.pathToSevenZipTool": "Path to 7z utility", + "loc.input.help.pathToSevenZipTool": "You can specify custom path to 7z utility. For example, \"C:\\7z\\7z.exe\" on Windows and \"/usr/local/bin/7z\" on MacOS/Ubuntu.", + "loc.messages.ExtractDirFailedinFindFiles": "Specified archive: %s can not be extracted because it is a directory.", + "loc.messages.ExtractNotFileFailed": "Specified archive: %s can not be extracted because it is not a file.", + "loc.messages.ExtractNotAccessibleFile": "Specified archive: %s can not be extracted because it can not be accessed: %s", + "loc.messages.SearchInDir": "Searching for: %s under directory: %s", + "loc.messages.SearchNonExistDir": "Search failed because the specified search directory: %s does not exist.", + "loc.messages.SearchNonDir": "Search failed because the specified search directory: %s is not a directory.", + "loc.messages.NoSearchPatternPath": "No path specified for search pattern: %s defaulting to: %s", + "loc.messages.ResolveRelativePath": "Relative file path: %s resolving to: %s", + "loc.messages.UnzipExtractFile": "Extracting file: %s", + "loc.messages.SevenZipExtractFile": "Extracting file: %s", + "loc.messages.TarExtractFile": "Extracting file: %s", + "loc.messages.ExtractFileFailedMsg": "Extraction failed for file: %s \ncode: %d \nstdout: %s \nstderr: %s \nerror: %s;", + "loc.messages.ExtractNonExistFile": "Extraction failed for file: %s because it does not exist.", + "loc.messages.ExtractDirFailed": "Extraction failed for file: %s because it is a directory.", + "loc.messages.CreateTempDir": "Creating temp folder: %s to decompress: %s", + "loc.messages.TempDir": "tempFolder = %s", + "loc.messages.DecompressedTempTar": "Decompressed temporary tar from: %s to: %s", + "loc.messages.RemoveTempDir": "Removing temp folder: %s", + "loc.messages.ExtractFailedCannotCreate": "Extraction failed for file: %s because temporary location could not be created: %s", + "loc.messages.NoFilesFound": "No archives were found using specified file patterns", + "loc.messages.FoundFiles": "Found: %d files to extract:", + "loc.messages.CleanDestDir": "Cleaning destination folder before extraction: %s", + "loc.messages.CreateDestDir": "Creating destination folder: %s", + "loc.messages.SucceedMsg": "Successfully extracted all files." +} \ No newline at end of file diff --git a/_generated/ExtractFilesV1_Node20/Strings/resources.resjson/es-ES/resources.resjson b/_generated/ExtractFilesV1_Node20/Strings/resources.resjson/es-ES/resources.resjson new file mode 100644 index 000000000000..eacd7390f0f5 --- /dev/null +++ b/_generated/ExtractFilesV1_Node20/Strings/resources.resjson/es-ES/resources.resjson @@ -0,0 +1,40 @@ +{ + "loc.friendlyName": "Extraer archivos", + "loc.helpMarkDown": "[Obtener más información acerca de esta tarea](https://go.microsoft.com/fwlink/?LinkId=800269)", + "loc.description": "Extrae una gran variedad de archivos comprimidos y de almacenamiento, como .7z, .rar, .tar.gz y .zip.", + "loc.instanceNameFormat": "Extraer archivos $(message)", + "loc.input.label.archiveFilePatterns": "Patrones de archivo de almacenamiento", + "loc.input.help.archiveFilePatterns": "Rutas de acceso de archivo o patrones de los archivos de almacenamiento que se deben extraer. Admite varias líneas de patrones de minimatch patterns. [Más información](https://go.microsoft.com/fwlink/?LinkId=800269)", + "loc.input.label.destinationFolder": "Carpeta de destino", + "loc.input.help.destinationFolder": "Carpeta de destino donde deben extraerse los archivos de almacenamiento. Use [variables](https://go.microsoft.com/fwlink/?LinkID=550988) si los archivos no están en el repositorio. Ejemplo: $(agent.builddirectory)", + "loc.input.label.cleanDestinationFolder": "Limpiar la carpeta de destino antes de la extracción", + "loc.input.help.cleanDestinationFolder": "Seleccione esta opción para limpiar el directorio de destino antes de extraer en él el contenido del archivo de almacenamiento.", + "loc.input.label.overwriteExistingFiles": "Sobrescribir los archivos existentes", + "loc.input.help.overwriteExistingFiles": "Seleccione esta opción para sobrescribir los archivos existentes en el directorio de destino.", + "loc.input.label.pathToSevenZipTool": "Ruta de acceso a la utilidad 7z", + "loc.input.help.pathToSevenZipTool": "Puede especificar una ruta de acceso personalizada para la utilidad 7z. Por ejemplo: \"C:\\7z\\7z.exe\" en Windows y \"/usr/local/bin/7z\" en MacOS/Ubuntu.", + "loc.messages.ExtractDirFailedinFindFiles": "El archivo especificado: %s no se puede extraer porque es un directorio.", + "loc.messages.ExtractNotFileFailed": "El archivo especificado: %s no se puede extraer porque no es un archivo.", + "loc.messages.ExtractNotAccessibleFile": "El archivo especificado: %s no se puede extraer porque no es posible tener acceso a él: %s", + "loc.messages.SearchInDir": "Buscando: %s en el directorio: %s", + "loc.messages.SearchNonExistDir": "Error en la búsqueda porque el directorio de búsqueda especificado: %s no existe.", + "loc.messages.SearchNonDir": "Error en la búsqueda porque el directorio de búsqueda especificado: %s no es un directorio.", + "loc.messages.NoSearchPatternPath": "No se especificó ruta de acceso para el patrón de búsqueda: %s y se estableció de manera predeterminada en: %s", + "loc.messages.ResolveRelativePath": "Ruta de acceso relativa a archivo: %s se resuelve en: %s", + "loc.messages.UnzipExtractFile": "Extrayendo archivo: %s", + "loc.messages.SevenZipExtractFile": "Extrayendo archivo: %s", + "loc.messages.TarExtractFile": "Extrayendo archivo: %s", + "loc.messages.ExtractFileFailedMsg": "Error al extraer el archivo: %s \nCódigo: %d \nStdOut: %s \nStdErr: %s \nError: %s;", + "loc.messages.ExtractNonExistFile": "Error al extraer el archivo: %s porque no existe.", + "loc.messages.ExtractDirFailed": "Error al extraer el archivo: %s porque es un directorio.", + "loc.messages.CreateTempDir": "Creando la carpeta temporal: %s para descomprimir: %s", + "loc.messages.TempDir": "tempFolder = %s", + "loc.messages.DecompressedTempTar": "Archivo tar temporal descomprimido de: %s a: %s", + "loc.messages.RemoveTempDir": "Quitando la carpeta temporal: %s", + "loc.messages.ExtractFailedCannotCreate": "Error al extraer el archivo: %s porque no se pudo crear la ubicación temporal: %s", + "loc.messages.NoFilesFound": "No se encontró ningún archivo con los patrones de archivo especificados.", + "loc.messages.FoundFiles": "Se encontraron: %d archivos para extraer:", + "loc.messages.CleanDestDir": "Limpiando la carpeta de destino antes de la extracción: %s", + "loc.messages.CreateDestDir": "Creando la carpeta de destino: %s", + "loc.messages.SucceedMsg": "Todos los archivos se extrajeron correctamente." +} \ No newline at end of file diff --git a/_generated/ExtractFilesV1_Node20/Strings/resources.resjson/fr-FR/resources.resjson b/_generated/ExtractFilesV1_Node20/Strings/resources.resjson/fr-FR/resources.resjson new file mode 100644 index 000000000000..fa81c04c0889 --- /dev/null +++ b/_generated/ExtractFilesV1_Node20/Strings/resources.resjson/fr-FR/resources.resjson @@ -0,0 +1,40 @@ +{ + "loc.friendlyName": "Extraire des fichiers", + "loc.helpMarkDown": "[En savoir plus sur cette tâche](https://go.microsoft.com/fwlink/?LinkId=800269)", + "loc.description": "Extrayez divers fichiers d'archives et fichiers de compression tels que .7z, .rar, .tar.gz et .zip", + "loc.instanceNameFormat": "Extraire les fichiers $(message)", + "loc.input.label.archiveFilePatterns": "Archiver les modèles de fichiers", + "loc.input.help.archiveFilePatterns": "Chemins de fichiers ou modèles des fichiers d'archives à extraire. Prend en charge plusieurs lignes de modèles minimatch. [Plus d'informations](https://go.microsoft.com/fwlink/?LinkId=800269)", + "loc.input.label.destinationFolder": "Dossier de destination", + "loc.input.help.destinationFolder": "Dossier de destination dans lequel les fichiers d'archives doivent être extraits. Utilisez des [variables](https://go.microsoft.com/fwlink/?LinkID=550988), si les fichiers ne sont pas dans le dépôt. Exemple : $(agent.builddirectory)", + "loc.input.label.cleanDestinationFolder": "Nettoyer le dossier de destination avant l'extraction", + "loc.input.help.cleanDestinationFolder": "Sélectionnez cette option pour nettoyer le répertoire de destination avant d'y extraire le contenu d'archive.", + "loc.input.label.overwriteExistingFiles": "Remplacer les fichiers existants", + "loc.input.help.overwriteExistingFiles": "Sélectionnez cette option pour remplacer les fichiers existants dans le répertoire de destination.", + "loc.input.label.pathToSevenZipTool": "Chemin d’accès à l’utilitaire 7z", + "loc.input.help.pathToSevenZipTool": "Vous pouvez spécifier un chemin personnalisé pour l’utilitaire 7z. Par exemple, « C:\\7z\\7z.exe » sur Windows et « /usr/local/bin/7z » sur MacOS/Ugrouptu.", + "loc.messages.ExtractDirFailedinFindFiles": "Archive spécifiée : %s ne peut pas être extrait, car il s'agit d'un répertoire.", + "loc.messages.ExtractNotFileFailed": "L'archive spécifiée %s ne peut pas être extraite, car il ne s'agit pas d'un fichier.", + "loc.messages.ExtractNotAccessibleFile": "L'archive spécifiée %s ne peut pas être extraite, car elle n'est pas accessible : %s", + "loc.messages.SearchInDir": "Recherche de %s sous le répertoire %s", + "loc.messages.SearchNonExistDir": "La recherche a échoué, car le répertoire de recherche spécifié %s n'existe pas.", + "loc.messages.SearchNonDir": "La recherche a échoué, car le répertoire de recherche spécifié %s n'est pas un répertoire.", + "loc.messages.NoSearchPatternPath": "Aucun chemin spécifié pour le modèle de recherche : %s. Chemin par défaut : %s", + "loc.messages.ResolveRelativePath": "Chemin relatif du fichier %s résolu en %s", + "loc.messages.UnzipExtractFile": "Extraction du fichier : %s", + "loc.messages.SevenZipExtractFile": "Extraction du fichier : %s", + "loc.messages.TarExtractFile": "Extraction du fichier : %s", + "loc.messages.ExtractFileFailedMsg": "Échec de l'extraction pour le fichier %s \nCode : %d \nstdout : %s \nstderr : %s \nErreur : %s;", + "loc.messages.ExtractNonExistFile": "Échec de l'extraction du fichier %s , car il n'existe pas.", + "loc.messages.ExtractDirFailed": "Échec de l'extraction du fichier %s, car il s'agit d'un répertoire.", + "loc.messages.CreateTempDir": "Création du dossier temporaire %s à décompresser : %s", + "loc.messages.TempDir": "tempFolder = %s", + "loc.messages.DecompressedTempTar": "Fichier temporaire .tar décompressé de %s à %s", + "loc.messages.RemoveTempDir": "Suppression du fichier temporaire : %s", + "loc.messages.ExtractFailedCannotCreate": "Échec de l'extraction du fichier %s, car l'emplacement temporaire n'a pas pu être créé : %s", + "loc.messages.NoFilesFound": "Aucune archive n'a été trouvée à l'aide des modèles de fichier spécifiés", + "loc.messages.FoundFiles": "%d fichiers à extraire trouvés :", + "loc.messages.CleanDestDir": "Nettoyage du dossier de destination avant l'extraction : %s", + "loc.messages.CreateDestDir": "Création du dossier de destination : %s", + "loc.messages.SucceedMsg": "Extraction réussie de tous les fichiers." +} \ No newline at end of file diff --git a/_generated/ExtractFilesV1_Node20/Strings/resources.resjson/it-IT/resources.resjson b/_generated/ExtractFilesV1_Node20/Strings/resources.resjson/it-IT/resources.resjson new file mode 100644 index 000000000000..54dd4554350f --- /dev/null +++ b/_generated/ExtractFilesV1_Node20/Strings/resources.resjson/it-IT/resources.resjson @@ -0,0 +1,40 @@ +{ + "loc.friendlyName": "Estrai file", + "loc.helpMarkDown": "[Altre informazioni su questa attività](https://go.microsoft.com/fwlink/?LinkId=800269)", + "loc.description": "Consente di estrarre una vasta gamma di file di archivio e di compressione, come .7z, .rar, .tar.gz e .zip", + "loc.instanceNameFormat": "Estrai file $(message)", + "loc.input.label.archiveFilePatterns": "Criteri dei file di archivio", + "loc.input.help.archiveFilePatterns": "Criteri o percorsi dei file di archivio da estrarre. Sono supportate più righe di criteri di corrispondenza minima. [Altre informazioni](https://go.microsoft.com/fwlink/?LinkId=800269)", + "loc.input.label.destinationFolder": "Cartella di destinazione", + "loc.input.help.destinationFolder": "Cartella di destinazione in cui devono essere estratti i file di archivio. Usare [variabili](https://go.microsoft.com/fwlink/?LinkID=550988) se i file non sono presenti nel repository. Esempio: $(agent.builddirectory)", + "loc.input.label.cleanDestinationFolder": "Pulisci la cartella di destinazione prima dell'estrazione", + "loc.input.help.cleanDestinationFolder": "Selezionare questa opzione per pulire la directory di destinazione prima di estrarvi il contenuto dell'archivio.", + "loc.input.label.overwriteExistingFiles": "Sovrascrivi file esistenti", + "loc.input.help.overwriteExistingFiles": "Selezionare questa opzione per sovrascrivere i file esistenti nella directory di destinazione.", + "loc.input.label.pathToSevenZipTool": "Percorso dell'utilità 7z", + "loc.input.help.pathToSevenZipTool": "È possibile specificare un percorso personalizzato per l'utilità 7z. Ad esempio, \"C:\\7z\\7z.exe\" on Windows and \"/usr/local/bin/7z\" in MacOS/Ubuntu.", + "loc.messages.ExtractDirFailedinFindFiles": "Non è possibile estrarre l'archivio specificato %s perché è una directory.", + "loc.messages.ExtractNotFileFailed": "Non è possibile estrarre l'archivio specificato %s perché non è un file.", + "loc.messages.ExtractNotAccessibleFile": "Non è possibile estrarre l'archivio specificato %s perché non è accessibile: %s", + "loc.messages.SearchInDir": "Ricerca di %s nella directory %s", + "loc.messages.SearchNonExistDir": "La ricerca non è riuscita perché la directory di ricerca specificata %s non esiste.", + "loc.messages.SearchNonDir": "La ricerca non è riuscita perché la directory di ricerca specificata %s non è una directory.", + "loc.messages.NoSearchPatternPath": "Non è stato specificato alcun percorso per i criteri di ricerca: %s. Per impostazione predefinita verrà usato %s", + "loc.messages.ResolveRelativePath": "Risoluzione del percorso relativo del file %s in %s", + "loc.messages.UnzipExtractFile": "Estrazione del file: %s", + "loc.messages.SevenZipExtractFile": "Estrazione del file: %s", + "loc.messages.TarExtractFile": "Estrazione del file: %s", + "loc.messages.ExtractFileFailedMsg": "L'estrazione del file %s non è riuscita\nCodice: %d \nStdout: %s \nStderr: %s \nErrore: %s;", + "loc.messages.ExtractNonExistFile": "L'estrazione del file %s non è riuscita perché non esiste.", + "loc.messages.ExtractDirFailed": "L'estrazione del file %s non è riuscita perché è una directory.", + "loc.messages.CreateTempDir": "Creazione della cartella temporanea %s per la decompressione di %s", + "loc.messages.TempDir": "tempFolder = %s", + "loc.messages.DecompressedTempTar": "Il file TAR temporaneo è stato decompresso da %s in %s", + "loc.messages.RemoveTempDir": "Rimozione della cartella temporanea: %s", + "loc.messages.ExtractFailedCannotCreate": "L'estrazione del file %s perché non è stato possibile trovare il percorso temporaneo: %s", + "loc.messages.NoFilesFound": "Non è stato trovato alcun archivio usando i criteri dei file specificati", + "loc.messages.FoundFiles": "Sono stati trovati %d file da estrarre:", + "loc.messages.CleanDestDir": "Pulizia della cartella di destinazione prima dell'estrazione: %s", + "loc.messages.CreateDestDir": "Creazione della cartella di destinazione: %s", + "loc.messages.SucceedMsg": "Sono stati estratti tutti i file." +} \ No newline at end of file diff --git a/_generated/ExtractFilesV1_Node20/Strings/resources.resjson/ja-JP/resources.resjson b/_generated/ExtractFilesV1_Node20/Strings/resources.resjson/ja-JP/resources.resjson new file mode 100644 index 000000000000..755c1f24b527 --- /dev/null +++ b/_generated/ExtractFilesV1_Node20/Strings/resources.resjson/ja-JP/resources.resjson @@ -0,0 +1,40 @@ +{ + "loc.friendlyName": "ファイルの抽出", + "loc.helpMarkDown": "[このタスクの詳細を表示](https://go.microsoft.com/fwlink/?LinkId=800269)", + "loc.description": ".7z、.rar、.tar.gz、.zip などのさまざまなアーカイブ ファイルと圧縮ファイルを抽出します", + "loc.instanceNameFormat": "ファイルの抽出 $(message)", + "loc.input.label.archiveFilePatterns": "アーカイブ ファイルのパターン", + "loc.input.help.archiveFilePatterns": "抽出するアーカイブ ファイルのファイル パスまたはパターン。複数行の minimatch パターンをサポートします。[詳細情報](https://go.microsoft.com/fwlink/?LinkId=800269)", + "loc.input.label.destinationFolder": "宛先フォルダー", + "loc.input.help.destinationFolder": "アーカイブ ファイルを抽出する宛先フォルダー。ファイルがリポジトリにない場合には [variables](https://go.microsoft.com/fwlink/?LinkID=550988) を使用します。例: $(agent.builddirectory)", + "loc.input.label.cleanDestinationFolder": "抽出前に宛先フォルダーを空にする", + "loc.input.help.cleanDestinationFolder": "アーカイブの内容を抽出する前に宛先ディレクトリを空にする場合、このオプションを選択します。", + "loc.input.label.overwriteExistingFiles": "既存のファイルを上書きする", + "loc.input.help.overwriteExistingFiles": "宛先ディレクトリ内の既存のファイルを上書きするには、このオプションを選択します。", + "loc.input.label.pathToSevenZipTool": ".7z ユーティリティへのパス", + "loc.input.help.pathToSevenZipTool": ".7z ユーティリティへのカスタムパスを指定できます。例: Windows 上の \"C:\\7z\\7z.exe\"、MacOS/Ubuntu 上の \"/usr/local/bin/7z\"。", + "loc.messages.ExtractDirFailedinFindFiles": "指定されたアーカイブ %s はディレクトリなので抽出できません。", + "loc.messages.ExtractNotFileFailed": "指定されたアーカイブ %s は、ファイルではないので抽出できません。", + "loc.messages.ExtractNotAccessibleFile": "指定されたアーカイブ %s は、アクセスできないので抽出できません: %s", + "loc.messages.SearchInDir": "次のディレクトリ下で %s を検索しています: %s", + "loc.messages.SearchNonExistDir": "指定された検索ディレクトリ %s がないので、検索できませんでした。", + "loc.messages.SearchNonDir": "指定された検索ディレクトリ %s はディレクトリではないので、検索できませんでした。", + "loc.messages.NoSearchPatternPath": "次を既定とする検索パターン %s に関するパスが指定されていません: %s", + "loc.messages.ResolveRelativePath": "相対ファイル パス %s の解決先: %s", + "loc.messages.UnzipExtractFile": "次のファイルを抽出しています: %s", + "loc.messages.SevenZipExtractFile": "次のファイルを抽出しています: %s", + "loc.messages.TarExtractFile": "次のファイルを抽出しています: %s", + "loc.messages.ExtractFileFailedMsg": "次のファイルを抽出できませんでした: %s \ncode: %d \nstdout: %s \nstderr: %s \nerror: %s;", + "loc.messages.ExtractNonExistFile": "ファイル %s がないので抽出できませんでした。", + "loc.messages.ExtractDirFailed": "ファイル: %s はディレクトリなので抽出できませんでした。", + "loc.messages.CreateTempDir": "展開するための一時フォルダー %s を作成しています: %s", + "loc.messages.TempDir": "tempFolder = %s", + "loc.messages.DecompressedTempTar": "一時 tar を %s から %s に展開しました", + "loc.messages.RemoveTempDir": "一時フォルダーを削除しています: %s", + "loc.messages.ExtractFailedCannotCreate": "一時保存場所を作成できなかったので、ファイル %s を抽出できませんでした: %s", + "loc.messages.NoFilesFound": "指定されたファイル パターンを使用しているアーカイブは見つかりませんでした", + "loc.messages.FoundFiles": "抽出対象の %d 個のファイルが見つかりました:", + "loc.messages.CleanDestDir": "抽出前に宛先フォルダーをクリーニングしています: %s", + "loc.messages.CreateDestDir": "宛先フォルダーを作成しています: %s", + "loc.messages.SucceedMsg": "すべてのファイルが正常に抽出されました。" +} \ No newline at end of file diff --git a/_generated/ExtractFilesV1_Node20/Strings/resources.resjson/ko-KR/resources.resjson b/_generated/ExtractFilesV1_Node20/Strings/resources.resjson/ko-KR/resources.resjson new file mode 100644 index 000000000000..247f5ce1a464 --- /dev/null +++ b/_generated/ExtractFilesV1_Node20/Strings/resources.resjson/ko-KR/resources.resjson @@ -0,0 +1,40 @@ +{ + "loc.friendlyName": "파일 추출", + "loc.helpMarkDown": "[이 작업에 대한 자세한 정보](https://go.microsoft.com/fwlink/?LinkId=800269)", + "loc.description": ".7z, .rar, .tar.gz, .zip 등의 다양한 보관 파일 및 압축 파일을 추출합니다.", + "loc.instanceNameFormat": "파일 풀기 $(message)", + "loc.input.label.archiveFilePatterns": "보관 파일 패턴", + "loc.input.help.archiveFilePatterns": "풀고자 하는 보관 파일의 파일 경로 또는 패턴입니다. 여러 줄로 된 minimatch 패턴을 지원합니다. [자세한 정보](https://go.microsoft.com/fwlink/?LinkId=800269)", + "loc.input.label.destinationFolder": "대상 폴더", + "loc.input.help.destinationFolder": "보관 파일을 풀게 될 대상 폴더입니다. 파일이 리포에 없으면 [변수](https://go.microsoft.com/fwlink/?LinkID=550988)를 사용하세요. 예: $(agent.builddirectory)", + "loc.input.label.cleanDestinationFolder": "풀기 전에 대상 폴더 정리", + "loc.input.help.cleanDestinationFolder": "보관 파일 콘텐츠를 대상 디렉터리에 풀기 전에 대상 디렉터리를 정리하려면 이 옵션을 선택합니다.", + "loc.input.label.overwriteExistingFiles": "기존 파일 덮어쓰기", + "loc.input.help.overwriteExistingFiles": "대상 디렉터리에 있는 기존 파일을 덮어쓰려면 이 옵션을 선택합니다.", + "loc.input.label.pathToSevenZipTool": "7z 유틸리티 경로", + "loc.input.help.pathToSevenZipTool": "7z 유틸리티에 대한 사용자 지정 경로를 지정할 수 있습니다. 예를 들면, Windows의 \"C:\\7z\\7z.exe\" 및 MacOS/Ubuntu의 “/usr/local/bin/7z\"입니다.", + "loc.messages.ExtractDirFailedinFindFiles": "지정된 보관 파일 %s은(는) 디렉터리이므로 압축할 수 없습니다.", + "loc.messages.ExtractNotFileFailed": "지정한 보관 파일 %s은(는) 파일이 아니므로 압축할 수 없습니다.", + "loc.messages.ExtractNotAccessibleFile": "지정한 보관 파일 %s은(는) 액세스할 수 없으므로 압축할 수 없습니다. %s", + "loc.messages.SearchInDir": "%s을(를) %s 디렉터리에서 검색하는 중입니다.", + "loc.messages.SearchNonExistDir": "지정한 검색 디렉터리 %s이(가) 없어서 검색하지 못했습니다.", + "loc.messages.SearchNonDir": "지정한 검색 디렉터리 %s이(가) 디렉터리가 아니어서 검색하지 못했습니다.", + "loc.messages.NoSearchPatternPath": "%s 검색 패턴의 경로를 지정하지 않아서 기본 설정 %s이(가) 사용됩니다.", + "loc.messages.ResolveRelativePath": "상대 파일 경로 %s을(를) %s(으)로 확인하는 중입니다.", + "loc.messages.UnzipExtractFile": "파일 압축을 푸는 중: %s", + "loc.messages.SevenZipExtractFile": "파일 압축을 푸는 중: %s", + "loc.messages.TarExtractFile": "파일 압축을 푸는 중: %s", + "loc.messages.ExtractFileFailedMsg": "%s 파일을 압축하지 못했습니다. \n코드: %d \nstdout: %s \nstderr: %s \n오류: %s;", + "loc.messages.ExtractNonExistFile": "%s 파일은 없으므로 압축하지 못했습니다.", + "loc.messages.ExtractDirFailed": "%s 파일은 디렉터리이므로 압축을 풀지 못했습니다.", + "loc.messages.CreateTempDir": "압축을 풀 임시 폴더 %s을(를) 만드는 중입니다. %s", + "loc.messages.TempDir": "tempFolder = %s", + "loc.messages.DecompressedTempTar": "%s에 있는 임시 tar 파일의 압축을 %s(으)로 풀었습니다.", + "loc.messages.RemoveTempDir": "임시 폴더를 제거하는 중입니다. %s", + "loc.messages.ExtractFailedCannotCreate": "임시 위치를 만들 수 없으므로 %s 파일을 압축하지 못했습니다. %s", + "loc.messages.NoFilesFound": "지정된 파일 패턴을 사용하여 보관 파일을 찾을 수 없음", + "loc.messages.FoundFiles": "압축할 %d개 파일을 찾았습니다.", + "loc.messages.CleanDestDir": "압축 전에 대상 폴더를 지우는 중입니다. %s", + "loc.messages.CreateDestDir": "대상 폴더를 지우는 중입니다. %s", + "loc.messages.SucceedMsg": "모든 파일을 압축했습니다." +} \ No newline at end of file diff --git a/_generated/ExtractFilesV1_Node20/Strings/resources.resjson/ru-RU/resources.resjson b/_generated/ExtractFilesV1_Node20/Strings/resources.resjson/ru-RU/resources.resjson new file mode 100644 index 000000000000..61554982c421 --- /dev/null +++ b/_generated/ExtractFilesV1_Node20/Strings/resources.resjson/ru-RU/resources.resjson @@ -0,0 +1,40 @@ +{ + "loc.friendlyName": "Извлечь файлы", + "loc.helpMarkDown": "[См. дополнительные сведения об этой задаче](https://go.microsoft.com/fwlink/?LinkId=800269)", + "loc.description": "Извлечение различных файлов архивов и сжатых файлов, таких как 7Z, RAR, TAR.GZ и ZIP", + "loc.instanceNameFormat": "Извлечь файлы $(message)", + "loc.input.label.archiveFilePatterns": "Шаблоны файлов архивов", + "loc.input.help.archiveFilePatterns": "Пути к файлам или шаблоны файлов архивов для извлечения. Поддерживает несколько строк шаблонов minimatch. [Подробнее...](https://go.microsoft.com/fwlink/?LinkId=800269)", + "loc.input.label.destinationFolder": "Папка назначения", + "loc.input.help.destinationFolder": "Папка назначения, в которую будут извлечены файлы архива. Если в репозитории нет файлов, используйте [переменные](https://go.microsoft.com/fwlink/?LinkID=550988). Пример: $(agent.builddirectory)", + "loc.input.label.cleanDestinationFolder": "Очистить папку назначения перед извлечением", + "loc.input.help.cleanDestinationFolder": "Выберите этот параметр, чтобы очистить каталог назначения до извлечения в него содержимого архива.", + "loc.input.label.overwriteExistingFiles": "Переписать существующие файлы", + "loc.input.help.overwriteExistingFiles": "Выберите этот параметр, чтобы перезаписать существующие файлы в целевом каталоге.", + "loc.input.label.pathToSevenZipTool": "Путь к служебной программе 7z", + "loc.input.help.pathToSevenZipTool": "Вы можете указать пользовательский путь к служебной программе 7z. Например, \"C:\\7z\\7z.exe\" в Windows и \"/usr/local/bin/7z\" в MacOS/Ubuntu.", + "loc.messages.ExtractDirFailedinFindFiles": "Указанный архив %s невозможно извлечь, так как он является каталогом.", + "loc.messages.ExtractNotFileFailed": "Указанный архив %s невозможно извлечь, так как он не является файлом.", + "loc.messages.ExtractNotAccessibleFile": "Указанный архив %s невозможно извлечь, так как он недоступен: %s", + "loc.messages.SearchInDir": "Поиск %s в каталоге: %s", + "loc.messages.SearchNonExistDir": "Произошел сбой поиска; указанный каталог поиска не существует: %s", + "loc.messages.SearchNonDir": "Произошел сбой поиска; указанный каталог поиска не является каталогом: %s", + "loc.messages.NoSearchPatternPath": "Не указан путь для шаблона поиска: %s, по умолчанию используется %s", + "loc.messages.ResolveRelativePath": "Относительный путь файла: %s разрешается в: %s", + "loc.messages.UnzipExtractFile": "Извлекается файл: %s", + "loc.messages.SevenZipExtractFile": "Извлекается файл: %s", + "loc.messages.TarExtractFile": "Извлекается файл: %s", + "loc.messages.ExtractFileFailedMsg": "Сбой извлечения файла: %s \ncode: %d \nstdout: %s \nstderr: %s \nerror: %s;", + "loc.messages.ExtractNonExistFile": "Произошел сбой извлечения файла: %s, так как он не существует.", + "loc.messages.ExtractDirFailed": "Произошел сбой извлечения файла: %s, так как он является каталогом.", + "loc.messages.CreateTempDir": "Создание временной папки: %s для распаковки: %s", + "loc.messages.TempDir": "tempFolder = %s", + "loc.messages.DecompressedTempTar": "Распакован временный TAR-файл из: %s в: %s", + "loc.messages.RemoveTempDir": "Удаление временной папки: %s", + "loc.messages.ExtractFailedCannotCreate": "Произошел сбой извлечения файла: %s, так как не удалось создать временное расположение: %s", + "loc.messages.NoFilesFound": "Архивы для указанных шаблонов файлов не найдены.", + "loc.messages.FoundFiles": "Найдены файлы для извлечения (%d):", + "loc.messages.CleanDestDir": "Очистка папки назначения перед извлечением: %s", + "loc.messages.CreateDestDir": "Создание папки назначения: %s", + "loc.messages.SucceedMsg": "Все файлы успешно извлечены." +} \ No newline at end of file diff --git a/_generated/ExtractFilesV1_Node20/Strings/resources.resjson/zh-CN/resources.resjson b/_generated/ExtractFilesV1_Node20/Strings/resources.resjson/zh-CN/resources.resjson new file mode 100644 index 000000000000..5fd054047ef2 --- /dev/null +++ b/_generated/ExtractFilesV1_Node20/Strings/resources.resjson/zh-CN/resources.resjson @@ -0,0 +1,40 @@ +{ + "loc.friendlyName": "提取文件", + "loc.helpMarkDown": "[详细了解此任务](https://go.microsoft.com/fwlink/?LinkId=800269)", + "loc.description": "提取各种存档和压缩文件,例如 .7z、.rar、.tar.gz 和 .zip", + "loc.instanceNameFormat": "提取文件 $(message)", + "loc.input.label.archiveFilePatterns": "存档文件模式", + "loc.input.help.archiveFilePatterns": "要提取的存档文件的文件路径或模式。支持多行最小匹配模式。[详细信息](https://go.microsoft.com/fwlink/?LinkId=800269)", + "loc.input.label.destinationFolder": "目标文件夹", + "loc.input.help.destinationFolder": "应将存档文件提取到的目标文件夹。如果文件不位于存储库中,请使用[变量](https://go.microsoft.com/fwlink/?LinkID=550988)。示例: $(agent.builddirectory)", + "loc.input.label.cleanDestinationFolder": "在提取前清理目标文件夹", + "loc.input.help.cleanDestinationFolder": "选择此选项,在将存档文件内容提取到目标目录之前清除该目录。", + "loc.input.label.overwriteExistingFiles": "覆盖现有文件", + "loc.input.help.overwriteExistingFiles": "选择此选项可覆盖目标目录中的现有文件。", + "loc.input.label.pathToSevenZipTool": "指向 7z 实用工具的路径", + "loc.input.help.pathToSevenZipTool": "你可以指定指向 7z 实用工具的自定义路径。例如,Windows 上的 “C: \\7z\\7z.exe” 和 MacOS/Ubuntu 上的 “/usr/local/bin/7z”。", + "loc.messages.ExtractDirFailedinFindFiles": "无法提取指定的存档 %s,因为它是一个目录。", + "loc.messages.ExtractNotFileFailed": "无法提取指定的存档 %s,因为它不是文件。", + "loc.messages.ExtractNotAccessibleFile": "无法提取指定的存档 %s,因为无法访问它: %s", + "loc.messages.SearchInDir": "正在搜索: %s (位于目录 %s 中)", + "loc.messages.SearchNonExistDir": "搜索失败,因为指定的搜索目录 %s 不存在。", + "loc.messages.SearchNonDir": "搜索失败,因为指定的搜索目录 %s 不是一个目录。", + "loc.messages.NoSearchPatternPath": "搜索模式 %s 未指定任何路径,默认值为: %s", + "loc.messages.ResolveRelativePath": "相对文件路径: %s 解析为: %s", + "loc.messages.UnzipExtractFile": "正在提取文件: %s", + "loc.messages.SevenZipExtractFile": "正在提取文件: %s", + "loc.messages.TarExtractFile": "正在提取文件: %s", + "loc.messages.ExtractFileFailedMsg": "文件 %s 提取失败 \n代码: %d \nStdOut: %s \nstderr: %s \n错误: %s;", + "loc.messages.ExtractNonExistFile": "文件 %s 提取失败,因为它不存在。", + "loc.messages.ExtractDirFailed": "文件 %s 提取失败,因为该文件是一个目录。", + "loc.messages.CreateTempDir": "创建临时文件夹 %s 以解压缩 %s", + "loc.messages.TempDir": "tempFolder = %s", + "loc.messages.DecompressedTempTar": "已将临时 tar 从 %s 解压缩到 %s", + "loc.messages.RemoveTempDir": "正在删除临时文件夹: %s", + "loc.messages.ExtractFailedCannotCreate": "文件 %s 提取失败,因为无法创建临时位置 %s", + "loc.messages.NoFilesFound": "找不到使用指定文件模式的存档", + "loc.messages.FoundFiles": "发现 %d 个要提取的文件:", + "loc.messages.CleanDestDir": "提取前需清理目标文件夹: %s", + "loc.messages.CreateDestDir": "创建目标文件夹: %s", + "loc.messages.SucceedMsg": "已成功提取所有文件。" +} \ No newline at end of file diff --git a/_generated/ExtractFilesV1_Node20/Strings/resources.resjson/zh-TW/resources.resjson b/_generated/ExtractFilesV1_Node20/Strings/resources.resjson/zh-TW/resources.resjson new file mode 100644 index 000000000000..99d0ef3cd9c7 --- /dev/null +++ b/_generated/ExtractFilesV1_Node20/Strings/resources.resjson/zh-TW/resources.resjson @@ -0,0 +1,40 @@ +{ + "loc.friendlyName": "解壓縮檔案", + "loc.helpMarkDown": "[深入了解此工作](https://go.microsoft.com/fwlink/?LinkId=800269)", + "loc.description": "解壓縮各種封存檔與壓縮檔,例如 .7z、.rar、.tar.gz 及 .zip", + "loc.instanceNameFormat": "解壓縮檔案 $(message)", + "loc.input.label.archiveFilePatterns": "封存檔樣式", + "loc.input.help.archiveFilePatterns": "要解壓縮之封存檔的檔案路徑或樣式。支援多行的 minimatch 樣式。[詳細資訊](https://go.microsoft.com/fwlink/?LinkId=800269)", + "loc.input.label.destinationFolder": "目的資料夾", + "loc.input.help.destinationFolder": "用以解壓縮後之封存檔的目的資料夾。若檔案不在存放庫中,請使用 [變數](https://go.microsoft.com/fwlink/?LinkID=550988)。例如: $(agent.builddirectory)", + "loc.input.label.cleanDestinationFolder": "清理目的地資料後再解壓縮", + "loc.input.help.cleanDestinationFolder": "選取此選項可先清理目的地目錄,然後再將封存檔內容解壓縮到其中。", + "loc.input.label.overwriteExistingFiles": "覆寫現有的檔案", + "loc.input.help.overwriteExistingFiles": "選取此選項可覆寫目的地目錄中的現有檔案。", + "loc.input.label.pathToSevenZipTool": "7z 公用程式的路徑", + "loc.input.help.pathToSevenZipTool": "您可以指定 7z 公用程式的自訂路徑。例如,在 Windows 上為 \"C:\\7z\\7z.exe\",在 MacOS/Ubuntu 上為 \"/usr/local/bin/7z\"。", + "loc.messages.ExtractDirFailedinFindFiles": "因為指定的封存 %s 為目錄,所以解壓縮失敗。", + "loc.messages.ExtractNotFileFailed": "因為指定的封存 %s 不是檔案,所以無法予以解壓縮。", + "loc.messages.ExtractNotAccessibleFile": "因為無法存取指定的封存 %s,所以無法予以解壓縮: %s", + "loc.messages.SearchInDir": "正在搜尋 %s,於目錄 %s 下", + "loc.messages.SearchNonExistDir": "因為指定的搜尋目錄 %s 不存在,所以搜尋失敗。", + "loc.messages.SearchNonDir": "因為指定的搜尋目錄 %s 不是目錄,所以搜尋失敗。", + "loc.messages.NoSearchPatternPath": "搜尋模式 %s 沒有指定的路徑,將預設為: %s", + "loc.messages.ResolveRelativePath": "正在將相對檔案路徑 %s 解析為 %s", + "loc.messages.UnzipExtractFile": "正在解壓縮檔案: %s", + "loc.messages.SevenZipExtractFile": "正在解壓縮檔案: %s", + "loc.messages.TarExtractFile": "正在解壓縮檔案: %s", + "loc.messages.ExtractFileFailedMsg": "檔案 %s 解壓縮失敗\n代碼: %d\nStdOut: %s\nSTDERR: %s\n錯誤: %s;", + "loc.messages.ExtractNonExistFile": "因為檔案 %s 不存在,所以解壓縮失敗。", + "loc.messages.ExtractDirFailed": "因為檔案 %s 為目錄,所以解壓縮失敗。", + "loc.messages.CreateTempDir": "正在建立暫存資料夾 %s 以解壓縮 %s", + "loc.messages.TempDir": "tempFolder = %s", + "loc.messages.DecompressedTempTar": "已將暫存 tar 從 %s 解壓縮至 %s", + "loc.messages.RemoveTempDir": "正在移除暫存資料夾: %s", + "loc.messages.ExtractFailedCannotCreate": "因為無法建立暫存位置,所以檔案 %s 解壓縮失敗: %s", + "loc.messages.NoFilesFound": "使用指定的檔案模式找不到任何封存", + "loc.messages.FoundFiles": "找到 %d 個可解壓縮的檔案:", + "loc.messages.CleanDestDir": "正於擷取前清理目的地資料夾: %s", + "loc.messages.CreateDestDir": "正在建立目的地資料夾: %s", + "loc.messages.SucceedMsg": "已成功解壓縮所有檔案。" +} \ No newline at end of file diff --git a/_generated/ExtractFilesV1_Node20/Tests/L0.ts b/_generated/ExtractFilesV1_Node20/Tests/L0.ts new file mode 100644 index 000000000000..35a002b1fa0c --- /dev/null +++ b/_generated/ExtractFilesV1_Node20/Tests/L0.ts @@ -0,0 +1,171 @@ +import assert = require('assert'); +import path = require('path'); +import * as ttm from 'azure-pipelines-task-lib/mock-test'; + + +describe('ExtractFile Suite', function () { + this.timeout(60000); + + function runValidations(validator: () => void, tr, done) { + try { + validator(); + done(); + } + catch (error) { + console.log("STDERR", tr.stderr); + console.log("STDOUT", tr.stdout); + done(error); + } + } + + it('Successfully extracts a single zip', (done: Mocha.Done) => { + this.timeout(5000); + process.env['archiveFilePatterns'] = 'zip1.zip'; + process.env['overwriteExistingFiles'] = 'true'; + delete process.env['cleanDestinationFolder']; + + let tp: string = path.join(__dirname, 'L0Extract.js'); + let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + runValidations(() => { + assert(tr.stdout.indexOf('extracted zip1') > -1); + }, tr, done); + }); + + it('Successfully extracts multiple zips', (done: Mocha.Done) => { + this.timeout(5000); + process.env['archiveFilePatterns'] = 'zip1.zip\nzip2.zip'; + process.env['overwriteExistingFiles'] = 'true'; + delete process.env['cleanDestinationFolder']; + + let tp: string = path.join(__dirname, 'L0Extract.js'); + let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + runValidations(() => { + assert(tr.stdout.indexOf('extracted zip1') > -1); + assert(tr.stdout.indexOf('extracted zip2') > -1); + }, tr, done); + }); + + it('Successfully extracts a tar', (done: Mocha.Done) => { + this.timeout(5000); + process.env['archiveFilePatterns'] = 'tar.tar'; + process.env['overwriteExistingFiles'] = 'true'; + delete process.env['cleanDestinationFolder']; + + let tp: string = path.join(__dirname, 'L0Extract.js'); + let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + runValidations(() => { + assert(tr.stdout.indexOf('extracted tar') > -1); + }, tr, done); + }); + + it('Successfully cleans destination', (done: Mocha.Done) => { + this.timeout(5000); + process.env['archiveFilePatterns'] = 'zip1.zip'; + process.env['overwriteExistingFiles'] = 'true'; + process.env['cleanDestinationFolder'] = 'true'; + + let tp: string = path.join(__dirname, 'L0Extract.js'); + let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + runValidations(() => { + assert(tr.stdout.indexOf('extracted zip1') > -1); + assert(tr.stdout.indexOf('Removing ' + __dirname) > -1); + }, tr, done); + }); + + it('Successfully overwrites files from zip in output directory', (done: Mocha.Done) => { + this.timeout(5000); + process.env['archiveFilePatterns'] = 'zip1.zip'; + process.env['overwriteExistingFiles'] = 'true'; + delete process.env['cleanDestinationFolder']; + + let tp: string = path.join(__dirname, 'L0Extract.js'); + let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + // run it twice to check files that was created during first run will be overwritten + tr.run(); + tr.run(); + + runValidations(() => { + assert(tr.stdout.indexOf('extracted zip1') > -1); + }, tr, done); + }); + + it('Successfully overwrites files from tar in output directory', (done: Mocha.Done) => { + this.timeout(5000); + process.env['archiveFilePatterns'] = 'tar.tar'; + process.env['overwriteExistingFiles'] = 'true'; + delete process.env['cleanDestinationFolder']; + + let tp: string = path.join(__dirname, 'L0Extract.js'); + let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + // run it twice to check files that was created during first run will be overwritten + tr.run(); + tr.run(); + + runValidations(() => { + assert(tr.stdout.indexOf('extracted tar') > -1); + }, tr, done); + }); + + it('Successfully extracts a 7z', (done: Mocha.Done) => { + this.timeout(5000); + process.env['archiveFilePatterns'] = 'zip3.7z'; + process.env['overwriteExistingFiles'] = 'true'; + delete process.env['cleanDestinationFolder']; + + let tp: string = path.join(__dirname, 'L0Extract.js'); + let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + runValidations(() => { + assert(tr.stdout.indexOf('extracted 7z') > -1); + }, tr, done); + }); + + it('User is able to setup custom path to 7z', (done: Mocha.Done) => { + this.timeout(5000); + process.env['archiveFilePatterns'] = 'zip3.7z'; + process.env['overwriteExistingFiles'] = 'true'; + delete process.env['cleanDestinationFolder']; + process.env['pathToSevenZipTool'] = 'custom/7z/path'; + + let tp: string = path.join(__dirname, 'L07zFromDifferentLocations.js'); + let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + runValidations(() => { + assert(tr.stderr.length == 0, tr.stderr); + }, tr, done); + }); + + it('Default path is used for 7z tool', (done: Mocha.Done) => { + this.timeout(5000); + process.env['archiveFilePatterns'] = 'zip3.7z'; + process.env['overwriteExistingFiles'] = 'true'; + delete process.env['cleanDestinationFolder']; + + let tp: string = path.join(__dirname, 'L07zFromDifferentLocations.js'); + let tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + runValidations(() => { + assert(tr.stderr.length == 0, tr.stderr); + }, tr, done); + }); +}); diff --git a/_generated/ExtractFilesV1_Node20/Tests/L07zFromDifferentLocations.ts b/_generated/ExtractFilesV1_Node20/Tests/L07zFromDifferentLocations.ts new file mode 100644 index 000000000000..140ed31a8b07 --- /dev/null +++ b/_generated/ExtractFilesV1_Node20/Tests/L07zFromDifferentLocations.ts @@ -0,0 +1,106 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import fs = require('fs'); +import path = require('path'); +import os = require('os'); + +enum Platform { + Windows = 0, + MacOS = 1, + Linux = 2 +} + +let taskPath = path.join(__dirname, '..', 'extractfilestask.js'); +let tmr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +process.env['SYSTEM_DEFAULTWORKINGDIRECTORY'] = __dirname; + +tmr.setInput('archiveFilePatterns', process.env['archiveFilePatterns']); +tmr.setInput('destinationFolder', __dirname); +tmr.setInput('cleanDestinationFolder', process.env['cleanDestinationFolder']); +tmr.setInput('overwriteExistingFiles', process.env['overwriteExistingFiles']); +tmr.setInput('pathToSevenZipTool', process.env['pathToSevenZipTool']); + +let osType: Platform; +switch (os.type()) { + case 'Linux': + osType = Platform.Linux; + break; + case 'Darwin': + osType = Platform.MacOS; + break; + case 'Windows_NT': + osType = Platform.Windows; + break; + default: + throw Error("Unknown OS type"); +} +const isWindows: boolean = osType == Platform.Windows; + +//Create osType, stats mocks, support not added in this version of task-lib +const tl = require('azure-pipelines-task-lib/mock-task'); +const tlClone = Object.assign({}, tl); +tlClone.getPlatform = function() { + return osType; +}; +tlClone.stats = function(path) { + return fs.statSync(path); +}; +tlClone.exist = function(path) { + // Copied from task-lib + var exist = false; + try { + exist = !!(path && fs.statSync(path) != null); + } catch (err) { + if (err && err.code === 'ENOENT') { + exist = false; + } else { + throw err; + } + } + return exist; +}; +tlClone.rmRF = function(path) { + console.log('Removing ' + path); +}; +tmr.registerMock('azure-pipelines-task-lib/mock-task', tlClone); + +let zipExecutable = path.join(__dirname, '..', '7zip', '7z.exe'); +let sevenZip1Command: string = `${process.env['pathToSevenZipTool']} -aoa x -o${__dirname} ${path.join(__dirname, 'zip3.7z')}`; +let sevenZip2Command: string = `${zipExecutable} -aoa x -o${__dirname} ${path.join(__dirname, 'zip3.7z')}`; +if (!isWindows) { + zipExecutable = 'path/to/7z' + sevenZip1Command = `${process.env['pathToSevenZipTool']} -aoa x -o${__dirname} ${path.join(__dirname, 'zip3.7z')}`; + sevenZip2Command = `${zipExecutable} -aoa x -o${__dirname} ${path.join(__dirname, 'zip3.7z')}`; +} + +let a: ma.TaskLibAnswers; +if (isWindows) { + a = { + 'exec': {} + }; +} else { + a = { + 'exec': {}, + 'which': { + '7z': 'path/to/7z' + }, + 'checkPath': { + 'path/to/7z': true + } + }; +} + +// Need to add these as seperate string since they are dynamic +a['exec'][sevenZip1Command] = { + "code": 0, + "stdout": "extracted zip3.7z" +} +a['exec'][sevenZip2Command] = { + "code": 0, + "stdout": "extracted zip3.7z" +} + +tmr.setAnswers(a); + +tmr.run(); diff --git a/_generated/ExtractFilesV1_Node20/Tests/L0Extract.ts b/_generated/ExtractFilesV1_Node20/Tests/L0Extract.ts new file mode 100644 index 000000000000..41f941435a11 --- /dev/null +++ b/_generated/ExtractFilesV1_Node20/Tests/L0Extract.ts @@ -0,0 +1,114 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import fs = require('fs'); +import path = require('path'); +import os = require('os'); + +enum Platform { + Windows = 0, + MacOS = 1, + Linux = 2 +} + +let taskPath = path.join(__dirname, '..', 'extractfilestask.js'); +let tmr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +process.env['SYSTEM_DEFAULTWORKINGDIRECTORY'] = __dirname; + +tmr.setInput('archiveFilePatterns', process.env['archiveFilePatterns']); +tmr.setInput('destinationFolder', __dirname); +tmr.setInput('cleanDestinationFolder', process.env['cleanDestinationFolder']); +tmr.setInput('overwriteExistingFiles', process.env['overwriteExistingFiles']); + +let osType: Platform; +switch (os.type()) { + case 'Linux': + osType = Platform.Linux; + break; + case 'Darwin': + osType = Platform.MacOS; + break; + case 'Windows_NT': + osType = Platform.Windows; + break; + default: + throw Error("Unknown OS type"); +} +const isWindows: boolean = osType == Platform.Windows; + +//Create osType, stats mocks, support not added in this version of task-lib +const tl = require('azure-pipelines-task-lib/mock-task'); +const tlClone = Object.assign({}, tl); +tlClone.getPlatform = function() { + return osType; +}; +tlClone.stats = function(path) { + return fs.statSync(path); +}; +tlClone.exist = function(path) { + // Copied from task-lib + var exist = false; + try { + exist = !!(path && fs.statSync(path) != null); + } catch (err) { + if (err && err.code === 'ENOENT') { + exist = false; + } else { + throw err; + } + } + return exist; +}; +tlClone.rmRF = function(path) { + console.log('Removing ' + path); +}; +tmr.registerMock('azure-pipelines-task-lib/mock-task', tlClone); + +let zipExecutable = path.join(__dirname, '..', '7zip', '7z.exe'); +let sevenZip1Command: string = `path/to/7z -aoa x -o${__dirname} ${path.join(__dirname, 'zip1.zip')}`; +let sevenZip2Command: string = `path/to/7z -aoa x -o${__dirname} ${path.join(__dirname, 'zip2.zip')}`; +let sevenZip3Command: string = `path/to/7z -aoa x -o${__dirname} ${path.join(__dirname, 'zip3.7z')}`; +let tarCommand = `path/to/7z -aoa x -o${__dirname} ${path.join(__dirname, 'tar.tar')}`; +if (!isWindows) { + zipExecutable = 'path/to/unzip' + sevenZip1Command = `${zipExecutable} -o ${path.join(__dirname, 'zip1.zip')} -d ${__dirname}`; + sevenZip2Command = `${zipExecutable} -o ${path.join(__dirname, 'zip2.zip')} -d ${__dirname}`; + sevenZip3Command = `path/to/7z -aoa x -o${__dirname} ${path.join(__dirname, 'zip3.7z')}`; + tarCommand = `path/to/tar -xvf ${path.join(__dirname, 'tar.tar')} -C ${__dirname}`; +} + +let a: ma.TaskLibAnswers = { + 'exec': {}, + 'which': { + 'unzip': 'path/to/unzip', + 'tar': 'path/to/tar', + '7z': 'path/to/7z' + }, + 'checkPath': { + 'path/to/unzip': true, + 'path/to/tar': true, + 'path/to/7z': true + } +}; + +// Need to add these as seperate string since they are dynamic +a['exec'][sevenZip1Command] = { + "code": 0, + "stdout": "extracted zip1" +} +a['exec'][sevenZip2Command] = { + "code": 0, + "stdout": "extracted zip2" +} +a['exec'][tarCommand] = { + "code": 0, + "stdout": "extracted tar" +} +a['exec'][sevenZip3Command] = { + "code": 0, + "stdout": "extracted 7z" +} + +tmr.setAnswers(a); + +tmr.run(); diff --git a/_generated/ExtractFilesV1_Node20/Tests/tar.tar b/_generated/ExtractFilesV1_Node20/Tests/tar.tar new file mode 100644 index 000000000000..bb7028571361 Binary files /dev/null and b/_generated/ExtractFilesV1_Node20/Tests/tar.tar differ diff --git a/_generated/ExtractFilesV1_Node20/Tests/zip1.zip b/_generated/ExtractFilesV1_Node20/Tests/zip1.zip new file mode 100644 index 000000000000..bb7028571361 Binary files /dev/null and b/_generated/ExtractFilesV1_Node20/Tests/zip1.zip differ diff --git a/_generated/ExtractFilesV1_Node20/Tests/zip2.zip b/_generated/ExtractFilesV1_Node20/Tests/zip2.zip new file mode 100644 index 000000000000..bb7028571361 Binary files /dev/null and b/_generated/ExtractFilesV1_Node20/Tests/zip2.zip differ diff --git a/_generated/ExtractFilesV1_Node20/Tests/zip3.7z b/_generated/ExtractFilesV1_Node20/Tests/zip3.7z new file mode 100644 index 000000000000..91c170648989 Binary files /dev/null and b/_generated/ExtractFilesV1_Node20/Tests/zip3.7z differ diff --git a/_generated/ExtractFilesV1_Node20/ThirdPartyNotices.txt b/_generated/ExtractFilesV1_Node20/ThirdPartyNotices.txt new file mode 100644 index 000000000000..999441b2416f --- /dev/null +++ b/_generated/ExtractFilesV1_Node20/ThirdPartyNotices.txt @@ -0,0 +1,172 @@ +---------------------------------START OF ENTRY FOR THE THIRD PARTY NOTICES---------------------------------------- + 7-Zip + ~~~~~ + License for use and distribution + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + 7-Zip Copyright (C) 1999-2016 Igor Pavlov. + + Licenses for files are: + + 1) 7z.dll: GNU LGPL + unRAR restriction + 2) All other files: GNU LGPL + + The GNU LGPL + unRAR restriction means that you must follow both + GNU LGPL rules and unRAR restriction rules. + + + Note: + You can use 7-Zip on any computer, including a computer in a commercial + organization. You don't need to register or pay for 7-Zip. + + + GNU LGPL information + -------------------- + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You can receive a copy of the GNU Lesser General Public License from + http://www.gnu.org/ + + + unRAR restriction + ----------------- + + The decompression engine for RAR archives was developed using source + code of unRAR program. + All copyrights to original unRAR code are owned by Alexander Roshal. + + The license for original unRAR code has the following restriction: + + The unRAR sources cannot be used to re-create the RAR compression algorithm, + which is proprietary. Distribution of modified unRAR sources in separate form + or as a part of other software is permitted, provided that it is clearly + stated in the documentation and source comments that the code may + not be used to develop a RAR (WinRAR) compatible archiver. + +GNU Lesser General Public License + +Version 2.1, February 1999 + +Copyright (C) 1991, 1999 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. +[This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] + +Preamble + +The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. +This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. +When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. +To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. +For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. +We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. +To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. +Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. +Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. +When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. +We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. +For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. +In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. +Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. +The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. + +TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + +0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". +A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. +The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) +"Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. +Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. + +1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. +You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. + +2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: +a) The modified work must itself be a software library. +b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. +c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. +d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. +(For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) +These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. +Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. +In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. + +3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. +Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. +This option is useful when you wish to copy part of the code of the Library into a program that is not a library. + +4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. +If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. + +5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. +However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. +When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. +If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) +Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. + +6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. +You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: +a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) +b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. +c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. +d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. +e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. +For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. +It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. + +7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: +a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. +b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. + +8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. + +9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. + +10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. + +11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. +If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. +It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. +This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. + +12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. + +13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. +Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. + +14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. + +NO WARRANTY + +15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + +16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +END OF TERMS AND CONDITIONS + +How to Apply These Terms to Your New Libraries + +If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). +To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. + Copyright (C) +This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. +This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. +You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +Also add information on how to contact you by electronic and paper mail. +You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: +Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. + +signature of Ty Coon, 1 April 1990 +Ty Coon, President of Vice + +That's all there is to it! + +----------------------------------------------- END OF ENTRY FOR THE THIRD PARTY NOTICES ---------------------------------------- + diff --git a/_generated/ExtractFilesV1_Node20/extractfilestask.ts b/_generated/ExtractFilesV1_Node20/extractfilestask.ts new file mode 100644 index 000000000000..00224eb90ca7 --- /dev/null +++ b/_generated/ExtractFilesV1_Node20/extractfilestask.ts @@ -0,0 +1,360 @@ +import path = require('path'); +import tl = require('azure-pipelines-task-lib/task'); +import tr = require('azure-pipelines-task-lib/toolrunner'); +import minimatch = require('minimatch'); +import os = require('os'); + +// archiveFilePatterns is a multiline input containing glob patterns +var archiveFilePatterns: string[] = tl.getDelimitedInput('archiveFilePatterns', '\n', true); +var destinationFolder: string = path.normalize(tl.getPathInput('destinationFolder', true, false).trim()); +var cleanDestinationFolder: boolean = tl.getBoolInput('cleanDestinationFolder', false); +var overwriteExistingFiles: boolean = tl.getBoolInput('overwriteExistingFiles', false); +const customPathToSevenZipTool: string = tl.getInput('pathToSevenZipTool', false); + +var repoRoot: string = tl.getVariable('System.DefaultWorkingDirectory'); +tl.debug('repoRoot: ' + repoRoot); + +const win: boolean = tl.getPlatform() == tl.Platform.Windows; +tl.debug('win: ' + win); + +// extractors +var xpTarLocation: string; +var xpUnzipLocation: string; +// 7zip +let sevenZipLocation: string; +let defaultWinSevenZipLocation: string = path.join(__dirname, '7zip/7z.exe'); + +function getSevenZipLocation(): string { + if (customPathToSevenZipTool) { + tl.debug('Get 7z tool from user defined location'); + return customPathToSevenZipTool; + } + + if (win) { + if (!sevenZipLocation) { + tl.debug('Try to resolve preinstalled 7z location'); + // we avoid check of tool existence to not fail the task if 7z is not preinstalled in system + sevenZipLocation = tl.which('7z', false); + } + + // return default location of the 7z which is bundled with the task in case the user didn't pass a custom path or the agent doesn't contain a preinstalled tool + return sevenZipLocation || defaultWinSevenZipLocation; + } + + if (!sevenZipLocation) { + tl.debug('Try to resolve preinstalled 7z location'); + sevenZipLocation = tl.which('7z', true); + } + + return sevenZipLocation; +} + +function findFiles(): string[] { + tl.debug('using: ' + archiveFilePatterns.length + ' archiveFilePatterns: ' + archiveFilePatterns + ' to search for archives.'); + + // minimatch options + var matchOptions = { matchBase: true }; + if (win) { + matchOptions["nocase"] = true; + } + + // use a set to avoid duplicates + var Set = require('collections/set'); + var matchingFilesSet = new Set(); + + for (var i = 0; i < archiveFilePatterns.length; i++) { + tl.debug('searching for archives, pattern[' + i + ']: ' + archiveFilePatterns[i]); + + var normalizedPattern: string = path.normalize(archiveFilePatterns[i]); + tl.debug('normalizedPattern= ' + normalizedPattern); + + var parseResult = parsePattern(normalizedPattern); + + if (parseResult.file != null) { + try { + var stats = tl.stats(parseResult.file); + if (stats.isFile()) { + if (matchingFilesSet.add(parseResult.file)) { + tl.debug('adding file: ' + parseResult.file); + } + matchingFilesSet.add(parseResult.file); + } else if (stats.isDirectory()) { // most likely error scenario is user specified a directory + failTask(tl.loc('ExtractDirFailedinFindFiles', parseResult.file)); + } else { // other error scenarios -- less likely + failTask(tl.loc('ExtractNotFileFailed', parseResult.file)); + } + } catch (e) { // typically because it does not exist + failTask(tl.loc('ExtractNotAccessibleFile', parseResult.file, e)); + } + } else { + console.log(tl.loc('SearchInDir', parseResult.search, parseResult.directory)); + + var stats = tl.stats(parseResult.directory); + + if (!stats) { + failTask(tl.loc('SearchNonExistDir', parseResult.directory)); + } else if (!stats.isDirectory()) { + failTask(tl.loc('SearchNonDir', parseResult.directory)); + } + + var allFiles = tl.find(parseResult.directory); + tl.debug('Candidates found for match: ' + allFiles.length); + + var matched = minimatch.match(allFiles, path.join(parseResult.directory, parseResult.search), matchOptions); + + // ensure only files are added, since our search results may include directories + for (var j = 0; j < matched.length; j++) { + var match = path.normalize(matched[j]); + var stats = tl.stats(match); + if (stats.isFile()) { + if (matchingFilesSet.add(match)) { + tl.debug('adding file: ' + match); + } + } + } + } + } + + return matchingFilesSet.toArray(); +} + +function parsePattern(normalizedPattern: string): { file: string, directory: string, search: string } { + tl.debug('parsePattern: ' + normalizedPattern); + + // the first occurance of a wild card, * or ? + var firstWildIndex = normalizedPattern.indexOf('*'); + var questionIndex = normalizedPattern.indexOf('?'); + if (questionIndex > -1 && (firstWildIndex == -1 || questionIndex < firstWildIndex)) { + firstWildIndex = questionIndex; + } + + // no wildcards + if (firstWildIndex == -1) { + return { + file: makeAbsolute(normalizedPattern), + directory: null, + search: null + }; + } + + // search backwards from the first wild card char for the nearest path separator + for (var i = firstWildIndex - 1; i > -1; i--) { + if (normalizedPattern.charAt(i) == path.sep) { + return { + file: null, + directory: makeAbsolute(normalizedPattern.substring(0, i + 1)), + search: normalizedPattern.substring(i + 1, normalizedPattern.length) + }; + } + } + + console.log(tl.loc('NoSearchPatternPath', normalizedPattern, repoRoot)); + + return { + file: null, + directory: repoRoot, + search: normalizedPattern + }; +} + +function makeAbsolute(normalizedPath: string): string { + tl.debug('makeAbsolute:' + normalizedPath); + + var result = normalizedPath; + if (!path.isAbsolute(normalizedPath)) { + result = path.join(repoRoot, normalizedPath); + console.log(tl.loc('ResolveRelativePath', normalizedPath, result)); + } + return result; +} + +// This check only pertains to linux where the native unzip command is used instead of 7zip +function isZip(file) { + return file.endsWith('.zip') + || file.endsWith('.jar') + || file.endsWith('.war') + || file.endsWith('.ear'); +} + +// This check pertains to linux so the native tar command is used, and on windows so the archive is decompressed and untared in two steps using 7zip. +function isTar(file) { + var name = win ? file.toLowerCase() : file; + // standard gnu-tar extension formats with recognized auto compression formats + // https://www.gnu.org/software/tar/manual/html_section/tar_69.html + return name.endsWith('.tar') // no compression + || name.endsWith('.tar.gz') // gzip + || name.endsWith('.tgz') // gzip + || name.endsWith('.taz') // gzip + || name.endsWith('.tar.Z') // compress + || (win && name.endsWith('tar.z')) // no case comparison for win + || name.endsWith('.taZ') // compress // no case for win already handled above + || name.endsWith('.tar.bz2') // bzip2 + || name.endsWith('.tz2') // bzip2 + || name.endsWith('.tbz2') // bzip2 + || name.endsWith('.tbz') // bzip2 + || name.endsWith('.tar.lz') // lzip + || name.endsWith('.tar.lzma') // lzma + || name.endsWith('.tlz') // lzma + || name.endsWith('.tar.lzo') // lzop + || name.endsWith('.tar.xz') // xz + || name.endsWith('.txz'); // xz +} + +function unzipExtract(file, destinationFolder) { + console.log(tl.loc('UnzipExtractFile', file)); + if (typeof xpUnzipLocation == "undefined") { + xpUnzipLocation = tl.which('unzip', true); + } + var unzip = tl.tool(xpUnzipLocation); + if (overwriteExistingFiles) { + unzip.arg('-o'); + } + unzip.arg(file); + unzip.arg('-d'); + unzip.arg(destinationFolder); + return handleExecResult(unzip.execSync(), file); +} + +function sevenZipExtract(file, destinationFolder) { + console.log(tl.loc('SevenZipExtractFile', file)); + var sevenZip = tl.tool(getSevenZipLocation()); + if (overwriteExistingFiles) { + sevenZip.arg('-aoa'); + } + sevenZip.arg('x'); + sevenZip.arg('-o' + destinationFolder); + sevenZip.arg(file); + return handleExecResult(sevenZip.execSync(), file); +} + +function tarExtract(file, destinationFolder) { + console.log(tl.loc('TarExtractFile', file)); + if (typeof xpTarLocation == "undefined") { + xpTarLocation = tl.which('tar', true); + } + var tar = tl.tool(xpTarLocation); + if (overwriteExistingFiles) { + tar.arg('-xvf'); // tar will correctly handle compression types outlined in isTar() + } else { + tar.arg('-xvkf'); + } + tar.arg(file); + tar.arg('-C'); + tar.arg(destinationFolder); + return handleExecResult(tar.execSync(), file); +} + +function handleExecResult(execResult: tr.IExecSyncResult, file) { + if (execResult.code != tl.TaskResult.Succeeded) { + tl.debug('execResult: ' + JSON.stringify(execResult)); + failTask(tl.loc('ExtractFileFailedMsg', file, execResult.code, execResult.stdout, execResult.stderr, execResult.error)); + } +} + +function failTask(message: string) { + throw new FailTaskError(message); +} + +export class FailTaskError extends Error { +} + +function extractFiles(files: string[]) { + // Extract the archive files on a single thread for two reasons: + // 1 - Multiple threads munge the log messages + // 2 - Everything is going to be blocked by I/O anyway. + for (var i = 0; i < files.length; i++) { + var file = files[i]; + var stats = tl.stats(file); + if (!stats) { + failTask(tl.loc('ExtractNonExistFile', file)); + } else if (stats.isDirectory()) { + failTask(tl.loc('ExtractDirFailed', file)); + } + + if (win) { + if (isTar(file)) { + if (file.endsWith('.tar')) { // a simple tar + sevenZipExtract(file, destinationFolder); + } else { // a compressed tar, e.g. 'fullFilePath/test.tar.bz2' + // 7zip can not decompress and expand in one step, so it is necessary + // to do this in multiple steps as follows: + // 0. create a temporary location to decompress the tar to + // 1. decompress the tar to the temporary location + // 2. expand the decompressed tar to the output folder + // 3. remove the temporary location + + // e.g. 'fullFilePath/test.tar.bz2' --> 'test.tar.bz2' + var shortFileName = file.substring(file.lastIndexOf(path.sep) + 1, file.length); + // e.g. 'destinationFolder/_test.tar.bz2_' + var tempFolder = path.normalize(destinationFolder + path.sep + '_' + shortFileName + '_'); + if (!tl.exist(tempFolder)) { + console.log(tl.loc('CreateTempDir', tempFolder, file)); + // 0 create temp folder + tl.mkdirP(tempFolder); + // 1 extract compressed tar + sevenZipExtract(file, tempFolder); + console.log(tl.loc('TempDir', tempFolder)); + var tempTar = tempFolder + path.sep + tl.ls('-A', [tempFolder])[0]; // should be only one + console.log(tl.loc('DecompressedTempTar', file, tempTar)); + // 2 expand extracted tar + sevenZipExtract(tempTar, destinationFolder); + // 3 cleanup temp folder + console.log(tl.loc('RemoveTempDir', tempFolder)); + tl.rmRF(tempFolder); + } else { + failTask(tl.loc('ExtractFailedCannotCreate', file, tempFolder)); + } + } + } else { // not a tar, so use sevenZip + sevenZipExtract(file, destinationFolder); + } + } else { // not windows + if (isTar(file)) { + tarExtract(file, destinationFolder); + } else if (isZip(file)) { + unzipExtract(file, destinationFolder); + } else { // fall through and use sevenZip + sevenZipExtract(file, destinationFolder) + } + } + } +} + +function doWork() { + try { + tl.setResourcePath(path.join( __dirname, 'task.json')); + + // Find matching archive files + var files: string[] = findFiles(); + + if (files.length === 0) { + tl.warning(tl.loc('NoFilesFound')); + } + + console.log(tl.loc('FoundFiles', files.length)); + for (var i = 0; i < files.length; i++) { + console.log(files[i]); + } + + // Clean the destination folder before extraction? + if (cleanDestinationFolder && tl.exist(destinationFolder)) { + console.log(tl.loc('CleanDestDir', destinationFolder)); + tl.rmRF(destinationFolder); + } + + // Create the destination folder if it doesn't exist + if (!tl.exist(destinationFolder)) { + console.log(tl.loc('CreateDestDir', destinationFolder)); + tl.mkdirP(destinationFolder); + } + + extractFiles(files); + tl.setResult(tl.TaskResult.Succeeded, tl.loc('SucceedMsg')); + } catch (e) { + tl.debug(e.message); + process.stderr.write(e + os.EOL); + tl.setResult(tl.TaskResult.Failed, e.message); + } +} + +doWork(); \ No newline at end of file diff --git a/_generated/ExtractFilesV1_Node20/icon.png b/_generated/ExtractFilesV1_Node20/icon.png new file mode 100644 index 000000000000..942dc8ed754e Binary files /dev/null and b/_generated/ExtractFilesV1_Node20/icon.png differ diff --git a/_generated/ExtractFilesV1_Node20/icon.svg b/_generated/ExtractFilesV1_Node20/icon.svg new file mode 100644 index 000000000000..c3daaa283b0c --- /dev/null +++ b/_generated/ExtractFilesV1_Node20/icon.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/_generated/ExtractFilesV1_Node20/make.json b/_generated/ExtractFilesV1_Node20/make.json new file mode 100644 index 000000000000..f57f912f88bc --- /dev/null +++ b/_generated/ExtractFilesV1_Node20/make.json @@ -0,0 +1,10 @@ +{ + "externals": { + "archivePackages": [ + { + "url": "https://vstsagenttools.blob.core.windows.net/tools/7zip/4/7zip.zip", + "dest": "./" + } + ] + } +} \ No newline at end of file diff --git a/_generated/ExtractFilesV1_Node20/package-lock.json b/_generated/ExtractFilesV1_Node20/package-lock.json new file mode 100644 index 000000000000..84b73a336a78 --- /dev/null +++ b/_generated/ExtractFilesV1_Node20/package-lock.json @@ -0,0 +1,511 @@ +{ + "name": "ExtractFiles", + "version": "1.0.2", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/concat-stream": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz", + "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==", + "requires": { + "@types/node": "*" + } + }, + "@types/form-data": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", + "integrity": "sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==", + "requires": { + "@types/node": "*" + } + }, + "@types/mocha": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.1.1.tgz", + "integrity": "sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==" + }, + "@types/node": { + "version": "20.7.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.7.0.tgz", + "integrity": "sha512-zI22/pJW2wUZOVyguFaUL1HABdmSVxpXrzIqkjsHmyUjNhPoWM1CKfvVuXfetHhIok4RY573cqS0mZ1SJEnoTg==" + }, + "@types/q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.1.tgz", + "integrity": "sha512-eqz8c/0kwNi/OEHQfvIuJVLTst3in0e7uTKeuY+WL/zfKn0xVujOTp42bS/vUUokhK5P2BppLd9JXMOMHcgbjA==" + }, + "@types/qs": { + "version": "6.9.8", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.8.tgz", + "integrity": "sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg==" + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "azure-pipelines-task-lib": { + "version": "5.0.0-preview.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-5.0.0-preview.0.tgz", + "integrity": "sha512-uQJEv+q3/7RD7kgphFd33uXijaPwA1ePYoNkAgZpUhbZUtc2u4JL4ujTT/JJfgXBNW/QQNAiDQ2OC7vOQG/0tg==", + "requires": { + "minimatch": "3.0.5", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "sync-request": "6.1.0", + "uuid": "^3.0.1" + }, + "dependencies": { + "minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "brace-expansion": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", + "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + }, + "collections": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/collections/-/collections-3.0.0.tgz", + "integrity": "sha512-ZcLwSBMEktp13cgsNTQGMVDoIKF6y2L7+0l3Ur6G3miB++aRpgiz7Hc4vvChtbALY7ce6LdUPnkw5goKQTmjdg==", + "requires": { + "weak-map": "~1.0.x" + } + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, + "form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + } + }, + "get-port": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", + "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==" + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "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" + }, + "dependencies": { + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==" + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "http-basic": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", + "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", + "requires": { + "caseless": "^0.12.0", + "concat-stream": "^1.6.2", + "http-response-object": "^3.0.1", + "parse-cache-control": "^1.0.1" + } + }, + "http-response-object": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", + "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", + "requires": { + "@types/node": "^10.0.3" + }, + "dependencies": { + "@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + } + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" + }, + "is-core-module": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "requires": { + "has": "^1.0.3" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, + "parse-cache-control": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", + "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "promise": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", + "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", + "requires": { + "asap": "~2.0.6" + } + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==" + }, + "qs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "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" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "requires": { + "resolve": "^1.1.6" + } + }, + "resolve": { + "version": "1.22.6", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.6.tgz", + "integrity": "sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==", + "requires": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" + }, + "shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, + "sync-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", + "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==", + "requires": { + "http-response-object": "^3.0.1", + "sync-rpc": "^1.2.1", + "then-request": "^6.0.0" + } + }, + "sync-rpc": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz", + "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==", + "requires": { + "get-port": "^3.1.0" + } + }, + "then-request": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", + "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", + "requires": { + "@types/concat-stream": "^1.6.0", + "@types/form-data": "0.0.33", + "@types/node": "^8.0.0", + "@types/qs": "^6.2.31", + "caseless": "~0.12.0", + "concat-stream": "^1.6.0", + "form-data": "^2.2.0", + "http-basic": "^8.1.1", + "http-response-object": "^3.0.1", + "promise": "^8.0.0", + "qs": "^6.4.0" + }, + "dependencies": { + "@types/node": { + "version": "8.10.66", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", + "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==" + } + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, + "typescript": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + }, + "weak-map": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/weak-map/-/weak-map-1.0.5.tgz", + "integrity": "sha1-eWkVhNmGB/UHC9O3CkDmuyLkAes=" + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + } + } +} diff --git a/_generated/ExtractFilesV1_Node20/package.json b/_generated/ExtractFilesV1_Node20/package.json new file mode 100644 index 000000000000..15521006a444 --- /dev/null +++ b/_generated/ExtractFilesV1_Node20/package.json @@ -0,0 +1,27 @@ +{ + "name": "ExtractFiles", + "version": "1.0.2", + "description": "Extract Files Task", + "main": "extractfilestask.js", + "repository": { + "type": "git", + "url": "git+https://github.com/Microsoft/azure-pipelines-tasks.git" + }, + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Microsoft/azure-pipelines-tasks/issues" + }, + "homepage": "https://github.com/Microsoft/azure-pipelines-tasks#readme", + "dependencies": { + "@types/q": "^1.0.7", + "@types/node": "^20.3.1", + "@types/mocha": "^9.1.1", + "azure-pipelines-task-lib": "^5.0.0-preview.0", + "collections": "3.0.0", + "minimatch": "^3.0.4" + }, + "devDependencies": { + "typescript": "5.1.6" + } +} diff --git a/_generated/ExtractFilesV1_Node20/task.json b/_generated/ExtractFilesV1_Node20/task.json new file mode 100644 index 000000000000..7047c552f533 --- /dev/null +++ b/_generated/ExtractFilesV1_Node20/task.json @@ -0,0 +1,124 @@ +{ + "id": "5e1e3830-fbfb-11e5-aab1-090c92bc4988", + "name": "ExtractFiles", + "friendlyName": "Extract files", + "description": "Extract a variety of archive and compression files such as .7z, .rar, .tar.gz, and .zip", + "author": "Microsoft Corporation", + "helpUrl": "https://docs.microsoft.com/azure/devops/pipelines/tasks/utility/extract-files", + "helpMarkDown": "[Learn more about this task](https://go.microsoft.com/fwlink/?LinkId=800269)", + "category": "Utility", + "visibility": [ + "Build", + "Release" + ], + "runsOn": [ + "Agent", + "DeploymentGroup" + ], + "demands": [], + "minimumAgentVersion": "2.182.1", + "version": { + "Major": 1, + "Minor": 229, + "Patch": 1 + }, + "instanceNameFormat": "Extract files $(message)", + "inputs": [ + { + "name": "archiveFilePatterns", + "type": "multiLine", + "label": "Archive file patterns", + "defaultValue": "**/*.zip", + "required": true, + "helpMarkDown": "File paths or patterns of the archive files to extract. Supports multiple lines of minimatch patterns. [More Information](https://go.microsoft.com/fwlink/?LinkId=800269)", + "properties": { + "resizable": "true", + "rows": "4" + } + }, + { + "name": "destinationFolder", + "type": "filePath", + "label": "Destination folder", + "defaultValue": "", + "required": true, + "helpMarkDown": "Destination folder into which archive files should be extracted. Use [variables](https://go.microsoft.com/fwlink/?LinkID=550988) if files are not in the repo. Example: $(agent.builddirectory)" + }, + { + "name": "cleanDestinationFolder", + "type": "boolean", + "label": "Clean destination folder before extracting", + "required": true, + "defaultValue": "true", + "helpMarkDown": "Select this option to clean the destination directory before archive contents are extracted into it." + }, + { + "name": "overwriteExistingFiles", + "type": "boolean", + "label": "Overwrite existing files", + "required": true, + "defaultValue": "false", + "helpMarkDown": "Select this option to overwrite existing files in the destination directory." + }, + { + "name": "pathToSevenZipTool", + "type": "string", + "defaultValue": "", + "label": "Path to 7z utility", + "required": false, + "helpMarkDown": "You can specify custom path to 7z utility. For example, \"C:\\7z\\7z.exe\" on Windows and \"/usr/local/bin/7z\" on MacOS/Ubuntu." + } + ], + "execution": { + "Node10": { + "target": "extractfilestask.js", + "argumentFormat": "" + }, + "Node16": { + "target": "extractfilestask.js", + "argumentFormat": "" + }, + "Node20": { + "target": "extractfilestask.js", + "argumentFormat": "" + } + }, + "restrictions": { + "commands": { + "mode": "restricted" + }, + "settableVariables": { + "allowed": [] + } + }, + "messages": { + "ExtractDirFailedinFindFiles": "Specified archive: %s can not be extracted because it is a directory.", + "ExtractNotFileFailed": "Specified archive: %s can not be extracted because it is not a file.", + "ExtractNotAccessibleFile": "Specified archive: %s can not be extracted because it can not be accessed: %s", + "SearchInDir": "Searching for: %s under directory: %s", + "SearchNonExistDir": "Search failed because the specified search directory: %s does not exist.", + "SearchNonDir": "Search failed because the specified search directory: %s is not a directory.", + "NoSearchPatternPath": "No path specified for search pattern: %s defaulting to: %s", + "ResolveRelativePath": "Relative file path: %s resolving to: %s", + "UnzipExtractFile": "Extracting file: %s", + "SevenZipExtractFile": "Extracting file: %s", + "TarExtractFile": "Extracting file: %s", + "ExtractFileFailedMsg": "Extraction failed for file: %s \ncode: %d \nstdout: %s \nstderr: %s \nerror: %s;", + "ExtractNonExistFile": "Extraction failed for file: %s because it does not exist.", + "ExtractDirFailed": "Extraction failed for file: %s because it is a directory.", + "CreateTempDir": "Creating temp folder: %s to decompress: %s", + "TempDir": "tempFolder = %s", + "DecompressedTempTar": "Decompressed temporary tar from: %s to: %s", + "RemoveTempDir": "Removing temp folder: %s", + "ExtractFailedCannotCreate": "Extraction failed for file: %s because temporary location could not be created: %s", + "NoFilesFound": "No archives were found using specified file patterns", + "FoundFiles": "Found: %d files to extract:", + "CleanDestDir": "Cleaning destination folder before extraction: %s", + "CreateDestDir": "Creating destination folder: %s", + "SucceedMsg": "Successfully extracted all files." + }, + "_buildConfigMapping": { + "Default": "1.229.0", + "Node20-225": "1.229.1" + } +} \ No newline at end of file diff --git a/_generated/ExtractFilesV1_Node20/task.loc.json b/_generated/ExtractFilesV1_Node20/task.loc.json new file mode 100644 index 000000000000..2a6559b008da --- /dev/null +++ b/_generated/ExtractFilesV1_Node20/task.loc.json @@ -0,0 +1,124 @@ +{ + "id": "5e1e3830-fbfb-11e5-aab1-090c92bc4988", + "name": "ExtractFiles", + "friendlyName": "ms-resource:loc.friendlyName", + "description": "ms-resource:loc.description", + "author": "Microsoft Corporation", + "helpUrl": "https://docs.microsoft.com/azure/devops/pipelines/tasks/utility/extract-files", + "helpMarkDown": "ms-resource:loc.helpMarkDown", + "category": "Utility", + "visibility": [ + "Build", + "Release" + ], + "runsOn": [ + "Agent", + "DeploymentGroup" + ], + "demands": [], + "minimumAgentVersion": "2.182.1", + "version": { + "Major": 1, + "Minor": 229, + "Patch": 1 + }, + "instanceNameFormat": "ms-resource:loc.instanceNameFormat", + "inputs": [ + { + "name": "archiveFilePatterns", + "type": "multiLine", + "label": "ms-resource:loc.input.label.archiveFilePatterns", + "defaultValue": "**/*.zip", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.archiveFilePatterns", + "properties": { + "resizable": "true", + "rows": "4" + } + }, + { + "name": "destinationFolder", + "type": "filePath", + "label": "ms-resource:loc.input.label.destinationFolder", + "defaultValue": "", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.destinationFolder" + }, + { + "name": "cleanDestinationFolder", + "type": "boolean", + "label": "ms-resource:loc.input.label.cleanDestinationFolder", + "required": true, + "defaultValue": "true", + "helpMarkDown": "ms-resource:loc.input.help.cleanDestinationFolder" + }, + { + "name": "overwriteExistingFiles", + "type": "boolean", + "label": "ms-resource:loc.input.label.overwriteExistingFiles", + "required": true, + "defaultValue": "false", + "helpMarkDown": "ms-resource:loc.input.help.overwriteExistingFiles" + }, + { + "name": "pathToSevenZipTool", + "type": "string", + "defaultValue": "", + "label": "ms-resource:loc.input.label.pathToSevenZipTool", + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.pathToSevenZipTool" + } + ], + "execution": { + "Node10": { + "target": "extractfilestask.js", + "argumentFormat": "" + }, + "Node16": { + "target": "extractfilestask.js", + "argumentFormat": "" + }, + "Node20": { + "target": "extractfilestask.js", + "argumentFormat": "" + } + }, + "restrictions": { + "commands": { + "mode": "restricted" + }, + "settableVariables": { + "allowed": [] + } + }, + "messages": { + "ExtractDirFailedinFindFiles": "ms-resource:loc.messages.ExtractDirFailedinFindFiles", + "ExtractNotFileFailed": "ms-resource:loc.messages.ExtractNotFileFailed", + "ExtractNotAccessibleFile": "ms-resource:loc.messages.ExtractNotAccessibleFile", + "SearchInDir": "ms-resource:loc.messages.SearchInDir", + "SearchNonExistDir": "ms-resource:loc.messages.SearchNonExistDir", + "SearchNonDir": "ms-resource:loc.messages.SearchNonDir", + "NoSearchPatternPath": "ms-resource:loc.messages.NoSearchPatternPath", + "ResolveRelativePath": "ms-resource:loc.messages.ResolveRelativePath", + "UnzipExtractFile": "ms-resource:loc.messages.UnzipExtractFile", + "SevenZipExtractFile": "ms-resource:loc.messages.SevenZipExtractFile", + "TarExtractFile": "ms-resource:loc.messages.TarExtractFile", + "ExtractFileFailedMsg": "ms-resource:loc.messages.ExtractFileFailedMsg", + "ExtractNonExistFile": "ms-resource:loc.messages.ExtractNonExistFile", + "ExtractDirFailed": "ms-resource:loc.messages.ExtractDirFailed", + "CreateTempDir": "ms-resource:loc.messages.CreateTempDir", + "TempDir": "ms-resource:loc.messages.TempDir", + "DecompressedTempTar": "ms-resource:loc.messages.DecompressedTempTar", + "RemoveTempDir": "ms-resource:loc.messages.RemoveTempDir", + "ExtractFailedCannotCreate": "ms-resource:loc.messages.ExtractFailedCannotCreate", + "NoFilesFound": "ms-resource:loc.messages.NoFilesFound", + "FoundFiles": "ms-resource:loc.messages.FoundFiles", + "CleanDestDir": "ms-resource:loc.messages.CleanDestDir", + "CreateDestDir": "ms-resource:loc.messages.CreateDestDir", + "SucceedMsg": "ms-resource:loc.messages.SucceedMsg" + }, + "_buildConfigMapping": { + "Default": "1.229.0", + "Node20-225": "1.229.1" + } +} \ No newline at end of file diff --git a/_generated/ExtractFilesV1_Node20/tsconfig.json b/_generated/ExtractFilesV1_Node20/tsconfig.json new file mode 100644 index 000000000000..0438b79f69ac --- /dev/null +++ b/_generated/ExtractFilesV1_Node20/tsconfig.json @@ -0,0 +1,6 @@ +{ + "compilerOptions": { + "target": "ES6", + "module": "commonjs" + } +} \ No newline at end of file diff --git a/_generated/FtpUploadV1.versionmap.txt b/_generated/FtpUploadV1.versionmap.txt new file mode 100644 index 000000000000..f74febd08e1e --- /dev/null +++ b/_generated/FtpUploadV1.versionmap.txt @@ -0,0 +1,2 @@ +Default|1.229.0 +Node20-225|1.229.1 diff --git a/_generated/FtpUploadV1/Strings/resources.resjson/de-DE/resources.resjson b/_generated/FtpUploadV1/Strings/resources.resjson/de-DE/resources.resjson new file mode 100644 index 000000000000..b013e3b5621b --- /dev/null +++ b/_generated/FtpUploadV1/Strings/resources.resjson/de-DE/resources.resjson @@ -0,0 +1,42 @@ +{ + "loc.friendlyName": "FTP-Upload", + "loc.helpMarkDown": "Lädt Dateien auf einen Remotecomputer mithilfe von FTP (File Transfer Protocol) oder sicher mit FTPS hoch. [Weitere Informationen](http://go.microsoft.com/fwlink/?LinkId=809084).", + "loc.description": "Hiermit werden Dateien per FTP hochgeladen.", + "loc.instanceNameFormat": "FTP-Upload: $(rootFolder)", + "loc.group.displayName.advanced": "Erweitert", + "loc.input.label.credsType": "Authentifizierungsmethode", + "loc.input.help.credsType": "Verwenden Sie die FTP-Dienstverbindung, oder geben Sie Anmeldeinformationen ein.", + "loc.input.label.serverEndpoint": "FTP-Dienstverbindung", + "loc.input.help.serverEndpoint": "Wählen Sie die Dienstverbindung für Ihren FTP-Server aus. Klicken Sie zum Erstellen einer Dienstverbindung auf den Link \"Verwalten\", und erstellen Sie dann eine neue generische Dienstverbindung. Geben Sie die FTP-Server-URL für die Server-URL (z. B. \"ftp://server.example.com\") sowie die erforderlichen Anmeldeinformationen ein.

Sichere Verbindungen werden unabhängig vom angegebenen Protokoll (\"ftp://\" oder \"ftps://\") immer hergestellt, wenn der Zielserver FTPS unterstützt. Um nur sichere Verbindungen zuzulassen, verwenden Sie das Protokoll \"ftps://\" (z. B. \"ftps://server.example.com\"). Bei Verbindungen mit Servern ohne FTPS-Unterstützung kommt es zu einem Fehler, wenn \"ftps://\" angegeben wird.", + "loc.input.label.serverUrl": "Server-URL", + "loc.input.label.username": "Benutzername", + "loc.input.label.password": "Kennwort", + "loc.input.label.rootFolder": "Stammordner", + "loc.input.help.rootFolder": "Der Quellordner, aus dem Dateien hochgeladen werden sollen.", + "loc.input.label.filePatterns": "Dateimuster", + "loc.input.help.filePatterns": "Dateipfade oder Muster der hochzuladenden Dateien. Unterstützt mehrere Minimatchmuster. [Weitere Informationen](https://go.microsoft.com/fwlink/?LinkId=800269)", + "loc.input.label.remotePath": "Remoteverzeichnis", + "loc.input.help.remotePath": "Lädt Dateien in dieses Verzeichnis auf dem Remote-FTP-Server hoch.", + "loc.input.label.clean": "Remoteverzeichnis löschen", + "loc.input.help.clean": "Löscht das Remoteverzeichnis einschließlich seiner Inhalte vor dem Hochladen.", + "loc.input.label.cleanContents": "Inhalte des Remoteverzeichnisses löschen", + "loc.input.help.cleanContents": "Löscht vor dem Hochladen rekursiv alle Inhalte aus dem Remoteverzeichnis. Das vorhandene Verzeichnis wird nicht gelöscht. Erwägen Sie zur Leistungsverbesserung stattdessen die Verwendung von \"Remoteverzeichnis löschen\".", + "loc.input.label.overwrite": "Überschreiben", + "loc.input.help.overwrite": "Überschreibt vorhandene Dateien im Remoteverzeichnis.", + "loc.input.label.preservePaths": "Dateipfade beibehalten", + "loc.input.help.preservePaths": "Wenn diese Option ausgewählt wird, wird die relative lokale Verzeichnisstruktur unter dem Remoteverzeichnis erneut erstellt, in das Dateien hochgeladen werden. Andernfalls werden Dateien direkt in das Remoteverzeichnis hochgeladen, ohne dass zusätzliche Unterverzeichnisse erstellt werden.

Angenommen, der Quellordner ist \"/home/user/source/\", und er enthält die Datei \"foo/bar/foobar.txt\". Das Remoteverzeichnis ist \"/uploads/\".
Wenn diese Option ausgewählt wird, wird die Datei in \"/uploads/foo/bar/foobar.txt\" hochgeladen. Andernfalls wird sie in \"/uploads/foobar.txt\" hochgeladen.", + "loc.input.label.trustSSL": "Serverzertifikat vertrauen", + "loc.input.help.trustSSL": "Das Auswählen dieser Option führt dazu, dass das SSL-Zertifikat des FTP-Servers mit ftps:// selbst dann als vertrauenswürdig betrachtet wird, wenn es selbstsigniert ist oder nicht von einer Zertifizierungsstelle (CA) überprüft werden kann.", + "loc.messages.CleanRemoteDir": "Remoteverzeichnis wird entfernt: %s", + "loc.messages.CleanRemoteDirContents": "Remoteverzeichnisinhalte werden entfernt: %s", + "loc.messages.CleanFileDeleteFail": "Fehler beim Versuch, die Datei zu entfernen: %s", + "loc.messages.ConnectPort": "Verbindung wird hergestellt mit: %s:%s ", + "loc.messages.Disconnected": "Getrennt", + "loc.messages.DisconnectHost": "Verbindung wird getrennt: %s", + "loc.messages.FTPConnected": "Verbunden: %s", + "loc.messages.FTPNoHostSpecified": "Die URL des FTP-Servers muss einen Hostnamen enthalten.", + "loc.messages.FTPNoProtocolSpecified": "Die URL des FTP-Servers muss mit ftp:// oder ftps:// beginnen.", + "loc.messages.UploadRemoteDir": "Die Dateien werden in das Remoteverzeichnis hochgeladen: %s", + "loc.messages.UploadSucceedMsg": "FTP-Upload erfolgreich: %s", + "loc.messages.UploadSucceedRes": "FTP-Upload erfolgreich" +} \ No newline at end of file diff --git a/_generated/FtpUploadV1/Strings/resources.resjson/en-US/resources.resjson b/_generated/FtpUploadV1/Strings/resources.resjson/en-US/resources.resjson new file mode 100644 index 000000000000..021ad3a90868 --- /dev/null +++ b/_generated/FtpUploadV1/Strings/resources.resjson/en-US/resources.resjson @@ -0,0 +1,42 @@ +{ + "loc.friendlyName": "FTP upload", + "loc.helpMarkDown": "Upload files to a remote machine using the File Transfer Protocol (FTP), or securely with FTPS. [More Information](http://go.microsoft.com/fwlink/?LinkId=809084).", + "loc.description": "Upload files using FTP", + "loc.instanceNameFormat": "FTP Upload: $(rootFolder)", + "loc.group.displayName.advanced": "Advanced", + "loc.input.label.credsType": "Authentication Method", + "loc.input.help.credsType": "Use FTP service connection or enter connection credentials.", + "loc.input.label.serverEndpoint": "FTP Service Connection", + "loc.input.help.serverEndpoint": "Select the service connection for your FTP server. To create one, click the Manage link and create a new Generic service connection, enter the FTP server URL for the server URL, e.g. `ftp://server.example.com`, and required credentials.

Secure connections will always be made regardless of the specified protocol (`ftp://` or `ftps://`) if the target server supports FTPS. To allow only secure connections, use the `ftps://` protocol, e.g. `ftps://server.example.com`. Connections to servers not supporting FTPS will fail if `ftps://` is specified.", + "loc.input.label.serverUrl": "Server URL", + "loc.input.label.username": "Username", + "loc.input.label.password": "Password", + "loc.input.label.rootFolder": "Root folder", + "loc.input.help.rootFolder": "The source folder to upload files from.", + "loc.input.label.filePatterns": "File patterns", + "loc.input.help.filePatterns": "File paths or patterns of the files to upload. Supports multiple lines of minimatch patterns. [More Information](https://go.microsoft.com/fwlink/?LinkId=800269)", + "loc.input.label.remotePath": "Remote directory", + "loc.input.help.remotePath": "Upload files to this directory on the remote FTP server.", + "loc.input.label.clean": "Delete remote directory", + "loc.input.help.clean": "Delete the remote directory including its contents before uploading.", + "loc.input.label.cleanContents": "Clear remote directory contents", + "loc.input.help.cleanContents": "Recursively delete all contents of the remote directory before uploading. The existing directory will not be deleted. For better performance, consider using `Delete remote directory` instead.", + "loc.input.label.overwrite": "Overwrite", + "loc.input.help.overwrite": "Overwrite existing files in the remote directory.", + "loc.input.label.preservePaths": "Preserve file paths", + "loc.input.help.preservePaths": "If selected, the relative local directory structure is recreated under the remote directory where files are uploaded. Otherwise, files are uploaded directly to the remote directory without creating additional subdirectories.

For example, suppose your source folder is: `/home/user/source/` and contains the file: `foo/bar/foobar.txt`, and your remote directory is: `/uploads/`.
If selected, the file is uploaded to: `/uploads/foo/bar/foobar.txt`. Otherwise, to: `/uploads/foobar.txt`.", + "loc.input.label.trustSSL": "Trust server certificate", + "loc.input.help.trustSSL": "Selecting this option results in the FTP server's SSL certificate being trusted with ftps://, even if it is self-signed or cannot be validated by a Certificate Authority (CA).", + "loc.messages.CleanRemoteDir": "removing remote directory: %s", + "loc.messages.CleanRemoteDirContents": "removing remote directory contents: %s", + "loc.messages.CleanFileDeleteFail": "an error occurred while trying to remove file: %s", + "loc.messages.ConnectPort": "connecting to: %s:%s", + "loc.messages.Disconnected": "disconnected", + "loc.messages.DisconnectHost": "disconnecting from: %s", + "loc.messages.FTPConnected": "connected: %s", + "loc.messages.FTPNoHostSpecified": "The FTP server URL must include a host name", + "loc.messages.FTPNoProtocolSpecified": "The FTP server URL must begin with ftp:// or ftps://", + "loc.messages.UploadRemoteDir": "uploading files to remote directory: %s", + "loc.messages.UploadSucceedMsg": "FTP upload successful %s", + "loc.messages.UploadSucceedRes": "FTP upload successful" +} \ No newline at end of file diff --git a/_generated/FtpUploadV1/Strings/resources.resjson/es-ES/resources.resjson b/_generated/FtpUploadV1/Strings/resources.resjson/es-ES/resources.resjson new file mode 100644 index 000000000000..0ffc9e2e347a --- /dev/null +++ b/_generated/FtpUploadV1/Strings/resources.resjson/es-ES/resources.resjson @@ -0,0 +1,42 @@ +{ + "loc.friendlyName": "Carga por FTP", + "loc.helpMarkDown": "Carga los archivos en una máquina remota usando el protocolo de transferencia de archivos (FTP) o de forma segura con FTPS. [Más información](http://go.microsoft.com/fwlink/?LinkId=809084).", + "loc.description": "Cargar archivos con FTP", + "loc.instanceNameFormat": "Carga por FTP: $(rootFolder)", + "loc.group.displayName.advanced": "Avanzado", + "loc.input.label.credsType": "Método de autenticación", + "loc.input.help.credsType": "Use la conexión del servicio FTP o especifique credenciales para la conexión.", + "loc.input.label.serverEndpoint": "Conexión del servicio FTP", + "loc.input.help.serverEndpoint": "Seleccione el punto de conexión de servicio del servidor FTP. Para crear uno, haga clic en el vínculo Administrar y cree un nuevo punto de conexión de servicio genérico, escriba la dirección URL del servidor FTP (por ejemplo, \"ftp://servidor.ejemplo.com\") y las credenciales necesarias.

Siempre se usarán conexiones seguras, independientemente del protocolo especificado (\"ftp://\" o \"ftps://\") si el servidor de destino admite FTPS. Para permitir solo conexiones seguras, use el protocolo \"ftps://\" (por ejemplo, \"ftps://servidor.ejemplo.com\"). Las conexiones a los servidores que no admiten FTPS dan error si se especifica \"ftps://\".", + "loc.input.label.serverUrl": "Dirección URL del servidor", + "loc.input.label.username": "Nombre de usuario", + "loc.input.label.password": "Contraseña", + "loc.input.label.rootFolder": "Carpeta raíz", + "loc.input.help.rootFolder": "Carpeta de origen de donde se cargan los archivos.", + "loc.input.label.filePatterns": "Patrones de archivo", + "loc.input.help.filePatterns": "Rutas de acceso de archivo o patrones de los archivos que se deben cargar. Admite varias líneas de patrones de minimatch. [Más información](https://go.microsoft.com/fwlink/?LinkId=800269)", + "loc.input.label.remotePath": "Directorio remoto", + "loc.input.help.remotePath": "Carga los archivos en este directorio en el servidor FTP remoto.", + "loc.input.label.clean": "Eliminar el directorio remoto", + "loc.input.help.clean": "Elimine el directorio remoto, incluido su contenido, antes de cargar.", + "loc.input.label.cleanContents": "Borrar el contenido del directorio remoto", + "loc.input.help.cleanContents": "Elimine de forma recursiva todo el contenido del directorio remoto antes de cargar. El directorio existente no se elimina. Para mejorar el rendimiento, considere la posibilidad de usar \"Eliminar el directorio remoto\" en su lugar.", + "loc.input.label.overwrite": "Sobrescribir", + "loc.input.help.overwrite": "Sobrescribe los archivos existentes en el directorio remoto.", + "loc.input.label.preservePaths": "Mantener las rutas de acceso de los archivos", + "loc.input.help.preservePaths": "Cuando se selecciona, la estructura de directorios local relativa se vuelve a crear en el directorio remoto donde se cargan los archivos. De lo contrario, los archivos se cargan directamente en el directorio remoto sin crear subdirectorios adicionales.

Por ejemplo, image que su carpeta es `/home/user/source/` y contiene el archivo `foo/bar/foobar.txt`, y el directorio remoto es `/uploads/`.
Si selecciona esta opción, el archivo se carga en `/uploads/foo/bar/foobar.txt`. De lo contrario, se carga en `/uploads/foobar.txt`.", + "loc.input.label.trustSSL": "Confiar en el certificado del servidor", + "loc.input.help.trustSSL": "Cuando se selecciona esta opción, se confía en el certificado SSL del servidor FTP con ftps://, incluso si es autofirmado o no lo puede validar una entidad de certificación (CA).", + "loc.messages.CleanRemoteDir": "Quitando el directorio remoto: %s", + "loc.messages.CleanRemoteDirContents": "Quitando el contenido del directorio remoto: %s", + "loc.messages.CleanFileDeleteFail": "Error al intentar quitar el archivo: %s", + "loc.messages.ConnectPort": "conectándose a: %s:%s", + "loc.messages.Disconnected": "desconectado", + "loc.messages.DisconnectHost": "desconectándose de: %s", + "loc.messages.FTPConnected": "conectado: %s", + "loc.messages.FTPNoHostSpecified": "La dirección URL del servidor FTP debe incluir un nombre de host", + "loc.messages.FTPNoProtocolSpecified": "La dirección URL del servidor FTP debe comenzar con ftp:// o ftps://", + "loc.messages.UploadRemoteDir": "cargando archivos al directorio remoto: %s", + "loc.messages.UploadSucceedMsg": "La carga por FTP de %s se realizó correctamente", + "loc.messages.UploadSucceedRes": "Carga por FTP correcta" +} \ No newline at end of file diff --git a/_generated/FtpUploadV1/Strings/resources.resjson/fr-FR/resources.resjson b/_generated/FtpUploadV1/Strings/resources.resjson/fr-FR/resources.resjson new file mode 100644 index 000000000000..7f556884082e --- /dev/null +++ b/_generated/FtpUploadV1/Strings/resources.resjson/fr-FR/resources.resjson @@ -0,0 +1,42 @@ +{ + "loc.friendlyName": "Chargement FTP", + "loc.helpMarkDown": "Chargez les fichiers vers une machine distante par FTP (File Transfer Protocol), ou de manière sécurisée par FTPS. [Plus d'informations](http://go.microsoft.com/fwlink/?LinkId=809084).", + "loc.description": "Charger des fichiers via FTP", + "loc.instanceNameFormat": "Chargement FTP : $(rootFolder)", + "loc.group.displayName.advanced": "Avancé", + "loc.input.label.credsType": "Méthode d'authentification", + "loc.input.help.credsType": "Utilisez la connexion de service FTP, ou entrez les informations d'identification de connexion.", + "loc.input.label.serverEndpoint": "Connexion de service FTP", + "loc.input.help.serverEndpoint": "Sélectionnez la connexion de service de votre serveur FTP. Pour en créer une, cliquez sur le lien Gérer, puis créez une connexion de service générique, entrez l'URL du serveur FTP, par exemple 'ftp://server.example.com', ainsi que les informations d'identification nécessaires.

Quel que soit le protocole spécifié, ('ftp://' ou 'ftps://'), la sécurisation des connexions est assurée si le serveur cible prend en charge le protocole FTPS. Pour autoriser uniquement les connexions sécurisées, utilisez le protocole 'ftps://', par exemple 'ftps://server.example.com'. Si 'ftps://' est spécifié, les connexions aux serveurs qui ne prennent pas en charge FTPS ne sont pas établies.", + "loc.input.label.serverUrl": "URL du serveur", + "loc.input.label.username": "Nom d'utilisateur", + "loc.input.label.password": "Mot de passe", + "loc.input.label.rootFolder": "Dossier racine", + "loc.input.help.rootFolder": "Dossier source du chargement des fichiers.", + "loc.input.label.filePatterns": "Modèles de fichiers", + "loc.input.help.filePatterns": "Chemins de fichiers ou modèles des fichiers à charger. Prend en charge plusieurs lignes de modèles minimatch. [Plus d'informations](https://go.microsoft.com/fwlink/?LinkId=800269)", + "loc.input.label.remotePath": "Répertoire distant", + "loc.input.help.remotePath": "Chargez les fichiers vers ce répertoire sur le serveur FTP distant.", + "loc.input.label.clean": "Supprimer le répertoire distant", + "loc.input.help.clean": "Supprimez le répertoire distant, notamment son contenu, avant le chargement.", + "loc.input.label.cleanContents": "Effacer le contenu du répertoire distant", + "loc.input.help.cleanContents": "Supprimez de manière récursive la totalité du contenu du répertoire distant avant le chargement. Le répertoire existant ne sera pas supprimé. Pour un meilleur niveau de performance, pensez à utiliser 'Supprimer le répertoire distant' à la place.", + "loc.input.label.overwrite": "Remplacer", + "loc.input.help.overwrite": "Remplacez les fichiers existants dans le répertoire distant.", + "loc.input.label.preservePaths": "Conserver les chemins de fichiers", + "loc.input.help.preservePaths": "Si l'option est sélectionnée, la structure de répertoire locale relative est recréée sous le répertoire distant où les fichiers sont chargés. Sinon, les fichiers sont chargés directement sur le répertoire distant sans création de sous-répertoires supplémentaires.

Par exemple, votre dossier source est '/home/user/source/', il contient le fichier 'foo/bar/foobar.txt', et votre répertoire distant est '/uploads/'.
Si l'option est sélectionnée, le fichier est chargé vers '/uploads/foo/bar/foobar.txt'. Sinon, il est chargé vers '/uploads/foobar.txt'.", + "loc.input.label.trustSSL": "Faire confiance au certificat de serveur", + "loc.input.help.trustSSL": "Si cette option est sélectionnée, le certificat SSL du serveur FTP est approuvé avec ftps://, même s'il est auto-signé ou même s'il ne peut pas être validé par une autorité de certification.", + "loc.messages.CleanRemoteDir": "suppression du répertoire distant : %s", + "loc.messages.CleanRemoteDirContents": "suppression du contenu du répertoire distant : %s", + "loc.messages.CleanFileDeleteFail": "une erreur s'est produite durant la suppression du fichier : %s", + "loc.messages.ConnectPort": "Connexion à : %s:%s", + "loc.messages.Disconnected": "déconnecté", + "loc.messages.DisconnectHost": "déconnexion de %s", + "loc.messages.FTPConnected": "connecté : %s", + "loc.messages.FTPNoHostSpecified": "L'URL du serveur FTP doit inclure un nom d'hôte", + "loc.messages.FTPNoProtocolSpecified": "L'URL du serveur FTP doit commencer par ftp:// ou ftps://", + "loc.messages.UploadRemoteDir": "téléchargement de fichiers sur le répertoire distant : %s", + "loc.messages.UploadSucceedMsg": "Téléchargement FTP réussi %s", + "loc.messages.UploadSucceedRes": "Téléchargement FTP réussi" +} \ No newline at end of file diff --git a/_generated/FtpUploadV1/Strings/resources.resjson/it-IT/resources.resjson b/_generated/FtpUploadV1/Strings/resources.resjson/it-IT/resources.resjson new file mode 100644 index 000000000000..07d8efd40209 --- /dev/null +++ b/_generated/FtpUploadV1/Strings/resources.resjson/it-IT/resources.resjson @@ -0,0 +1,42 @@ +{ + "loc.friendlyName": "Caricamento FTP", + "loc.helpMarkDown": "Carica i file in un computer remoto usando il protocollo FTP (File Transfer Protocol) oppure in modo protetto con FTPS. [Altre informazioni](http://go.microsoft.com/fwlink/?LinkId=809084).", + "loc.description": "Consente di caricare file tramite FTP", + "loc.instanceNameFormat": "Caricamento FTP: $(rootFolder)", + "loc.group.displayName.advanced": "Avanzate", + "loc.input.label.credsType": "Metodo di autenticazione", + "loc.input.help.credsType": "Consente di usare la connessione al servizio FTP o di immettere le credenziali di connessione.", + "loc.input.label.serverEndpoint": "Connessione al servizio FTP", + "loc.input.help.serverEndpoint": "Consente di selezionare la connessione al servizio per il server FTP. Per crearne una, fare clic sul collegamento Gestisci e creare una nuova connessione al servizio generica, immettere l'URL del server FTP per l'URL del server, ad esempio `ftp://server.example.com`, nonché le credenziali richieste.

Le connessioni sicure verranno sempre stabilite indipendentemente dal protocollo specificato (`ftp://` o `ftps://`) se il server di destinazione supporta FTPS. Per consentire solo le connessioni sicure, usare il protocollo `ftps://`, ad esempio `ftps://server.example.com`. Se si specifica `ftps://`, le connessioni a server che non supportano FTPS non riusciranno.", + "loc.input.label.serverUrl": "URL del server", + "loc.input.label.username": "Nome utente", + "loc.input.label.password": "Password", + "loc.input.label.rootFolder": "Cartella radice", + "loc.input.help.rootFolder": "Cartella di origine da cui caricare i file.", + "loc.input.label.filePatterns": "Criteri dei file", + "loc.input.help.filePatterns": "Criteri o percorsi dei file da caricare. Sono supportate più righe di criteri di corrispondenza minima. [Altre informazioni](https://go.microsoft.com/fwlink/?LinkId=800269)", + "loc.input.label.remotePath": "Directory remota", + "loc.input.help.remotePath": "Directory in cui vengono caricati i file nel server FTP remoto.", + "loc.input.label.clean": "Elimina la directory remota", + "loc.input.help.clean": "Elimina la directory remota, incluso il relativo contenuto, prima del caricamento.", + "loc.input.label.cleanContents": "Cancella il contenuto della directory remota", + "loc.input.help.cleanContents": "Elimina in modo ricorsivo tutto il contenuto della directory remota prima del caricamento. La directory esistente non verrà eliminata. Per prestazioni ottimali, provare a usare `Elimina la directory remota`.", + "loc.input.label.overwrite": "Sovrascrivi", + "loc.input.help.overwrite": "Sovrascrive i file esistenti nella directory remota.", + "loc.input.label.preservePaths": "Mantieni i percorsi di file", + "loc.input.help.preservePaths": "Se l'opzione è selezionata, la struttura di directory locale relativa viene ricreata nella directory remota in cui vengono caricati i file. In caso contrario, i file vengono caricati direttamente nella directory remota senza creare sottodirectory aggiuntive.

Ad esempio, si supponga che la cartella di origine sia `/home/user/source/` e contenga il file `foo/bar/foobar.txt` e che la directory remota sia `/uploads/`.
Se l'opzione è selezionata, il file verrà caricato in `/uploads/foo/bar/foobar.txt`; in caso contrario, verrà caricato in `/uploads/foobar.txt`.", + "loc.input.label.trustSSL": "Considera attendibile il certificato del server", + "loc.input.help.trustSSL": "Se si seleziona questa opzione, il certificato SSL del server FTP verrà considerato attendibile con ftps://, anche se è auto-firmato o non può essere convalidato da un'Autorità di certificazione (CA).", + "loc.messages.CleanRemoteDir": "rimozione della directory remota: %s", + "loc.messages.CleanRemoteDirContents": "rimozione del contenuto della directory remota: %s", + "loc.messages.CleanFileDeleteFail": "si è verificato un errore durante il tentativo di rimuovere il file: %s", + "loc.messages.ConnectPort": "connessione a: %s:%s", + "loc.messages.Disconnected": "disconnesso", + "loc.messages.DisconnectHost": "disconnessione da: %s", + "loc.messages.FTPConnected": "connessione stabilita: %s", + "loc.messages.FTPNoHostSpecified": "L'URL del server FTP deve includere un nome host", + "loc.messages.FTPNoProtocolSpecified": "L'URL del server FTP deve iniziare con ftp:// o ftps://", + "loc.messages.UploadRemoteDir": "caricamento di file nella directory remota: %s", + "loc.messages.UploadSucceedMsg": "Caricamento FTP riuscito: %s", + "loc.messages.UploadSucceedRes": "Caricamento FTP riuscito" +} \ No newline at end of file diff --git a/_generated/FtpUploadV1/Strings/resources.resjson/ja-JP/resources.resjson b/_generated/FtpUploadV1/Strings/resources.resjson/ja-JP/resources.resjson new file mode 100644 index 000000000000..55fbed89df8f --- /dev/null +++ b/_generated/FtpUploadV1/Strings/resources.resjson/ja-JP/resources.resjson @@ -0,0 +1,42 @@ +{ + "loc.friendlyName": "FTP アップロード", + "loc.helpMarkDown": "ファイル転送プロトコル (FTP) を使用して、または FTPS でセキュリティ保護して、リモート コンピューターにファイルをアップロードします。[詳細情報](http://go.microsoft.com/fwlink/?LinkId=809084)。", + "loc.description": "FTP を使用してファイルをアップロードします", + "loc.instanceNameFormat": "FTP アップロード: $(rootFolder)", + "loc.group.displayName.advanced": "詳細設定", + "loc.input.label.credsType": "認証方法", + "loc.input.help.credsType": "FTP サービス接続を使うか、接続の資格情報を入力します。", + "loc.input.label.serverEndpoint": "FTP サービス接続", + "loc.input.help.serverEndpoint": "FTP サーバーのサービス エンドポイントを選択します。サービス エンドポイントを作成するには、[管理] リンクをクリックし、新しい汎用サービス エンドポイントを作成し、サーバー URL の FTP サーバー URL (例: `ftp://server.example.com`) と必要な資格情報を入力します。

ターゲット サーバーが FTPS をサポートしている場合には、指定したプロトコル (`ftp://` または `ftps://`) に関係なくセキュリティで保護された接続が常に作成されます。セキュリティで保護された接続のみを許可する場合には `ftps://` プロトコル (例: `ftps://server.example.com`) を使用します。`ftps://` を指定すると、FTPS をサポートしていないサーバーへの接続は失敗します。", + "loc.input.label.serverUrl": "サーバーの URL", + "loc.input.label.username": "ユーザー名", + "loc.input.label.password": "パスワード", + "loc.input.label.rootFolder": "ルート フォルダー", + "loc.input.help.rootFolder": "ファイルのアップロード元のソース フォルダー。", + "loc.input.label.filePatterns": "ファイル パターン", + "loc.input.help.filePatterns": "アーカイブするファイルのファイル パスまたはパターン。複数行の minimatch パターンをサポートします。[詳細情報](https://go.microsoft.com/fwlink/?LinkId=800269)", + "loc.input.label.remotePath": "リモート ディレクトリ", + "loc.input.help.remotePath": "リモート FTP サーバー上のこのディレクトリにファイルをアップロードします。", + "loc.input.label.clean": "リモート ディレクトリの削除", + "loc.input.help.clean": "アップロードする前に、リモート ディレクトリをコンテンツも含めて削除します。", + "loc.input.label.cleanContents": "リモート ディレクトリ コンテンツのクリア", + "loc.input.help.cleanContents": "アップロードの前に、リモート ディレクトリのすべてのコンテンツを再帰的に削除します。既存のディレクトリは、削除されません。パフォーマンス向上のために、代わりに [リモート ディレクトリの削除] の使用をご検討ください。", + "loc.input.label.overwrite": "上書き", + "loc.input.help.overwrite": "リモート ディレクトリの既存のファイルを上書きします。", + "loc.input.label.preservePaths": "ファイル パスを保持", + "loc.input.help.preservePaths": "選択すると、ファイルのアップロード先のリモート ディレクトリの下に、相対ローカル ディレクトリ構造が再作成されます。選択しない場合には、ファイルは、サブディレクトリが作成されることなくリモート ディレクトリに直接アップロードされます。

たとえば、ソース フォルダーが `/home/user/source/` で、ファイル `foo/bar/foobar.txt` が含まれ、リモート ディレクトリが `/uploads/` であるとします。
選択すると、ファイルは `/uploads/foo/bar/foobar.txt` にアップロードされます。選択しないと、`/uploads/foobar.txt` にアップロードされます。", + "loc.input.label.trustSSL": "サーバー証明書を信頼する", + "loc.input.help.trustSSL": "このオプションを選択すると、FTP サーバーの SSL 証明書が、自己署名されている場合や証明書機関 (CA) によって検証できない場合であっても ftps:// によって信頼できるようになります。", + "loc.messages.CleanRemoteDir": "リモート ディレクトリを削除しています: %s", + "loc.messages.CleanRemoteDirContents": "リモート ディレクトリのコンテンツを削除しています: %s", + "loc.messages.CleanFileDeleteFail": "ファイルを削除しようとしている間にエラーが発生しました: %s", + "loc.messages.ConnectPort": "次に接続しています: %s:%s", + "loc.messages.Disconnected": "切断されました", + "loc.messages.DisconnectHost": "次から切断しています: %s", + "loc.messages.FTPConnected": "接続されました: %s", + "loc.messages.FTPNoHostSpecified": "FTP サーバーの URL には、ホスト名を含める必要があります", + "loc.messages.FTPNoProtocolSpecified": "FTP サーバーの URL は、ftp:// または ftps:// で始める必要があります", + "loc.messages.UploadRemoteDir": "リモート ディレクトリにファイルをアップロードしています: %s", + "loc.messages.UploadSucceedMsg": "FTP が正常にアップロードされました %s", + "loc.messages.UploadSucceedRes": "FTP が正常にアップロードされました" +} \ No newline at end of file diff --git a/_generated/FtpUploadV1/Strings/resources.resjson/ko-KR/resources.resjson b/_generated/FtpUploadV1/Strings/resources.resjson/ko-KR/resources.resjson new file mode 100644 index 000000000000..c414f2e944ac --- /dev/null +++ b/_generated/FtpUploadV1/Strings/resources.resjson/ko-KR/resources.resjson @@ -0,0 +1,42 @@ +{ + "loc.friendlyName": "FTP 업로드", + "loc.helpMarkDown": "FTP(파일 전송 프로토콜)를 사용하거나 FTPS를 사용하여 안전하게 파일을 원격 컴퓨터에 업로드합니다. [자세한 정보](http://go.microsoft.com/fwlink/?LinkId=809084).", + "loc.description": "FTP를 사용하여 파일을 업로드합니다.", + "loc.instanceNameFormat": "FTP 업로드: $(rootFolder)", + "loc.group.displayName.advanced": "고급", + "loc.input.label.credsType": "인증 방법", + "loc.input.help.credsType": "FTP 서비스 연결을 사용하거나 연결 자격 증명을 입력합니다.", + "loc.input.label.serverEndpoint": "FTP 서비스 연결", + "loc.input.help.serverEndpoint": "FTP 서버의 서비스 연결을 선택합니다. 서비스 연결을 만들려면 [관리] 링크를 클릭하고 새 일반 서비스 연결을 만든 후 서버 URL의 FTP 서버 URL(예: 'ftp://server.example.com') 및 필요한 자격 증명을 입력합니다.

대상 서버가 FTPS를 지원하는 경우 지정된 프로토콜('ftp://' 또는 'ftps://')과 관계없이 항상 보안 연결이 만들어집니다. 보안 연결만 허용하려면 'ftps://' 프로토콜(예: 'ftps://server.example.com')을 사용합니다. 'ftps://'가 지정된 경우 FTPS를 지원하지 않는 서버에 연결할 수 없습니다.", + "loc.input.label.serverUrl": "서버 URL", + "loc.input.label.username": "사용자 이름", + "loc.input.label.password": "암호", + "loc.input.label.rootFolder": "루트 폴더", + "loc.input.help.rootFolder": "파일을 업로드할 소스 폴더입니다.", + "loc.input.label.filePatterns": "파일 패턴", + "loc.input.help.filePatterns": "업로드할 파일의 파일 경로 또는 패턴입니다. 여러 줄로 된 minimatch 패턴을 지원합니다. [자세한 정보](https://go.microsoft.com/fwlink/?LinkId=800269)", + "loc.input.label.remotePath": "원격 디렉터리", + "loc.input.help.remotePath": "파일을 원격 FTP 서버의 이 디렉터리에 업로드합니다.", + "loc.input.label.clean": "원격 디렉터리 삭제", + "loc.input.help.clean": "업로드 전에 해당 콘텐츠를 포함하여 원격 디렉터리를 삭제합니다.", + "loc.input.label.cleanContents": "원격 디렉터리 콘텐츠 지우기", + "loc.input.help.cleanContents": "업로드 전에 원격 디렉터리의 모든 콘텐츠를 재귀적으로 삭제합니다. 기존 디렉터리는 삭제되지 않습니다. 성능을 향상하려면 '원격 디렉터리 삭제'를 대신 사용하는 것이 좋습니다.", + "loc.input.label.overwrite": "덮어쓰기", + "loc.input.help.overwrite": "원격 디렉터리의 기존 파일을 덮어씁니다.", + "loc.input.label.preservePaths": "파일 경로 유지", + "loc.input.help.preservePaths": "선택하는 경우 파일이 업로드되는 원격 디렉터리 아래에 상대 로컬 디렉터리 구조가 다시 만들어집니다. 선택하지 않으면 추가 하위 디렉터리가 만들어지지 않고 파일이 원격 디렉터리에 직접 업로드됩니다.

예를 들어 소스 폴더가 `/home/user/source/`이고 `foo/bar/foobar.txt` 파일을 포함하고 있으며, 원격 디렉터리는 `/uploads/`라고 가정합니다.
선택하는 경우 파일은 `/uploads/foo/bar/foobar.txt`에 업로드됩니다. 선택하지 않으면 `/uploads/foobar.txt`에 업로드됩니다.", + "loc.input.label.trustSSL": "서버 인증서 신뢰", + "loc.input.help.trustSSL": "이 옵션을 선택하면 FTP 서버의 SSL 인증서가 자체 서명되거나 CA(인증 기관)에서 그 유효성을 검사할 수 없더라도 해당 인증서가 ftps://로 신뢰됩니다.", + "loc.messages.CleanRemoteDir": "원격 디렉터리를 제거하는 중: %s", + "loc.messages.CleanRemoteDirContents": "원격 디렉터리 콘텐츠를 제거하는 중: %s", + "loc.messages.CleanFileDeleteFail": "파일을 제거하는 중 오류 발생: %s", + "loc.messages.ConnectPort": "%s:%s에 연결하는 중입니다.", + "loc.messages.Disconnected": "연결 끊김", + "loc.messages.DisconnectHost": "%s에서 연결을 끊는 중입니다.", + "loc.messages.FTPConnected": "%s이(가) 연결되었습니다.", + "loc.messages.FTPNoHostSpecified": "FTP 서버 URL은 호스트 이름을 포함해야 합니다.", + "loc.messages.FTPNoProtocolSpecified": "FTP 서버 URL은 ftp:// 또는 ftps://로 시작해야 합니다.", + "loc.messages.UploadRemoteDir": "파일을 원격 디렉터리로 업로드하는 중입니다. %s", + "loc.messages.UploadSucceedMsg": "FTP 업로드 성공 %s", + "loc.messages.UploadSucceedRes": "FTP 업로드 성공" +} \ No newline at end of file diff --git a/_generated/FtpUploadV1/Strings/resources.resjson/ru-RU/resources.resjson b/_generated/FtpUploadV1/Strings/resources.resjson/ru-RU/resources.resjson new file mode 100644 index 000000000000..7f45c7f4c965 --- /dev/null +++ b/_generated/FtpUploadV1/Strings/resources.resjson/ru-RU/resources.resjson @@ -0,0 +1,42 @@ +{ + "loc.friendlyName": "Отправка по FTP", + "loc.helpMarkDown": "Передача файлов на удаленный компьютер по протоколу FTP или защищенному протоколу FTPS. [Дополнительные сведения](http://go.microsoft.com/fwlink/?LinkId=809084).", + "loc.description": "Отправка файлов по FTP", + "loc.instanceNameFormat": "Отправка по FTP: $(rootFolder)", + "loc.group.displayName.advanced": "Дополнительно", + "loc.input.label.credsType": "Способ проверки подлинности", + "loc.input.help.credsType": "Используйте подключение к службе FTP или введите учетные данные подключения.", + "loc.input.label.serverEndpoint": "Подключение к службе FTP", + "loc.input.help.serverEndpoint": "Выберите подключение к службе для FTP-сервера. Чтобы создать подключение, щелкните ссылку \"Управление\" и создайте универсальное подключение к службе, введите URL-адрес FTP-сервера в поле \"URL-адрес сервера\" (например, ftp://server.example.com) и необходимые учетные данные.

Если конечный сервер поддерживает FTPS, всегда будут устанавливаться безопасные подключения независимо от указанного протокола (ftp:// или ftps://). Чтобы разрешить только безопасные подключения, используйте протокол ftps://, например ftps://server.example.com. Если указан протокол ftps://, подключения к серверам, не поддерживающим FTPS, будут завершаться ошибкой.", + "loc.input.label.serverUrl": "URL-адрес сервера", + "loc.input.label.username": "Имя пользователя", + "loc.input.label.password": "Пароль", + "loc.input.label.rootFolder": "Корневая папка", + "loc.input.help.rootFolder": "Исходная папка, из которой выполняется отправка файлов.", + "loc.input.label.filePatterns": "Шаблоны файлов", + "loc.input.help.filePatterns": "Пути к файлам или шаблоны файлов для отправки. Поддерживает несколько строк шаблонов minimatch. [Подробнее...](https://go.microsoft.com/fwlink/?LinkId=800269)", + "loc.input.label.remotePath": "Удаленный каталог", + "loc.input.help.remotePath": "Отправлять файлы в этот каталог на удаленном FTP-сервере.", + "loc.input.label.clean": "Удалить удаленный каталог", + "loc.input.help.clean": "Удалить удаленный каталог, включая его содержимое, перед отправкой.", + "loc.input.label.cleanContents": "Очистить содержимое удаленного каталога", + "loc.input.help.cleanContents": "Рекурсивно удалить все содержимое удаленного каталога перед отправкой. Существующий каталог не удаляется. Для повышения производительности используйте вместо этого функцию \"Удалить удаленный каталог\".", + "loc.input.label.overwrite": "Перезаписать", + "loc.input.help.overwrite": "Перезапись существующих файлов в удаленном каталоге.", + "loc.input.label.preservePaths": "Сохранять пути к файлам", + "loc.input.help.preservePaths": "Если этот флажок установлен, структура относительного локального каталога пересоздается в удаленном каталоге, в который отправляются файлы. В противном случае файлы отправляются напрямую в удаленный каталог без создания дополнительных подкаталогов.

Предположим, ваша исходная папка — /home/user/source/, которая содержит файл foo/bar/foobar.txt, а удаленный каталог — /uploads/.
Если флажок установлен, файл отправляется в папку /uploads/foo/bar/foobar.txt. В противном случае он отправляется в папку /uploads/foobar.txt.", + "loc.input.label.trustSSL": "Доверять сертификату сервера", + "loc.input.help.trustSSL": "При выборе этого параметра SSL-сертификат FTP-сервера становится доверенным для ftps://, даже если он является самозаверяющим или центр сертификации не может подтвердить его подлинность.", + "loc.messages.CleanRemoteDir": "удаляется удаленный каталог: %s", + "loc.messages.CleanRemoteDirContents": "удаляется содержимое удаленного каталога: %s", + "loc.messages.CleanFileDeleteFail": "произошла ошибка при удалении файла: %s", + "loc.messages.ConnectPort": "подключено к: %s:%s", + "loc.messages.Disconnected": "отключено", + "loc.messages.DisconnectHost": "отключение от: %s", + "loc.messages.FTPConnected": "подключено: %s", + "loc.messages.FTPNoHostSpecified": "В URL-адресе FTP-сервера должно быть указано имя узла.", + "loc.messages.FTPNoProtocolSpecified": "URL-адрес FTP-сервера должен начинаться с \"ftp://\" или \"ftps://\"", + "loc.messages.UploadRemoteDir": "отправка файлов в удаленный каталог: %s", + "loc.messages.UploadSucceedMsg": "Отправка по FTP успешно завершена: %s", + "loc.messages.UploadSucceedRes": "Отправка по FTP успешно завершена." +} \ No newline at end of file diff --git a/_generated/FtpUploadV1/Strings/resources.resjson/zh-CN/resources.resjson b/_generated/FtpUploadV1/Strings/resources.resjson/zh-CN/resources.resjson new file mode 100644 index 000000000000..5d0d7bcfd24d --- /dev/null +++ b/_generated/FtpUploadV1/Strings/resources.resjson/zh-CN/resources.resjson @@ -0,0 +1,42 @@ +{ + "loc.friendlyName": "FTP 上传", + "loc.helpMarkDown": "使用文件传输协议(FTP)将文件上传到远程计算机,或使用 FTPS 安全上传。[详细信息](http://go.microsoft.com/fwlink/?LinkId=809084)。", + "loc.description": "使用 FTP 上传文件", + "loc.instanceNameFormat": "FTP 上传: $(rootFolder)", + "loc.group.displayName.advanced": "高级", + "loc.input.label.credsType": "身份验证方法", + "loc.input.help.credsType": "使用 FTP 服务连接或输入连接凭据。", + "loc.input.label.serverEndpoint": "FTP 服务连接", + "loc.input.help.serverEndpoint": "选择 FTP 服务器的服务连接。若要创建一个,可单击管理链接并创建新的通用服务连接,为服务器 URL 输入 FTP 服务器 URL,例如,\"ftp://server.example.com\",以及所需的凭据。

如果目标服务器支持 FTPS,无论指定了什么协议,都会建立安全连接(\"ftp://\"\"ftps://\")。若要仅允许安全连接,请使用 \"ftps://\" 协议,例如,\"ftps://server.example.com\"。如果指定了 \"ftps://\",则连接不支持 FTPS 的服务器将失败。", + "loc.input.label.serverUrl": "服务器 URL", + "loc.input.label.username": "用户名", + "loc.input.label.password": "密码", + "loc.input.label.rootFolder": "根文件夹", + "loc.input.help.rootFolder": "要上传其中文件的源文件夹。", + "loc.input.label.filePatterns": "文件模式", + "loc.input.help.filePatterns": "要上传的文件的文件路径或模式。支持多行最小匹配模式。[详细信息](https://go.microsoft.com/fwlink/?LinkId=800269)", + "loc.input.label.remotePath": "远程目录", + "loc.input.help.remotePath": "将文件上传到远程 FTP 服务器上的该目录中。", + "loc.input.label.clean": "删除远程目录", + "loc.input.help.clean": "上传前,请删除远程目录及其内容。", + "loc.input.label.cleanContents": "清除远程目录内容", + "loc.input.help.cleanContents": "上传前,请以递归方式删除所有远程目录的内容。不会删除现有目录。要提高性能,请考虑改用“删除远程目录”。", + "loc.input.label.overwrite": "覆盖", + "loc.input.help.overwrite": "覆盖远程目录中的现有文件。", + "loc.input.label.preservePaths": "保留文件路径", + "loc.input.help.preservePaths": "如果选中,将在上传文件的远程目录下重新创建有关本地目录结构。否则,会将文件直接上传到远程目录而不创建其他子目录。

例如,假设源文件夹为: `/home/user/source/`,它包含文件: `foo/bar/foobar.txt`,而远程目录为: `/uploads/`
如果选中,文件将上传到: `/ uploads/foo/bar/foobar.txt`。否则上传到: `/ uploads/foobar.txt`。", + "loc.input.label.trustSSL": "信任服务器证书", + "loc.input.help.trustSSL": "选择此选项将通过 ftps:// 信任 FTP 服务器的 SSL 证书,即使它是自签名证书或无法由证书颁发机构(CA)验证的证书。", + "loc.messages.CleanRemoteDir": "正在删除远程目录: %s", + "loc.messages.CleanRemoteDirContents": "正在删除远程目录内容: %s", + "loc.messages.CleanFileDeleteFail": "尝试删除文件时出错: %s", + "loc.messages.ConnectPort": "正在连接到: %s:%s", + "loc.messages.Disconnected": "已断开连接", + "loc.messages.DisconnectHost": "正在断开与 %s 的连接 ", + "loc.messages.FTPConnected": "已连接: %s", + "loc.messages.FTPNoHostSpecified": "FTP 服务器 URL 必需包括主机名", + "loc.messages.FTPNoProtocolSpecified": "FTP 服务器 URL 必需以 ftp:// 或 ftps:// 开头", + "loc.messages.UploadRemoteDir": "正在将文件上传到远程目录: %s", + "loc.messages.UploadSucceedMsg": "FTP 已成功上传 %s", + "loc.messages.UploadSucceedRes": "FTP 已成功上传" +} \ No newline at end of file diff --git a/_generated/FtpUploadV1/Strings/resources.resjson/zh-TW/resources.resjson b/_generated/FtpUploadV1/Strings/resources.resjson/zh-TW/resources.resjson new file mode 100644 index 000000000000..3e6e9f188211 --- /dev/null +++ b/_generated/FtpUploadV1/Strings/resources.resjson/zh-TW/resources.resjson @@ -0,0 +1,42 @@ +{ + "loc.friendlyName": "FTP 上傳", + "loc.helpMarkDown": "使用檔案傳輸通訊協定 (FTP) 或更安全的 FTPS,將檔案上傳到遠端電腦。[詳細資訊](http://go.microsoft.com/fwlink/?LinkId=809084)。", + "loc.description": "使用 FTP 上傳檔案", + "loc.instanceNameFormat": "FTP 上傳: $(rootFolder)", + "loc.group.displayName.advanced": "進階", + "loc.input.label.credsType": "驗證方法", + "loc.input.help.credsType": "請使用 FTP 服務連線,或輸入連線認證。", + "loc.input.label.serverEndpoint": "FTP 服務連線", + "loc.input.help.serverEndpoint": "請為您的 FTP 伺服器選取服務連線。若要建立服務連線,請按一下 [管理連結],然後建立新的泛型服務連線,輸入伺服器 URL 的 FTP 伺服器 URL (例如: `ftp://server.example.com`) 和必要認證。

無論指定何種通訊協定 ('ftp://''ftps://'),只要目標伺服器支援 FTPS,一律會建立安全連線。若要只允許安全連線,請使用 'ftps://' 通訊協定,例如 'ftps://server.example.com'。若指定了 'ftps://',但伺服器不支援 FTPS,連線將會失敗。", + "loc.input.label.serverUrl": "伺服器 URL", + "loc.input.label.username": "使用者名稱", + "loc.input.label.password": "密碼", + "loc.input.label.rootFolder": "根資料夾", + "loc.input.help.rootFolder": "要上傳之檔案所在的來源資料夾。", + "loc.input.label.filePatterns": "檔案模式", + "loc.input.help.filePatterns": "要上傳之檔案的檔案路徑或樣式。支援多行的 minimatch 樣式。[詳細資訊](https://go.microsoft.com/fwlink/?LinkId=800269)", + "loc.input.label.remotePath": "遠端目錄", + "loc.input.help.remotePath": "將檔案上傳到遠端 FTP 伺服器上的此目錄。", + "loc.input.label.clean": "刪除遠端目錄", + "loc.input.help.clean": "先刪除遠端目錄 (包括其內容) 再上傳。", + "loc.input.label.cleanContents": "清除遠端目錄內容", + "loc.input.help.cleanContents": "先以遞迴方式刪除遠端目錄的所有內容再上傳。現有的目錄不會刪除。為達更佳效能,請考慮改為使用 `Delete remote directory`。", + "loc.input.label.overwrite": "覆寫", + "loc.input.help.overwrite": "覆寫遠端目錄中現有的檔案。", + "loc.input.label.preservePaths": "保留檔案路徑", + "loc.input.help.preservePaths": "如有選取,會在檔案上傳的遠端目錄下重新建立相對的本機目錄結構。否則,檔案會直接上傳到遠端目錄,而不會另外建立其他子目錄。

例如,假設您的來源資料來為 '/home/user/source/',其中包含了檔案 'foo/bar/foobar.txt',而您的遠端目錄為 '/uploads/'
如有選取,檔案會上傳到 '/uploads/foo/bar/foobar.txt',否則會上傳到 '/uploads/foobar.txt'。", + "loc.input.label.trustSSL": "信任伺服器憑證", + "loc.input.help.trustSSL": "選取此選項會導致 FTP 伺服器的 SSL 憑證受 ftps:// 信任,即使它是自我簽署的憑證,或是憑證授權單位 (CA) 無法驗證的憑證亦然。", + "loc.messages.CleanRemoteDir": "正在移除遠端目錄: %s", + "loc.messages.CleanRemoteDirContents": "正在移除遠端目錄內容: %s", + "loc.messages.CleanFileDeleteFail": "嘗試移除檔案時發生錯誤: %s", + "loc.messages.ConnectPort": "正在連線到: %s:%s", + "loc.messages.Disconnected": "已中斷連線", + "loc.messages.DisconnectHost": "正在中斷下項的連線: %s", + "loc.messages.FTPConnected": "已連線: %s", + "loc.messages.FTPNoHostSpecified": "FTP 伺服器 URL 必須包含主機名稱。", + "loc.messages.FTPNoProtocolSpecified": "FTP 伺服器 URL 的開頭必須是 ftp:// 或 ftps://", + "loc.messages.UploadRemoteDir": "正在將檔案上傳至遠端目錄: %s", + "loc.messages.UploadSucceedMsg": "FTP 上傳成功 %s", + "loc.messages.UploadSucceedRes": "FTP 上傳成功" +} \ No newline at end of file diff --git a/_generated/FtpUploadV1/Tests/L0.ts b/_generated/FtpUploadV1/Tests/L0.ts new file mode 100644 index 000000000000..13a8d5dc2ad4 --- /dev/null +++ b/_generated/FtpUploadV1/Tests/L0.ts @@ -0,0 +1,129 @@ +import fs = require('fs'); +import assert = require('assert'); +import path = require('path'); +import * as ttm from 'azure-pipelines-task-lib/mock-test'; + +describe('FtpUploadV1 Suite', function () { + this.timeout(parseInt(process.env.TASK_TEST_TIMEOUT) || 20000); + + it('check args: no serverEndpoint', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0NoServerEndpoint.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.stdOutContained('Input required: serverEndpoint'), 'Should have printed: Input required: serverEndpoint'); + assert(tr.failed, 'task should have failed'); + + done(); + }); + + it('check args: no rootFolder', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0NoRootFolder.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.stdOutContained('Input required: rootFolder'), 'Should have printed: Input required: rootFolder'); + assert(tr.failed, 'task should have failed'); + + done(); + }); + + it('check args: no filePatterns', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0NoFilePatterns.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.stdOutContained('Input required: filePatterns'), 'Should have printed: Input required: filePatterns'); + assert(tr.failed, 'task should have failed'); + + done(); + }); + + it('check args: no remotePath', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0NoRemotePath.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.stdOutContained('Input required: remotePath'), 'Should have printed: Input required: remotePath'); + assert(tr.failed, 'task should have failed'); + + done(); + }); + + it('check args: no clean', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0NoClean.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.stdOutContained('Input required: clean'), 'Should have printed: Input required: clean'); + assert(tr.failed, 'task should have failed'); + + done(); + }); + + it('check args: no overwrite', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0NoOverwrite.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.stdOutContained('Input required: overwrite'), 'Should have printed: Input required: overwrite'); + assert(tr.failed, 'task should have failed'); + + done(); + }); + + it('check args: no preservePaths', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0NoPreservePaths.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.stdOutContained('Input required: preservePaths'), 'Should have printed: Input required: preservePaths'); + assert(tr.failed, 'task should have failed'); + + done(); + }); + + it('check args: no trustSSL', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0NoTrustSSL.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.invokedToolCount === 0, 'should not run anything'); + assert(tr.stdOutContained('Input required: trustSSL'), 'Should have printed: Input required: trustSSL'); + assert(tr.failed, 'task should have failed'); + + done(); + }); + + it('check args: no protocol on server URL (ftp:// or ftps://)', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0NoProtocol.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.stdOutContained('loc_mock_FTPNoProtocolSpecified'), 'Should have printed: loc_mock_FTPNoProtocolSpecified'); + assert(tr.failed, 'task should have failed'); + + done(); + }); + + it('check args: no host name on server URL', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0NoHostName.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.stdOutContained('loc_mock_FTPNoHostSpecified'), 'Should have printed: loc_mock_FTPNoHostSpecified'); + assert(tr.failed, 'task should have failed'); + + done(); + }); +}); diff --git a/_generated/FtpUploadV1/Tests/L0NoClean.ts b/_generated/FtpUploadV1/Tests/L0NoClean.ts new file mode 100644 index 000000000000..e0c4ad749695 --- /dev/null +++ b/_generated/FtpUploadV1/Tests/L0NoClean.ts @@ -0,0 +1,40 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'ftpuploadtask.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('serverEndpoint', 'ID1'); +tr.setInput('rootFolder', 'rootFolder'); +tr.setInput('filePatterns', '**'); +tr.setInput('remotePath', '/upload/'); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "getVariable": { + "ENDPOINT_URL_ID1": "ftp://valid.microsoft.com", + "ENDPOINT_AUTH_ID1": "{\"scheme\":\"UsernamePassword\", \"parameters\": {\"username\": \"uname\", \"password\": \"pword\"}}", + "build.sourcesDirectory": "/" + }, + "exist" : { + "rootFolder": true + }, + "find": { + "rootFolder": [ + "rootFolder/a", + "rootFolder/b", + "rootFolder/c" + ] + }, + "match": { + "*": [ + "rootFolder/a", + "rootFolder/b", + "rootFolder/c" + ] + } +}; +tr.setAnswers(a); + +tr.run(); \ No newline at end of file diff --git a/_generated/FtpUploadV1/Tests/L0NoFilePatterns.ts b/_generated/FtpUploadV1/Tests/L0NoFilePatterns.ts new file mode 100644 index 000000000000..8e3444ba1f04 --- /dev/null +++ b/_generated/FtpUploadV1/Tests/L0NoFilePatterns.ts @@ -0,0 +1,38 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'ftpuploadtask.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('serverEndpoint', 'ID1'); +tr.setInput('rootFolder', 'rootFolder'); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "getVariable": { + "ENDPOINT_URL_ID1": "ftp://valid.microsoft.com", + "ENDPOINT_AUTH_ID1": "{\"scheme\":\"UsernamePassword\", \"parameters\": {\"username\": \"uname\", \"password\": \"pword\"}}", + "build.sourcesDirectory": "/" + }, + "exist" : { + "rootFolder": true + }, + "find": { + "rootFolder": [ + "rootFolder/a", + "rootFolder/b", + "rootFolder/c" + ] + }, + "match": { + "*": [ + "rootFolder/a", + "rootFolder/b", + "rootFolder/c" + ] + } +}; +tr.setAnswers(a); + +tr.run(); \ No newline at end of file diff --git a/_generated/FtpUploadV1/Tests/L0NoHostName.ts b/_generated/FtpUploadV1/Tests/L0NoHostName.ts new file mode 100644 index 000000000000..b7e3877412bb --- /dev/null +++ b/_generated/FtpUploadV1/Tests/L0NoHostName.ts @@ -0,0 +1,47 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'ftpuploadtask.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('credsType', 'inputs'); +tr.setInput('serverUrl', 'ftps://'); +tr.setInput('username', 'username'); +tr.setInput('password', 'password'); +tr.setInput('rootFolder', 'rootFolder'); +tr.setInput('filePatterns', '**'); +tr.setInput('remotePath', '/upload/'); +tr.setInput('clean', 'true'); +tr.setInput('overwrite', 'true'); +tr.setInput('preservePaths', 'true'); +tr.setInput('trustSSL', 'true'); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "getVariable": { + "ENDPOINT_URL_ID1": "ftp://valid.microsoft.com", + "ENDPOINT_AUTH_ID1": "{\"scheme\":\"UsernamePassword\", \"parameters\": {\"username\": \"uname\", \"password\": \"pword\"}}", + "build.sourcesDirectory": "/" + }, + "exist" : { + "rootFolder": true + }, + "find": { + "rootFolder": [ + "rootFolder/a", + "rootFolder/b", + "rootFolder/c" + ] + }, + "match": { + "*": [ + "rootFolder/a", + "rootFolder/b", + "rootFolder/c" + ] + } +}; +tr.setAnswers(a); + +tr.run(); \ No newline at end of file diff --git a/_generated/FtpUploadV1/Tests/L0NoOverwrite.ts b/_generated/FtpUploadV1/Tests/L0NoOverwrite.ts new file mode 100644 index 000000000000..3bbddd96337d --- /dev/null +++ b/_generated/FtpUploadV1/Tests/L0NoOverwrite.ts @@ -0,0 +1,41 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'ftpuploadtask.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('serverEndpoint', 'ID1'); +tr.setInput('rootFolder', 'rootFolder'); +tr.setInput('filePatterns', '**'); +tr.setInput('remotePath', '/upload/'); +tr.setInput('clean', 'true'); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "getVariable": { + "ENDPOINT_URL_ID1": "ftp://valid.microsoft.com", + "ENDPOINT_AUTH_ID1": "{\"scheme\":\"UsernamePassword\", \"parameters\": {\"username\": \"uname\", \"password\": \"pword\"}}", + "build.sourcesDirectory": "/" + }, + "exist" : { + "rootFolder": true + }, + "find": { + "rootFolder": [ + "rootFolder/a", + "rootFolder/b", + "rootFolder/c" + ] + }, + "match": { + "*": [ + "rootFolder/a", + "rootFolder/b", + "rootFolder/c" + ] + } +}; +tr.setAnswers(a); + +tr.run(); \ No newline at end of file diff --git a/_generated/FtpUploadV1/Tests/L0NoPreservePaths.ts b/_generated/FtpUploadV1/Tests/L0NoPreservePaths.ts new file mode 100644 index 000000000000..e62cc4cae38e --- /dev/null +++ b/_generated/FtpUploadV1/Tests/L0NoPreservePaths.ts @@ -0,0 +1,42 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'ftpuploadtask.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('serverEndpoint', 'ID1'); +tr.setInput('rootFolder', 'rootFolder'); +tr.setInput('filePatterns', '**'); +tr.setInput('remotePath', '/upload/'); +tr.setInput('clean', 'true'); +tr.setInput('overwrite', 'true'); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "getVariable": { + "ENDPOINT_URL_ID1": "ftp://valid.microsoft.com", + "ENDPOINT_AUTH_ID1": "{\"scheme\":\"UsernamePassword\", \"parameters\": {\"username\": \"uname\", \"password\": \"pword\"}}", + "build.sourcesDirectory": "/" + }, + "exist" : { + "rootFolder": true + }, + "find": { + "rootFolder": [ + "rootFolder/a", + "rootFolder/b", + "rootFolder/c" + ] + }, + "match": { + "*": [ + "rootFolder/a", + "rootFolder/b", + "rootFolder/c" + ] + } +}; +tr.setAnswers(a); + +tr.run(); \ No newline at end of file diff --git a/_generated/FtpUploadV1/Tests/L0NoProtocol.ts b/_generated/FtpUploadV1/Tests/L0NoProtocol.ts new file mode 100644 index 000000000000..b94be5afef47 --- /dev/null +++ b/_generated/FtpUploadV1/Tests/L0NoProtocol.ts @@ -0,0 +1,47 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'ftpuploadtask.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('credsType', 'inputs'); +tr.setInput('serverUrl', 'noprotocol.microsoft.com'); +tr.setInput('username', 'myUsername'); +tr.setInput('password', 'myPassword'); +tr.setInput('rootFolder', 'rootFolder'); +tr.setInput('filePatterns', '**'); +tr.setInput('remotePath', '/upload/'); +tr.setInput('clean', 'true'); +tr.setInput('overwrite', 'true'); +tr.setInput('preservePaths', 'true'); +tr.setInput('trustSSL', 'true'); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "getVariable": { + "ENDPOINT_URL_ID1": "ftp://valid.microsoft.com", + "ENDPOINT_AUTH_ID1": "{\"scheme\":\"UsernamePassword\", \"parameters\": {\"username\": \"uname\", \"password\": \"pword\"}}", + "build.sourcesDirectory": "/" + }, + "exist" : { + "rootFolder": true + }, + "find": { + "rootFolder": [ + "rootFolder/a", + "rootFolder/b", + "rootFolder/c" + ] + }, + "match": { + "*": [ + "rootFolder/a", + "rootFolder/b", + "rootFolder/c" + ] + } +}; +tr.setAnswers(a); + +tr.run(); \ No newline at end of file diff --git a/_generated/FtpUploadV1/Tests/L0NoRemotePath.ts b/_generated/FtpUploadV1/Tests/L0NoRemotePath.ts new file mode 100644 index 000000000000..d16cad0ee3ed --- /dev/null +++ b/_generated/FtpUploadV1/Tests/L0NoRemotePath.ts @@ -0,0 +1,39 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'ftpuploadtask.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('serverEndpoint', 'ID1'); +tr.setInput('rootFolder', 'rootFolder'); +tr.setInput('filePatterns', '**'); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "getVariable": { + "ENDPOINT_URL_ID1": "ftp://valid.microsoft.com", + "ENDPOINT_AUTH_ID1": "{\"scheme\":\"UsernamePassword\", \"parameters\": {\"username\": \"uname\", \"password\": \"pword\"}}", + "build.sourcesDirectory": "/" + }, + "exist" : { + "rootFolder": true + }, + "find": { + "rootFolder": [ + "rootFolder/a", + "rootFolder/b", + "rootFolder/c" + ] + }, + "match": { + "*": [ + "rootFolder/a", + "rootFolder/b", + "rootFolder/c" + ] + } +}; +tr.setAnswers(a); + +tr.run(); \ No newline at end of file diff --git a/_generated/FtpUploadV1/Tests/L0NoRootFolder.ts b/_generated/FtpUploadV1/Tests/L0NoRootFolder.ts new file mode 100644 index 000000000000..07d04bbda4bf --- /dev/null +++ b/_generated/FtpUploadV1/Tests/L0NoRootFolder.ts @@ -0,0 +1,37 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'ftpuploadtask.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('serverEndpoint', 'ID1'); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "getVariable": { + "ENDPOINT_URL_ID1": "ftp://valid.microsoft.com", + "ENDPOINT_AUTH_ID1": "{\"scheme\":\"UsernamePassword\", \"parameters\": {\"username\": \"uname\", \"password\": \"pword\"}}", + "build.sourcesDirectory": "/" + }, + "exist" : { + "rootFolder": true + }, + "find": { + "rootFolder": [ + "rootFolder/a", + "rootFolder/b", + "rootFolder/c" + ] + }, + "match": { + "*": [ + "rootFolder/a", + "rootFolder/b", + "rootFolder/c" + ] + } +}; +tr.setAnswers(a); + +tr.run(); \ No newline at end of file diff --git a/_generated/FtpUploadV1/Tests/L0NoServerEndpoint.ts b/_generated/FtpUploadV1/Tests/L0NoServerEndpoint.ts new file mode 100644 index 000000000000..d466bcf5c551 --- /dev/null +++ b/_generated/FtpUploadV1/Tests/L0NoServerEndpoint.ts @@ -0,0 +1,37 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'ftpuploadtask.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('credsType', 'serviceEndpoint'); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "getVariable": { + "ENDPOINT_URL_ID1": "ftp://valid.microsoft.com", + "ENDPOINT_AUTH_ID1": "{\"scheme\":\"UsernamePassword\", \"parameters\": {\"username\": \"uname\", \"password\": \"pword\"}}", + "build.sourcesDirectory": "/" + }, + "exist" : { + "rootFolder": true + }, + "find": { + "rootFolder": [ + "rootFolder/a", + "rootFolder/b", + "rootFolder/c" + ] + }, + "match": { + "*": [ + "rootFolder/a", + "rootFolder/b", + "rootFolder/c" + ] + } +}; +tr.setAnswers(a); + +tr.run(); \ No newline at end of file diff --git a/_generated/FtpUploadV1/Tests/L0NoTrustSSL.ts b/_generated/FtpUploadV1/Tests/L0NoTrustSSL.ts new file mode 100644 index 000000000000..dbf227e2e628 --- /dev/null +++ b/_generated/FtpUploadV1/Tests/L0NoTrustSSL.ts @@ -0,0 +1,43 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'ftpuploadtask.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('serverEndpoint', 'ID1'); +tr.setInput('rootFolder', 'rootFolder'); +tr.setInput('filePatterns', '**'); +tr.setInput('remotePath', '/upload/'); +tr.setInput('clean', 'true'); +tr.setInput('overwrite', 'true'); +tr.setInput('preservePaths', 'true'); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "getVariable": { + "ENDPOINT_URL_ID1": "ftp://valid.microsoft.com", + "ENDPOINT_AUTH_ID1": "{\"scheme\":\"UsernamePassword\", \"parameters\": {\"username\": \"uname\", \"password\": \"pword\"}}", + "build.sourcesDirectory": "/" + }, + "exist" : { + "rootFolder": true + }, + "find": { + "rootFolder": [ + "rootFolder/a", + "rootFolder/b", + "rootFolder/c" + ] + }, + "match": { + "*": [ + "rootFolder/a", + "rootFolder/b", + "rootFolder/c" + ] + } +}; +tr.setAnswers(a); + +tr.run(); \ No newline at end of file diff --git a/_generated/FtpUploadV1/Tests/package-lock.json b/_generated/FtpUploadV1/Tests/package-lock.json new file mode 100644 index 000000000000..04ef5eaf8472 --- /dev/null +++ b/_generated/FtpUploadV1/Tests/package-lock.json @@ -0,0 +1,14 @@ +{ + "name": "ftp-upload-tests", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/mocha": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", + "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==", + "dev": true + } + } +} diff --git a/_generated/FtpUploadV1/Tests/package.json b/_generated/FtpUploadV1/Tests/package.json new file mode 100644 index 000000000000..743cd975ef68 --- /dev/null +++ b/_generated/FtpUploadV1/Tests/package.json @@ -0,0 +1,22 @@ +{ + "name": "ftp-upload-tests", + "version": "1.0.0", + "description": "Azure Pipelines FTP Upload V1 Task Tests", + "main": "L0.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/Microsoft/azure-pipelines-tasks.git" + }, + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Microsoft/azure-pipelines-tasks/issues" + }, + "homepage": "https://github.com/Microsoft/azure-pipelines-tasks#readme", + "devDependencies": { + "@types/mocha": "^5.2.0" + } +} diff --git a/_generated/FtpUploadV1/ThirdPartyNotices.txt b/_generated/FtpUploadV1/ThirdPartyNotices.txt new file mode 100644 index 000000000000..ff44a8011b20 --- /dev/null +++ b/_generated/FtpUploadV1/ThirdPartyNotices.txt @@ -0,0 +1,18 @@ +---------------------------------------- START OF THIRD PARTY NOTICE ----------------------------------------- +This file is based on or incorporates material from the projects listed below (Third Party OSS). The original copyright notice and the license under which Microsoft received such Third Party OSS, are set forth below. Such licenses and notices are provided for informational purposes only. Microsoft licenses the Third Party OSS to you under the licensing terms for the Microsoft product or service. Microsoft reserves all other rights not expressly granted under this agreement, whether by implication, estoppel or otherwise. + +ftp + +Copyright Brian White. All rights reserved. + +Provided for Informational Purposes Only + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the Software), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------- END OF THIRD PARTY NOTICE -------------------------------------------- \ No newline at end of file diff --git a/_generated/FtpUploadV1/ftpuploadtask.ts b/_generated/FtpUploadV1/ftpuploadtask.ts new file mode 100644 index 000000000000..041bd9671d1c --- /dev/null +++ b/_generated/FtpUploadV1/ftpuploadtask.ts @@ -0,0 +1,164 @@ +import tl = require('azure-pipelines-task-lib/task'); +import url = require('url'); +import Q = require('q'); +import path = require('path'); + +let Client = require('ftp'); + +import ftputils = require('./ftputils'); + +export class FtpOptions { + // url + serverEndpointUrl: url.Url; + + // credentials + username: string; + password: string + + // other standard options + rootFolder: string; + filePatterns: string[]; + remotePath: string; + + // advanced options + clean: boolean; + cleanContents: boolean; + overwrite: boolean; + preservePaths: boolean; + trustSSL: boolean; +} + +function getFtpOptions(): FtpOptions { + let options: FtpOptions = new FtpOptions(); + + if (tl.getInput('credsType') === 'serviceEndpoint') { + // server endpoint + let serverEndpoint: string = tl.getInput('serverEndpoint', true); + options.serverEndpointUrl = url.parse(tl.getEndpointUrl(serverEndpoint, false)); + + let serverEndpointAuth: tl.EndpointAuthorization = tl.getEndpointAuthorization(serverEndpoint, false); + options.username = serverEndpointAuth['parameters']['username']; + options.password = serverEndpointAuth['parameters']['password']; + } else if (tl.getInput('credsType') === 'inputs') { + options.serverEndpointUrl = url.parse(tl.getInput('serverUrl', true)); + options.username = tl.getInput('username', true); + options.password = tl.getInput('password', true); + } + + // other standard options + options.rootFolder = tl.getPathInput('rootFolder', true); + options.filePatterns = tl.getDelimitedInput('filePatterns', '\n', true); + options.remotePath = tl.getInput('remotePath', true).trim(); + + // advanced options + options.clean = tl.getBoolInput('clean', true); + options.cleanContents = tl.getBoolInput('cleanContents', false); + options.overwrite = tl.getBoolInput('overwrite', true); + options.preservePaths = tl.getBoolInput('preservePaths', true); + options.trustSSL = tl.getBoolInput('trustSSL', true); + + return options; +} + +function doWork() { + tl.setResourcePath(path.join( __dirname, 'task.json')); + + let ftpOptions: FtpOptions = getFtpOptions(); + if (!ftpOptions.serverEndpointUrl.protocol) { + tl.setResult(tl.TaskResult.Failed, tl.loc('FTPNoProtocolSpecified')); + } + if (!ftpOptions.serverEndpointUrl.hostname) { + tl.setResult(tl.TaskResult.Failed, tl.loc('FTPNoHostSpecified')); + } + + let ftpClient: any = new Client(); + let ftpHelper: ftputils.FtpHelper = new ftputils.FtpHelper(ftpOptions, ftpClient); + + let files: string[] = ftputils.findFiles(ftpOptions); + tl.debug('number of files to upload: ' + files.length); + tl.debug('files to upload: ' + JSON.stringify(files)); + + let uploadSuccessful: boolean = false; + + ftpClient.on('greeting', (message: string) => { + tl.debug('ftp client greeting'); + console.log(tl.loc('FTPConnected', message)); + }); + + ftpClient.on('ready', async () => { + tl.debug('ftp client ready'); + try { + if (ftpOptions.clean) { + console.log(tl.loc('CleanRemoteDir', ftpOptions.remotePath)); + await ftpHelper.cleanRemote(ftpOptions.remotePath); + } else if (ftpOptions.cleanContents) { + console.log(tl.loc('CleanRemoteDirContents', ftpOptions.remotePath)); + await ftpHelper.cleanRemoteContents(ftpOptions.remotePath); + } + + console.log(tl.loc('UploadRemoteDir', ftpOptions.remotePath)); + await ftpHelper.uploadFiles(files); + uploadSuccessful = true; + console.log(tl.loc('UploadSucceedMsg', ftpHelper.progressTracking.getSuccessStatusMessage())); + + tl.setResult(tl.TaskResult.Succeeded, tl.loc('UploadSucceedRes')); + } catch (err) { + failTask(err); + } finally { + console.log(tl.loc('DisconnectHost', ftpOptions.serverEndpointUrl.host)); + ftpClient.end(); + ftpClient.destroy(); + } + }); + + ftpClient.on('close', (hadErr: boolean) => { + console.log(tl.loc('Disconnected')); + tl.debug('ftp client close, hadErr:' + hadErr); + }); + + ftpClient.on('end', () => { + tl.debug('ftp client end'); + }) + + ftpClient.on('error', (err) => { + tl.debug('ftp client error, err: ' + err); + if (!uploadSuccessful) { + // once all files are successfully uploaded, a subsequent error should not fail the task + failTask(err); + } + }) + + let verboseSnippet: string[] = []; + let debugLogger:any = function(message) { + verboseSnippet.push(message); + if (verboseSnippet.length >= 5) { + verboseSnippet.shift(); + } + tl.debug(message); + }; + function failTask(message: string): void { + let fullMessage: string = `FTP upload failed: "${message}". FTP log: "${verboseSnippet}".`; + if (ftpHelper.progressTracking) { + fullMessage += ftpHelper.progressTracking.getFailureStatusMessage(); + } + console.log(fullMessage); + tl.setResult(tl.TaskResult.Failed, message); + } + + let secure: boolean = ftpOptions.serverEndpointUrl.protocol.toLowerCase() == 'ftps:' ? true : false; + tl.debug('secure ftp=' + secure); + + let secureOptions: any = { 'rejectUnauthorized': !ftpOptions.trustSSL }; + + let hostName: string = ftpOptions.serverEndpointUrl.hostname; + let port: string = ftpOptions.serverEndpointUrl.port; + if (!port) { // port not explicitly specifed, use default + port = '21'; + tl.debug('port not specifided, using default: ' + port); + } + + console.log(tl.loc('ConnectPort', hostName, port)); + ftpClient.connect({ 'host': hostName, 'port': port, 'user': ftpOptions.username, 'password': ftpOptions.password, 'secure': secure, 'secureOptions': secureOptions, 'debug': debugLogger }); +} + +doWork(); \ No newline at end of file diff --git a/_generated/FtpUploadV1/ftputils.ts b/_generated/FtpUploadV1/ftputils.ts new file mode 100644 index 000000000000..70d724771c75 --- /dev/null +++ b/_generated/FtpUploadV1/ftputils.ts @@ -0,0 +1,318 @@ +import tl = require('azure-pipelines-task-lib/task'); +import Q = require('q'); +import path = require('path'); +import minimatch = require('minimatch'); + +import task = require('./ftpuploadtask'); +import FtpOptions = task.FtpOptions; + + +export class FtpHelper { + ftpOptions: FtpOptions = null; + ftpClient: any = null; + progressTracking: ProgressTracking = null; + + constructor(ftpOptions: FtpOptions, ftpClient: any) { + this.ftpOptions = ftpOptions; + this.ftpClient = ftpClient; + } + + createRemoteDirectory(remoteDirectory: string): Q.Promise { + let defer: Q.Deferred = Q.defer(); + + tl.debug('creating remote directory: ' + remoteDirectory); + + this.ftpClient.mkdir(remoteDirectory, true, function (err) { + if (err) { + defer.reject('Unable to create remote directory: ' + remoteDirectory + ' due to error: ' + err); + } else { + defer.resolve(null); + } + }); + + return defer.promise; + } + + uploadFile(file: string, remoteFile: string): Q.Promise { + let defer: Q.Deferred = Q.defer(); + + tl.debug('uploading file: ' + file + ' remote: ' + remoteFile); + + this.ftpClient.put(file, remoteFile, function (err) { + if (err) { + defer.reject('upload failed: ' + remoteFile + ' due to error: ' + err); + } else { + defer.resolve(null); + } + }); + + return defer.promise; + } + + remoteExists(remoteFile: string): Q.Promise { + let defer: Q.Deferred = Q.defer(); + + tl.debug('checking if remote exists: ' + remoteFile); + + let remoteDirname = path.normalize(path.dirname(remoteFile)); + let remoteBasename = path.basename(remoteFile); + + this.ftpClient.list(remoteDirname, function (err, list) { + if (err) { + //err.code == 550 is the standard not found error + //but just resolve false for all errors + defer.resolve(false); + } else { + for (let remote of list) { + if (remote.name == remoteBasename) { + defer.resolve(true); + return; + } + } + defer.resolve(false); + } + }); + + return defer.promise; + } + + rmdir(remotePath: string): Q.Promise { + let defer: Q.Deferred = Q.defer(); + + tl.debug('removing remote directory: ' + remotePath); + + this.ftpClient.rmdir(remotePath, true, function (err) { + if (err) { + defer.reject('Unable to remove remote folder: ' + remotePath + ' error: ' + err); + } else { + defer.resolve(null); + } + }); + + return defer.promise; + } + + remoteDelete(remotePath: string): Q.Promise { + let defer: Q.Deferred = Q.defer(); + + tl.debug('removing remote content: ' + remotePath); + + this.ftpClient.delete(remotePath, function (err) { + if (err) { + defer.reject('Unable to remove remote content: ' + remotePath + ' error: ' + err); + } else { + defer.resolve(null); + } + }); + + return defer.promise; + } + + async cleanRemote(remotePath: string) { + tl.debug('cleaning remote directory: ' + remotePath); + + if (await this.remoteExists(remotePath)) { + await this.rmdir(remotePath); + } + } + + async cleanRemoteContents(remotePath: string) { + tl.debug('cleaning remote directory contents: ' + remotePath); + + let that: any = this; + let defer: Q.Deferred = Q.defer(); + this.ftpClient.list(path.normalize(remotePath), async function (err, list) { + try { + if (!err) { + for (let remote of list) { + let item = path.join(remotePath, remote.name); + if (remote.type === 'd') { // directories + await that.rmdir(item); + } else { + await that.remoteDelete(item); + } + } + } + defer.resolve(null); + } catch(err) { + defer.reject('Error cleaning remote path: ' + err); + } + }); + return defer.promise; + } + + uploadFiles(files: string[]): Q.Promise { + let thisHelper = this; + thisHelper.progressTracking = new ProgressTracking(thisHelper.ftpOptions, files.length + 1); // add one extra for the root directory + tl.debug('uploading files'); + + let defer: Q.Deferred = Q.defer(); + + let outerPromises: Q.Promise[] = []; // these run first, and their then clauses add more promises to innerPromises + let innerPromises: Q.Promise[] = []; + outerPromises.push(this.createRemoteDirectory(thisHelper.ftpOptions.remotePath).then(() => { + thisHelper.progressTracking.directoryProcessed(thisHelper.ftpOptions.remotePath); + })); // ensure root remote location exists + + files.forEach((file) => { + tl.debug('file: ' + file); + let remoteFile: string = thisHelper.ftpOptions.preservePaths ? + path.join(thisHelper.ftpOptions.remotePath, file.substring(thisHelper.ftpOptions.rootFolder.length)) : + path.join(thisHelper.ftpOptions.remotePath, path.basename(file)); + + remoteFile = remoteFile.replace(/\\/gi, "/"); // use forward slashes always + tl.debug('remoteFile: ' + remoteFile); + + let stats = tl.stats(file); + if (stats.isDirectory()) { // create directories if necessary + outerPromises.push(thisHelper.createRemoteDirectory(remoteFile).then(() => { + thisHelper.progressTracking.directoryProcessed(remoteFile); + })); + } else if (stats.isFile()) { // upload files + if (thisHelper.ftpOptions.overwrite) { + outerPromises.push(thisHelper.uploadFile(file, remoteFile).then(() => { + thisHelper.progressTracking.fileUploaded(file, remoteFile); + })); + } else { + outerPromises.push(thisHelper.remoteExists(remoteFile).then((exists: boolean) => { + if (!exists) { + innerPromises.push(thisHelper.uploadFile(file, remoteFile).then(() => { + thisHelper.progressTracking.fileUploaded(file, remoteFile); + })); + } else { + thisHelper.progressTracking.fileSkipped(file, remoteFile); + } + })); + } + } + }); + + Q.all(outerPromises).then(() => { + Q.all(innerPromises).then(() => { + defer.resolve(null); + }).fail((err) => { + defer.reject(err); + }) + }).fail((err) => { + defer.reject(err); + }); + + return defer.promise; + } +} + +export class ProgressTracking { + ftpOptions: FtpOptions = null; + fileCount: number = -1; + + progressFilesUploaded: number = 0; + progressFilesSkipped: number = 0; // already exists and overwrite mode off + progressDirectoriesProcessed: number = 0; + + constructor(ftpOptions: FtpOptions, fileCount: number) { + this.ftpOptions = ftpOptions; + this.fileCount = fileCount; + } + + directoryProcessed(name: string): void { + this.progressDirectoriesProcessed++; + this.printProgress('remote directory successfully created/verified: ' + name); + } + + fileUploaded(file: string, remoteFile: string): void { + this.progressFilesUploaded++; + this.printProgress('successfully uploaded: ' + file + ' to: ' + remoteFile); + } + + fileSkipped(file: string, remoteFile: string): void { + this.progressFilesSkipped++; + this.printProgress('skipping file: ' + file + ' remote: ' + remoteFile + ' because it already exists'); + } + + printProgress(message: string): void { + let total: number = this.progressFilesUploaded + this.progressFilesSkipped + this.progressDirectoriesProcessed; + let remaining: number = this.fileCount - total; + console.log( + 'files uploaded: ' + this.progressFilesUploaded + + ', files skipped: ' + this.progressFilesSkipped + + ', directories processed: ' + this.progressDirectoriesProcessed + + ', total: ' + total + ', remaining: ' + remaining + + ', ' + message); + } + + getSuccessStatusMessage(): string { + return '\nhost: ' + this.ftpOptions.serverEndpointUrl.host + + '\npath: ' + this.ftpOptions.remotePath + + '\nfiles uploaded: ' + this.progressFilesUploaded + + '\nfiles skipped: ' + this.progressFilesSkipped + + '\ndirectories processed: ' + this.progressDirectoriesProcessed; + } + + getFailureStatusMessage() { + let total: number = this.progressFilesUploaded + this.progressFilesSkipped + this.progressDirectoriesProcessed; + let remaining: number = this.fileCount - total; + return this.getSuccessStatusMessage() + + '\nunprocessed files & directories: ' + remaining; + } +} + + + +export function findFiles(ftpOptions: FtpOptions): string[] { + tl.debug('Searching for files to upload'); + + let rootFolderStats = tl.stats(ftpOptions.rootFolder); + if (rootFolderStats.isFile()) { + let file = ftpOptions.rootFolder; + tl.debug(file + ' is a file. Ignoring all file patterns'); + return [file]; + } + + let allFiles = tl.find(ftpOptions.rootFolder); + + // filePatterns is a multiline input containing glob patterns + tl.debug('searching for files using: ' + ftpOptions.filePatterns.length + ' filePatterns: ' + ftpOptions.filePatterns); + + // minimatch options + let matchOptions = { matchBase: true, dot: true }; + let win = tl.osType().match(/^Win/); + tl.debug('win: ' + win); + if (win) { + matchOptions["nocase"] = true; + } + + tl.debug('Candidates found for match: ' + allFiles.length); + for (let i = 0; i < allFiles.length; i++) { + tl.debug('file: ' + allFiles[i]); + } + + // use a set to avoid duplicates + let matchingFilesSet: Set = new Set(); + + for (let i = 0; i < ftpOptions.filePatterns.length; i++) { + let normalizedPattern: string = path.join(ftpOptions.rootFolder, path.normalize(ftpOptions.filePatterns[i])); + + tl.debug('searching for files, pattern: ' + normalizedPattern); + + let matched = minimatch.match(allFiles, normalizedPattern, matchOptions); + tl.debug('Found total matches: ' + matched.length); + // ensure each result is only added once + for (let j = 0; j < matched.length; j++) { + let match = path.normalize(matched[j]); + let stats = tl.stats(match); + if (!ftpOptions.preservePaths && stats.isDirectory()) { + // if not preserving paths, skip all directories + } else if (matchingFilesSet.add(match)) { + tl.debug('adding ' + (stats.isFile() ? 'file: ' : 'folder: ') + match); + if (stats.isFile() && ftpOptions.preservePaths) { + // if preservePaths, make sure the parent directory is also included + let parent = path.normalize(path.dirname(match)); + if (matchingFilesSet.add(parent)) { + tl.debug('adding folder: ' + parent); + } + } + } + } + } + return Array.from(matchingFilesSet).sort(); +} \ No newline at end of file diff --git a/_generated/FtpUploadV1/icon.png b/_generated/FtpUploadV1/icon.png new file mode 100644 index 000000000000..490abba147c9 Binary files /dev/null and b/_generated/FtpUploadV1/icon.png differ diff --git a/_generated/FtpUploadV1/icon.svg b/_generated/FtpUploadV1/icon.svg new file mode 100644 index 000000000000..e5d5684a3791 --- /dev/null +++ b/_generated/FtpUploadV1/icon.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/_generated/FtpUploadV1/package-lock.json b/_generated/FtpUploadV1/package-lock.json new file mode 100644 index 000000000000..defed0618eb4 --- /dev/null +++ b/_generated/FtpUploadV1/package-lock.json @@ -0,0 +1,535 @@ +{ + "name": "FTP", + "version": "1.0.1", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/concat-stream": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz", + "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==", + "requires": { + "@types/node": "*" + } + }, + "@types/form-data": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", + "integrity": "sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==", + "requires": { + "@types/node": "*" + } + }, + "@types/mocha": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.1.1.tgz", + "integrity": "sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==" + }, + "@types/node": { + "version": "16.11.57", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.57.tgz", + "integrity": "sha512-diBb5AE2V8h9Fs9zEDtBwSeLvIACng/aAkdZ3ujMV+cGuIQ9Nc/V+wQqurk9HJp8ni5roBxQHW21z/ZYbGDivg==" + }, + "@types/q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.1.tgz", + "integrity": "sha512-eqz8c/0kwNi/OEHQfvIuJVLTst3in0e7uTKeuY+WL/zfKn0xVujOTp42bS/vUUokhK5P2BppLd9JXMOMHcgbjA==" + }, + "@types/qs": { + "version": "6.9.8", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.8.tgz", + "integrity": "sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg==" + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "azure-pipelines-task-lib": { + "version": "5.0.0-preview.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-5.0.0-preview.0.tgz", + "integrity": "sha512-uQJEv+q3/7RD7kgphFd33uXijaPwA1ePYoNkAgZpUhbZUtc2u4JL4ujTT/JJfgXBNW/QQNAiDQ2OC7vOQG/0tg==", + "requires": { + "minimatch": "3.0.5", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "sync-request": "6.1.0", + "uuid": "^3.0.1" + }, + "dependencies": { + "minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "brace-expansion": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", + "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "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" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, + "form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "ftp": { + "version": "0.3.10", + "resolved": "https://registry.npmjs.org/ftp/-/ftp-0.3.10.tgz", + "integrity": "sha1-kZfYYa2BQvPmPVqDv+TFn3MwiF0=", + "requires": { + "readable-stream": "1.1.x", + "xregexp": "2.0.0" + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + } + }, + "get-port": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", + "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==" + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "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" + }, + "dependencies": { + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==" + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "http-basic": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", + "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", + "requires": { + "caseless": "^0.12.0", + "concat-stream": "^1.6.2", + "http-response-object": "^3.0.1", + "parse-cache-control": "^1.0.1" + } + }, + "http-response-object": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", + "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", + "requires": { + "@types/node": "^10.0.3" + }, + "dependencies": { + "@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + } + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" + }, + "is-core-module": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "requires": { + "has": "^1.0.3" + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, + "parse-cache-control": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", + "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "promise": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", + "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", + "requires": { + "asap": "~2.0.6" + } + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==" + }, + "qs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "requires": { + "resolve": "^1.1.6" + } + }, + "resolve": { + "version": "1.22.6", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.6.tgz", + "integrity": "sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==", + "requires": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" + }, + "shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, + "sync-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", + "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==", + "requires": { + "http-response-object": "^3.0.1", + "sync-rpc": "^1.2.1", + "then-request": "^6.0.0" + } + }, + "sync-rpc": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz", + "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==", + "requires": { + "get-port": "^3.1.0" + } + }, + "then-request": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", + "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", + "requires": { + "@types/concat-stream": "^1.6.0", + "@types/form-data": "0.0.33", + "@types/node": "^8.0.0", + "@types/qs": "^6.2.31", + "caseless": "~0.12.0", + "concat-stream": "^1.6.0", + "form-data": "^2.2.0", + "http-basic": "^8.1.1", + "http-response-object": "^3.0.1", + "promise": "^8.0.0", + "qs": "^6.4.0" + }, + "dependencies": { + "@types/node": { + "version": "8.10.66", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", + "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==" + } + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, + "typescript": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.2.tgz", + "integrity": "sha512-e4ERvRV2wb+rRZ/IQeb3jm2VxBsirQLpQhdxplZ2MEzGvDkkMmPglecnNDfSUBivMjP93vRbngYYDQqQ/78bcQ==", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "xregexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-2.0.0.tgz", + "integrity": "sha1-UqY+VsoLhKfzpfPWGHLxJq16WUM=" + } + } +} diff --git a/_generated/FtpUploadV1/package.json b/_generated/FtpUploadV1/package.json new file mode 100644 index 000000000000..9e1159d882ef --- /dev/null +++ b/_generated/FtpUploadV1/package.json @@ -0,0 +1,27 @@ +{ + "name": "FTP", + "version": "1.0.1", + "description": "FTP Upload Task", + "main": "ftpuploadtask.js", + "repository": { + "type": "git", + "url": "git+https://github.com/Microsoft/azure-pipelines-tasks.git" + }, + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Microsoft/azure-pipelines-tasks/issues" + }, + "homepage": "https://github.com/Microsoft/azure-pipelines-tasks#readme", + "dependencies": { + "@types/node": "^16.11.39", + "@types/mocha": "^9.1.1", + "@types/q": "^1.0.7", + "azure-pipelines-task-lib": "^5.0.0-preview.0", + "ftp": "0.3.10", + "minimatch": "^3.0.4" + }, + "devDependencies": { + "typescript": "4.0.2" + } +} diff --git a/_generated/FtpUploadV1/task.json b/_generated/FtpUploadV1/task.json new file mode 100644 index 000000000000..3656454bf5eb --- /dev/null +++ b/_generated/FtpUploadV1/task.json @@ -0,0 +1,199 @@ +{ + "id": "6f8c69a5-b023-428e-a125-fccf4efcb929", + "name": "FtpUpload", + "friendlyName": "FTP upload", + "description": "Upload files using FTP", + "author": "Microsoft Corporation", + "helpUrl": "https://docs.microsoft.com/azure/devops/pipelines/tasks/utility/ftp-upload", + "helpMarkDown": "Upload files to a remote machine using the File Transfer Protocol (FTP), or securely with FTPS. [More Information](http://go.microsoft.com/fwlink/?LinkId=809084).", + "category": "Utility", + "visibility": [ + "Build", + "Release" + ], + "runsOn": [ + "Agent", + "DeploymentGroup" + ], + "demands": [], + "version": { + "Major": 1, + "Minor": 229, + "Patch": 0 + }, + "minimumAgentVersion": "2.182.1", + "instanceNameFormat": "FTP Upload: $(rootFolder)", + "groups": [ + { + "name": "advanced", + "displayName": "Advanced", + "isExpanded": true + } + ], + "inputs": [ + { + "name": "credsType", + "aliases": [ + "credentialsOption" + ], + "type": "pickList", + "label": "Authentication Method", + "defaultValue": "serviceEndpoint", + "required": true, + "helpMarkDown": "Use FTP service connection or enter connection credentials.", + "options": { + "serviceEndpoint": "FTP service connection", + "inputs": "Enter credentials" + } + }, + { + "name": "serverEndpoint", + "type": "connectedService:Generic", + "label": "FTP Service Connection", + "defaultValue": "", + "required": true, + "helpMarkDown": "Select the service connection for your FTP server. To create one, click the Manage link and create a new Generic service connection, enter the FTP server URL for the server URL, e.g. `ftp://server.example.com`, and required credentials.

Secure connections will always be made regardless of the specified protocol (`ftp://` or `ftps://`) if the target server supports FTPS. To allow only secure connections, use the `ftps://` protocol, e.g. `ftps://server.example.com`. Connections to servers not supporting FTPS will fail if `ftps://` is specified.", + "visibleRule": "credsType = serviceEndpoint" + }, + { + "name": "serverUrl", + "type": "string", + "label": "Server URL", + "defaultValue": "", + "required": true, + "visibleRule": "credsType = inputs" + }, + { + "name": "username", + "type": "string", + "label": "Username", + "defaultValue": "", + "required": true, + "visibleRule": "credsType = inputs" + }, + { + "name": "password", + "type": "string", + "label": "Password", + "defaultValue": "", + "required": true, + "visibleRule": "credsType = inputs" + }, + { + "name": "rootFolder", + "aliases": [ + "rootDirectory" + ], + "type": "filePath", + "label": "Root folder", + "defaultValue": "", + "required": true, + "helpMarkDown": "The source folder to upload files from." + }, + { + "name": "filePatterns", + "type": "multiLine", + "label": "File patterns", + "defaultValue": "**", + "required": true, + "helpMarkDown": "File paths or patterns of the files to upload. Supports multiple lines of minimatch patterns. [More Information](https://go.microsoft.com/fwlink/?LinkId=800269)", + "properties": { + "resizable": "true", + "rows": "4" + } + }, + { + "name": "remotePath", + "aliases": [ + "remoteDirectory" + ], + "type": "string", + "label": "Remote directory", + "defaultValue": "/upload/$(Build.BuildId)/", + "required": true, + "helpMarkDown": "Upload files to this directory on the remote FTP server." + }, + { + "name": "clean", + "type": "boolean", + "label": "Delete remote directory", + "defaultValue": "false", + "required": true, + "helpMarkDown": "Delete the remote directory including its contents before uploading.", + "groupName": "advanced" + }, + { + "name": "cleanContents", + "type": "boolean", + "label": "Clear remote directory contents", + "defaultValue": "false", + "required": true, + "helpMarkDown": "Recursively delete all contents of the remote directory before uploading. The existing directory will not be deleted. For better performance, consider using `Delete remote directory` instead.", + "groupName": "advanced", + "visibleRule": "clean = false" + }, + { + "name": "overwrite", + "type": "boolean", + "label": "Overwrite", + "defaultValue": "true", + "required": true, + "helpMarkDown": "Overwrite existing files in the remote directory.", + "groupName": "advanced" + }, + { + "name": "preservePaths", + "type": "boolean", + "label": "Preserve file paths", + "defaultValue": "false", + "required": true, + "helpMarkDown": "If selected, the relative local directory structure is recreated under the remote directory where files are uploaded. Otherwise, files are uploaded directly to the remote directory without creating additional subdirectories.

For example, suppose your source folder is: `/home/user/source/` and contains the file: `foo/bar/foobar.txt`, and your remote directory is: `/uploads/`.
If selected, the file is uploaded to: `/uploads/foo/bar/foobar.txt`. Otherwise, to: `/uploads/foobar.txt`.", + "groupName": "advanced" + }, + { + "name": "trustSSL", + "type": "boolean", + "label": "Trust server certificate", + "defaultValue": "false", + "required": true, + "helpMarkDown": "Selecting this option results in the FTP server's SSL certificate being trusted with ftps://, even if it is self-signed or cannot be validated by a Certificate Authority (CA).", + "groupName": "advanced" + } + ], + "execution": { + "Node10": { + "target": "ftpuploadtask.js", + "argumentFormat": "" + }, + "Node16": { + "target": "ftpuploadtask.js", + "argumentFormat": "" + } + }, + "restrictions": { + "commands": { + "mode": "restricted" + }, + "settableVariables": { + "allowed": [] + } + }, + "messages": { + "CleanRemoteDir": "removing remote directory: %s", + "CleanRemoteDirContents": "removing remote directory contents: %s", + "CleanFileDeleteFail": "an error occurred while trying to remove file: %s", + "ConnectPort": "connecting to: %s:%s", + "Disconnected": "disconnected", + "DisconnectHost": "disconnecting from: %s", + "FTPConnected": "connected: %s", + "FTPNoHostSpecified": "The FTP server URL must include a host name", + "FTPNoProtocolSpecified": "The FTP server URL must begin with ftp:// or ftps://", + "UploadRemoteDir": "uploading files to remote directory: %s", + "UploadSucceedMsg": "FTP upload successful %s", + "UploadSucceedRes": "FTP upload successful" + }, + "_buildConfigMapping": { + "Default": "1.229.0", + "Node20-225": "1.229.1" + } +} \ No newline at end of file diff --git a/_generated/FtpUploadV1/task.loc.json b/_generated/FtpUploadV1/task.loc.json new file mode 100644 index 000000000000..663c2a92bdab --- /dev/null +++ b/_generated/FtpUploadV1/task.loc.json @@ -0,0 +1,199 @@ +{ + "id": "6f8c69a5-b023-428e-a125-fccf4efcb929", + "name": "FtpUpload", + "friendlyName": "ms-resource:loc.friendlyName", + "description": "ms-resource:loc.description", + "author": "Microsoft Corporation", + "helpUrl": "https://docs.microsoft.com/azure/devops/pipelines/tasks/utility/ftp-upload", + "helpMarkDown": "ms-resource:loc.helpMarkDown", + "category": "Utility", + "visibility": [ + "Build", + "Release" + ], + "runsOn": [ + "Agent", + "DeploymentGroup" + ], + "demands": [], + "version": { + "Major": 1, + "Minor": 229, + "Patch": 0 + }, + "minimumAgentVersion": "2.182.1", + "instanceNameFormat": "ms-resource:loc.instanceNameFormat", + "groups": [ + { + "name": "advanced", + "displayName": "ms-resource:loc.group.displayName.advanced", + "isExpanded": true + } + ], + "inputs": [ + { + "name": "credsType", + "aliases": [ + "credentialsOption" + ], + "type": "pickList", + "label": "ms-resource:loc.input.label.credsType", + "defaultValue": "serviceEndpoint", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.credsType", + "options": { + "serviceEndpoint": "FTP service connection", + "inputs": "Enter credentials" + } + }, + { + "name": "serverEndpoint", + "type": "connectedService:Generic", + "label": "ms-resource:loc.input.label.serverEndpoint", + "defaultValue": "", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.serverEndpoint", + "visibleRule": "credsType = serviceEndpoint" + }, + { + "name": "serverUrl", + "type": "string", + "label": "ms-resource:loc.input.label.serverUrl", + "defaultValue": "", + "required": true, + "visibleRule": "credsType = inputs" + }, + { + "name": "username", + "type": "string", + "label": "ms-resource:loc.input.label.username", + "defaultValue": "", + "required": true, + "visibleRule": "credsType = inputs" + }, + { + "name": "password", + "type": "string", + "label": "ms-resource:loc.input.label.password", + "defaultValue": "", + "required": true, + "visibleRule": "credsType = inputs" + }, + { + "name": "rootFolder", + "aliases": [ + "rootDirectory" + ], + "type": "filePath", + "label": "ms-resource:loc.input.label.rootFolder", + "defaultValue": "", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.rootFolder" + }, + { + "name": "filePatterns", + "type": "multiLine", + "label": "ms-resource:loc.input.label.filePatterns", + "defaultValue": "**", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.filePatterns", + "properties": { + "resizable": "true", + "rows": "4" + } + }, + { + "name": "remotePath", + "aliases": [ + "remoteDirectory" + ], + "type": "string", + "label": "ms-resource:loc.input.label.remotePath", + "defaultValue": "/upload/$(Build.BuildId)/", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.remotePath" + }, + { + "name": "clean", + "type": "boolean", + "label": "ms-resource:loc.input.label.clean", + "defaultValue": "false", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.clean", + "groupName": "advanced" + }, + { + "name": "cleanContents", + "type": "boolean", + "label": "ms-resource:loc.input.label.cleanContents", + "defaultValue": "false", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.cleanContents", + "groupName": "advanced", + "visibleRule": "clean = false" + }, + { + "name": "overwrite", + "type": "boolean", + "label": "ms-resource:loc.input.label.overwrite", + "defaultValue": "true", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.overwrite", + "groupName": "advanced" + }, + { + "name": "preservePaths", + "type": "boolean", + "label": "ms-resource:loc.input.label.preservePaths", + "defaultValue": "false", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.preservePaths", + "groupName": "advanced" + }, + { + "name": "trustSSL", + "type": "boolean", + "label": "ms-resource:loc.input.label.trustSSL", + "defaultValue": "false", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.trustSSL", + "groupName": "advanced" + } + ], + "execution": { + "Node10": { + "target": "ftpuploadtask.js", + "argumentFormat": "" + }, + "Node16": { + "target": "ftpuploadtask.js", + "argumentFormat": "" + } + }, + "restrictions": { + "commands": { + "mode": "restricted" + }, + "settableVariables": { + "allowed": [] + } + }, + "messages": { + "CleanRemoteDir": "ms-resource:loc.messages.CleanRemoteDir", + "CleanRemoteDirContents": "ms-resource:loc.messages.CleanRemoteDirContents", + "CleanFileDeleteFail": "ms-resource:loc.messages.CleanFileDeleteFail", + "ConnectPort": "ms-resource:loc.messages.ConnectPort", + "Disconnected": "ms-resource:loc.messages.Disconnected", + "DisconnectHost": "ms-resource:loc.messages.DisconnectHost", + "FTPConnected": "ms-resource:loc.messages.FTPConnected", + "FTPNoHostSpecified": "ms-resource:loc.messages.FTPNoHostSpecified", + "FTPNoProtocolSpecified": "ms-resource:loc.messages.FTPNoProtocolSpecified", + "UploadRemoteDir": "ms-resource:loc.messages.UploadRemoteDir", + "UploadSucceedMsg": "ms-resource:loc.messages.UploadSucceedMsg", + "UploadSucceedRes": "ms-resource:loc.messages.UploadSucceedRes" + }, + "_buildConfigMapping": { + "Default": "1.229.0", + "Node20-225": "1.229.1" + } +} \ No newline at end of file diff --git a/_generated/FtpUploadV1/tsconfig.json b/_generated/FtpUploadV1/tsconfig.json new file mode 100644 index 000000000000..0438b79f69ac --- /dev/null +++ b/_generated/FtpUploadV1/tsconfig.json @@ -0,0 +1,6 @@ +{ + "compilerOptions": { + "target": "ES6", + "module": "commonjs" + } +} \ No newline at end of file diff --git a/_generated/FtpUploadV1_Node20/.npmrc b/_generated/FtpUploadV1_Node20/.npmrc new file mode 100644 index 000000000000..5fca0d518be7 --- /dev/null +++ b/_generated/FtpUploadV1_Node20/.npmrc @@ -0,0 +1 @@ +scripts-prepend-node-path=true diff --git a/_generated/FtpUploadV1_Node20/Strings/resources.resjson/de-DE/resources.resjson b/_generated/FtpUploadV1_Node20/Strings/resources.resjson/de-DE/resources.resjson new file mode 100644 index 000000000000..b013e3b5621b --- /dev/null +++ b/_generated/FtpUploadV1_Node20/Strings/resources.resjson/de-DE/resources.resjson @@ -0,0 +1,42 @@ +{ + "loc.friendlyName": "FTP-Upload", + "loc.helpMarkDown": "Lädt Dateien auf einen Remotecomputer mithilfe von FTP (File Transfer Protocol) oder sicher mit FTPS hoch. [Weitere Informationen](http://go.microsoft.com/fwlink/?LinkId=809084).", + "loc.description": "Hiermit werden Dateien per FTP hochgeladen.", + "loc.instanceNameFormat": "FTP-Upload: $(rootFolder)", + "loc.group.displayName.advanced": "Erweitert", + "loc.input.label.credsType": "Authentifizierungsmethode", + "loc.input.help.credsType": "Verwenden Sie die FTP-Dienstverbindung, oder geben Sie Anmeldeinformationen ein.", + "loc.input.label.serverEndpoint": "FTP-Dienstverbindung", + "loc.input.help.serverEndpoint": "Wählen Sie die Dienstverbindung für Ihren FTP-Server aus. Klicken Sie zum Erstellen einer Dienstverbindung auf den Link \"Verwalten\", und erstellen Sie dann eine neue generische Dienstverbindung. Geben Sie die FTP-Server-URL für die Server-URL (z. B. \"ftp://server.example.com\") sowie die erforderlichen Anmeldeinformationen ein.

Sichere Verbindungen werden unabhängig vom angegebenen Protokoll (\"ftp://\" oder \"ftps://\") immer hergestellt, wenn der Zielserver FTPS unterstützt. Um nur sichere Verbindungen zuzulassen, verwenden Sie das Protokoll \"ftps://\" (z. B. \"ftps://server.example.com\"). Bei Verbindungen mit Servern ohne FTPS-Unterstützung kommt es zu einem Fehler, wenn \"ftps://\" angegeben wird.", + "loc.input.label.serverUrl": "Server-URL", + "loc.input.label.username": "Benutzername", + "loc.input.label.password": "Kennwort", + "loc.input.label.rootFolder": "Stammordner", + "loc.input.help.rootFolder": "Der Quellordner, aus dem Dateien hochgeladen werden sollen.", + "loc.input.label.filePatterns": "Dateimuster", + "loc.input.help.filePatterns": "Dateipfade oder Muster der hochzuladenden Dateien. Unterstützt mehrere Minimatchmuster. [Weitere Informationen](https://go.microsoft.com/fwlink/?LinkId=800269)", + "loc.input.label.remotePath": "Remoteverzeichnis", + "loc.input.help.remotePath": "Lädt Dateien in dieses Verzeichnis auf dem Remote-FTP-Server hoch.", + "loc.input.label.clean": "Remoteverzeichnis löschen", + "loc.input.help.clean": "Löscht das Remoteverzeichnis einschließlich seiner Inhalte vor dem Hochladen.", + "loc.input.label.cleanContents": "Inhalte des Remoteverzeichnisses löschen", + "loc.input.help.cleanContents": "Löscht vor dem Hochladen rekursiv alle Inhalte aus dem Remoteverzeichnis. Das vorhandene Verzeichnis wird nicht gelöscht. Erwägen Sie zur Leistungsverbesserung stattdessen die Verwendung von \"Remoteverzeichnis löschen\".", + "loc.input.label.overwrite": "Überschreiben", + "loc.input.help.overwrite": "Überschreibt vorhandene Dateien im Remoteverzeichnis.", + "loc.input.label.preservePaths": "Dateipfade beibehalten", + "loc.input.help.preservePaths": "Wenn diese Option ausgewählt wird, wird die relative lokale Verzeichnisstruktur unter dem Remoteverzeichnis erneut erstellt, in das Dateien hochgeladen werden. Andernfalls werden Dateien direkt in das Remoteverzeichnis hochgeladen, ohne dass zusätzliche Unterverzeichnisse erstellt werden.

Angenommen, der Quellordner ist \"/home/user/source/\", und er enthält die Datei \"foo/bar/foobar.txt\". Das Remoteverzeichnis ist \"/uploads/\".
Wenn diese Option ausgewählt wird, wird die Datei in \"/uploads/foo/bar/foobar.txt\" hochgeladen. Andernfalls wird sie in \"/uploads/foobar.txt\" hochgeladen.", + "loc.input.label.trustSSL": "Serverzertifikat vertrauen", + "loc.input.help.trustSSL": "Das Auswählen dieser Option führt dazu, dass das SSL-Zertifikat des FTP-Servers mit ftps:// selbst dann als vertrauenswürdig betrachtet wird, wenn es selbstsigniert ist oder nicht von einer Zertifizierungsstelle (CA) überprüft werden kann.", + "loc.messages.CleanRemoteDir": "Remoteverzeichnis wird entfernt: %s", + "loc.messages.CleanRemoteDirContents": "Remoteverzeichnisinhalte werden entfernt: %s", + "loc.messages.CleanFileDeleteFail": "Fehler beim Versuch, die Datei zu entfernen: %s", + "loc.messages.ConnectPort": "Verbindung wird hergestellt mit: %s:%s ", + "loc.messages.Disconnected": "Getrennt", + "loc.messages.DisconnectHost": "Verbindung wird getrennt: %s", + "loc.messages.FTPConnected": "Verbunden: %s", + "loc.messages.FTPNoHostSpecified": "Die URL des FTP-Servers muss einen Hostnamen enthalten.", + "loc.messages.FTPNoProtocolSpecified": "Die URL des FTP-Servers muss mit ftp:// oder ftps:// beginnen.", + "loc.messages.UploadRemoteDir": "Die Dateien werden in das Remoteverzeichnis hochgeladen: %s", + "loc.messages.UploadSucceedMsg": "FTP-Upload erfolgreich: %s", + "loc.messages.UploadSucceedRes": "FTP-Upload erfolgreich" +} \ No newline at end of file diff --git a/_generated/FtpUploadV1_Node20/Strings/resources.resjson/en-US/resources.resjson b/_generated/FtpUploadV1_Node20/Strings/resources.resjson/en-US/resources.resjson new file mode 100644 index 000000000000..021ad3a90868 --- /dev/null +++ b/_generated/FtpUploadV1_Node20/Strings/resources.resjson/en-US/resources.resjson @@ -0,0 +1,42 @@ +{ + "loc.friendlyName": "FTP upload", + "loc.helpMarkDown": "Upload files to a remote machine using the File Transfer Protocol (FTP), or securely with FTPS. [More Information](http://go.microsoft.com/fwlink/?LinkId=809084).", + "loc.description": "Upload files using FTP", + "loc.instanceNameFormat": "FTP Upload: $(rootFolder)", + "loc.group.displayName.advanced": "Advanced", + "loc.input.label.credsType": "Authentication Method", + "loc.input.help.credsType": "Use FTP service connection or enter connection credentials.", + "loc.input.label.serverEndpoint": "FTP Service Connection", + "loc.input.help.serverEndpoint": "Select the service connection for your FTP server. To create one, click the Manage link and create a new Generic service connection, enter the FTP server URL for the server URL, e.g. `ftp://server.example.com`, and required credentials.

Secure connections will always be made regardless of the specified protocol (`ftp://` or `ftps://`) if the target server supports FTPS. To allow only secure connections, use the `ftps://` protocol, e.g. `ftps://server.example.com`. Connections to servers not supporting FTPS will fail if `ftps://` is specified.", + "loc.input.label.serverUrl": "Server URL", + "loc.input.label.username": "Username", + "loc.input.label.password": "Password", + "loc.input.label.rootFolder": "Root folder", + "loc.input.help.rootFolder": "The source folder to upload files from.", + "loc.input.label.filePatterns": "File patterns", + "loc.input.help.filePatterns": "File paths or patterns of the files to upload. Supports multiple lines of minimatch patterns. [More Information](https://go.microsoft.com/fwlink/?LinkId=800269)", + "loc.input.label.remotePath": "Remote directory", + "loc.input.help.remotePath": "Upload files to this directory on the remote FTP server.", + "loc.input.label.clean": "Delete remote directory", + "loc.input.help.clean": "Delete the remote directory including its contents before uploading.", + "loc.input.label.cleanContents": "Clear remote directory contents", + "loc.input.help.cleanContents": "Recursively delete all contents of the remote directory before uploading. The existing directory will not be deleted. For better performance, consider using `Delete remote directory` instead.", + "loc.input.label.overwrite": "Overwrite", + "loc.input.help.overwrite": "Overwrite existing files in the remote directory.", + "loc.input.label.preservePaths": "Preserve file paths", + "loc.input.help.preservePaths": "If selected, the relative local directory structure is recreated under the remote directory where files are uploaded. Otherwise, files are uploaded directly to the remote directory without creating additional subdirectories.

For example, suppose your source folder is: `/home/user/source/` and contains the file: `foo/bar/foobar.txt`, and your remote directory is: `/uploads/`.
If selected, the file is uploaded to: `/uploads/foo/bar/foobar.txt`. Otherwise, to: `/uploads/foobar.txt`.", + "loc.input.label.trustSSL": "Trust server certificate", + "loc.input.help.trustSSL": "Selecting this option results in the FTP server's SSL certificate being trusted with ftps://, even if it is self-signed or cannot be validated by a Certificate Authority (CA).", + "loc.messages.CleanRemoteDir": "removing remote directory: %s", + "loc.messages.CleanRemoteDirContents": "removing remote directory contents: %s", + "loc.messages.CleanFileDeleteFail": "an error occurred while trying to remove file: %s", + "loc.messages.ConnectPort": "connecting to: %s:%s", + "loc.messages.Disconnected": "disconnected", + "loc.messages.DisconnectHost": "disconnecting from: %s", + "loc.messages.FTPConnected": "connected: %s", + "loc.messages.FTPNoHostSpecified": "The FTP server URL must include a host name", + "loc.messages.FTPNoProtocolSpecified": "The FTP server URL must begin with ftp:// or ftps://", + "loc.messages.UploadRemoteDir": "uploading files to remote directory: %s", + "loc.messages.UploadSucceedMsg": "FTP upload successful %s", + "loc.messages.UploadSucceedRes": "FTP upload successful" +} \ No newline at end of file diff --git a/_generated/FtpUploadV1_Node20/Strings/resources.resjson/es-ES/resources.resjson b/_generated/FtpUploadV1_Node20/Strings/resources.resjson/es-ES/resources.resjson new file mode 100644 index 000000000000..0ffc9e2e347a --- /dev/null +++ b/_generated/FtpUploadV1_Node20/Strings/resources.resjson/es-ES/resources.resjson @@ -0,0 +1,42 @@ +{ + "loc.friendlyName": "Carga por FTP", + "loc.helpMarkDown": "Carga los archivos en una máquina remota usando el protocolo de transferencia de archivos (FTP) o de forma segura con FTPS. [Más información](http://go.microsoft.com/fwlink/?LinkId=809084).", + "loc.description": "Cargar archivos con FTP", + "loc.instanceNameFormat": "Carga por FTP: $(rootFolder)", + "loc.group.displayName.advanced": "Avanzado", + "loc.input.label.credsType": "Método de autenticación", + "loc.input.help.credsType": "Use la conexión del servicio FTP o especifique credenciales para la conexión.", + "loc.input.label.serverEndpoint": "Conexión del servicio FTP", + "loc.input.help.serverEndpoint": "Seleccione el punto de conexión de servicio del servidor FTP. Para crear uno, haga clic en el vínculo Administrar y cree un nuevo punto de conexión de servicio genérico, escriba la dirección URL del servidor FTP (por ejemplo, \"ftp://servidor.ejemplo.com\") y las credenciales necesarias.

Siempre se usarán conexiones seguras, independientemente del protocolo especificado (\"ftp://\" o \"ftps://\") si el servidor de destino admite FTPS. Para permitir solo conexiones seguras, use el protocolo \"ftps://\" (por ejemplo, \"ftps://servidor.ejemplo.com\"). Las conexiones a los servidores que no admiten FTPS dan error si se especifica \"ftps://\".", + "loc.input.label.serverUrl": "Dirección URL del servidor", + "loc.input.label.username": "Nombre de usuario", + "loc.input.label.password": "Contraseña", + "loc.input.label.rootFolder": "Carpeta raíz", + "loc.input.help.rootFolder": "Carpeta de origen de donde se cargan los archivos.", + "loc.input.label.filePatterns": "Patrones de archivo", + "loc.input.help.filePatterns": "Rutas de acceso de archivo o patrones de los archivos que se deben cargar. Admite varias líneas de patrones de minimatch. [Más información](https://go.microsoft.com/fwlink/?LinkId=800269)", + "loc.input.label.remotePath": "Directorio remoto", + "loc.input.help.remotePath": "Carga los archivos en este directorio en el servidor FTP remoto.", + "loc.input.label.clean": "Eliminar el directorio remoto", + "loc.input.help.clean": "Elimine el directorio remoto, incluido su contenido, antes de cargar.", + "loc.input.label.cleanContents": "Borrar el contenido del directorio remoto", + "loc.input.help.cleanContents": "Elimine de forma recursiva todo el contenido del directorio remoto antes de cargar. El directorio existente no se elimina. Para mejorar el rendimiento, considere la posibilidad de usar \"Eliminar el directorio remoto\" en su lugar.", + "loc.input.label.overwrite": "Sobrescribir", + "loc.input.help.overwrite": "Sobrescribe los archivos existentes en el directorio remoto.", + "loc.input.label.preservePaths": "Mantener las rutas de acceso de los archivos", + "loc.input.help.preservePaths": "Cuando se selecciona, la estructura de directorios local relativa se vuelve a crear en el directorio remoto donde se cargan los archivos. De lo contrario, los archivos se cargan directamente en el directorio remoto sin crear subdirectorios adicionales.

Por ejemplo, image que su carpeta es `/home/user/source/` y contiene el archivo `foo/bar/foobar.txt`, y el directorio remoto es `/uploads/`.
Si selecciona esta opción, el archivo se carga en `/uploads/foo/bar/foobar.txt`. De lo contrario, se carga en `/uploads/foobar.txt`.", + "loc.input.label.trustSSL": "Confiar en el certificado del servidor", + "loc.input.help.trustSSL": "Cuando se selecciona esta opción, se confía en el certificado SSL del servidor FTP con ftps://, incluso si es autofirmado o no lo puede validar una entidad de certificación (CA).", + "loc.messages.CleanRemoteDir": "Quitando el directorio remoto: %s", + "loc.messages.CleanRemoteDirContents": "Quitando el contenido del directorio remoto: %s", + "loc.messages.CleanFileDeleteFail": "Error al intentar quitar el archivo: %s", + "loc.messages.ConnectPort": "conectándose a: %s:%s", + "loc.messages.Disconnected": "desconectado", + "loc.messages.DisconnectHost": "desconectándose de: %s", + "loc.messages.FTPConnected": "conectado: %s", + "loc.messages.FTPNoHostSpecified": "La dirección URL del servidor FTP debe incluir un nombre de host", + "loc.messages.FTPNoProtocolSpecified": "La dirección URL del servidor FTP debe comenzar con ftp:// o ftps://", + "loc.messages.UploadRemoteDir": "cargando archivos al directorio remoto: %s", + "loc.messages.UploadSucceedMsg": "La carga por FTP de %s se realizó correctamente", + "loc.messages.UploadSucceedRes": "Carga por FTP correcta" +} \ No newline at end of file diff --git a/_generated/FtpUploadV1_Node20/Strings/resources.resjson/fr-FR/resources.resjson b/_generated/FtpUploadV1_Node20/Strings/resources.resjson/fr-FR/resources.resjson new file mode 100644 index 000000000000..7f556884082e --- /dev/null +++ b/_generated/FtpUploadV1_Node20/Strings/resources.resjson/fr-FR/resources.resjson @@ -0,0 +1,42 @@ +{ + "loc.friendlyName": "Chargement FTP", + "loc.helpMarkDown": "Chargez les fichiers vers une machine distante par FTP (File Transfer Protocol), ou de manière sécurisée par FTPS. [Plus d'informations](http://go.microsoft.com/fwlink/?LinkId=809084).", + "loc.description": "Charger des fichiers via FTP", + "loc.instanceNameFormat": "Chargement FTP : $(rootFolder)", + "loc.group.displayName.advanced": "Avancé", + "loc.input.label.credsType": "Méthode d'authentification", + "loc.input.help.credsType": "Utilisez la connexion de service FTP, ou entrez les informations d'identification de connexion.", + "loc.input.label.serverEndpoint": "Connexion de service FTP", + "loc.input.help.serverEndpoint": "Sélectionnez la connexion de service de votre serveur FTP. Pour en créer une, cliquez sur le lien Gérer, puis créez une connexion de service générique, entrez l'URL du serveur FTP, par exemple 'ftp://server.example.com', ainsi que les informations d'identification nécessaires.

Quel que soit le protocole spécifié, ('ftp://' ou 'ftps://'), la sécurisation des connexions est assurée si le serveur cible prend en charge le protocole FTPS. Pour autoriser uniquement les connexions sécurisées, utilisez le protocole 'ftps://', par exemple 'ftps://server.example.com'. Si 'ftps://' est spécifié, les connexions aux serveurs qui ne prennent pas en charge FTPS ne sont pas établies.", + "loc.input.label.serverUrl": "URL du serveur", + "loc.input.label.username": "Nom d'utilisateur", + "loc.input.label.password": "Mot de passe", + "loc.input.label.rootFolder": "Dossier racine", + "loc.input.help.rootFolder": "Dossier source du chargement des fichiers.", + "loc.input.label.filePatterns": "Modèles de fichiers", + "loc.input.help.filePatterns": "Chemins de fichiers ou modèles des fichiers à charger. Prend en charge plusieurs lignes de modèles minimatch. [Plus d'informations](https://go.microsoft.com/fwlink/?LinkId=800269)", + "loc.input.label.remotePath": "Répertoire distant", + "loc.input.help.remotePath": "Chargez les fichiers vers ce répertoire sur le serveur FTP distant.", + "loc.input.label.clean": "Supprimer le répertoire distant", + "loc.input.help.clean": "Supprimez le répertoire distant, notamment son contenu, avant le chargement.", + "loc.input.label.cleanContents": "Effacer le contenu du répertoire distant", + "loc.input.help.cleanContents": "Supprimez de manière récursive la totalité du contenu du répertoire distant avant le chargement. Le répertoire existant ne sera pas supprimé. Pour un meilleur niveau de performance, pensez à utiliser 'Supprimer le répertoire distant' à la place.", + "loc.input.label.overwrite": "Remplacer", + "loc.input.help.overwrite": "Remplacez les fichiers existants dans le répertoire distant.", + "loc.input.label.preservePaths": "Conserver les chemins de fichiers", + "loc.input.help.preservePaths": "Si l'option est sélectionnée, la structure de répertoire locale relative est recréée sous le répertoire distant où les fichiers sont chargés. Sinon, les fichiers sont chargés directement sur le répertoire distant sans création de sous-répertoires supplémentaires.

Par exemple, votre dossier source est '/home/user/source/', il contient le fichier 'foo/bar/foobar.txt', et votre répertoire distant est '/uploads/'.
Si l'option est sélectionnée, le fichier est chargé vers '/uploads/foo/bar/foobar.txt'. Sinon, il est chargé vers '/uploads/foobar.txt'.", + "loc.input.label.trustSSL": "Faire confiance au certificat de serveur", + "loc.input.help.trustSSL": "Si cette option est sélectionnée, le certificat SSL du serveur FTP est approuvé avec ftps://, même s'il est auto-signé ou même s'il ne peut pas être validé par une autorité de certification.", + "loc.messages.CleanRemoteDir": "suppression du répertoire distant : %s", + "loc.messages.CleanRemoteDirContents": "suppression du contenu du répertoire distant : %s", + "loc.messages.CleanFileDeleteFail": "une erreur s'est produite durant la suppression du fichier : %s", + "loc.messages.ConnectPort": "Connexion à : %s:%s", + "loc.messages.Disconnected": "déconnecté", + "loc.messages.DisconnectHost": "déconnexion de %s", + "loc.messages.FTPConnected": "connecté : %s", + "loc.messages.FTPNoHostSpecified": "L'URL du serveur FTP doit inclure un nom d'hôte", + "loc.messages.FTPNoProtocolSpecified": "L'URL du serveur FTP doit commencer par ftp:// ou ftps://", + "loc.messages.UploadRemoteDir": "téléchargement de fichiers sur le répertoire distant : %s", + "loc.messages.UploadSucceedMsg": "Téléchargement FTP réussi %s", + "loc.messages.UploadSucceedRes": "Téléchargement FTP réussi" +} \ No newline at end of file diff --git a/_generated/FtpUploadV1_Node20/Strings/resources.resjson/it-IT/resources.resjson b/_generated/FtpUploadV1_Node20/Strings/resources.resjson/it-IT/resources.resjson new file mode 100644 index 000000000000..07d8efd40209 --- /dev/null +++ b/_generated/FtpUploadV1_Node20/Strings/resources.resjson/it-IT/resources.resjson @@ -0,0 +1,42 @@ +{ + "loc.friendlyName": "Caricamento FTP", + "loc.helpMarkDown": "Carica i file in un computer remoto usando il protocollo FTP (File Transfer Protocol) oppure in modo protetto con FTPS. [Altre informazioni](http://go.microsoft.com/fwlink/?LinkId=809084).", + "loc.description": "Consente di caricare file tramite FTP", + "loc.instanceNameFormat": "Caricamento FTP: $(rootFolder)", + "loc.group.displayName.advanced": "Avanzate", + "loc.input.label.credsType": "Metodo di autenticazione", + "loc.input.help.credsType": "Consente di usare la connessione al servizio FTP o di immettere le credenziali di connessione.", + "loc.input.label.serverEndpoint": "Connessione al servizio FTP", + "loc.input.help.serverEndpoint": "Consente di selezionare la connessione al servizio per il server FTP. Per crearne una, fare clic sul collegamento Gestisci e creare una nuova connessione al servizio generica, immettere l'URL del server FTP per l'URL del server, ad esempio `ftp://server.example.com`, nonché le credenziali richieste.

Le connessioni sicure verranno sempre stabilite indipendentemente dal protocollo specificato (`ftp://` o `ftps://`) se il server di destinazione supporta FTPS. Per consentire solo le connessioni sicure, usare il protocollo `ftps://`, ad esempio `ftps://server.example.com`. Se si specifica `ftps://`, le connessioni a server che non supportano FTPS non riusciranno.", + "loc.input.label.serverUrl": "URL del server", + "loc.input.label.username": "Nome utente", + "loc.input.label.password": "Password", + "loc.input.label.rootFolder": "Cartella radice", + "loc.input.help.rootFolder": "Cartella di origine da cui caricare i file.", + "loc.input.label.filePatterns": "Criteri dei file", + "loc.input.help.filePatterns": "Criteri o percorsi dei file da caricare. Sono supportate più righe di criteri di corrispondenza minima. [Altre informazioni](https://go.microsoft.com/fwlink/?LinkId=800269)", + "loc.input.label.remotePath": "Directory remota", + "loc.input.help.remotePath": "Directory in cui vengono caricati i file nel server FTP remoto.", + "loc.input.label.clean": "Elimina la directory remota", + "loc.input.help.clean": "Elimina la directory remota, incluso il relativo contenuto, prima del caricamento.", + "loc.input.label.cleanContents": "Cancella il contenuto della directory remota", + "loc.input.help.cleanContents": "Elimina in modo ricorsivo tutto il contenuto della directory remota prima del caricamento. La directory esistente non verrà eliminata. Per prestazioni ottimali, provare a usare `Elimina la directory remota`.", + "loc.input.label.overwrite": "Sovrascrivi", + "loc.input.help.overwrite": "Sovrascrive i file esistenti nella directory remota.", + "loc.input.label.preservePaths": "Mantieni i percorsi di file", + "loc.input.help.preservePaths": "Se l'opzione è selezionata, la struttura di directory locale relativa viene ricreata nella directory remota in cui vengono caricati i file. In caso contrario, i file vengono caricati direttamente nella directory remota senza creare sottodirectory aggiuntive.

Ad esempio, si supponga che la cartella di origine sia `/home/user/source/` e contenga il file `foo/bar/foobar.txt` e che la directory remota sia `/uploads/`.
Se l'opzione è selezionata, il file verrà caricato in `/uploads/foo/bar/foobar.txt`; in caso contrario, verrà caricato in `/uploads/foobar.txt`.", + "loc.input.label.trustSSL": "Considera attendibile il certificato del server", + "loc.input.help.trustSSL": "Se si seleziona questa opzione, il certificato SSL del server FTP verrà considerato attendibile con ftps://, anche se è auto-firmato o non può essere convalidato da un'Autorità di certificazione (CA).", + "loc.messages.CleanRemoteDir": "rimozione della directory remota: %s", + "loc.messages.CleanRemoteDirContents": "rimozione del contenuto della directory remota: %s", + "loc.messages.CleanFileDeleteFail": "si è verificato un errore durante il tentativo di rimuovere il file: %s", + "loc.messages.ConnectPort": "connessione a: %s:%s", + "loc.messages.Disconnected": "disconnesso", + "loc.messages.DisconnectHost": "disconnessione da: %s", + "loc.messages.FTPConnected": "connessione stabilita: %s", + "loc.messages.FTPNoHostSpecified": "L'URL del server FTP deve includere un nome host", + "loc.messages.FTPNoProtocolSpecified": "L'URL del server FTP deve iniziare con ftp:// o ftps://", + "loc.messages.UploadRemoteDir": "caricamento di file nella directory remota: %s", + "loc.messages.UploadSucceedMsg": "Caricamento FTP riuscito: %s", + "loc.messages.UploadSucceedRes": "Caricamento FTP riuscito" +} \ No newline at end of file diff --git a/_generated/FtpUploadV1_Node20/Strings/resources.resjson/ja-JP/resources.resjson b/_generated/FtpUploadV1_Node20/Strings/resources.resjson/ja-JP/resources.resjson new file mode 100644 index 000000000000..55fbed89df8f --- /dev/null +++ b/_generated/FtpUploadV1_Node20/Strings/resources.resjson/ja-JP/resources.resjson @@ -0,0 +1,42 @@ +{ + "loc.friendlyName": "FTP アップロード", + "loc.helpMarkDown": "ファイル転送プロトコル (FTP) を使用して、または FTPS でセキュリティ保護して、リモート コンピューターにファイルをアップロードします。[詳細情報](http://go.microsoft.com/fwlink/?LinkId=809084)。", + "loc.description": "FTP を使用してファイルをアップロードします", + "loc.instanceNameFormat": "FTP アップロード: $(rootFolder)", + "loc.group.displayName.advanced": "詳細設定", + "loc.input.label.credsType": "認証方法", + "loc.input.help.credsType": "FTP サービス接続を使うか、接続の資格情報を入力します。", + "loc.input.label.serverEndpoint": "FTP サービス接続", + "loc.input.help.serverEndpoint": "FTP サーバーのサービス エンドポイントを選択します。サービス エンドポイントを作成するには、[管理] リンクをクリックし、新しい汎用サービス エンドポイントを作成し、サーバー URL の FTP サーバー URL (例: `ftp://server.example.com`) と必要な資格情報を入力します。

ターゲット サーバーが FTPS をサポートしている場合には、指定したプロトコル (`ftp://` または `ftps://`) に関係なくセキュリティで保護された接続が常に作成されます。セキュリティで保護された接続のみを許可する場合には `ftps://` プロトコル (例: `ftps://server.example.com`) を使用します。`ftps://` を指定すると、FTPS をサポートしていないサーバーへの接続は失敗します。", + "loc.input.label.serverUrl": "サーバーの URL", + "loc.input.label.username": "ユーザー名", + "loc.input.label.password": "パスワード", + "loc.input.label.rootFolder": "ルート フォルダー", + "loc.input.help.rootFolder": "ファイルのアップロード元のソース フォルダー。", + "loc.input.label.filePatterns": "ファイル パターン", + "loc.input.help.filePatterns": "アーカイブするファイルのファイル パスまたはパターン。複数行の minimatch パターンをサポートします。[詳細情報](https://go.microsoft.com/fwlink/?LinkId=800269)", + "loc.input.label.remotePath": "リモート ディレクトリ", + "loc.input.help.remotePath": "リモート FTP サーバー上のこのディレクトリにファイルをアップロードします。", + "loc.input.label.clean": "リモート ディレクトリの削除", + "loc.input.help.clean": "アップロードする前に、リモート ディレクトリをコンテンツも含めて削除します。", + "loc.input.label.cleanContents": "リモート ディレクトリ コンテンツのクリア", + "loc.input.help.cleanContents": "アップロードの前に、リモート ディレクトリのすべてのコンテンツを再帰的に削除します。既存のディレクトリは、削除されません。パフォーマンス向上のために、代わりに [リモート ディレクトリの削除] の使用をご検討ください。", + "loc.input.label.overwrite": "上書き", + "loc.input.help.overwrite": "リモート ディレクトリの既存のファイルを上書きします。", + "loc.input.label.preservePaths": "ファイル パスを保持", + "loc.input.help.preservePaths": "選択すると、ファイルのアップロード先のリモート ディレクトリの下に、相対ローカル ディレクトリ構造が再作成されます。選択しない場合には、ファイルは、サブディレクトリが作成されることなくリモート ディレクトリに直接アップロードされます。

たとえば、ソース フォルダーが `/home/user/source/` で、ファイル `foo/bar/foobar.txt` が含まれ、リモート ディレクトリが `/uploads/` であるとします。
選択すると、ファイルは `/uploads/foo/bar/foobar.txt` にアップロードされます。選択しないと、`/uploads/foobar.txt` にアップロードされます。", + "loc.input.label.trustSSL": "サーバー証明書を信頼する", + "loc.input.help.trustSSL": "このオプションを選択すると、FTP サーバーの SSL 証明書が、自己署名されている場合や証明書機関 (CA) によって検証できない場合であっても ftps:// によって信頼できるようになります。", + "loc.messages.CleanRemoteDir": "リモート ディレクトリを削除しています: %s", + "loc.messages.CleanRemoteDirContents": "リモート ディレクトリのコンテンツを削除しています: %s", + "loc.messages.CleanFileDeleteFail": "ファイルを削除しようとしている間にエラーが発生しました: %s", + "loc.messages.ConnectPort": "次に接続しています: %s:%s", + "loc.messages.Disconnected": "切断されました", + "loc.messages.DisconnectHost": "次から切断しています: %s", + "loc.messages.FTPConnected": "接続されました: %s", + "loc.messages.FTPNoHostSpecified": "FTP サーバーの URL には、ホスト名を含める必要があります", + "loc.messages.FTPNoProtocolSpecified": "FTP サーバーの URL は、ftp:// または ftps:// で始める必要があります", + "loc.messages.UploadRemoteDir": "リモート ディレクトリにファイルをアップロードしています: %s", + "loc.messages.UploadSucceedMsg": "FTP が正常にアップロードされました %s", + "loc.messages.UploadSucceedRes": "FTP が正常にアップロードされました" +} \ No newline at end of file diff --git a/_generated/FtpUploadV1_Node20/Strings/resources.resjson/ko-KR/resources.resjson b/_generated/FtpUploadV1_Node20/Strings/resources.resjson/ko-KR/resources.resjson new file mode 100644 index 000000000000..c414f2e944ac --- /dev/null +++ b/_generated/FtpUploadV1_Node20/Strings/resources.resjson/ko-KR/resources.resjson @@ -0,0 +1,42 @@ +{ + "loc.friendlyName": "FTP 업로드", + "loc.helpMarkDown": "FTP(파일 전송 프로토콜)를 사용하거나 FTPS를 사용하여 안전하게 파일을 원격 컴퓨터에 업로드합니다. [자세한 정보](http://go.microsoft.com/fwlink/?LinkId=809084).", + "loc.description": "FTP를 사용하여 파일을 업로드합니다.", + "loc.instanceNameFormat": "FTP 업로드: $(rootFolder)", + "loc.group.displayName.advanced": "고급", + "loc.input.label.credsType": "인증 방법", + "loc.input.help.credsType": "FTP 서비스 연결을 사용하거나 연결 자격 증명을 입력합니다.", + "loc.input.label.serverEndpoint": "FTP 서비스 연결", + "loc.input.help.serverEndpoint": "FTP 서버의 서비스 연결을 선택합니다. 서비스 연결을 만들려면 [관리] 링크를 클릭하고 새 일반 서비스 연결을 만든 후 서버 URL의 FTP 서버 URL(예: 'ftp://server.example.com') 및 필요한 자격 증명을 입력합니다.

대상 서버가 FTPS를 지원하는 경우 지정된 프로토콜('ftp://' 또는 'ftps://')과 관계없이 항상 보안 연결이 만들어집니다. 보안 연결만 허용하려면 'ftps://' 프로토콜(예: 'ftps://server.example.com')을 사용합니다. 'ftps://'가 지정된 경우 FTPS를 지원하지 않는 서버에 연결할 수 없습니다.", + "loc.input.label.serverUrl": "서버 URL", + "loc.input.label.username": "사용자 이름", + "loc.input.label.password": "암호", + "loc.input.label.rootFolder": "루트 폴더", + "loc.input.help.rootFolder": "파일을 업로드할 소스 폴더입니다.", + "loc.input.label.filePatterns": "파일 패턴", + "loc.input.help.filePatterns": "업로드할 파일의 파일 경로 또는 패턴입니다. 여러 줄로 된 minimatch 패턴을 지원합니다. [자세한 정보](https://go.microsoft.com/fwlink/?LinkId=800269)", + "loc.input.label.remotePath": "원격 디렉터리", + "loc.input.help.remotePath": "파일을 원격 FTP 서버의 이 디렉터리에 업로드합니다.", + "loc.input.label.clean": "원격 디렉터리 삭제", + "loc.input.help.clean": "업로드 전에 해당 콘텐츠를 포함하여 원격 디렉터리를 삭제합니다.", + "loc.input.label.cleanContents": "원격 디렉터리 콘텐츠 지우기", + "loc.input.help.cleanContents": "업로드 전에 원격 디렉터리의 모든 콘텐츠를 재귀적으로 삭제합니다. 기존 디렉터리는 삭제되지 않습니다. 성능을 향상하려면 '원격 디렉터리 삭제'를 대신 사용하는 것이 좋습니다.", + "loc.input.label.overwrite": "덮어쓰기", + "loc.input.help.overwrite": "원격 디렉터리의 기존 파일을 덮어씁니다.", + "loc.input.label.preservePaths": "파일 경로 유지", + "loc.input.help.preservePaths": "선택하는 경우 파일이 업로드되는 원격 디렉터리 아래에 상대 로컬 디렉터리 구조가 다시 만들어집니다. 선택하지 않으면 추가 하위 디렉터리가 만들어지지 않고 파일이 원격 디렉터리에 직접 업로드됩니다.

예를 들어 소스 폴더가 `/home/user/source/`이고 `foo/bar/foobar.txt` 파일을 포함하고 있으며, 원격 디렉터리는 `/uploads/`라고 가정합니다.
선택하는 경우 파일은 `/uploads/foo/bar/foobar.txt`에 업로드됩니다. 선택하지 않으면 `/uploads/foobar.txt`에 업로드됩니다.", + "loc.input.label.trustSSL": "서버 인증서 신뢰", + "loc.input.help.trustSSL": "이 옵션을 선택하면 FTP 서버의 SSL 인증서가 자체 서명되거나 CA(인증 기관)에서 그 유효성을 검사할 수 없더라도 해당 인증서가 ftps://로 신뢰됩니다.", + "loc.messages.CleanRemoteDir": "원격 디렉터리를 제거하는 중: %s", + "loc.messages.CleanRemoteDirContents": "원격 디렉터리 콘텐츠를 제거하는 중: %s", + "loc.messages.CleanFileDeleteFail": "파일을 제거하는 중 오류 발생: %s", + "loc.messages.ConnectPort": "%s:%s에 연결하는 중입니다.", + "loc.messages.Disconnected": "연결 끊김", + "loc.messages.DisconnectHost": "%s에서 연결을 끊는 중입니다.", + "loc.messages.FTPConnected": "%s이(가) 연결되었습니다.", + "loc.messages.FTPNoHostSpecified": "FTP 서버 URL은 호스트 이름을 포함해야 합니다.", + "loc.messages.FTPNoProtocolSpecified": "FTP 서버 URL은 ftp:// 또는 ftps://로 시작해야 합니다.", + "loc.messages.UploadRemoteDir": "파일을 원격 디렉터리로 업로드하는 중입니다. %s", + "loc.messages.UploadSucceedMsg": "FTP 업로드 성공 %s", + "loc.messages.UploadSucceedRes": "FTP 업로드 성공" +} \ No newline at end of file diff --git a/_generated/FtpUploadV1_Node20/Strings/resources.resjson/ru-RU/resources.resjson b/_generated/FtpUploadV1_Node20/Strings/resources.resjson/ru-RU/resources.resjson new file mode 100644 index 000000000000..7f45c7f4c965 --- /dev/null +++ b/_generated/FtpUploadV1_Node20/Strings/resources.resjson/ru-RU/resources.resjson @@ -0,0 +1,42 @@ +{ + "loc.friendlyName": "Отправка по FTP", + "loc.helpMarkDown": "Передача файлов на удаленный компьютер по протоколу FTP или защищенному протоколу FTPS. [Дополнительные сведения](http://go.microsoft.com/fwlink/?LinkId=809084).", + "loc.description": "Отправка файлов по FTP", + "loc.instanceNameFormat": "Отправка по FTP: $(rootFolder)", + "loc.group.displayName.advanced": "Дополнительно", + "loc.input.label.credsType": "Способ проверки подлинности", + "loc.input.help.credsType": "Используйте подключение к службе FTP или введите учетные данные подключения.", + "loc.input.label.serverEndpoint": "Подключение к службе FTP", + "loc.input.help.serverEndpoint": "Выберите подключение к службе для FTP-сервера. Чтобы создать подключение, щелкните ссылку \"Управление\" и создайте универсальное подключение к службе, введите URL-адрес FTP-сервера в поле \"URL-адрес сервера\" (например, ftp://server.example.com) и необходимые учетные данные.

Если конечный сервер поддерживает FTPS, всегда будут устанавливаться безопасные подключения независимо от указанного протокола (ftp:// или ftps://). Чтобы разрешить только безопасные подключения, используйте протокол ftps://, например ftps://server.example.com. Если указан протокол ftps://, подключения к серверам, не поддерживающим FTPS, будут завершаться ошибкой.", + "loc.input.label.serverUrl": "URL-адрес сервера", + "loc.input.label.username": "Имя пользователя", + "loc.input.label.password": "Пароль", + "loc.input.label.rootFolder": "Корневая папка", + "loc.input.help.rootFolder": "Исходная папка, из которой выполняется отправка файлов.", + "loc.input.label.filePatterns": "Шаблоны файлов", + "loc.input.help.filePatterns": "Пути к файлам или шаблоны файлов для отправки. Поддерживает несколько строк шаблонов minimatch. [Подробнее...](https://go.microsoft.com/fwlink/?LinkId=800269)", + "loc.input.label.remotePath": "Удаленный каталог", + "loc.input.help.remotePath": "Отправлять файлы в этот каталог на удаленном FTP-сервере.", + "loc.input.label.clean": "Удалить удаленный каталог", + "loc.input.help.clean": "Удалить удаленный каталог, включая его содержимое, перед отправкой.", + "loc.input.label.cleanContents": "Очистить содержимое удаленного каталога", + "loc.input.help.cleanContents": "Рекурсивно удалить все содержимое удаленного каталога перед отправкой. Существующий каталог не удаляется. Для повышения производительности используйте вместо этого функцию \"Удалить удаленный каталог\".", + "loc.input.label.overwrite": "Перезаписать", + "loc.input.help.overwrite": "Перезапись существующих файлов в удаленном каталоге.", + "loc.input.label.preservePaths": "Сохранять пути к файлам", + "loc.input.help.preservePaths": "Если этот флажок установлен, структура относительного локального каталога пересоздается в удаленном каталоге, в который отправляются файлы. В противном случае файлы отправляются напрямую в удаленный каталог без создания дополнительных подкаталогов.

Предположим, ваша исходная папка — /home/user/source/, которая содержит файл foo/bar/foobar.txt, а удаленный каталог — /uploads/.
Если флажок установлен, файл отправляется в папку /uploads/foo/bar/foobar.txt. В противном случае он отправляется в папку /uploads/foobar.txt.", + "loc.input.label.trustSSL": "Доверять сертификату сервера", + "loc.input.help.trustSSL": "При выборе этого параметра SSL-сертификат FTP-сервера становится доверенным для ftps://, даже если он является самозаверяющим или центр сертификации не может подтвердить его подлинность.", + "loc.messages.CleanRemoteDir": "удаляется удаленный каталог: %s", + "loc.messages.CleanRemoteDirContents": "удаляется содержимое удаленного каталога: %s", + "loc.messages.CleanFileDeleteFail": "произошла ошибка при удалении файла: %s", + "loc.messages.ConnectPort": "подключено к: %s:%s", + "loc.messages.Disconnected": "отключено", + "loc.messages.DisconnectHost": "отключение от: %s", + "loc.messages.FTPConnected": "подключено: %s", + "loc.messages.FTPNoHostSpecified": "В URL-адресе FTP-сервера должно быть указано имя узла.", + "loc.messages.FTPNoProtocolSpecified": "URL-адрес FTP-сервера должен начинаться с \"ftp://\" или \"ftps://\"", + "loc.messages.UploadRemoteDir": "отправка файлов в удаленный каталог: %s", + "loc.messages.UploadSucceedMsg": "Отправка по FTP успешно завершена: %s", + "loc.messages.UploadSucceedRes": "Отправка по FTP успешно завершена." +} \ No newline at end of file diff --git a/_generated/FtpUploadV1_Node20/Strings/resources.resjson/zh-CN/resources.resjson b/_generated/FtpUploadV1_Node20/Strings/resources.resjson/zh-CN/resources.resjson new file mode 100644 index 000000000000..5d0d7bcfd24d --- /dev/null +++ b/_generated/FtpUploadV1_Node20/Strings/resources.resjson/zh-CN/resources.resjson @@ -0,0 +1,42 @@ +{ + "loc.friendlyName": "FTP 上传", + "loc.helpMarkDown": "使用文件传输协议(FTP)将文件上传到远程计算机,或使用 FTPS 安全上传。[详细信息](http://go.microsoft.com/fwlink/?LinkId=809084)。", + "loc.description": "使用 FTP 上传文件", + "loc.instanceNameFormat": "FTP 上传: $(rootFolder)", + "loc.group.displayName.advanced": "高级", + "loc.input.label.credsType": "身份验证方法", + "loc.input.help.credsType": "使用 FTP 服务连接或输入连接凭据。", + "loc.input.label.serverEndpoint": "FTP 服务连接", + "loc.input.help.serverEndpoint": "选择 FTP 服务器的服务连接。若要创建一个,可单击管理链接并创建新的通用服务连接,为服务器 URL 输入 FTP 服务器 URL,例如,\"ftp://server.example.com\",以及所需的凭据。

如果目标服务器支持 FTPS,无论指定了什么协议,都会建立安全连接(\"ftp://\"\"ftps://\")。若要仅允许安全连接,请使用 \"ftps://\" 协议,例如,\"ftps://server.example.com\"。如果指定了 \"ftps://\",则连接不支持 FTPS 的服务器将失败。", + "loc.input.label.serverUrl": "服务器 URL", + "loc.input.label.username": "用户名", + "loc.input.label.password": "密码", + "loc.input.label.rootFolder": "根文件夹", + "loc.input.help.rootFolder": "要上传其中文件的源文件夹。", + "loc.input.label.filePatterns": "文件模式", + "loc.input.help.filePatterns": "要上传的文件的文件路径或模式。支持多行最小匹配模式。[详细信息](https://go.microsoft.com/fwlink/?LinkId=800269)", + "loc.input.label.remotePath": "远程目录", + "loc.input.help.remotePath": "将文件上传到远程 FTP 服务器上的该目录中。", + "loc.input.label.clean": "删除远程目录", + "loc.input.help.clean": "上传前,请删除远程目录及其内容。", + "loc.input.label.cleanContents": "清除远程目录内容", + "loc.input.help.cleanContents": "上传前,请以递归方式删除所有远程目录的内容。不会删除现有目录。要提高性能,请考虑改用“删除远程目录”。", + "loc.input.label.overwrite": "覆盖", + "loc.input.help.overwrite": "覆盖远程目录中的现有文件。", + "loc.input.label.preservePaths": "保留文件路径", + "loc.input.help.preservePaths": "如果选中,将在上传文件的远程目录下重新创建有关本地目录结构。否则,会将文件直接上传到远程目录而不创建其他子目录。

例如,假设源文件夹为: `/home/user/source/`,它包含文件: `foo/bar/foobar.txt`,而远程目录为: `/uploads/`
如果选中,文件将上传到: `/ uploads/foo/bar/foobar.txt`。否则上传到: `/ uploads/foobar.txt`。", + "loc.input.label.trustSSL": "信任服务器证书", + "loc.input.help.trustSSL": "选择此选项将通过 ftps:// 信任 FTP 服务器的 SSL 证书,即使它是自签名证书或无法由证书颁发机构(CA)验证的证书。", + "loc.messages.CleanRemoteDir": "正在删除远程目录: %s", + "loc.messages.CleanRemoteDirContents": "正在删除远程目录内容: %s", + "loc.messages.CleanFileDeleteFail": "尝试删除文件时出错: %s", + "loc.messages.ConnectPort": "正在连接到: %s:%s", + "loc.messages.Disconnected": "已断开连接", + "loc.messages.DisconnectHost": "正在断开与 %s 的连接 ", + "loc.messages.FTPConnected": "已连接: %s", + "loc.messages.FTPNoHostSpecified": "FTP 服务器 URL 必需包括主机名", + "loc.messages.FTPNoProtocolSpecified": "FTP 服务器 URL 必需以 ftp:// 或 ftps:// 开头", + "loc.messages.UploadRemoteDir": "正在将文件上传到远程目录: %s", + "loc.messages.UploadSucceedMsg": "FTP 已成功上传 %s", + "loc.messages.UploadSucceedRes": "FTP 已成功上传" +} \ No newline at end of file diff --git a/_generated/FtpUploadV1_Node20/Strings/resources.resjson/zh-TW/resources.resjson b/_generated/FtpUploadV1_Node20/Strings/resources.resjson/zh-TW/resources.resjson new file mode 100644 index 000000000000..3e6e9f188211 --- /dev/null +++ b/_generated/FtpUploadV1_Node20/Strings/resources.resjson/zh-TW/resources.resjson @@ -0,0 +1,42 @@ +{ + "loc.friendlyName": "FTP 上傳", + "loc.helpMarkDown": "使用檔案傳輸通訊協定 (FTP) 或更安全的 FTPS,將檔案上傳到遠端電腦。[詳細資訊](http://go.microsoft.com/fwlink/?LinkId=809084)。", + "loc.description": "使用 FTP 上傳檔案", + "loc.instanceNameFormat": "FTP 上傳: $(rootFolder)", + "loc.group.displayName.advanced": "進階", + "loc.input.label.credsType": "驗證方法", + "loc.input.help.credsType": "請使用 FTP 服務連線,或輸入連線認證。", + "loc.input.label.serverEndpoint": "FTP 服務連線", + "loc.input.help.serverEndpoint": "請為您的 FTP 伺服器選取服務連線。若要建立服務連線,請按一下 [管理連結],然後建立新的泛型服務連線,輸入伺服器 URL 的 FTP 伺服器 URL (例如: `ftp://server.example.com`) 和必要認證。

無論指定何種通訊協定 ('ftp://''ftps://'),只要目標伺服器支援 FTPS,一律會建立安全連線。若要只允許安全連線,請使用 'ftps://' 通訊協定,例如 'ftps://server.example.com'。若指定了 'ftps://',但伺服器不支援 FTPS,連線將會失敗。", + "loc.input.label.serverUrl": "伺服器 URL", + "loc.input.label.username": "使用者名稱", + "loc.input.label.password": "密碼", + "loc.input.label.rootFolder": "根資料夾", + "loc.input.help.rootFolder": "要上傳之檔案所在的來源資料夾。", + "loc.input.label.filePatterns": "檔案模式", + "loc.input.help.filePatterns": "要上傳之檔案的檔案路徑或樣式。支援多行的 minimatch 樣式。[詳細資訊](https://go.microsoft.com/fwlink/?LinkId=800269)", + "loc.input.label.remotePath": "遠端目錄", + "loc.input.help.remotePath": "將檔案上傳到遠端 FTP 伺服器上的此目錄。", + "loc.input.label.clean": "刪除遠端目錄", + "loc.input.help.clean": "先刪除遠端目錄 (包括其內容) 再上傳。", + "loc.input.label.cleanContents": "清除遠端目錄內容", + "loc.input.help.cleanContents": "先以遞迴方式刪除遠端目錄的所有內容再上傳。現有的目錄不會刪除。為達更佳效能,請考慮改為使用 `Delete remote directory`。", + "loc.input.label.overwrite": "覆寫", + "loc.input.help.overwrite": "覆寫遠端目錄中現有的檔案。", + "loc.input.label.preservePaths": "保留檔案路徑", + "loc.input.help.preservePaths": "如有選取,會在檔案上傳的遠端目錄下重新建立相對的本機目錄結構。否則,檔案會直接上傳到遠端目錄,而不會另外建立其他子目錄。

例如,假設您的來源資料來為 '/home/user/source/',其中包含了檔案 'foo/bar/foobar.txt',而您的遠端目錄為 '/uploads/'
如有選取,檔案會上傳到 '/uploads/foo/bar/foobar.txt',否則會上傳到 '/uploads/foobar.txt'。", + "loc.input.label.trustSSL": "信任伺服器憑證", + "loc.input.help.trustSSL": "選取此選項會導致 FTP 伺服器的 SSL 憑證受 ftps:// 信任,即使它是自我簽署的憑證,或是憑證授權單位 (CA) 無法驗證的憑證亦然。", + "loc.messages.CleanRemoteDir": "正在移除遠端目錄: %s", + "loc.messages.CleanRemoteDirContents": "正在移除遠端目錄內容: %s", + "loc.messages.CleanFileDeleteFail": "嘗試移除檔案時發生錯誤: %s", + "loc.messages.ConnectPort": "正在連線到: %s:%s", + "loc.messages.Disconnected": "已中斷連線", + "loc.messages.DisconnectHost": "正在中斷下項的連線: %s", + "loc.messages.FTPConnected": "已連線: %s", + "loc.messages.FTPNoHostSpecified": "FTP 伺服器 URL 必須包含主機名稱。", + "loc.messages.FTPNoProtocolSpecified": "FTP 伺服器 URL 的開頭必須是 ftp:// 或 ftps://", + "loc.messages.UploadRemoteDir": "正在將檔案上傳至遠端目錄: %s", + "loc.messages.UploadSucceedMsg": "FTP 上傳成功 %s", + "loc.messages.UploadSucceedRes": "FTP 上傳成功" +} \ No newline at end of file diff --git a/_generated/FtpUploadV1_Node20/Tests/L0.ts b/_generated/FtpUploadV1_Node20/Tests/L0.ts new file mode 100644 index 000000000000..13a8d5dc2ad4 --- /dev/null +++ b/_generated/FtpUploadV1_Node20/Tests/L0.ts @@ -0,0 +1,129 @@ +import fs = require('fs'); +import assert = require('assert'); +import path = require('path'); +import * as ttm from 'azure-pipelines-task-lib/mock-test'; + +describe('FtpUploadV1 Suite', function () { + this.timeout(parseInt(process.env.TASK_TEST_TIMEOUT) || 20000); + + it('check args: no serverEndpoint', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0NoServerEndpoint.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.stdOutContained('Input required: serverEndpoint'), 'Should have printed: Input required: serverEndpoint'); + assert(tr.failed, 'task should have failed'); + + done(); + }); + + it('check args: no rootFolder', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0NoRootFolder.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.stdOutContained('Input required: rootFolder'), 'Should have printed: Input required: rootFolder'); + assert(tr.failed, 'task should have failed'); + + done(); + }); + + it('check args: no filePatterns', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0NoFilePatterns.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.stdOutContained('Input required: filePatterns'), 'Should have printed: Input required: filePatterns'); + assert(tr.failed, 'task should have failed'); + + done(); + }); + + it('check args: no remotePath', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0NoRemotePath.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.stdOutContained('Input required: remotePath'), 'Should have printed: Input required: remotePath'); + assert(tr.failed, 'task should have failed'); + + done(); + }); + + it('check args: no clean', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0NoClean.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.stdOutContained('Input required: clean'), 'Should have printed: Input required: clean'); + assert(tr.failed, 'task should have failed'); + + done(); + }); + + it('check args: no overwrite', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0NoOverwrite.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.stdOutContained('Input required: overwrite'), 'Should have printed: Input required: overwrite'); + assert(tr.failed, 'task should have failed'); + + done(); + }); + + it('check args: no preservePaths', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0NoPreservePaths.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.stdOutContained('Input required: preservePaths'), 'Should have printed: Input required: preservePaths'); + assert(tr.failed, 'task should have failed'); + + done(); + }); + + it('check args: no trustSSL', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0NoTrustSSL.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.invokedToolCount === 0, 'should not run anything'); + assert(tr.stdOutContained('Input required: trustSSL'), 'Should have printed: Input required: trustSSL'); + assert(tr.failed, 'task should have failed'); + + done(); + }); + + it('check args: no protocol on server URL (ftp:// or ftps://)', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0NoProtocol.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.stdOutContained('loc_mock_FTPNoProtocolSpecified'), 'Should have printed: loc_mock_FTPNoProtocolSpecified'); + assert(tr.failed, 'task should have failed'); + + done(); + }); + + it('check args: no host name on server URL', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0NoHostName.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.stdOutContained('loc_mock_FTPNoHostSpecified'), 'Should have printed: loc_mock_FTPNoHostSpecified'); + assert(tr.failed, 'task should have failed'); + + done(); + }); +}); diff --git a/_generated/FtpUploadV1_Node20/Tests/L0NoClean.ts b/_generated/FtpUploadV1_Node20/Tests/L0NoClean.ts new file mode 100644 index 000000000000..e0c4ad749695 --- /dev/null +++ b/_generated/FtpUploadV1_Node20/Tests/L0NoClean.ts @@ -0,0 +1,40 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'ftpuploadtask.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('serverEndpoint', 'ID1'); +tr.setInput('rootFolder', 'rootFolder'); +tr.setInput('filePatterns', '**'); +tr.setInput('remotePath', '/upload/'); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "getVariable": { + "ENDPOINT_URL_ID1": "ftp://valid.microsoft.com", + "ENDPOINT_AUTH_ID1": "{\"scheme\":\"UsernamePassword\", \"parameters\": {\"username\": \"uname\", \"password\": \"pword\"}}", + "build.sourcesDirectory": "/" + }, + "exist" : { + "rootFolder": true + }, + "find": { + "rootFolder": [ + "rootFolder/a", + "rootFolder/b", + "rootFolder/c" + ] + }, + "match": { + "*": [ + "rootFolder/a", + "rootFolder/b", + "rootFolder/c" + ] + } +}; +tr.setAnswers(a); + +tr.run(); \ No newline at end of file diff --git a/_generated/FtpUploadV1_Node20/Tests/L0NoFilePatterns.ts b/_generated/FtpUploadV1_Node20/Tests/L0NoFilePatterns.ts new file mode 100644 index 000000000000..8e3444ba1f04 --- /dev/null +++ b/_generated/FtpUploadV1_Node20/Tests/L0NoFilePatterns.ts @@ -0,0 +1,38 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'ftpuploadtask.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('serverEndpoint', 'ID1'); +tr.setInput('rootFolder', 'rootFolder'); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "getVariable": { + "ENDPOINT_URL_ID1": "ftp://valid.microsoft.com", + "ENDPOINT_AUTH_ID1": "{\"scheme\":\"UsernamePassword\", \"parameters\": {\"username\": \"uname\", \"password\": \"pword\"}}", + "build.sourcesDirectory": "/" + }, + "exist" : { + "rootFolder": true + }, + "find": { + "rootFolder": [ + "rootFolder/a", + "rootFolder/b", + "rootFolder/c" + ] + }, + "match": { + "*": [ + "rootFolder/a", + "rootFolder/b", + "rootFolder/c" + ] + } +}; +tr.setAnswers(a); + +tr.run(); \ No newline at end of file diff --git a/_generated/FtpUploadV1_Node20/Tests/L0NoHostName.ts b/_generated/FtpUploadV1_Node20/Tests/L0NoHostName.ts new file mode 100644 index 000000000000..b7e3877412bb --- /dev/null +++ b/_generated/FtpUploadV1_Node20/Tests/L0NoHostName.ts @@ -0,0 +1,47 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'ftpuploadtask.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('credsType', 'inputs'); +tr.setInput('serverUrl', 'ftps://'); +tr.setInput('username', 'username'); +tr.setInput('password', 'password'); +tr.setInput('rootFolder', 'rootFolder'); +tr.setInput('filePatterns', '**'); +tr.setInput('remotePath', '/upload/'); +tr.setInput('clean', 'true'); +tr.setInput('overwrite', 'true'); +tr.setInput('preservePaths', 'true'); +tr.setInput('trustSSL', 'true'); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "getVariable": { + "ENDPOINT_URL_ID1": "ftp://valid.microsoft.com", + "ENDPOINT_AUTH_ID1": "{\"scheme\":\"UsernamePassword\", \"parameters\": {\"username\": \"uname\", \"password\": \"pword\"}}", + "build.sourcesDirectory": "/" + }, + "exist" : { + "rootFolder": true + }, + "find": { + "rootFolder": [ + "rootFolder/a", + "rootFolder/b", + "rootFolder/c" + ] + }, + "match": { + "*": [ + "rootFolder/a", + "rootFolder/b", + "rootFolder/c" + ] + } +}; +tr.setAnswers(a); + +tr.run(); \ No newline at end of file diff --git a/_generated/FtpUploadV1_Node20/Tests/L0NoOverwrite.ts b/_generated/FtpUploadV1_Node20/Tests/L0NoOverwrite.ts new file mode 100644 index 000000000000..3bbddd96337d --- /dev/null +++ b/_generated/FtpUploadV1_Node20/Tests/L0NoOverwrite.ts @@ -0,0 +1,41 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'ftpuploadtask.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('serverEndpoint', 'ID1'); +tr.setInput('rootFolder', 'rootFolder'); +tr.setInput('filePatterns', '**'); +tr.setInput('remotePath', '/upload/'); +tr.setInput('clean', 'true'); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "getVariable": { + "ENDPOINT_URL_ID1": "ftp://valid.microsoft.com", + "ENDPOINT_AUTH_ID1": "{\"scheme\":\"UsernamePassword\", \"parameters\": {\"username\": \"uname\", \"password\": \"pword\"}}", + "build.sourcesDirectory": "/" + }, + "exist" : { + "rootFolder": true + }, + "find": { + "rootFolder": [ + "rootFolder/a", + "rootFolder/b", + "rootFolder/c" + ] + }, + "match": { + "*": [ + "rootFolder/a", + "rootFolder/b", + "rootFolder/c" + ] + } +}; +tr.setAnswers(a); + +tr.run(); \ No newline at end of file diff --git a/_generated/FtpUploadV1_Node20/Tests/L0NoPreservePaths.ts b/_generated/FtpUploadV1_Node20/Tests/L0NoPreservePaths.ts new file mode 100644 index 000000000000..e62cc4cae38e --- /dev/null +++ b/_generated/FtpUploadV1_Node20/Tests/L0NoPreservePaths.ts @@ -0,0 +1,42 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'ftpuploadtask.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('serverEndpoint', 'ID1'); +tr.setInput('rootFolder', 'rootFolder'); +tr.setInput('filePatterns', '**'); +tr.setInput('remotePath', '/upload/'); +tr.setInput('clean', 'true'); +tr.setInput('overwrite', 'true'); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "getVariable": { + "ENDPOINT_URL_ID1": "ftp://valid.microsoft.com", + "ENDPOINT_AUTH_ID1": "{\"scheme\":\"UsernamePassword\", \"parameters\": {\"username\": \"uname\", \"password\": \"pword\"}}", + "build.sourcesDirectory": "/" + }, + "exist" : { + "rootFolder": true + }, + "find": { + "rootFolder": [ + "rootFolder/a", + "rootFolder/b", + "rootFolder/c" + ] + }, + "match": { + "*": [ + "rootFolder/a", + "rootFolder/b", + "rootFolder/c" + ] + } +}; +tr.setAnswers(a); + +tr.run(); \ No newline at end of file diff --git a/_generated/FtpUploadV1_Node20/Tests/L0NoProtocol.ts b/_generated/FtpUploadV1_Node20/Tests/L0NoProtocol.ts new file mode 100644 index 000000000000..b94be5afef47 --- /dev/null +++ b/_generated/FtpUploadV1_Node20/Tests/L0NoProtocol.ts @@ -0,0 +1,47 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'ftpuploadtask.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('credsType', 'inputs'); +tr.setInput('serverUrl', 'noprotocol.microsoft.com'); +tr.setInput('username', 'myUsername'); +tr.setInput('password', 'myPassword'); +tr.setInput('rootFolder', 'rootFolder'); +tr.setInput('filePatterns', '**'); +tr.setInput('remotePath', '/upload/'); +tr.setInput('clean', 'true'); +tr.setInput('overwrite', 'true'); +tr.setInput('preservePaths', 'true'); +tr.setInput('trustSSL', 'true'); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "getVariable": { + "ENDPOINT_URL_ID1": "ftp://valid.microsoft.com", + "ENDPOINT_AUTH_ID1": "{\"scheme\":\"UsernamePassword\", \"parameters\": {\"username\": \"uname\", \"password\": \"pword\"}}", + "build.sourcesDirectory": "/" + }, + "exist" : { + "rootFolder": true + }, + "find": { + "rootFolder": [ + "rootFolder/a", + "rootFolder/b", + "rootFolder/c" + ] + }, + "match": { + "*": [ + "rootFolder/a", + "rootFolder/b", + "rootFolder/c" + ] + } +}; +tr.setAnswers(a); + +tr.run(); \ No newline at end of file diff --git a/_generated/FtpUploadV1_Node20/Tests/L0NoRemotePath.ts b/_generated/FtpUploadV1_Node20/Tests/L0NoRemotePath.ts new file mode 100644 index 000000000000..d16cad0ee3ed --- /dev/null +++ b/_generated/FtpUploadV1_Node20/Tests/L0NoRemotePath.ts @@ -0,0 +1,39 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'ftpuploadtask.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('serverEndpoint', 'ID1'); +tr.setInput('rootFolder', 'rootFolder'); +tr.setInput('filePatterns', '**'); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "getVariable": { + "ENDPOINT_URL_ID1": "ftp://valid.microsoft.com", + "ENDPOINT_AUTH_ID1": "{\"scheme\":\"UsernamePassword\", \"parameters\": {\"username\": \"uname\", \"password\": \"pword\"}}", + "build.sourcesDirectory": "/" + }, + "exist" : { + "rootFolder": true + }, + "find": { + "rootFolder": [ + "rootFolder/a", + "rootFolder/b", + "rootFolder/c" + ] + }, + "match": { + "*": [ + "rootFolder/a", + "rootFolder/b", + "rootFolder/c" + ] + } +}; +tr.setAnswers(a); + +tr.run(); \ No newline at end of file diff --git a/_generated/FtpUploadV1_Node20/Tests/L0NoRootFolder.ts b/_generated/FtpUploadV1_Node20/Tests/L0NoRootFolder.ts new file mode 100644 index 000000000000..07d04bbda4bf --- /dev/null +++ b/_generated/FtpUploadV1_Node20/Tests/L0NoRootFolder.ts @@ -0,0 +1,37 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'ftpuploadtask.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('serverEndpoint', 'ID1'); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "getVariable": { + "ENDPOINT_URL_ID1": "ftp://valid.microsoft.com", + "ENDPOINT_AUTH_ID1": "{\"scheme\":\"UsernamePassword\", \"parameters\": {\"username\": \"uname\", \"password\": \"pword\"}}", + "build.sourcesDirectory": "/" + }, + "exist" : { + "rootFolder": true + }, + "find": { + "rootFolder": [ + "rootFolder/a", + "rootFolder/b", + "rootFolder/c" + ] + }, + "match": { + "*": [ + "rootFolder/a", + "rootFolder/b", + "rootFolder/c" + ] + } +}; +tr.setAnswers(a); + +tr.run(); \ No newline at end of file diff --git a/_generated/FtpUploadV1_Node20/Tests/L0NoServerEndpoint.ts b/_generated/FtpUploadV1_Node20/Tests/L0NoServerEndpoint.ts new file mode 100644 index 000000000000..d466bcf5c551 --- /dev/null +++ b/_generated/FtpUploadV1_Node20/Tests/L0NoServerEndpoint.ts @@ -0,0 +1,37 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'ftpuploadtask.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('credsType', 'serviceEndpoint'); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "getVariable": { + "ENDPOINT_URL_ID1": "ftp://valid.microsoft.com", + "ENDPOINT_AUTH_ID1": "{\"scheme\":\"UsernamePassword\", \"parameters\": {\"username\": \"uname\", \"password\": \"pword\"}}", + "build.sourcesDirectory": "/" + }, + "exist" : { + "rootFolder": true + }, + "find": { + "rootFolder": [ + "rootFolder/a", + "rootFolder/b", + "rootFolder/c" + ] + }, + "match": { + "*": [ + "rootFolder/a", + "rootFolder/b", + "rootFolder/c" + ] + } +}; +tr.setAnswers(a); + +tr.run(); \ No newline at end of file diff --git a/_generated/FtpUploadV1_Node20/Tests/L0NoTrustSSL.ts b/_generated/FtpUploadV1_Node20/Tests/L0NoTrustSSL.ts new file mode 100644 index 000000000000..dbf227e2e628 --- /dev/null +++ b/_generated/FtpUploadV1_Node20/Tests/L0NoTrustSSL.ts @@ -0,0 +1,43 @@ +import ma = require('azure-pipelines-task-lib/mock-answer'); +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import path = require('path'); + +let taskPath = path.join(__dirname, '..', 'ftpuploadtask.js'); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput('serverEndpoint', 'ID1'); +tr.setInput('rootFolder', 'rootFolder'); +tr.setInput('filePatterns', '**'); +tr.setInput('remotePath', '/upload/'); +tr.setInput('clean', 'true'); +tr.setInput('overwrite', 'true'); +tr.setInput('preservePaths', 'true'); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "getVariable": { + "ENDPOINT_URL_ID1": "ftp://valid.microsoft.com", + "ENDPOINT_AUTH_ID1": "{\"scheme\":\"UsernamePassword\", \"parameters\": {\"username\": \"uname\", \"password\": \"pword\"}}", + "build.sourcesDirectory": "/" + }, + "exist" : { + "rootFolder": true + }, + "find": { + "rootFolder": [ + "rootFolder/a", + "rootFolder/b", + "rootFolder/c" + ] + }, + "match": { + "*": [ + "rootFolder/a", + "rootFolder/b", + "rootFolder/c" + ] + } +}; +tr.setAnswers(a); + +tr.run(); \ No newline at end of file diff --git a/_generated/FtpUploadV1_Node20/Tests/package-lock.json b/_generated/FtpUploadV1_Node20/Tests/package-lock.json new file mode 100644 index 000000000000..04ef5eaf8472 --- /dev/null +++ b/_generated/FtpUploadV1_Node20/Tests/package-lock.json @@ -0,0 +1,14 @@ +{ + "name": "ftp-upload-tests", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/mocha": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", + "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==", + "dev": true + } + } +} diff --git a/_generated/FtpUploadV1_Node20/Tests/package.json b/_generated/FtpUploadV1_Node20/Tests/package.json new file mode 100644 index 000000000000..743cd975ef68 --- /dev/null +++ b/_generated/FtpUploadV1_Node20/Tests/package.json @@ -0,0 +1,22 @@ +{ + "name": "ftp-upload-tests", + "version": "1.0.0", + "description": "Azure Pipelines FTP Upload V1 Task Tests", + "main": "L0.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/Microsoft/azure-pipelines-tasks.git" + }, + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Microsoft/azure-pipelines-tasks/issues" + }, + "homepage": "https://github.com/Microsoft/azure-pipelines-tasks#readme", + "devDependencies": { + "@types/mocha": "^5.2.0" + } +} diff --git a/_generated/FtpUploadV1_Node20/ThirdPartyNotices.txt b/_generated/FtpUploadV1_Node20/ThirdPartyNotices.txt new file mode 100644 index 000000000000..ff44a8011b20 --- /dev/null +++ b/_generated/FtpUploadV1_Node20/ThirdPartyNotices.txt @@ -0,0 +1,18 @@ +---------------------------------------- START OF THIRD PARTY NOTICE ----------------------------------------- +This file is based on or incorporates material from the projects listed below (Third Party OSS). The original copyright notice and the license under which Microsoft received such Third Party OSS, are set forth below. Such licenses and notices are provided for informational purposes only. Microsoft licenses the Third Party OSS to you under the licensing terms for the Microsoft product or service. Microsoft reserves all other rights not expressly granted under this agreement, whether by implication, estoppel or otherwise. + +ftp + +Copyright Brian White. All rights reserved. + +Provided for Informational Purposes Only + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the Software), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------- END OF THIRD PARTY NOTICE -------------------------------------------- \ No newline at end of file diff --git a/_generated/FtpUploadV1_Node20/ftpuploadtask.ts b/_generated/FtpUploadV1_Node20/ftpuploadtask.ts new file mode 100644 index 000000000000..041bd9671d1c --- /dev/null +++ b/_generated/FtpUploadV1_Node20/ftpuploadtask.ts @@ -0,0 +1,164 @@ +import tl = require('azure-pipelines-task-lib/task'); +import url = require('url'); +import Q = require('q'); +import path = require('path'); + +let Client = require('ftp'); + +import ftputils = require('./ftputils'); + +export class FtpOptions { + // url + serverEndpointUrl: url.Url; + + // credentials + username: string; + password: string + + // other standard options + rootFolder: string; + filePatterns: string[]; + remotePath: string; + + // advanced options + clean: boolean; + cleanContents: boolean; + overwrite: boolean; + preservePaths: boolean; + trustSSL: boolean; +} + +function getFtpOptions(): FtpOptions { + let options: FtpOptions = new FtpOptions(); + + if (tl.getInput('credsType') === 'serviceEndpoint') { + // server endpoint + let serverEndpoint: string = tl.getInput('serverEndpoint', true); + options.serverEndpointUrl = url.parse(tl.getEndpointUrl(serverEndpoint, false)); + + let serverEndpointAuth: tl.EndpointAuthorization = tl.getEndpointAuthorization(serverEndpoint, false); + options.username = serverEndpointAuth['parameters']['username']; + options.password = serverEndpointAuth['parameters']['password']; + } else if (tl.getInput('credsType') === 'inputs') { + options.serverEndpointUrl = url.parse(tl.getInput('serverUrl', true)); + options.username = tl.getInput('username', true); + options.password = tl.getInput('password', true); + } + + // other standard options + options.rootFolder = tl.getPathInput('rootFolder', true); + options.filePatterns = tl.getDelimitedInput('filePatterns', '\n', true); + options.remotePath = tl.getInput('remotePath', true).trim(); + + // advanced options + options.clean = tl.getBoolInput('clean', true); + options.cleanContents = tl.getBoolInput('cleanContents', false); + options.overwrite = tl.getBoolInput('overwrite', true); + options.preservePaths = tl.getBoolInput('preservePaths', true); + options.trustSSL = tl.getBoolInput('trustSSL', true); + + return options; +} + +function doWork() { + tl.setResourcePath(path.join( __dirname, 'task.json')); + + let ftpOptions: FtpOptions = getFtpOptions(); + if (!ftpOptions.serverEndpointUrl.protocol) { + tl.setResult(tl.TaskResult.Failed, tl.loc('FTPNoProtocolSpecified')); + } + if (!ftpOptions.serverEndpointUrl.hostname) { + tl.setResult(tl.TaskResult.Failed, tl.loc('FTPNoHostSpecified')); + } + + let ftpClient: any = new Client(); + let ftpHelper: ftputils.FtpHelper = new ftputils.FtpHelper(ftpOptions, ftpClient); + + let files: string[] = ftputils.findFiles(ftpOptions); + tl.debug('number of files to upload: ' + files.length); + tl.debug('files to upload: ' + JSON.stringify(files)); + + let uploadSuccessful: boolean = false; + + ftpClient.on('greeting', (message: string) => { + tl.debug('ftp client greeting'); + console.log(tl.loc('FTPConnected', message)); + }); + + ftpClient.on('ready', async () => { + tl.debug('ftp client ready'); + try { + if (ftpOptions.clean) { + console.log(tl.loc('CleanRemoteDir', ftpOptions.remotePath)); + await ftpHelper.cleanRemote(ftpOptions.remotePath); + } else if (ftpOptions.cleanContents) { + console.log(tl.loc('CleanRemoteDirContents', ftpOptions.remotePath)); + await ftpHelper.cleanRemoteContents(ftpOptions.remotePath); + } + + console.log(tl.loc('UploadRemoteDir', ftpOptions.remotePath)); + await ftpHelper.uploadFiles(files); + uploadSuccessful = true; + console.log(tl.loc('UploadSucceedMsg', ftpHelper.progressTracking.getSuccessStatusMessage())); + + tl.setResult(tl.TaskResult.Succeeded, tl.loc('UploadSucceedRes')); + } catch (err) { + failTask(err); + } finally { + console.log(tl.loc('DisconnectHost', ftpOptions.serverEndpointUrl.host)); + ftpClient.end(); + ftpClient.destroy(); + } + }); + + ftpClient.on('close', (hadErr: boolean) => { + console.log(tl.loc('Disconnected')); + tl.debug('ftp client close, hadErr:' + hadErr); + }); + + ftpClient.on('end', () => { + tl.debug('ftp client end'); + }) + + ftpClient.on('error', (err) => { + tl.debug('ftp client error, err: ' + err); + if (!uploadSuccessful) { + // once all files are successfully uploaded, a subsequent error should not fail the task + failTask(err); + } + }) + + let verboseSnippet: string[] = []; + let debugLogger:any = function(message) { + verboseSnippet.push(message); + if (verboseSnippet.length >= 5) { + verboseSnippet.shift(); + } + tl.debug(message); + }; + function failTask(message: string): void { + let fullMessage: string = `FTP upload failed: "${message}". FTP log: "${verboseSnippet}".`; + if (ftpHelper.progressTracking) { + fullMessage += ftpHelper.progressTracking.getFailureStatusMessage(); + } + console.log(fullMessage); + tl.setResult(tl.TaskResult.Failed, message); + } + + let secure: boolean = ftpOptions.serverEndpointUrl.protocol.toLowerCase() == 'ftps:' ? true : false; + tl.debug('secure ftp=' + secure); + + let secureOptions: any = { 'rejectUnauthorized': !ftpOptions.trustSSL }; + + let hostName: string = ftpOptions.serverEndpointUrl.hostname; + let port: string = ftpOptions.serverEndpointUrl.port; + if (!port) { // port not explicitly specifed, use default + port = '21'; + tl.debug('port not specifided, using default: ' + port); + } + + console.log(tl.loc('ConnectPort', hostName, port)); + ftpClient.connect({ 'host': hostName, 'port': port, 'user': ftpOptions.username, 'password': ftpOptions.password, 'secure': secure, 'secureOptions': secureOptions, 'debug': debugLogger }); +} + +doWork(); \ No newline at end of file diff --git a/_generated/FtpUploadV1_Node20/ftputils.ts b/_generated/FtpUploadV1_Node20/ftputils.ts new file mode 100644 index 000000000000..70d724771c75 --- /dev/null +++ b/_generated/FtpUploadV1_Node20/ftputils.ts @@ -0,0 +1,318 @@ +import tl = require('azure-pipelines-task-lib/task'); +import Q = require('q'); +import path = require('path'); +import minimatch = require('minimatch'); + +import task = require('./ftpuploadtask'); +import FtpOptions = task.FtpOptions; + + +export class FtpHelper { + ftpOptions: FtpOptions = null; + ftpClient: any = null; + progressTracking: ProgressTracking = null; + + constructor(ftpOptions: FtpOptions, ftpClient: any) { + this.ftpOptions = ftpOptions; + this.ftpClient = ftpClient; + } + + createRemoteDirectory(remoteDirectory: string): Q.Promise { + let defer: Q.Deferred = Q.defer(); + + tl.debug('creating remote directory: ' + remoteDirectory); + + this.ftpClient.mkdir(remoteDirectory, true, function (err) { + if (err) { + defer.reject('Unable to create remote directory: ' + remoteDirectory + ' due to error: ' + err); + } else { + defer.resolve(null); + } + }); + + return defer.promise; + } + + uploadFile(file: string, remoteFile: string): Q.Promise { + let defer: Q.Deferred = Q.defer(); + + tl.debug('uploading file: ' + file + ' remote: ' + remoteFile); + + this.ftpClient.put(file, remoteFile, function (err) { + if (err) { + defer.reject('upload failed: ' + remoteFile + ' due to error: ' + err); + } else { + defer.resolve(null); + } + }); + + return defer.promise; + } + + remoteExists(remoteFile: string): Q.Promise { + let defer: Q.Deferred = Q.defer(); + + tl.debug('checking if remote exists: ' + remoteFile); + + let remoteDirname = path.normalize(path.dirname(remoteFile)); + let remoteBasename = path.basename(remoteFile); + + this.ftpClient.list(remoteDirname, function (err, list) { + if (err) { + //err.code == 550 is the standard not found error + //but just resolve false for all errors + defer.resolve(false); + } else { + for (let remote of list) { + if (remote.name == remoteBasename) { + defer.resolve(true); + return; + } + } + defer.resolve(false); + } + }); + + return defer.promise; + } + + rmdir(remotePath: string): Q.Promise { + let defer: Q.Deferred = Q.defer(); + + tl.debug('removing remote directory: ' + remotePath); + + this.ftpClient.rmdir(remotePath, true, function (err) { + if (err) { + defer.reject('Unable to remove remote folder: ' + remotePath + ' error: ' + err); + } else { + defer.resolve(null); + } + }); + + return defer.promise; + } + + remoteDelete(remotePath: string): Q.Promise { + let defer: Q.Deferred = Q.defer(); + + tl.debug('removing remote content: ' + remotePath); + + this.ftpClient.delete(remotePath, function (err) { + if (err) { + defer.reject('Unable to remove remote content: ' + remotePath + ' error: ' + err); + } else { + defer.resolve(null); + } + }); + + return defer.promise; + } + + async cleanRemote(remotePath: string) { + tl.debug('cleaning remote directory: ' + remotePath); + + if (await this.remoteExists(remotePath)) { + await this.rmdir(remotePath); + } + } + + async cleanRemoteContents(remotePath: string) { + tl.debug('cleaning remote directory contents: ' + remotePath); + + let that: any = this; + let defer: Q.Deferred = Q.defer(); + this.ftpClient.list(path.normalize(remotePath), async function (err, list) { + try { + if (!err) { + for (let remote of list) { + let item = path.join(remotePath, remote.name); + if (remote.type === 'd') { // directories + await that.rmdir(item); + } else { + await that.remoteDelete(item); + } + } + } + defer.resolve(null); + } catch(err) { + defer.reject('Error cleaning remote path: ' + err); + } + }); + return defer.promise; + } + + uploadFiles(files: string[]): Q.Promise { + let thisHelper = this; + thisHelper.progressTracking = new ProgressTracking(thisHelper.ftpOptions, files.length + 1); // add one extra for the root directory + tl.debug('uploading files'); + + let defer: Q.Deferred = Q.defer(); + + let outerPromises: Q.Promise[] = []; // these run first, and their then clauses add more promises to innerPromises + let innerPromises: Q.Promise[] = []; + outerPromises.push(this.createRemoteDirectory(thisHelper.ftpOptions.remotePath).then(() => { + thisHelper.progressTracking.directoryProcessed(thisHelper.ftpOptions.remotePath); + })); // ensure root remote location exists + + files.forEach((file) => { + tl.debug('file: ' + file); + let remoteFile: string = thisHelper.ftpOptions.preservePaths ? + path.join(thisHelper.ftpOptions.remotePath, file.substring(thisHelper.ftpOptions.rootFolder.length)) : + path.join(thisHelper.ftpOptions.remotePath, path.basename(file)); + + remoteFile = remoteFile.replace(/\\/gi, "/"); // use forward slashes always + tl.debug('remoteFile: ' + remoteFile); + + let stats = tl.stats(file); + if (stats.isDirectory()) { // create directories if necessary + outerPromises.push(thisHelper.createRemoteDirectory(remoteFile).then(() => { + thisHelper.progressTracking.directoryProcessed(remoteFile); + })); + } else if (stats.isFile()) { // upload files + if (thisHelper.ftpOptions.overwrite) { + outerPromises.push(thisHelper.uploadFile(file, remoteFile).then(() => { + thisHelper.progressTracking.fileUploaded(file, remoteFile); + })); + } else { + outerPromises.push(thisHelper.remoteExists(remoteFile).then((exists: boolean) => { + if (!exists) { + innerPromises.push(thisHelper.uploadFile(file, remoteFile).then(() => { + thisHelper.progressTracking.fileUploaded(file, remoteFile); + })); + } else { + thisHelper.progressTracking.fileSkipped(file, remoteFile); + } + })); + } + } + }); + + Q.all(outerPromises).then(() => { + Q.all(innerPromises).then(() => { + defer.resolve(null); + }).fail((err) => { + defer.reject(err); + }) + }).fail((err) => { + defer.reject(err); + }); + + return defer.promise; + } +} + +export class ProgressTracking { + ftpOptions: FtpOptions = null; + fileCount: number = -1; + + progressFilesUploaded: number = 0; + progressFilesSkipped: number = 0; // already exists and overwrite mode off + progressDirectoriesProcessed: number = 0; + + constructor(ftpOptions: FtpOptions, fileCount: number) { + this.ftpOptions = ftpOptions; + this.fileCount = fileCount; + } + + directoryProcessed(name: string): void { + this.progressDirectoriesProcessed++; + this.printProgress('remote directory successfully created/verified: ' + name); + } + + fileUploaded(file: string, remoteFile: string): void { + this.progressFilesUploaded++; + this.printProgress('successfully uploaded: ' + file + ' to: ' + remoteFile); + } + + fileSkipped(file: string, remoteFile: string): void { + this.progressFilesSkipped++; + this.printProgress('skipping file: ' + file + ' remote: ' + remoteFile + ' because it already exists'); + } + + printProgress(message: string): void { + let total: number = this.progressFilesUploaded + this.progressFilesSkipped + this.progressDirectoriesProcessed; + let remaining: number = this.fileCount - total; + console.log( + 'files uploaded: ' + this.progressFilesUploaded + + ', files skipped: ' + this.progressFilesSkipped + + ', directories processed: ' + this.progressDirectoriesProcessed + + ', total: ' + total + ', remaining: ' + remaining + + ', ' + message); + } + + getSuccessStatusMessage(): string { + return '\nhost: ' + this.ftpOptions.serverEndpointUrl.host + + '\npath: ' + this.ftpOptions.remotePath + + '\nfiles uploaded: ' + this.progressFilesUploaded + + '\nfiles skipped: ' + this.progressFilesSkipped + + '\ndirectories processed: ' + this.progressDirectoriesProcessed; + } + + getFailureStatusMessage() { + let total: number = this.progressFilesUploaded + this.progressFilesSkipped + this.progressDirectoriesProcessed; + let remaining: number = this.fileCount - total; + return this.getSuccessStatusMessage() + + '\nunprocessed files & directories: ' + remaining; + } +} + + + +export function findFiles(ftpOptions: FtpOptions): string[] { + tl.debug('Searching for files to upload'); + + let rootFolderStats = tl.stats(ftpOptions.rootFolder); + if (rootFolderStats.isFile()) { + let file = ftpOptions.rootFolder; + tl.debug(file + ' is a file. Ignoring all file patterns'); + return [file]; + } + + let allFiles = tl.find(ftpOptions.rootFolder); + + // filePatterns is a multiline input containing glob patterns + tl.debug('searching for files using: ' + ftpOptions.filePatterns.length + ' filePatterns: ' + ftpOptions.filePatterns); + + // minimatch options + let matchOptions = { matchBase: true, dot: true }; + let win = tl.osType().match(/^Win/); + tl.debug('win: ' + win); + if (win) { + matchOptions["nocase"] = true; + } + + tl.debug('Candidates found for match: ' + allFiles.length); + for (let i = 0; i < allFiles.length; i++) { + tl.debug('file: ' + allFiles[i]); + } + + // use a set to avoid duplicates + let matchingFilesSet: Set = new Set(); + + for (let i = 0; i < ftpOptions.filePatterns.length; i++) { + let normalizedPattern: string = path.join(ftpOptions.rootFolder, path.normalize(ftpOptions.filePatterns[i])); + + tl.debug('searching for files, pattern: ' + normalizedPattern); + + let matched = minimatch.match(allFiles, normalizedPattern, matchOptions); + tl.debug('Found total matches: ' + matched.length); + // ensure each result is only added once + for (let j = 0; j < matched.length; j++) { + let match = path.normalize(matched[j]); + let stats = tl.stats(match); + if (!ftpOptions.preservePaths && stats.isDirectory()) { + // if not preserving paths, skip all directories + } else if (matchingFilesSet.add(match)) { + tl.debug('adding ' + (stats.isFile() ? 'file: ' : 'folder: ') + match); + if (stats.isFile() && ftpOptions.preservePaths) { + // if preservePaths, make sure the parent directory is also included + let parent = path.normalize(path.dirname(match)); + if (matchingFilesSet.add(parent)) { + tl.debug('adding folder: ' + parent); + } + } + } + } + } + return Array.from(matchingFilesSet).sort(); +} \ No newline at end of file diff --git a/_generated/FtpUploadV1_Node20/icon.png b/_generated/FtpUploadV1_Node20/icon.png new file mode 100644 index 000000000000..490abba147c9 Binary files /dev/null and b/_generated/FtpUploadV1_Node20/icon.png differ diff --git a/_generated/FtpUploadV1_Node20/icon.svg b/_generated/FtpUploadV1_Node20/icon.svg new file mode 100644 index 000000000000..e5d5684a3791 --- /dev/null +++ b/_generated/FtpUploadV1_Node20/icon.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/_generated/FtpUploadV1_Node20/package-lock.json b/_generated/FtpUploadV1_Node20/package-lock.json new file mode 100644 index 000000000000..010dc8da12d9 --- /dev/null +++ b/_generated/FtpUploadV1_Node20/package-lock.json @@ -0,0 +1,535 @@ +{ + "name": "FTP", + "version": "1.0.1", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/concat-stream": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz", + "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==", + "requires": { + "@types/node": "*" + } + }, + "@types/form-data": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", + "integrity": "sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==", + "requires": { + "@types/node": "*" + } + }, + "@types/mocha": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.1.1.tgz", + "integrity": "sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==" + }, + "@types/node": { + "version": "20.7.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.7.0.tgz", + "integrity": "sha512-zI22/pJW2wUZOVyguFaUL1HABdmSVxpXrzIqkjsHmyUjNhPoWM1CKfvVuXfetHhIok4RY573cqS0mZ1SJEnoTg==" + }, + "@types/q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.1.tgz", + "integrity": "sha512-eqz8c/0kwNi/OEHQfvIuJVLTst3in0e7uTKeuY+WL/zfKn0xVujOTp42bS/vUUokhK5P2BppLd9JXMOMHcgbjA==" + }, + "@types/qs": { + "version": "6.9.8", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.8.tgz", + "integrity": "sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg==" + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "azure-pipelines-task-lib": { + "version": "5.0.0-preview.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-5.0.0-preview.0.tgz", + "integrity": "sha512-uQJEv+q3/7RD7kgphFd33uXijaPwA1ePYoNkAgZpUhbZUtc2u4JL4ujTT/JJfgXBNW/QQNAiDQ2OC7vOQG/0tg==", + "requires": { + "minimatch": "3.0.5", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "sync-request": "6.1.0", + "uuid": "^3.0.1" + }, + "dependencies": { + "minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "brace-expansion": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", + "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "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" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, + "form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "ftp": { + "version": "0.3.10", + "resolved": "https://registry.npmjs.org/ftp/-/ftp-0.3.10.tgz", + "integrity": "sha512-faFVML1aBx2UoDStmLwv2Wptt4vw5x03xxX172nhA5Y5HBshW5JweqQ2W4xL4dezQTG8inJsuYcpPHHU3X5OTQ==", + "requires": { + "readable-stream": "1.1.x", + "xregexp": "2.0.0" + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + } + }, + "get-port": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", + "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==" + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "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" + }, + "dependencies": { + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==" + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "http-basic": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", + "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", + "requires": { + "caseless": "^0.12.0", + "concat-stream": "^1.6.2", + "http-response-object": "^3.0.1", + "parse-cache-control": "^1.0.1" + } + }, + "http-response-object": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", + "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", + "requires": { + "@types/node": "^10.0.3" + }, + "dependencies": { + "@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + } + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" + }, + "is-core-module": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "requires": { + "has": "^1.0.3" + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, + "parse-cache-control": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", + "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "promise": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", + "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", + "requires": { + "asap": "~2.0.6" + } + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==" + }, + "qs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "requires": { + "resolve": "^1.1.6" + } + }, + "resolve": { + "version": "1.22.6", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.6.tgz", + "integrity": "sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==", + "requires": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" + }, + "shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, + "sync-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", + "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==", + "requires": { + "http-response-object": "^3.0.1", + "sync-rpc": "^1.2.1", + "then-request": "^6.0.0" + } + }, + "sync-rpc": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz", + "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==", + "requires": { + "get-port": "^3.1.0" + } + }, + "then-request": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", + "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", + "requires": { + "@types/concat-stream": "^1.6.0", + "@types/form-data": "0.0.33", + "@types/node": "^8.0.0", + "@types/qs": "^6.2.31", + "caseless": "~0.12.0", + "concat-stream": "^1.6.0", + "form-data": "^2.2.0", + "http-basic": "^8.1.1", + "http-response-object": "^3.0.1", + "promise": "^8.0.0", + "qs": "^6.4.0" + }, + "dependencies": { + "@types/node": { + "version": "8.10.66", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", + "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==" + } + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, + "typescript": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "xregexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-2.0.0.tgz", + "integrity": "sha512-xl/50/Cf32VsGq/1R8jJE5ajH1yMCQkpmoS10QbFZWl2Oor4H0Me64Pu2yxvsRWK3m6soJbmGfzSR7BYmDcWAA==" + } + } +} diff --git a/_generated/FtpUploadV1_Node20/package.json b/_generated/FtpUploadV1_Node20/package.json new file mode 100644 index 000000000000..4ed7e50cd20e --- /dev/null +++ b/_generated/FtpUploadV1_Node20/package.json @@ -0,0 +1,27 @@ +{ + "name": "FTP", + "version": "1.0.1", + "description": "FTP Upload Task", + "main": "ftpuploadtask.js", + "repository": { + "type": "git", + "url": "git+https://github.com/Microsoft/azure-pipelines-tasks.git" + }, + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Microsoft/azure-pipelines-tasks/issues" + }, + "homepage": "https://github.com/Microsoft/azure-pipelines-tasks#readme", + "dependencies": { + "@types/node": "^20.3.1", + "@types/mocha": "^9.1.1", + "@types/q": "^1.0.7", + "azure-pipelines-task-lib": "^5.0.0-preview.0", + "ftp": "0.3.10", + "minimatch": "^3.0.4" + }, + "devDependencies": { + "typescript": "5.1.6" + } +} diff --git a/_generated/FtpUploadV1_Node20/task.json b/_generated/FtpUploadV1_Node20/task.json new file mode 100644 index 000000000000..9b8ef9181c63 --- /dev/null +++ b/_generated/FtpUploadV1_Node20/task.json @@ -0,0 +1,203 @@ +{ + "id": "6f8c69a5-b023-428e-a125-fccf4efcb929", + "name": "FtpUpload", + "friendlyName": "FTP upload", + "description": "Upload files using FTP", + "author": "Microsoft Corporation", + "helpUrl": "https://docs.microsoft.com/azure/devops/pipelines/tasks/utility/ftp-upload", + "helpMarkDown": "Upload files to a remote machine using the File Transfer Protocol (FTP), or securely with FTPS. [More Information](http://go.microsoft.com/fwlink/?LinkId=809084).", + "category": "Utility", + "visibility": [ + "Build", + "Release" + ], + "runsOn": [ + "Agent", + "DeploymentGroup" + ], + "demands": [], + "version": { + "Major": 1, + "Minor": 229, + "Patch": 1 + }, + "minimumAgentVersion": "2.182.1", + "instanceNameFormat": "FTP Upload: $(rootFolder)", + "groups": [ + { + "name": "advanced", + "displayName": "Advanced", + "isExpanded": true + } + ], + "inputs": [ + { + "name": "credsType", + "aliases": [ + "credentialsOption" + ], + "type": "pickList", + "label": "Authentication Method", + "defaultValue": "serviceEndpoint", + "required": true, + "helpMarkDown": "Use FTP service connection or enter connection credentials.", + "options": { + "serviceEndpoint": "FTP service connection", + "inputs": "Enter credentials" + } + }, + { + "name": "serverEndpoint", + "type": "connectedService:Generic", + "label": "FTP Service Connection", + "defaultValue": "", + "required": true, + "helpMarkDown": "Select the service connection for your FTP server. To create one, click the Manage link and create a new Generic service connection, enter the FTP server URL for the server URL, e.g. `ftp://server.example.com`, and required credentials.

Secure connections will always be made regardless of the specified protocol (`ftp://` or `ftps://`) if the target server supports FTPS. To allow only secure connections, use the `ftps://` protocol, e.g. `ftps://server.example.com`. Connections to servers not supporting FTPS will fail if `ftps://` is specified.", + "visibleRule": "credsType = serviceEndpoint" + }, + { + "name": "serverUrl", + "type": "string", + "label": "Server URL", + "defaultValue": "", + "required": true, + "visibleRule": "credsType = inputs" + }, + { + "name": "username", + "type": "string", + "label": "Username", + "defaultValue": "", + "required": true, + "visibleRule": "credsType = inputs" + }, + { + "name": "password", + "type": "string", + "label": "Password", + "defaultValue": "", + "required": true, + "visibleRule": "credsType = inputs" + }, + { + "name": "rootFolder", + "aliases": [ + "rootDirectory" + ], + "type": "filePath", + "label": "Root folder", + "defaultValue": "", + "required": true, + "helpMarkDown": "The source folder to upload files from." + }, + { + "name": "filePatterns", + "type": "multiLine", + "label": "File patterns", + "defaultValue": "**", + "required": true, + "helpMarkDown": "File paths or patterns of the files to upload. Supports multiple lines of minimatch patterns. [More Information](https://go.microsoft.com/fwlink/?LinkId=800269)", + "properties": { + "resizable": "true", + "rows": "4" + } + }, + { + "name": "remotePath", + "aliases": [ + "remoteDirectory" + ], + "type": "string", + "label": "Remote directory", + "defaultValue": "/upload/$(Build.BuildId)/", + "required": true, + "helpMarkDown": "Upload files to this directory on the remote FTP server." + }, + { + "name": "clean", + "type": "boolean", + "label": "Delete remote directory", + "defaultValue": "false", + "required": true, + "helpMarkDown": "Delete the remote directory including its contents before uploading.", + "groupName": "advanced" + }, + { + "name": "cleanContents", + "type": "boolean", + "label": "Clear remote directory contents", + "defaultValue": "false", + "required": true, + "helpMarkDown": "Recursively delete all contents of the remote directory before uploading. The existing directory will not be deleted. For better performance, consider using `Delete remote directory` instead.", + "groupName": "advanced", + "visibleRule": "clean = false" + }, + { + "name": "overwrite", + "type": "boolean", + "label": "Overwrite", + "defaultValue": "true", + "required": true, + "helpMarkDown": "Overwrite existing files in the remote directory.", + "groupName": "advanced" + }, + { + "name": "preservePaths", + "type": "boolean", + "label": "Preserve file paths", + "defaultValue": "false", + "required": true, + "helpMarkDown": "If selected, the relative local directory structure is recreated under the remote directory where files are uploaded. Otherwise, files are uploaded directly to the remote directory without creating additional subdirectories.

For example, suppose your source folder is: `/home/user/source/` and contains the file: `foo/bar/foobar.txt`, and your remote directory is: `/uploads/`.
If selected, the file is uploaded to: `/uploads/foo/bar/foobar.txt`. Otherwise, to: `/uploads/foobar.txt`.", + "groupName": "advanced" + }, + { + "name": "trustSSL", + "type": "boolean", + "label": "Trust server certificate", + "defaultValue": "false", + "required": true, + "helpMarkDown": "Selecting this option results in the FTP server's SSL certificate being trusted with ftps://, even if it is self-signed or cannot be validated by a Certificate Authority (CA).", + "groupName": "advanced" + } + ], + "execution": { + "Node10": { + "target": "ftpuploadtask.js", + "argumentFormat": "" + }, + "Node16": { + "target": "ftpuploadtask.js", + "argumentFormat": "" + }, + "Node20": { + "target": "ftpuploadtask.js", + "argumentFormat": "" + } + }, + "restrictions": { + "commands": { + "mode": "restricted" + }, + "settableVariables": { + "allowed": [] + } + }, + "messages": { + "CleanRemoteDir": "removing remote directory: %s", + "CleanRemoteDirContents": "removing remote directory contents: %s", + "CleanFileDeleteFail": "an error occurred while trying to remove file: %s", + "ConnectPort": "connecting to: %s:%s", + "Disconnected": "disconnected", + "DisconnectHost": "disconnecting from: %s", + "FTPConnected": "connected: %s", + "FTPNoHostSpecified": "The FTP server URL must include a host name", + "FTPNoProtocolSpecified": "The FTP server URL must begin with ftp:// or ftps://", + "UploadRemoteDir": "uploading files to remote directory: %s", + "UploadSucceedMsg": "FTP upload successful %s", + "UploadSucceedRes": "FTP upload successful" + }, + "_buildConfigMapping": { + "Default": "1.229.0", + "Node20-225": "1.229.1" + } +} \ No newline at end of file diff --git a/_generated/FtpUploadV1_Node20/task.loc.json b/_generated/FtpUploadV1_Node20/task.loc.json new file mode 100644 index 000000000000..51108747948f --- /dev/null +++ b/_generated/FtpUploadV1_Node20/task.loc.json @@ -0,0 +1,203 @@ +{ + "id": "6f8c69a5-b023-428e-a125-fccf4efcb929", + "name": "FtpUpload", + "friendlyName": "ms-resource:loc.friendlyName", + "description": "ms-resource:loc.description", + "author": "Microsoft Corporation", + "helpUrl": "https://docs.microsoft.com/azure/devops/pipelines/tasks/utility/ftp-upload", + "helpMarkDown": "ms-resource:loc.helpMarkDown", + "category": "Utility", + "visibility": [ + "Build", + "Release" + ], + "runsOn": [ + "Agent", + "DeploymentGroup" + ], + "demands": [], + "version": { + "Major": 1, + "Minor": 229, + "Patch": 1 + }, + "minimumAgentVersion": "2.182.1", + "instanceNameFormat": "ms-resource:loc.instanceNameFormat", + "groups": [ + { + "name": "advanced", + "displayName": "ms-resource:loc.group.displayName.advanced", + "isExpanded": true + } + ], + "inputs": [ + { + "name": "credsType", + "aliases": [ + "credentialsOption" + ], + "type": "pickList", + "label": "ms-resource:loc.input.label.credsType", + "defaultValue": "serviceEndpoint", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.credsType", + "options": { + "serviceEndpoint": "FTP service connection", + "inputs": "Enter credentials" + } + }, + { + "name": "serverEndpoint", + "type": "connectedService:Generic", + "label": "ms-resource:loc.input.label.serverEndpoint", + "defaultValue": "", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.serverEndpoint", + "visibleRule": "credsType = serviceEndpoint" + }, + { + "name": "serverUrl", + "type": "string", + "label": "ms-resource:loc.input.label.serverUrl", + "defaultValue": "", + "required": true, + "visibleRule": "credsType = inputs" + }, + { + "name": "username", + "type": "string", + "label": "ms-resource:loc.input.label.username", + "defaultValue": "", + "required": true, + "visibleRule": "credsType = inputs" + }, + { + "name": "password", + "type": "string", + "label": "ms-resource:loc.input.label.password", + "defaultValue": "", + "required": true, + "visibleRule": "credsType = inputs" + }, + { + "name": "rootFolder", + "aliases": [ + "rootDirectory" + ], + "type": "filePath", + "label": "ms-resource:loc.input.label.rootFolder", + "defaultValue": "", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.rootFolder" + }, + { + "name": "filePatterns", + "type": "multiLine", + "label": "ms-resource:loc.input.label.filePatterns", + "defaultValue": "**", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.filePatterns", + "properties": { + "resizable": "true", + "rows": "4" + } + }, + { + "name": "remotePath", + "aliases": [ + "remoteDirectory" + ], + "type": "string", + "label": "ms-resource:loc.input.label.remotePath", + "defaultValue": "/upload/$(Build.BuildId)/", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.remotePath" + }, + { + "name": "clean", + "type": "boolean", + "label": "ms-resource:loc.input.label.clean", + "defaultValue": "false", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.clean", + "groupName": "advanced" + }, + { + "name": "cleanContents", + "type": "boolean", + "label": "ms-resource:loc.input.label.cleanContents", + "defaultValue": "false", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.cleanContents", + "groupName": "advanced", + "visibleRule": "clean = false" + }, + { + "name": "overwrite", + "type": "boolean", + "label": "ms-resource:loc.input.label.overwrite", + "defaultValue": "true", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.overwrite", + "groupName": "advanced" + }, + { + "name": "preservePaths", + "type": "boolean", + "label": "ms-resource:loc.input.label.preservePaths", + "defaultValue": "false", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.preservePaths", + "groupName": "advanced" + }, + { + "name": "trustSSL", + "type": "boolean", + "label": "ms-resource:loc.input.label.trustSSL", + "defaultValue": "false", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.trustSSL", + "groupName": "advanced" + } + ], + "execution": { + "Node10": { + "target": "ftpuploadtask.js", + "argumentFormat": "" + }, + "Node16": { + "target": "ftpuploadtask.js", + "argumentFormat": "" + }, + "Node20": { + "target": "ftpuploadtask.js", + "argumentFormat": "" + } + }, + "restrictions": { + "commands": { + "mode": "restricted" + }, + "settableVariables": { + "allowed": [] + } + }, + "messages": { + "CleanRemoteDir": "ms-resource:loc.messages.CleanRemoteDir", + "CleanRemoteDirContents": "ms-resource:loc.messages.CleanRemoteDirContents", + "CleanFileDeleteFail": "ms-resource:loc.messages.CleanFileDeleteFail", + "ConnectPort": "ms-resource:loc.messages.ConnectPort", + "Disconnected": "ms-resource:loc.messages.Disconnected", + "DisconnectHost": "ms-resource:loc.messages.DisconnectHost", + "FTPConnected": "ms-resource:loc.messages.FTPConnected", + "FTPNoHostSpecified": "ms-resource:loc.messages.FTPNoHostSpecified", + "FTPNoProtocolSpecified": "ms-resource:loc.messages.FTPNoProtocolSpecified", + "UploadRemoteDir": "ms-resource:loc.messages.UploadRemoteDir", + "UploadSucceedMsg": "ms-resource:loc.messages.UploadSucceedMsg", + "UploadSucceedRes": "ms-resource:loc.messages.UploadSucceedRes" + }, + "_buildConfigMapping": { + "Default": "1.229.0", + "Node20-225": "1.229.1" + } +} \ No newline at end of file diff --git a/_generated/FtpUploadV1_Node20/tsconfig.json b/_generated/FtpUploadV1_Node20/tsconfig.json new file mode 100644 index 000000000000..0438b79f69ac --- /dev/null +++ b/_generated/FtpUploadV1_Node20/tsconfig.json @@ -0,0 +1,6 @@ +{ + "compilerOptions": { + "target": "ES6", + "module": "commonjs" + } +} \ No newline at end of file diff --git a/_generated/GruntV0.versionmap.txt b/_generated/GruntV0.versionmap.txt new file mode 100644 index 000000000000..378f4c63ee24 --- /dev/null +++ b/_generated/GruntV0.versionmap.txt @@ -0,0 +1,2 @@ +Default|0.229.0 +Node20-225|0.229.1 diff --git a/_generated/GruntV0/Strings/resources.resjson/de-DE/resources.resjson b/_generated/GruntV0/Strings/resources.resjson/de-DE/resources.resjson new file mode 100644 index 000000000000..b48a7375bc13 --- /dev/null +++ b/_generated/GruntV0/Strings/resources.resjson/de-DE/resources.resjson @@ -0,0 +1,38 @@ +{ + "loc.friendlyName": "Grunt", + "loc.helpMarkDown": "[Weitere Informationen zu dieser Aufgabe](https://go.microsoft.com/fwlink/?LinkID=627413) oder [Grunt-Dokumentation anzeigen](https://gruntjs.com/getting-started)", + "loc.description": "Grunt-JavaScript-Aufgabenausführung ausführen", + "loc.instanceNameFormat": "grunt $(targets)", + "loc.group.displayName.advanced": "Erweitert", + "loc.group.displayName.junitTestResults": "JUnit-Testergebnisse", + "loc.group.displayName.codeCoverage": "Code Coverage", + "loc.input.label.gruntFile": "Grunt-Dateipfad", + "loc.input.help.gruntFile": "Der relative Pfad vom Repositorystamm der auszuführenden Grunt-Skriptdatei.", + "loc.input.label.targets": "Grunt-Aufgabe(n)", + "loc.input.help.targets": "Optional. Mit Leerzeichen getrennte Liste der auszuführenden Aufgaben. Wenn nicht angegeben, wird die Standardaufgabe ausgeführt.", + "loc.input.label.arguments": "Argumente", + "loc.input.help.arguments": "Zusätzliche Argumente, die an Grunt übergeben werden. \"-gruntfile\" wurde bereits über die gruntFile-Eingabe weiter oben hinzugefügt und ist daher nicht erforderlich.", + "loc.input.label.cwd": "Arbeitsverzeichnis", + "loc.input.help.cwd": "Aktuelles Arbeitsverzeichnis bei Skriptausführung. Standardmäßig der Ordner, in dem das Skript gespeichert ist.", + "loc.input.label.gruntCli": "Speicherort der Grunt-CLI", + "loc.input.help.gruntCli": "Die auszuführende Grunt-CLI, wenn der Agent keine globale Installation der Grunt-CLI findet. Standardmäßig wird die Grunt-CLI im Ordner \"node_modules\" des Arbeitsverzeichnisses verwendet.", + "loc.input.label.publishJUnitResults": "In Azure Pipelines veröffentlichen", + "loc.input.help.publishJUnitResults": "Wählen Sie diese Option aus, um vom Grunt-Bild generierte JUnit-Testergebnisse in Azure Pipelines zu veröffentlichen.", + "loc.input.label.testResultsFiles": "Testergebnisdateien", + "loc.input.help.testResultsFiles": "Der Pfad der Testergebnisdateien. Platzhalter können verwendet werden. Beispiel: \"**/TEST-*.xml\" für alle XML-Dateien, deren Name mit \"TEST-\" beginnt.", + "loc.input.label.testRunTitle": "Testlauftitel", + "loc.input.help.testRunTitle": "Geben Sie einen Namen für den Testlauf an.", + "loc.input.label.enableCodeCoverage": "Code Coverage aktivieren", + "loc.input.help.enableCodeCoverage": "Wählen Sie diese Option aus, um Code Coverage mithilfe von Istanbul zu aktivieren.", + "loc.input.label.testFramework": "Testframework", + "loc.input.help.testFramework": "Wählen Sie das Testframework aus.", + "loc.input.label.srcFiles": "Quelldateien", + "loc.input.help.srcFiles": "Geben Sie den Pfad zu Ihren Quelldateien an, für die hookRequire() gelten soll.", + "loc.input.label.testFiles": "Testskriptdateien", + "loc.input.help.testFiles": "Geben Sie den Pfad zu Ihren Testskriptdateien an.", + "loc.messages.GruntCliNotInstalled": "Die Grunt-CLI ist nicht global installiert (oder befindet sich nicht im Pfad des Benutzers, als der der Agent ausgeführt wird) und befindet sich nicht im lokalen Arbeitsordner: %s", + "loc.messages.GruntReturnCode": "Grunt wurde mit dem folgenden Rückgabecode beendet: %d", + "loc.messages.GruntFailed": "Grunt-Fehler: %s", + "loc.messages.NpmFailed": "Npm-Fehler: %s", + "loc.messages.IstanbulFailed": "Istanbul-Fehler: %s" +} \ No newline at end of file diff --git a/_generated/GruntV0/Strings/resources.resjson/en-US/resources.resjson b/_generated/GruntV0/Strings/resources.resjson/en-US/resources.resjson new file mode 100644 index 000000000000..a4d1762ad542 --- /dev/null +++ b/_generated/GruntV0/Strings/resources.resjson/en-US/resources.resjson @@ -0,0 +1,38 @@ +{ + "loc.friendlyName": "Grunt", + "loc.helpMarkDown": "[Learn more about this task](https://go.microsoft.com/fwlink/?LinkID=627413) or [see the Grunt documentation](https://gruntjs.com/getting-started)", + "loc.description": "Run the Grunt JavaScript task runner", + "loc.instanceNameFormat": "grunt $(targets)", + "loc.group.displayName.advanced": "Advanced", + "loc.group.displayName.junitTestResults": "JUnit Test Results", + "loc.group.displayName.codeCoverage": "Code Coverage", + "loc.input.label.gruntFile": "Grunt File Path", + "loc.input.help.gruntFile": "Relative path from repo root of the grunt file script file to run.", + "loc.input.label.targets": "Grunt Task(s)", + "loc.input.help.targets": "Optional. Space delimited list of tasks to run. If not specified, the default task will run.", + "loc.input.label.arguments": "Arguments", + "loc.input.help.arguments": "Additional arguments passed to grunt. --gruntfile is not needed since already added via gruntFile input above.", + "loc.input.label.cwd": "Working Directory", + "loc.input.help.cwd": "Current working directory when script is run. Defaults to the folder where the script is located.", + "loc.input.label.gruntCli": "grunt-cli location", + "loc.input.help.gruntCli": "grunt-cli to run when agent can't find global installed grunt-cli Defaults to the grunt-cli under node_modules folder of the working directory.", + "loc.input.label.publishJUnitResults": "Publish to Azure Pipelines", + "loc.input.help.publishJUnitResults": "Select this option to publish JUnit test results produced by the Grunt build to Azure Pipelines.", + "loc.input.label.testResultsFiles": "Test Results Files", + "loc.input.help.testResultsFiles": "Test results files path. Wildcards can be used. For example, `**/TEST-*.xml` for all XML files whose name starts with TEST-.", + "loc.input.label.testRunTitle": "Test Run Title", + "loc.input.help.testRunTitle": "Provide a name for the test run.", + "loc.input.label.enableCodeCoverage": "Enable Code Coverage", + "loc.input.help.enableCodeCoverage": "Select this option to enable Code Coverage using Istanbul.", + "loc.input.label.testFramework": "Test Framework", + "loc.input.help.testFramework": "Select your test framework.", + "loc.input.label.srcFiles": "Source Files", + "loc.input.help.srcFiles": "Provide the path to your source files which you want to hookRequire()", + "loc.input.label.testFiles": "Test Script Files", + "loc.input.help.testFiles": "Provide the path to your test script files", + "loc.messages.GruntCliNotInstalled": "Grunt-cli is not installed globally (or is not in the path of the user the agent is running as) and it is not in the local working folder: %s", + "loc.messages.GruntReturnCode": "Grunt exited with return code: %d", + "loc.messages.GruntFailed": "Grunt failed with error: %s", + "loc.messages.NpmFailed": "Npm failed with error: %s", + "loc.messages.IstanbulFailed": "Istanbul failed with error: %s" +} \ No newline at end of file diff --git a/_generated/GruntV0/Strings/resources.resjson/es-ES/resources.resjson b/_generated/GruntV0/Strings/resources.resjson/es-ES/resources.resjson new file mode 100644 index 000000000000..1ade6d0a0fe4 --- /dev/null +++ b/_generated/GruntV0/Strings/resources.resjson/es-ES/resources.resjson @@ -0,0 +1,38 @@ +{ + "loc.friendlyName": "Grunt", + "loc.helpMarkDown": "[Obtener más información acerca de esta tarea](https://go.microsoft.com/fwlink/?LinkID=627413) o [consultar la documentación de Grunt](https://gruntjs.com/getting-started)", + "loc.description": "Inicia el ejecutor Grunt de tareas de JavaScript.", + "loc.instanceNameFormat": "$(targets) de Grunt", + "loc.group.displayName.advanced": "Avanzado", + "loc.group.displayName.junitTestResults": "Resultados de pruebas JUnit", + "loc.group.displayName.codeCoverage": "Cobertura de código", + "loc.input.label.gruntFile": "Ruta de acceso del archivo de Grunt", + "loc.input.help.gruntFile": "Ruta de acceso relativa de la raíz del repositorio del archivo de script Grunt que se va a ejecutar.", + "loc.input.label.targets": "Tarea o tareas de Grunt", + "loc.input.help.targets": "Opcional. Lista de tareas para ejecutar delimitada por espacios. Si no se especifica, se ejecutará la tarea predeterminada.", + "loc.input.label.arguments": "Argumentos", + "loc.input.help.arguments": "Se pasaron argumentos adicionales a Grunt. --gruntfile no es necesario puesto que ya se agregó a través de la entrada gruntFile anterior.", + "loc.input.label.cwd": "Directorio de trabajo", + "loc.input.help.cwd": "Directorio de trabajo actual cuando el script se ejecuta. Se establece de forma predeterminada en la carpeta en la que se encuentra el script.", + "loc.input.label.gruntCli": "ubicación de grunt-cli", + "loc.input.help.gruntCli": "grunt-cli que se ejecuta cuando el agente no encuentra el grunt-cli instalado a nivel global. El elemento grunt-cli de la carpeta node_modules del directorio de trabajo es la opción predeterminada.", + "loc.input.label.publishJUnitResults": "Publicar en Azure Pipelines", + "loc.input.help.publishJUnitResults": "Seleccione esta opción para publicar los resultados de pruebas JUnit generados por la compilación de Grunt en Azure Pipelines.", + "loc.input.label.testResultsFiles": "Archivos de resultados de pruebas", + "loc.input.help.testResultsFiles": "Ruta de acceso a los archivos de resultados de pruebas. Se pueden usar caracteres comodín. Por ejemplo, \"**/TEST-*.xml\" para todos los archivos XML cuyos nombres empiecen por TEST-.", + "loc.input.label.testRunTitle": "Título de la serie de pruebas", + "loc.input.help.testRunTitle": "Asigne un nombre a la serie de pruebas.", + "loc.input.label.enableCodeCoverage": "Habilitar Cobertura de código", + "loc.input.help.enableCodeCoverage": "Seleccione esta opción para habilitar Cobertura de código con Istanbul.", + "loc.input.label.testFramework": "Marco de pruebas", + "loc.input.help.testFramework": "Seleccione su marco de pruebas.", + "loc.input.label.srcFiles": "Archivos de origen", + "loc.input.help.srcFiles": "Proporcione la ruta de acceso a los archivos de origen que quiera para hookRequire().", + "loc.input.label.testFiles": "Archivos de script de prueba", + "loc.input.help.testFiles": "Proporcione la ruta de acceso a sus archivos de script de prueba.", + "loc.messages.GruntCliNotInstalled": "Grunt-cli no está instalado a nivel global (o no está en la ruta del usuario con el que se ejecuta el agente) y no está en la carpeta de trabajo local: %s", + "loc.messages.GruntReturnCode": "Grunt se cerró con el código de retorno: %d", + "loc.messages.GruntFailed": "Error de Grunt: %s", + "loc.messages.NpmFailed": "Error de Npm: %s", + "loc.messages.IstanbulFailed": "Error de Istanbul: %s" +} \ No newline at end of file diff --git a/_generated/GruntV0/Strings/resources.resjson/fr-FR/resources.resjson b/_generated/GruntV0/Strings/resources.resjson/fr-FR/resources.resjson new file mode 100644 index 000000000000..8e03a6749118 --- /dev/null +++ b/_generated/GruntV0/Strings/resources.resjson/fr-FR/resources.resjson @@ -0,0 +1,38 @@ +{ + "loc.friendlyName": "Grunt", + "loc.helpMarkDown": "[En savoir plus sur cette tâche](https://go.microsoft.com/fwlink/?LinkID=627413) ou [consulter la documentation de Grunt](https://gruntjs.com/getting-started)", + "loc.description": "Lancer l'exécuteur de tâches JavaScript Grunt", + "loc.instanceNameFormat": "grunt $(targets)", + "loc.group.displayName.advanced": "Avancé", + "loc.group.displayName.junitTestResults": "Résultats du test JUnit", + "loc.group.displayName.codeCoverage": "Couverture du code", + "loc.input.label.gruntFile": "Chemin d'accès du fichier grunt", + "loc.input.help.gruntFile": "Chemin relatif de la racine de dépôt du fichier script du fichier grunt à exécuter.", + "loc.input.label.targets": "Tâche(s) grunt", + "loc.input.help.targets": "Facultatif. Liste des tâches à exécuter délimitées par des espaces. Si elle n'est pas spécifiée, la tâche par défaut est exécutée.", + "loc.input.label.arguments": "Arguments", + "loc.input.help.arguments": "Arguments supplémentaires passés à grunt. --gruntfile n'est pas nécessaire, car il est déjà ajouté via l'entrée gruntFile ci-dessus.", + "loc.input.label.cwd": "Répertoire de travail", + "loc.input.help.cwd": "Répertoire de travail actuel quand le script est exécuté. Il s'agit généralement du dossier dans lequel se trouve le script.", + "loc.input.label.gruntCli": "Emplacement de grunt-cli", + "loc.input.help.gruntCli": "grunt-cli à exécuter quand l'agent ne trouve pas de grunt-cli global installé. Correspond par défaut à grunt-cli sous le dossier node_modules du répertoire de travail.", + "loc.input.label.publishJUnitResults": "Publier sur Azure Pipelines", + "loc.input.help.publishJUnitResults": "Sélectionnez cette option pour publier les résultats des tests JUnit produits par la build Grunt sur Azure Pipelines.", + "loc.input.label.testResultsFiles": "Fichiers des résultats des tests", + "loc.input.help.testResultsFiles": "Chemin des fichiers de résultats des tests. Les caractères génériques sont autorisés. Par exemple, '**/TEST-*.xml' correspond à tous les fichiers XML dont le nom commence par TEST-.", + "loc.input.label.testRunTitle": "Titre de l'exécution du test", + "loc.input.help.testRunTitle": "Indiquez le nom de la série de tests.", + "loc.input.label.enableCodeCoverage": "Activer la couverture du code", + "loc.input.help.enableCodeCoverage": "Sélectionnez cette option pour activer la couverture du code à l'aide d'Istanbul.", + "loc.input.label.testFramework": "Framework de tests", + "loc.input.help.testFramework": "Sélectionnez votre framework de tests.", + "loc.input.label.srcFiles": "Fichiers sources", + "loc.input.help.srcFiles": "Indiquez le chemin des fichiers sources auxquels vous voulez appliquer hookRequire()", + "loc.input.label.testFiles": "Fichiers de script de test", + "loc.input.help.testFiles": "Indiquez le chemin de vos fichiers de script de test", + "loc.messages.GruntCliNotInstalled": "Grunt-cli n'est pas installé de manière globale, ou ne se trouve pas dans le chemin de l'utilisateur via lequel l'agent s'exécute. De plus, il ne se trouve pas dans le dossier de travail local : %s", + "loc.messages.GruntReturnCode": "Sortie de Grunt. Code de retour : %d", + "loc.messages.GruntFailed": "Échec de Grunt. Erreur : %s", + "loc.messages.NpmFailed": "Échec de Npm. Erreur : %s", + "loc.messages.IstanbulFailed": "Échec d'Istanbul avec l'erreur : %s" +} \ No newline at end of file diff --git a/_generated/GruntV0/Strings/resources.resjson/it-IT/resources.resjson b/_generated/GruntV0/Strings/resources.resjson/it-IT/resources.resjson new file mode 100644 index 000000000000..1bcba294fc5e --- /dev/null +++ b/_generated/GruntV0/Strings/resources.resjson/it-IT/resources.resjson @@ -0,0 +1,38 @@ +{ + "loc.friendlyName": "Grunt", + "loc.helpMarkDown": "[Altre informazioni su questa attività](https://go.microsoft.com/fwlink/?LinkID=627413). In alternativa [vedere la documentazione di Grunt](https://gruntjs.com/getting-started)", + "loc.description": "Esegue lo strumento di esecuzione attività JavaScript di Grunt", + "loc.instanceNameFormat": "grunt $(targets)", + "loc.group.displayName.advanced": "Avanzate", + "loc.group.displayName.junitTestResults": "Risultati del test JUnit", + "loc.group.displayName.codeCoverage": "Code coverage", + "loc.input.label.gruntFile": "Percorso file di grunt", + "loc.input.help.gruntFile": "Percorso relativo dalla radice del repository del file di script del file grunt da eseguire.", + "loc.input.label.targets": "Attività di grunt", + "loc.input.help.targets": "Facoltativo. Elenco di attività delimitate da spazio da eseguire. Se non è specificato, viene eseguita l'attività predefinita.", + "loc.input.label.arguments": "Argomenti", + "loc.input.help.arguments": "Argomenti aggiuntivi passati a grunt. --gruntfile non è necessario perché è stato già aggiunto con l'input gruntFile precedente.", + "loc.input.label.cwd": "Directory di lavoro", + "loc.input.help.cwd": "Directory di lavoro corrente durante l'esecuzione dello script. Per impostazione predefinita, corrisponde alla cartella in cui si trova lo script.", + "loc.input.label.gruntCli": "Percorso grunt-cli", + "loc.input.help.gruntCli": "File grunt-cli da eseguire quando l'agente non riesce a trovare il file grunt-cli installato globale. Per impostazione predefinita, viene usato il file grunt-cli presente nella cartella node_modules della directory di lavoro.", + "loc.input.label.publishJUnitResults": "Pubblica in Azure Pipelines", + "loc.input.help.publishJUnitResults": "Selezionare questa opzione per pubblicare in Azure Pipelines i risultati di test JUnit ottenuti con la compilazione Grunt.", + "loc.input.label.testResultsFiles": "File dei risultati del test", + "loc.input.help.testResultsFiles": "Percorso dei file dei risultati del test. È possibile usare i caratteri jolly, ad esempio `**/TEST-*.xml` per individuare tutti i file XML il cui nome inizia con TEST-.", + "loc.input.label.testRunTitle": "Titolo esecuzione dei test", + "loc.input.help.testRunTitle": "Consente di specificare un nome per l'esecuzione dei test.", + "loc.input.label.enableCodeCoverage": "Abilita code coverage", + "loc.input.help.enableCodeCoverage": "Selezionare questa opzione per abilitare il code coverage con Istanbul.", + "loc.input.label.testFramework": "Framework di test", + "loc.input.help.testFramework": "Consente di selezionare il framework di test.", + "loc.input.label.srcFiles": "File di origine", + "loc.input.help.srcFiles": "Consente di specificare il percorso dei file di origine per hookRequire()", + "loc.input.label.testFiles": "File di script di test", + "loc.input.help.testFiles": "Consente di specificare il percorso dei file di script di test", + "loc.messages.GruntCliNotInstalled": "Grunt-cli non è installato globalmente oppure non è presente nel percorso dell'utente con cui viene eseguito l'agente e non è incluso nella cartella di lavoro locale %s", + "loc.messages.GruntReturnCode": "Grunt terminato. Codice restituito: %d", + "loc.messages.GruntFailed": "Grunt non riuscito. Errore: %s", + "loc.messages.NpmFailed": "Npm non riuscito. Errore: %s", + "loc.messages.IstanbulFailed": "Istanbul non riuscito. Errore: %s" +} \ No newline at end of file diff --git a/_generated/GruntV0/Strings/resources.resjson/ja-JP/resources.resjson b/_generated/GruntV0/Strings/resources.resjson/ja-JP/resources.resjson new file mode 100644 index 000000000000..eb8a32712ba8 --- /dev/null +++ b/_generated/GruntV0/Strings/resources.resjson/ja-JP/resources.resjson @@ -0,0 +1,38 @@ +{ + "loc.friendlyName": "Grunt", + "loc.helpMarkDown": "[このタスクの詳細を表示](https://go.microsoft.com/fwlink/?LinkID=627413)、または [Grunt のドキュメントを参照](https://gruntjs.com/getting-started)", + "loc.description": "Grunt JavaScript タスク ランナーを実行します", + "loc.instanceNameFormat": "grunt $(targets)", + "loc.group.displayName.advanced": "詳細設定", + "loc.group.displayName.junitTestResults": "JUnit のテスト結果", + "loc.group.displayName.codeCoverage": "コード カバレッジ", + "loc.input.label.gruntFile": "Grunt ファイルのパス", + "loc.input.help.gruntFile": "実行する Grunt スクリプト ファイルのリポジトリのルートからの相対パス。", + "loc.input.label.targets": "Grunt タスク", + "loc.input.help.targets": "(省略可能) スペース区切りの実行タスクのリスト。指定しない場合は、既定のタスクが実行されます。", + "loc.input.label.arguments": "引数", + "loc.input.help.arguments": "Grunt に渡される追加引数。上記の gruntFile 入力で既に追加されているので、--gruntfile は不要です。", + "loc.input.label.cwd": "作業ディレクトリ", + "loc.input.help.cwd": "スクリプトの実行時の現行の作業ディレクトリ。スクリプトが配置されているフォルダーを既定値に使用します。", + "loc.input.label.gruntCli": "grunt-cli の場所", + "loc.input.help.gruntCli": "グローバルにインストールされた grunt-cli をエージェントが見つけられない場合に実行する grunt-cli。既定値は、作業ディレクトリの node_modules フォルダーの下にある grunt-cli です。", + "loc.input.label.publishJUnitResults": "Azure Pipelines に公開する", + "loc.input.help.publishJUnitResults": "Grunt のビルドによって生成される JUnit のテスト結果を Azure Pipelines に公開するには、このオプションを選びます。", + "loc.input.label.testResultsFiles": "テスト結果のファイル", + "loc.input.help.testResultsFiles": "テスト結果ファイルのパス。ワイルドカードを使用できます。たとえば、名前が TEST- で始まるすべての XML ファイルの場合は `**/TEST-*.xml` です。", + "loc.input.label.testRunTitle": "テスト実行のタイトル", + "loc.input.help.testRunTitle": "テストの実行の名前を指定します。", + "loc.input.label.enableCodeCoverage": "コード カバレッジを有効にする", + "loc.input.help.enableCodeCoverage": "Istanbul を使用してコード カバレッジを有効にするには、このオプションを選びます。", + "loc.input.label.testFramework": "テスト フレームワーク", + "loc.input.help.testFramework": "テスト フレームワークを選びます。", + "loc.input.label.srcFiles": "ソース ファイル", + "loc.input.help.srcFiles": "hookRequire() を実行しようとしているソース ファイルへのパスを指定します", + "loc.input.label.testFiles": "テスト スクリプト ファイル", + "loc.input.help.testFiles": "テスト スクリプト ファイルへのパスを指定します", + "loc.messages.GruntCliNotInstalled": "Grunt-cli はグローバルにインストールされていません (またはエージェントが実行しているユーザーのパスにありません)。またローカル作業フォルダーにありません: %s", + "loc.messages.GruntReturnCode": "Grunt は、リターン コードを伴って終了しました: %d", + "loc.messages.GruntFailed": "Grunt でエラーが発生しました: %s", + "loc.messages.NpmFailed": "Npm でエラーが発生しました: %s", + "loc.messages.IstanbulFailed": "Istanbul でエラーが発生しました: %s" +} \ No newline at end of file diff --git a/_generated/GruntV0/Strings/resources.resjson/ko-KR/resources.resjson b/_generated/GruntV0/Strings/resources.resjson/ko-KR/resources.resjson new file mode 100644 index 000000000000..90bb41e452c5 --- /dev/null +++ b/_generated/GruntV0/Strings/resources.resjson/ko-KR/resources.resjson @@ -0,0 +1,38 @@ +{ + "loc.friendlyName": "Grunt", + "loc.helpMarkDown": "[이 작업에 대한 자세한 정보](https://go.microsoft.com/fwlink/?LinkID=627413) 또는 [Grunt 설명서 참조](https://gruntjs.com/getting-started)", + "loc.description": "Grunt JavaScript 작업 실행기를 실행합니다.", + "loc.instanceNameFormat": "grunt $(targets)", + "loc.group.displayName.advanced": "고급", + "loc.group.displayName.junitTestResults": "JUnit 테스트 결과", + "loc.group.displayName.codeCoverage": "코드 검사", + "loc.input.label.gruntFile": "Grunt 파일 경로", + "loc.input.help.gruntFile": "실행할 grunt 파일 스크립트 파일의 리포 루트로부터의 상대 경로입니다.", + "loc.input.label.targets": "Grunt 작업", + "loc.input.help.targets": "선택 사항. 공백으로 구분된 실행할 작업 목록입니다. 지정하지 않을 경우 기본 작업이 실행됩니다.", + "loc.input.label.arguments": "인수", + "loc.input.help.arguments": "추가 인수가 grunt로 전달되었습니다. --gruntfile은 위의 gruntFile 입력을 통해 이미 추가되었으므로 필요하지 않습니다.", + "loc.input.label.cwd": "작업 디렉터리", + "loc.input.help.cwd": "스크립트 실행 시 현재 작업 디렉터리입니다. 기본값을 스크립트가 있는 폴더로 지정합니다.", + "loc.input.label.gruntCli": "Grunt-cli 위치", + "loc.input.help.gruntCli": "에이전트에서 전역 설치 Grunt-cli를 찾을 수 없을 때 실행할 Grunt-cli입니다. 기본값은 작업 디렉터리의 node_modules 폴더 아래에 있는 Grunt-cli입니다.", + "loc.input.label.publishJUnitResults": "Azure Pipelines/에 게시", + "loc.input.help.publishJUnitResults": "Grunt 빌드에서 생성된 JUnit 테스트 결과를 Azure Pipelines에 게시하려면 이 옵션을 선택합니다.", + "loc.input.label.testResultsFiles": "테스트 결과 파일", + "loc.input.help.testResultsFiles": "테스트 결과 파일 경로입니다. 와일드카드를 사용할 수 있습니다. 예를 들어, 이름이 TEST-로 시작하는 모든 XML 파일을 표시하기 위해 `**/TEST-*.xml`을 사용할 수 있습니다.", + "loc.input.label.testRunTitle": "테스트 실행 제목", + "loc.input.help.testRunTitle": "테스트 실행의 이름을 지정하세요.", + "loc.input.label.enableCodeCoverage": "코드 검사 사용", + "loc.input.help.enableCodeCoverage": "Istanbul을 사용하여 코드 검사를 사용하도록 설정하려면 이 옵션을 선택하세요.", + "loc.input.label.testFramework": "테스트 프레임워크", + "loc.input.help.testFramework": "테스트 프레임워크를 선택하세요.", + "loc.input.label.srcFiles": "소스 파일", + "loc.input.help.srcFiles": "hookRequire()를 적용할 소스 파일의 경로를 지정하세요.", + "loc.input.label.testFiles": "테스트 스크립트 파일", + "loc.input.help.testFiles": "테스트 스크립트 파일의 경로를 지정하세요.", + "loc.messages.GruntCliNotInstalled": "Grunt-cli가 전역으로 설치되지 않았거나 에이전트가 실행 중인 사용자 경로에 없으며 로컬 작업 폴더 %s에 없습니다.", + "loc.messages.GruntReturnCode": "반환 코드 %d(으)로 Grunt 종료", + "loc.messages.GruntFailed": "오류 %s(으)로 Grunt 실패", + "loc.messages.NpmFailed": "오류 %s(으)로 Npm 실패", + "loc.messages.IstanbulFailed": "다음 오류가 발생하여 Istanbul이 실패했습니다. %s" +} \ No newline at end of file diff --git a/_generated/GruntV0/Strings/resources.resjson/ru-RU/resources.resjson b/_generated/GruntV0/Strings/resources.resjson/ru-RU/resources.resjson new file mode 100644 index 000000000000..601fe1618204 --- /dev/null +++ b/_generated/GruntV0/Strings/resources.resjson/ru-RU/resources.resjson @@ -0,0 +1,38 @@ +{ + "loc.friendlyName": "Grunt", + "loc.helpMarkDown": "[См. дополнительные сведения об этой задаче](https://go.microsoft.com/fwlink/?LinkID=627413) или [документацию по Grunt](https://gruntjs.com/getting-started)", + "loc.description": "Запустить запускатель задач JavaScript Grunt", + "loc.instanceNameFormat": "grunt $(targets)", + "loc.group.displayName.advanced": "Дополнительно", + "loc.group.displayName.junitTestResults": "Результаты теста JUnit", + "loc.group.displayName.codeCoverage": "Объем протестированного кода", + "loc.input.label.gruntFile": "Путь к файлу Grunt", + "loc.input.help.gruntFile": "Относительный путь от корня репозитория для запускаемого файла скрипта файла Grunt.", + "loc.input.label.targets": "Задачи Grunt", + "loc.input.help.targets": "Необязательно. Список запускаемых задач с разделителями-пробелами. Если он не указан, будет запущена задача по умолчанию.", + "loc.input.label.arguments": "Аргументы", + "loc.input.help.arguments": "Дополнительные аргументы, переданные Grunt. Параметр --gruntfile не требуется, так как он уже добавлен с помощью ввода gruntFile выше.", + "loc.input.label.cwd": "Рабочий каталог", + "loc.input.help.cwd": "Текущий рабочий каталог при выполнении сценария. По умолчанию используется папка, в которой находится сценарий.", + "loc.input.label.gruntCli": "Расположение grunt-cli", + "loc.input.help.gruntCli": "Grunt-cli, который будет запущен, если агенту не удастся найти глобально установленный grunt-cli. Значение по умолчанию — grunt-cli в папке node_modules в рабочем каталоге.", + "loc.input.label.publishJUnitResults": "Опубликовать в Azure Pipelines", + "loc.input.help.publishJUnitResults": "Выберите этот параметр, чтобы опубликовать результаты тестов JUnit, созданные сборкой Grunt, в Azure Pipelines.", + "loc.input.label.testResultsFiles": "Файлы результатов тестов", + "loc.input.help.testResultsFiles": "Путь к файлам результатов тестов. Можно использовать подстановочные знаки. Пример: \"**/TEST-*.xml\" для всех XML-файлов, имена которых начинаются с \"TEST-\".", + "loc.input.label.testRunTitle": "Заголовок тестового запуска", + "loc.input.help.testRunTitle": "Укажите имя для тестового запуска.", + "loc.input.label.enableCodeCoverage": "Включить оценку объема протестированного кода", + "loc.input.help.enableCodeCoverage": "Выберите этот параметр, чтобы включить оценку объема протестированного кода с помощью Istanbul.", + "loc.input.label.testFramework": "Платформа тестирования", + "loc.input.help.testFramework": "Выберите платформу тестирования.", + "loc.input.label.srcFiles": "Исходные файлы", + "loc.input.help.srcFiles": "Укажите путь к исходным файлам, к которым необходимо применить метод hookRequire()", + "loc.input.label.testFiles": "Файлы скриптов тестирования", + "loc.input.help.testFiles": "Укажите путь к файлам скриптов тестирования", + "loc.messages.GruntCliNotInstalled": "Grunt-cli не установлен глобально (или не находится в пути пользователя, от имени которого выполняется агент) и не находится в локальной рабочей папке: %s", + "loc.messages.GruntReturnCode": "Завершение работы Grunt с кодом возврата: %d", + "loc.messages.GruntFailed": "Сбой Grunt с ошибкой: %s", + "loc.messages.NpmFailed": "Сбой NPM с ошибкой: %s", + "loc.messages.IstanbulFailed": "Сбой Istanbul с ошибкой: %s" +} \ No newline at end of file diff --git a/_generated/GruntV0/Strings/resources.resjson/zh-CN/resources.resjson b/_generated/GruntV0/Strings/resources.resjson/zh-CN/resources.resjson new file mode 100644 index 000000000000..8a429de31c3c --- /dev/null +++ b/_generated/GruntV0/Strings/resources.resjson/zh-CN/resources.resjson @@ -0,0 +1,38 @@ +{ + "loc.friendlyName": "Grunt", + "loc.helpMarkDown": "[详细了解此任务](https://go.microsoft.com/fwlink/?LinkID=627413)或[参阅 Grunt 文档](https://gruntjs.com/getting-started)", + "loc.description": "运行 Grunt JavaScript 任务运行程序", + "loc.instanceNameFormat": "Grunt $(targets)", + "loc.group.displayName.advanced": "高级", + "loc.group.displayName.junitTestResults": "JUnit 测试结果", + "loc.group.displayName.codeCoverage": "代码覆盖率", + "loc.input.label.gruntFile": "Grunt 文件路径", + "loc.input.help.gruntFile": "待运行 Grunt 文件脚本文件的存储库根路径的相对路径。", + "loc.input.label.targets": "Grunt 任务", + "loc.input.help.targets": "可选。待运行任务的列表,以空格分隔。如未指定,则将运行默认任务。", + "loc.input.label.arguments": "参数", + "loc.input.help.arguments": "传递给 Grunt 的其他参数。不需要 --gruntfile,因为已通过上面的 gruntFile 输入进行添加。", + "loc.input.label.cwd": "工作目录", + "loc.input.help.cwd": "脚本运行时的当前工作目录。默认为脚本所处的文件夹。", + "loc.input.label.gruntCli": "Grunt-cli 位置", + "loc.input.help.gruntCli": "代理找不到全局安装的 Grunt-cli 时要运行的 Grunt-cli。默认为工作目录的 node_modules 文件夹下的 Grunt-cli。", + "loc.input.label.publishJUnitResults": "发布到 Azure Pipelines", + "loc.input.help.publishJUnitResults": "选择此选项可将 Grunt 生成产生的 JUnit 测试结果发布到 Azure Pipelines。", + "loc.input.label.testResultsFiles": "测试结果文件", + "loc.input.help.testResultsFiles": "测试结果文件路径。可以使用通配符。例如,\"**/TEST-*.xml\" 表示名称以 TEST- 开头的所有 XML 文件。", + "loc.input.label.testRunTitle": "测试运行标题", + "loc.input.help.testRunTitle": "为测试运行提供一个名称。", + "loc.input.label.enableCodeCoverage": "启用代码覆盖率", + "loc.input.help.enableCodeCoverage": "选择此选项以使用 Istanbul 启用代码覆盖率。", + "loc.input.label.testFramework": "测试框架", + "loc.input.help.testFramework": "选择你的测试框架。", + "loc.input.label.srcFiles": "源文件", + "loc.input.help.srcFiles": "将你所需的源文件路径提供给 hookRequire()", + "loc.input.label.testFiles": "测试脚本文件", + "loc.input.help.testFiles": "提供测试脚本文件的路径", + "loc.messages.GruntCliNotInstalled": "Grunt-cli 未全局安装(或不位于代理运行身份用户的路径下),且不位于本地工作文件夹中: %s", + "loc.messages.GruntReturnCode": "Grunt 已退出,返回代码为: %d", + "loc.messages.GruntFailed": "Grunt 失败,出现错误: %s", + "loc.messages.NpmFailed": "Npm 失败,出现错误: %s", + "loc.messages.IstanbulFailed": "Istanbul 失败,出现错误: %s" +} \ No newline at end of file diff --git a/_generated/GruntV0/Strings/resources.resjson/zh-TW/resources.resjson b/_generated/GruntV0/Strings/resources.resjson/zh-TW/resources.resjson new file mode 100644 index 000000000000..0077270bdd41 --- /dev/null +++ b/_generated/GruntV0/Strings/resources.resjson/zh-TW/resources.resjson @@ -0,0 +1,38 @@ +{ + "loc.friendlyName": "Grunt", + "loc.helpMarkDown": "[深入了解此工作](https://go.microsoft.com/fwlink/?LinkID=627413)或[參閱 Grunt 文件](https://gruntjs.com/getting-started)", + "loc.description": "執行 Grunt JavaScript 工作執行器", + "loc.instanceNameFormat": "Grunt $(targets)", + "loc.group.displayName.advanced": "進階", + "loc.group.displayName.junitTestResults": "JUnit 測試結果", + "loc.group.displayName.codeCoverage": "程式碼涵蓋範圍", + "loc.input.label.gruntFile": "Grunt 檔案路徑", + "loc.input.help.gruntFile": "要執行之 grunt 檔案指令檔存放庫根路徑目錄的相對路徑。", + "loc.input.label.targets": "Grunt 工作", + "loc.input.help.targets": "可省略。以空格分隔要執行之工作的清單。若未指定,將會執行預設工作。", + "loc.input.label.arguments": "引數", + "loc.input.help.arguments": "傳遞給 Grunt 的額外引數。 因為 --gruntfile 已經由前述的 gruntFile 輸入加入,所以無須再提供。", + "loc.input.label.cwd": "工作目錄", + "loc.input.help.cwd": "執行指令碼後的目前工作目錄。預設為指令碼所在的資料夾。", + "loc.input.label.gruntCli": "grunt-cli 位置", + "loc.input.help.gruntCli": "當代理程式找不到全域安裝的 grunt-cli 時所要執行的 grunt-cli,預設為工作目錄 node_modules 資料夾下的 grunt-cli。", + "loc.input.label.publishJUnitResults": "發佈至 Azure Pipelines", + "loc.input.help.publishJUnitResults": "選取此選項會將 Grunt 組建所產生的 JUnit 測試結果發佈至 Azure Pipelines。", + "loc.input.label.testResultsFiles": "測試結果檔案", + "loc.input.help.testResultsFiles": "測試結果檔案路徑。可使用萬用字元。例如 `**/TEST-*.xml` 即適用於所有名稱開頭為 TEST- 的 XML 檔案。", + "loc.input.label.testRunTitle": "測試回合標題", + "loc.input.help.testRunTitle": "提供測試回合的名稱。", + "loc.input.label.enableCodeCoverage": "啟用程式碼涵蓋範圍", + "loc.input.help.enableCodeCoverage": "選取這個選項,以使用 Istanbul 啟用程式碼涵蓋範圍。", + "loc.input.label.testFramework": "測試架構", + "loc.input.help.testFramework": "選取測試架構。", + "loc.input.label.srcFiles": "原始程式檔", + "loc.input.help.srcFiles": "提供要進行 hookRequire() 之原始程式檔的路徑", + "loc.input.label.testFiles": "測試指令檔", + "loc.input.help.testFiles": "提供測試指令碼檔案的路徑", + "loc.messages.GruntCliNotInstalled": "Grunt-cli 未全域安裝 (或不在作為代理程式執行身分的使用者路徑中) 且不在本機工作資料夾: %s", + "loc.messages.GruntReturnCode": "Grunt 已結束,傳回碼為: %d", + "loc.messages.GruntFailed": "Grunt 失敗,錯誤為: %s", + "loc.messages.NpmFailed": "Npm 失敗,錯誤為: %s", + "loc.messages.IstanbulFailed": "Istanbul 失敗,錯誤為: %s" +} \ No newline at end of file diff --git a/_generated/GruntV0/Tests/L0.ts b/_generated/GruntV0/Tests/L0.ts new file mode 100644 index 000000000000..f799f61e4710 --- /dev/null +++ b/_generated/GruntV0/Tests/L0.ts @@ -0,0 +1,244 @@ +import fs = require('fs'); +import os = require('os'); +import assert = require('assert'); +import path = require('path'); +import * as ttm from 'azure-pipelines-task-lib/mock-test'; + +const isWin = os.type().match(/^Win/); + +describe('GruntV0 Suite', function () { + this.timeout(parseInt(process.env.TASK_TEST_TIMEOUT) || 20000); + + before((done: Mocha.Done) => { + process.env['SYSTEM_DEFAULTWORKINGDIRECTORY'] = '/user/build'; + done(); + }); + + it('runs a gruntFile through global grunt-cli', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0GruntGlobalGood.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.ran('/usr/local/bin/grunt --gruntfile gruntfile.js'), 'it should have run grunt'); + assert(tr.invokedToolCount == 1, 'should have only run grunt'); + assert(tr.stderr.length == 0, 'should not have written to stderr'); + assert(tr.succeeded, 'task should have succeeded'); + + done(); + }); + + it('runs a gruntFile through local grunt-cli', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0GruntLocalGood.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + if (isWin) { + assert( + tr.ran('/usr/local/bin/node c:\\fake\\wd\\node_modules\\grunt-cli\\bin\\grunt --gruntfile gruntfile.js'), + 'it should have run grunt' + ); + } else { + assert( + tr.ran('/usr/local/bin/node /fake/wd/node_modules/grunt-cli/bin/grunt --gruntfile gruntfile.js'), + 'it should have run grunt' + ); + } + assert(tr.invokedToolCount == 1, 'should have only run grunt'); + assert(tr.stderr.length == 0, 'should not have written to stderr'); + assert(tr.succeeded, 'task should have succeeded'); + + done(); + }); + + it('runs a gruntFile when code coverage is enabled', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0GruntFileWithCodeCoverage.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.ran('/usr/local/bin/grunt --gruntfile gruntfile.js'), 'it should have run grunt'); + assert(tr.invokedToolCount == 3, 'should have only npm, grunt and istanbul'); + assert(tr.stderr.length == 0, 'should not have written to stderr'); + assert(tr.succeeded, 'task should have succeeded'); + + done(); + }); + + it('runs a gruntFile when publishJUnitTestResults is false', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0publishJUnitTestResultIsFalse.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.ran('/usr/local/bin/grunt --gruntfile gruntfile.js'), 'it should have run grunt'); + assert(tr.invokedToolCount == 1, 'should have only run grunt'); + assert(tr.stderr.length == 0, 'should not have written to stderr'); + assert(tr.succeeded, 'task should have succeeded'); + + done(); + }); + + it('fails if grunt-cli no exist globally and locally', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0GruntNoGruntCli.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.stdOutContained('loc_mock_GruntCliNotInstalled'), 'Should have printed: loc_mock_GruntCliNotInstalled'); + assert(tr.failed, 'task should have failed'); + + done(); + }); + + it('errors if gruntfile not found', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0NoGruntFile.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.stdOutContained('Not found gruntfile.js'), 'Should have printed: Not found gruntfile.js'); + assert(tr.invokedToolCount == 0, 'should exit before running Grunt'); + assert(tr.failed, 'should have failed'); + + done(); + }); + + it('fails if npm fails', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0NpmFails.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.invokedToolCount == 2, 'should have only run npm'); + assert(tr.stdOutContained('loc_mock_NpmFailed'), 'Should have printed: loc_mock_NpmFailed'); + assert(tr.failed, 'task should have failed'); + + done(); + }); + + it('fails if grunt fails', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0GruntFails.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.ran('/usr/local/bin/grunt build test --gruntfile gruntfile.js -v'), 'it should have run grunt'); + assert(tr.invokedToolCount == 1, 'should have only run npm and Grunt'); + // success scripts don't necessarily set a result + assert(tr.stdOutContained('loc_mock_GruntFailed'), 'Should have printed: loc_mock_GruntFailed'); + assert(tr.failed, 'task should have failed'); + + done(); + }); + + it('fails if istanbul fails', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0IstanbulFails.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.invokedToolCount == 3, 'should have only run npm and Grunt'); + assert(tr.stdOutContained('loc_mock_IstanbulFailed'), 'Should have printed: loc_mock_IstanbulFailed'); + assert(tr.failed, 'task should have failed'); + + done(); + }); + + it('errors if cwd not set', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0CwdNotSet.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.stdOutContained('Input required: cwd'), 'Should have printed: Input required: cwd'); + assert(tr.invokedToolCount == 0, 'should exit before running Grunt'); + assert(tr.failed, 'should have failed'); + + done(); + }); + + it('errors if gruntFile not set', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0GruntFileNotSet.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.stdOutContained('Input required: gruntFile'), 'Should have printed: Input required: gruntFile'); + assert(tr.invokedToolCount == 0, 'should exit before running Grunt'); + assert(tr.failed, 'should have failed'); + + done(); + }); + + it('errors if gruntCli not set', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0GruntCliNotSet.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.stdOutContained('Input required: gruntCli'), 'Should have printed: Input required: gruntCli'); + assert(tr.invokedToolCount == 0, 'should exit before running Grunt'); + assert(tr.failed, 'should have failed'); + + done(); + }); + + it('Fails when test result files input is not provided', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0TestResultFilesNotSet.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.invokedToolCount == 0, 'should exit before running gulp'); + assert(tr.failed, 'task should have failed'); + assert(tr.stdOutContained('Input required: testResultsFiles'), 'Should have printed: Input required: testResultsFiles'); + + done(); + }); + + it('gives warning and runs when test result files input does not match any file', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0TestResultFilesDoesNotMatchAnyFile.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.ran('/usr/local/bin/grunt --gruntfile gruntfile.js'), 'it should have run grunt'); + assert(tr.invokedToolCount == 1, 'should run completely'); + assert( + tr.stdout.search('No pattern found in testResultsFiles parameter') >= 0, + 'should give a warning for test file pattern not matched.' + ); + assert(tr.succeeded, 'task should have succeeded'); + + done(); + }); + + it('Fails when test source files input is not provided for coverage', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0NoTestSourceFiles.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.invokedToolCount == 0, 'should exit before running grunt'); + assert(tr.stdOutContained('Input required: testFiles'), 'Should have printed: Input required: testFiles'); + assert(tr.failed, 'task should have failed'); + + done(); + }); + + it('fails when test source files input does not match any file', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0InvalidTestSource.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.failed, 'task should have failed'); + assert(tr.invokedToolCount == 3, 'should exit while running istanbul'); + assert(tr.stdOutContained('loc_mock_IstanbulFailed'), 'Should have printed: loc_mock_IstanbulFailed'); + assert(tr.failed, 'task should have failed'); + + done(); + }); +}); diff --git a/_generated/GruntV0/Tests/L0CwdNotSet.ts b/_generated/GruntV0/Tests/L0CwdNotSet.ts new file mode 100644 index 000000000000..21a2bd95150b --- /dev/null +++ b/_generated/GruntV0/Tests/L0CwdNotSet.ts @@ -0,0 +1,60 @@ +import ma = require("azure-pipelines-task-lib/mock-answer"); +import tmrm = require("azure-pipelines-task-lib/mock-run"); +import path = require("path"); + +let taskPath = path.join(__dirname, "..", "grunttask.js"); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput("gruntFile", "gruntfile.js"); +tr.setInput("publishJUnitResults", "true"); +tr.setInput("testResultsFiles", "**/build/test-results/TEST-*.xml"); +tr.setInput("enableCodeCoverage", "false"); +tr.setInput("gruntCli", "node_modules/grunt-cli/bin/grunt"); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "grunt": "/usr/local/bin/grunt", + "npm": "/usr/local/bin/npm", + "node": "/usr/local/bin/node", + "istanbulWin": "/usr/local/bin/istanbul", + "istanbul": "/usr/local/bin/node_modules/istanbul/lib/cli.js", + }, + "exec": { + "/usr/local/bin/grunt --gruntfile gruntfile.js": { + "code": 0, + "stdout": "grunt output here", + }, + "/usr/local/bin/npm install istanbul": { + "code": 0, + "stdout": "npm output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i ./**/build/src/*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 0, + "stdout": "istanbul output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i .\\**\\build\\src\\*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 0, + "stdout": "istanbul output here", + }, + }, + "checkPath": { + "/usr/local/bin/grunt": true, + "/usr/local/bin/npm": true, + "/usr/local/bin/node": true, + "/usr/local/bin/istanbul": true, + "/usr/local/bin/node_modules/istanbul/lib/cli.js": true, + "gruntfile.js": true, + "**/build/test/*.js": true, + }, + "exist": { + "/usr/local/bin/grunt": true, + }, + "match": { + "**/TEST-*.xml": ["/user/build/fun/test-123.xml"], + "**/*.js": ["/test/test.js"], + }, +}; +tr.setAnswers(a); + +tr.run(); diff --git a/_generated/GruntV0/Tests/L0GruntCliNotSet.ts b/_generated/GruntV0/Tests/L0GruntCliNotSet.ts new file mode 100644 index 000000000000..fc3b09ed8d4e --- /dev/null +++ b/_generated/GruntV0/Tests/L0GruntCliNotSet.ts @@ -0,0 +1,57 @@ +import ma = require("azure-pipelines-task-lib/mock-answer"); +import tmrm = require("azure-pipelines-task-lib/mock-run"); +import path = require("path"); + +let taskPath = path.join(__dirname, "..", "grunttask.js"); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput("gruntFile", "gruntfile.js"); +tr.setInput("cwd", "fake/wd"); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "grunt": "/usr/local/bin/grunt", + "npm": "/usr/local/bin/npm", + "node": "/usr/local/bin/node", + "istanbulWin": "/usr/local/bin/istanbul", + "istanbul": "/usr/local/bin/node_modules/istanbul/lib/cli.js", + }, + "exec": { + "/usr/local/bin/grunt --gruntfile gruntfile.js": { + "code": 0, + "stdout": "grunt output here", + }, + "/usr/local/bin/npm install istanbul": { + "code": 0, + "stdout": "npm output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i ./**/build/src/*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 0, + "stdout": "istanbul output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i .\\**\\build\\src\\*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 0, + "stdout": "istanbul output here", + }, + }, + "checkPath": { + "/usr/local/bin/grunt": true, + "/usr/local/bin/npm": true, + "/usr/local/bin/node": true, + "/usr/local/bin/istanbul": true, + "/usr/local/bin/node_modules/istanbul/lib/cli.js": true, + "gruntfile.js": true, + "**/build/test/*.js": true, + }, + "exist": { + "/usr/local/bin/grunt": false, + }, + "match": { + "**/TEST-*.xml": ["/user/build/fun/test-123.xml"], + "**/*.js": ["/test/test.js"], + }, +}; +tr.setAnswers(a); + +tr.run(); diff --git a/_generated/GruntV0/Tests/L0GruntFails.ts b/_generated/GruntV0/Tests/L0GruntFails.ts new file mode 100644 index 000000000000..0dedef59fe59 --- /dev/null +++ b/_generated/GruntV0/Tests/L0GruntFails.ts @@ -0,0 +1,63 @@ +import ma = require("azure-pipelines-task-lib/mock-answer"); +import tmrm = require("azure-pipelines-task-lib/mock-run"); +import path = require("path"); +import os = require("os"); + +let taskPath = path.join(__dirname, "..", "grunttask.js"); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput("gruntFile", "gruntfile.js"); +tr.setInput("publishJUnitResults", "true"); +tr.setInput("testResultsFiles", "**/build/test-results/TEST-*.xml"); +tr.setInput("enableCodeCoverage", "false"); +if (os.type().match(/^Win/)) { + tr.setInput("cwd", "c:/fake/wd"); +} else { + tr.setInput("cwd", "/fake/wd"); +} +tr.setInput("targets", "build test"); +tr.setInput("arguments", "-v"); +tr.setInput("gruntCli", "node_modules/grunt-cli/bin/grunt"); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "grunt": "/usr/local/bin/grunt", + "npm": "/usr/local/bin/npm", + "node": "/usr/local/bin/node", + "istanbulWin": "/usr/local/bin/istanbul", + "istanbul": "/usr/local/bin/node_modules/istanbul/lib/cli.js", + }, + "exec": { + "/usr/local/bin/grunt build test --gruntfile gruntfile.js -v": { + "code": 1, + "stdout": "grunt output here", + "stderr": "grunt failed with this output", + }, + "/usr/local/bin/npm install istanbul": { + "code": 0, + "stdout": "npm output here", + }, + }, + "checkPath": { + "/usr/local/bin/grunt": true, + "/usr/local/bin/npm": true, + "/usr/local/bin/node": true, + "/usr/local/bin/istanbul": true, + "/usr/local/bin/node_modules/istanbul/lib/cli.js": true, + "gruntfile.js": true, + }, + "exist": { + "/usr/local/bin/grunt": true, + }, + "find": { + "/user/build": ["/user/build/fun/test-123.xml"], + }, + "match": { + "**/TEST-*.xml": ["/user/build/fun/test-123.xml"], + }, +}; + +tr.setAnswers(a); + +tr.run(); diff --git a/_generated/GruntV0/Tests/L0GruntFileNotSet.ts b/_generated/GruntV0/Tests/L0GruntFileNotSet.ts new file mode 100644 index 000000000000..0cc260b29fad --- /dev/null +++ b/_generated/GruntV0/Tests/L0GruntFileNotSet.ts @@ -0,0 +1,65 @@ +import ma = require("azure-pipelines-task-lib/mock-answer"); +import tmrm = require("azure-pipelines-task-lib/mock-run"); +import path = require("path"); +import os = require("os"); + +let taskPath = path.join(__dirname, "..", "grunttask.js"); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput("publishJUnitResults", "true"); +tr.setInput("testResultsFiles", "**/build/test-results/TEST-*.xml"); +tr.setInput("enableCodeCoverage", "false"); +if (os.type().match(/^Win/)) { + tr.setInput("cwd", "c:/fake/wd"); +} else { + tr.setInput("cwd", "/fake/wd"); +} +tr.setInput("gruntCli", "node_modules/grunt-cli/bin/grunt"); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "grunt": "/usr/local/bin/grunt", + "npm": "/usr/local/bin/npm", + "node": "/usr/local/bin/node", + "istanbulWin": "/usr/local/bin/istanbul", + "istanbul": "/usr/local/bin/node_modules/istanbul/lib/cli.js", + }, + "exec": { + "/usr/local/bin/grunt --gruntfile gruntfile.js": { + "code": 0, + "stdout": "grunt output here", + }, + "/usr/local/bin/npm install istanbul": { + "code": 0, + "stdout": "npm output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i ./**/build/src/*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 0, + "stdout": "istanbul output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i .\\**\\build\\src\\*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 0, + "stdout": "istanbul output here", + }, + }, + "checkPath": { + "/usr/local/bin/grunt": true, + "/usr/local/bin/npm": true, + "/usr/local/bin/node": true, + "/usr/local/bin/istanbul": true, + "/usr/local/bin/node_modules/istanbul/lib/cli.js": true, + "gruntfile.js": true, + "**/build/test/*.js": true, + }, + "exist": { + "/usr/local/bin/grunt": true, + }, + "match": { + "**/TEST-*.xml": ["/user/build/fun/test-123.xml"], + "**/*.js": ["/test/test.js"], + }, +}; +tr.setAnswers(a); + +tr.run(); diff --git a/_generated/GruntV0/Tests/L0GruntFileWithCodeCoverage.ts b/_generated/GruntV0/Tests/L0GruntFileWithCodeCoverage.ts new file mode 100644 index 000000000000..5859070abba8 --- /dev/null +++ b/_generated/GruntV0/Tests/L0GruntFileWithCodeCoverage.ts @@ -0,0 +1,75 @@ +import ma = require("azure-pipelines-task-lib/mock-answer"); +import tmrm = require("azure-pipelines-task-lib/mock-run"); +import path = require("path"); +import os = require("os"); + +let taskPath = path.join(__dirname, "..", "grunttask.js"); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput("gruntFile", "gruntfile.js"); +tr.setInput("publishJUnitResults", "true"); +tr.setInput("testResultsFiles", "**/build/test-results/TEST-*.xml"); +tr.setInput("enableCodeCoverage", "true"); +tr.setInput("testFramework", "Mocha"); +tr.setInput("srcFiles", "**/build/src/*.js"); +tr.setInput("testFiles", "**/build/test/*.js"); +if (os.type().match(/^Win/)) { + tr.setInput("cwd", "c:/fake/wd"); +} else { + tr.setInput("cwd", "/fake/wd"); +} +tr.setInput("gruntCli", "node_modules/grunt-cli/bin/grunt"); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "grunt": "/usr/local/bin/grunt", + "npm": "/usr/local/bin/npm", + "node": "/usr/local/bin/node", + "istanbulWin": "/usr/local/bin/istanbul", + "istanbul": "/usr/local/bin/node_modules/istanbul/lib/cli.js", + }, + "exec": { + "/usr/local/bin/grunt --gruntfile gruntfile.js": { + "code": 0, + "stdout": "grunt output here", + }, + "/usr/local/bin/npm install istanbul": { + "code": 0, + "stdout": "npm output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i ./**/build/src/*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 0, + "stdout": "istanbul output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i .\\**\\build\\src\\*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 0, + "stdout": "istanbul output here", + }, + }, + "checkPath": { + "/usr/local/bin/grunt": true, + "/usr/local/bin/npm": true, + "/usr/local/bin/node": true, + "/usr/local/bin/istanbul": true, + "/usr/local/bin/node_modules/istanbul/lib/cli.js": true, + "gruntfile.js": true, + "**/build/test/*.js": true, + }, + "exist": { + "/usr/local/bin/grunt": true, + }, + "match": { + "**/TEST-*.xml": ["/user/build/fun/test-123.xml"], + "**/*.js": ["/test/test.js"], + }, + "find": { + "/user/build": ["/user/build/fun/test-123.xml"], + }, + "getVariable": { + "System.DefaultWorkingDirectory": "/user/build", + }, +}; +tr.setAnswers(a); + +tr.run(); diff --git a/_generated/GruntV0/Tests/L0GruntGlobalGood.ts b/_generated/GruntV0/Tests/L0GruntGlobalGood.ts new file mode 100644 index 000000000000..71b92ea9cfca --- /dev/null +++ b/_generated/GruntV0/Tests/L0GruntGlobalGood.ts @@ -0,0 +1,69 @@ +import ma = require("azure-pipelines-task-lib/mock-answer"); +import tmrm = require("azure-pipelines-task-lib/mock-run"); +import path = require("path"); +import os = require("os"); + +let taskPath = path.join(__dirname, "..", "grunttask.js"); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput("gruntFile", "gruntfile.js"); +tr.setInput("publishJUnitResults", "true"); +tr.setInput("testResultsFiles", "**/build/test-results/TEST-*.xml"); +tr.setInput("enableCodeCoverage", "false"); +if (os.type().match(/^Win/)) { + tr.setInput("cwd", "c:/fake/wd"); +} else { + tr.setInput("cwd", "/fake/wd"); +} +tr.setInput("gruntCli", "node_modules/grunt-cli/bin/grunt"); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "grunt": "/usr/local/bin/grunt", + "npm": "/usr/local/bin/npm", + "node": "/usr/local/bin/node", + "istanbulWin": "/usr/local/bin/istanbul", + "istanbul": "/usr/local/bin/node_modules/istanbul/lib/cli.js", + }, + "exec": { + "/usr/local/bin/grunt --gruntfile gruntfile.js": { + "code": 0, + "stdout": "grunt output here", + }, + "/usr/local/bin/npm install istanbul": { + "code": 0, + "stdout": "npm output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i ./**/build/src/*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 0, + "stdout": "istanbul output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i .\\**\\build\\src\\*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 0, + "stdout": "istanbul output here", + }, + }, + "checkPath": { + "/usr/local/bin/grunt": true, + "/usr/local/bin/npm": true, + "/usr/local/bin/node": true, + "/usr/local/bin/istanbul": true, + "/usr/local/bin/node_modules/istanbul/lib/cli.js": true, + "gruntfile.js": true, + "**/build/test/*.js": true, + }, + "exist": { + "/usr/local/bin/grunt": true, + }, + "match": { + "**/TEST-*.xml": ["/user/build/fun/test-123.xml"], + "**/*.js": ["/test/test.js"], + }, + "find": { + "/user/build": ["/user/build/fun/test-123.xml"] + } +}; +tr.setAnswers(a); + +tr.run(); diff --git a/_generated/GruntV0/Tests/L0GruntLocalGood.ts b/_generated/GruntV0/Tests/L0GruntLocalGood.ts new file mode 100644 index 000000000000..b0d184689b05 --- /dev/null +++ b/_generated/GruntV0/Tests/L0GruntLocalGood.ts @@ -0,0 +1,62 @@ +import ma = require("azure-pipelines-task-lib/mock-answer"); +import tmrm = require("azure-pipelines-task-lib/mock-run"); +import path = require("path"); +import os = require("os"); + +let taskPath = path.join(__dirname, "..", "grunttask.js"); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput("gruntFile", "gruntfile.js"); +tr.setInput("publishJUnitResults", "true"); +tr.setInput("testResultsFiles", "**/test-*.xml"); +tr.setInput("enableCodeCoverage", "false"); +if (os.type().match(/^Win/)) { + tr.setInput("cwd", "c:/fake/wd"); +} else { + tr.setInput("cwd", "/fake/wd"); +} +tr.setInput("gruntCli", "node_modules/grunt-cli/bin/grunt"); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "npm": "/usr/local/bin/npm", + "node": "/usr/local/bin/node", + "istanbulWin": "/usr/local/bin/istanbul", + "istanbul": "/usr/local/bin/node_modules/istanbul/lib/cli.js", + }, + "exec": { + "/usr/local/bin/node /fake/wd/node_modules/grunt-cli/bin/grunt --gruntfile gruntfile.js": { + "code": 0, + "stdout": "grunt output here", + }, + "/usr/local/bin/node c:\\fake\\wd\\node_modules\\grunt-cli\\bin\\grunt --gruntfile gruntfile.js": { + "code": 0, + "stdout": "grunt output here", + }, + }, + "checkPath": { + "/usr/local/bin/node": true, + "/usr/local/bin/npm": true, + "/usr/local/bin/istanbul": true, + "/usr/local/bin/node_modules/istanbul/lib/cli.js": true, + "gruntfile.js": true, + }, + "exist": { + "/fake/wd/node_modules/grunt-cli/bin/grunt": true, + "c:\\fake\\wd\\node_modules\\grunt-cli\\bin\\grunt": true, + }, + "find": { + "/user/build": ["/user/build/fun/test-123.xml"], + }, + "match": { + "**/test-*.xml": ["/user/build/fun/test-123.xml"], + }, + "getVariable": { + "System.DefaultWorkingDirectory": "/user/build", + }, +}; + +tr.setAnswers(a); + +tr.run(); diff --git a/_generated/GruntV0/Tests/L0GruntNoGruntCli.ts b/_generated/GruntV0/Tests/L0GruntNoGruntCli.ts new file mode 100644 index 000000000000..45e79be85b26 --- /dev/null +++ b/_generated/GruntV0/Tests/L0GruntNoGruntCli.ts @@ -0,0 +1,42 @@ +import ma = require("azure-pipelines-task-lib/mock-answer"); +import tmrm = require("azure-pipelines-task-lib/mock-run"); +import path = require("path"); +import os = require("os"); + +let taskPath = path.join(__dirname, "..", "grunttask.js"); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput("gruntFile", "gruntfile.js"); +tr.setInput("publishJUnitResults", "true"); +tr.setInput("testResultsFiles", "**/build/test-results/TEST-*.xml"); +tr.setInput("enableCodeCoverage", "false"); +if (os.type().match(/^Win/)) { + tr.setInput("cwd", "c:/fake/wd"); +} else { + tr.setInput("cwd", "/fake/wd"); +} +tr.setInput("gruntCli", "node_modules/grunt-cli/bin/grunt"); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "npm": "/usr/local/bin/npm", + "node": "/usr/local/bin/node", + "istanbulWin": "/usr/local/bin/istanbul", + "istanbul": "/usr/local/bin/node_modules/istanbul/lib/cli.js", + }, + "checkPath": { + "/usr/local/bin/npm": true, + "/usr/local/bin/node": true, + "/usr/local/bin/istanbul": true, + "/usr/local/bin/node_modules/istanbul/lib/cli.js": true, + "gruntfile.js": true, + }, + "match": { + "**/TEST-*.xml": ["/user/build/fun/test-123.xml"], + }, +}; + +tr.setAnswers(a); + +tr.run(); diff --git a/_generated/GruntV0/Tests/L0InvalidTestSource.ts b/_generated/GruntV0/Tests/L0InvalidTestSource.ts new file mode 100644 index 000000000000..ad351f87af3f --- /dev/null +++ b/_generated/GruntV0/Tests/L0InvalidTestSource.ts @@ -0,0 +1,75 @@ +import ma = require("azure-pipelines-task-lib/mock-answer"); +import tmrm = require("azure-pipelines-task-lib/mock-run"); +import path = require("path"); +import os = require("os"); + +let taskPath = path.join(__dirname, "..", "grunttask.js"); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput("gruntFile", "gruntfile.js"); +tr.setInput("publishJUnitResults", "true"); +tr.setInput("testResultsFiles", "**/build/test-results/TEST-*.xml"); +tr.setInput("enableCodeCoverage", "true"); +tr.setInput("testFramework", "Mocha"); +tr.setInput("srcFiles", "**/build/src/*.js"); +tr.setInput("testFiles", "/invalid/input"); +if (os.type().match(/^Win/)) { + tr.setInput("cwd", "c:/fake/wd"); +} else { + tr.setInput("cwd", "/fake/wd"); +} +tr.setInput("gruntCli", "node_modules/grunt-cli/bin/grunt"); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "grunt": "/usr/local/bin/grunt", + "npm": "/usr/local/bin/npm", + "node": "/usr/local/bin/node", + "istanbulWin": "/usr/local/bin/istanbul", + "istanbul": "/usr/local/bin/node_modules/istanbul/lib/cli.js", + }, + "exec": { + "/usr/local/bin/grunt --gruntfile gruntfile.js": { + "code": 0, + "stdout": "grunt output here", + }, + "/usr/local/bin/npm install istanbul": { + "code": 0, + "stdout": "npm output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i ./**/build/src/*.js ./node_modules/mocha/bin/_mocha /invalid/input": { + "code": 1, + "stdout": "istanbul output here", + "stderr": "istanbul failed with this output", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i .\\**\\build\\src\\*.js ./node_modules/mocha/bin/_mocha /invalid/input": { + "code": 1, + "stdout": "istanbul output here", + "stderr": "istanbul failed with this output", + }, + }, + "checkPath": { + "/usr/local/bin/grunt": true, + "/usr/local/bin/npm": true, + "/usr/local/bin/node": true, + "/usr/local/bin/istanbul": true, + "/usr/local/bin/node_modules/istanbul/lib/cli.js": true, + "gruntfile.js": true, + "**/build/test/*.js": true, + }, + "exist": { + "/usr/local/bin/grunt": true, + }, + "match": { + "**/TEST-*.xml": ["/user/build/fun/test-123.xml"], + "**/*.js": ["/test/test.js"], + }, + "find": { + "/user/build": ["/user/build/fun/test-123.xml"], + }, +}; + +tr.setAnswers(a); + +tr.run(); diff --git a/_generated/GruntV0/Tests/L0IstanbulFails.ts b/_generated/GruntV0/Tests/L0IstanbulFails.ts new file mode 100644 index 000000000000..440b053218f2 --- /dev/null +++ b/_generated/GruntV0/Tests/L0IstanbulFails.ts @@ -0,0 +1,75 @@ +import ma = require("azure-pipelines-task-lib/mock-answer"); +import tmrm = require("azure-pipelines-task-lib/mock-run"); +import path = require("path"); +import os = require("os"); + +let taskPath = path.join(__dirname, "..", "grunttask.js"); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput("gruntFile", "gruntfile.js"); +tr.setInput("publishJUnitResults", "true"); +tr.setInput("testResultsFiles", "**/build/test-results/TEST-*.xml"); +tr.setInput("enableCodeCoverage", "true"); +tr.setInput("testFramework", "Mocha"); +tr.setInput("srcFiles", "**/build/src/*.js"); +tr.setInput("testFiles", "**/build/test/*.js"); +if (os.type().match(/^Win/)) { + tr.setInput("cwd", "c:/fake/wd"); +} else { + tr.setInput("cwd", "/fake/wd"); +} +tr.setInput("gruntCli", "node_modules/grunt-cli/bin/grunt"); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "grunt": "/usr/local/bin/grunt", + "npm": "/usr/local/bin/npm", + "node": "/usr/local/bin/node", + "istanbulWin": "/usr/local/bin/istanbul", + "istanbul": "/usr/local/bin/node_modules/istanbul/lib/cli.js", + }, + "exec": { + "/usr/local/bin/grunt --gruntfile gruntfile.js": { + "code": 0, + "stdout": "grunt output here", + }, + "/usr/local/bin/npm install istanbul": { + "code": 0, + "stdout": "npm output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i ./**/build/src/*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 1, + "stdout": "istanbul output here", + "stderr": "istanbul failed with this output", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i .\\**\\build\\src\\*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 1, + "stdout": "istanbul output here", + "stderr": "istanbul failed with this output", + }, + }, + "checkPath": { + "/usr/local/bin/grunt": true, + "/usr/local/bin/npm": true, + "/usr/local/bin/node": true, + "/usr/local/bin/istanbul": true, + "/usr/local/bin/node_modules/istanbul/lib/cli.js": true, + "gruntfile.js": true, + "**/build/test/*.js": true, + }, + "exist": { + "/usr/local/bin/grunt": true, + }, + "find": { + "/user/build": ["/user/build/fun/test-123.xml"], + }, + "match": { + "**/TEST-*.xml": ["/user/build/fun/test-123.xml"], + "**/*.js": ["/test/test.js"], + }, +}; + +tr.setAnswers(a); + +tr.run(); diff --git a/_generated/GruntV0/Tests/L0NoGruntFile.ts b/_generated/GruntV0/Tests/L0NoGruntFile.ts new file mode 100644 index 000000000000..d6a417e10c4c --- /dev/null +++ b/_generated/GruntV0/Tests/L0NoGruntFile.ts @@ -0,0 +1,30 @@ +import ma = require("azure-pipelines-task-lib/mock-answer"); +import tmrm = require("azure-pipelines-task-lib/mock-run"); +import path = require("path"); +import os = require("os"); + +let taskPath = path.join(__dirname, "..", "grunttask.js"); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput("gruntFile", "gruntfile.js"); +if (os.type().match(/^Win/)) { + tr.setInput("cwd", "c:/fake/wd"); +} else { + tr.setInput("cwd", "/fake/wd"); +} +tr.setInput("gruntCli", "node_modules/grunt-cli/bin/grunt"); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "node": "/usr/local/bin/node", + }, + "checkPath": { + "/usr/local/bin/node": true, + "gruntfile.js": false, + }, +}; + +tr.setAnswers(a); + +tr.run(); diff --git a/_generated/GruntV0/Tests/L0NoTestSourceFiles.ts b/_generated/GruntV0/Tests/L0NoTestSourceFiles.ts new file mode 100644 index 000000000000..30a610046fdb --- /dev/null +++ b/_generated/GruntV0/Tests/L0NoTestSourceFiles.ts @@ -0,0 +1,68 @@ +import ma = require("azure-pipelines-task-lib/mock-answer"); +import tmrm = require("azure-pipelines-task-lib/mock-run"); +import path = require("path"); +import os = require("os"); + +let taskPath = path.join(__dirname, "..", "grunttask.js"); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput("gruntFile", "gruntfile.js"); +tr.setInput("publishJUnitResults", "true"); +tr.setInput("testResultsFiles", "**/build/test-results/TEST-*.xml"); +tr.setInput("enableCodeCoverage", "true"); +tr.setInput("testFramework", "Mocha"); +tr.setInput("srcFiles", "**/build/src/*.js"); +if (os.type().match(/^Win/)) { + tr.setInput("cwd", "c:/fake/wd"); +} else { + tr.setInput("cwd", "/fake/wd"); +} +tr.setInput("gruntCli", "node_modules/grunt-cli/bin/grunt"); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "grunt": "/usr/local/bin/grunt", + "npm": "/usr/local/bin/npm", + "node": "/usr/local/bin/node", + "istanbulWin": "/usr/local/bin/istanbul", + "istanbul": "/usr/local/bin/node_modules/istanbul/lib/cli.js", + }, + "exec": { + "/usr/local/bin/grunt --gruntfile gruntfile.js": { + "code": 0, + "stdout": "grunt output here", + }, + "/usr/local/bin/npm install istanbul": { + "code": 0, + "stdout": "npm output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i ./**/build/src/*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 0, + "stdout": "istanbul output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i .\\**\\build\\src\\*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 0, + "stdout": "istanbul output here", + }, + }, + "checkPath": { + "/usr/local/bin/grunt": true, + "/usr/local/bin/npm": true, + "/usr/local/bin/node": true, + "/usr/local/bin/istanbul": true, + "/usr/local/bin/node_modules/istanbul/lib/cli.js": true, + "gruntfile.js": true, + "**/build/test/*.js": true, + }, + "exist": { + "/usr/local/bin/grunt": true, + }, + "match": { + "**/TEST-*.xml": ["/user/build/fun/test-123.xml"], + "**/*.js": ["/test/test.js"], + }, +}; +tr.setAnswers(a); + +tr.run(); diff --git a/_generated/GruntV0/Tests/L0NpmFails.ts b/_generated/GruntV0/Tests/L0NpmFails.ts new file mode 100644 index 000000000000..e86709c4c894 --- /dev/null +++ b/_generated/GruntV0/Tests/L0NpmFails.ts @@ -0,0 +1,65 @@ +import ma = require("azure-pipelines-task-lib/mock-answer"); +import tmrm = require("azure-pipelines-task-lib/mock-run"); +import path = require("path"); +import os = require("os"); + +let taskPath = path.join(__dirname, "..", "grunttask.js"); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput("gruntFile", "gruntfile.js"); +tr.setInput("publishJUnitResults", "true"); +tr.setInput("testResultsFiles", "**/build/test-results/TEST-*.xml"); +tr.setInput("enableCodeCoverage", "true"); +tr.setInput("testFramework", "Mocha"); +tr.setInput("srcFiles", "**/build/src/*.js"); +tr.setInput("testFiles", "**/build/test/*.js"); +if (os.type().match(/^Win/)) { + tr.setInput("cwd", "c:/fake/wd"); +} else { + tr.setInput("cwd", "/fake/wd"); +} +tr.setInput("gruntCli", "node_modules/grunt-cli/bin/grunt"); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "grunt": "/usr/local/bin/grunt", + "npm": "/usr/local/bin/npm", + "node": "/usr/local/bin/node", + "istanbulWin": "/usr/local/bin/istanbul", + "istanbul": "/usr/local/bin/node_modules/istanbul/lib/cli.js", + }, + "exec": { + "/usr/local/bin/grunt --gruntfile gruntfile.js": { + "code": 0, + "stdout": "grunt output here", + }, + "/usr/local/bin/npm install istanbul": { + "code": 1, + "stdout": "npm output here", + "stderr": "npm failed with this output", + }, + }, + "checkPath": { + "/usr/local/bin/grunt": true, + "/usr/local/bin/npm": true, + "/usr/local/bin/node": true, + "/usr/local/bin/istanbul": true, + "/usr/local/bin/node_modules/istanbul/lib/cli.js": true, + "gruntfile.js": true, + }, + "exist": { + "/usr/local/bin/grunt": true, + }, + "match": { + "**/TEST-*.xml": ["/user/build/fun/test-123.xml"], + "**/*.js": ["/test/test.js"], + }, + "find": { + "/user/build": ["/user/build/fun/test-123.xml"], + }, +}; + +tr.setAnswers(a); + +tr.run(); diff --git a/_generated/GruntV0/Tests/L0TestResultFilesDoesNotMatchAnyFile.ts b/_generated/GruntV0/Tests/L0TestResultFilesDoesNotMatchAnyFile.ts new file mode 100644 index 000000000000..16912fdd6b9a --- /dev/null +++ b/_generated/GruntV0/Tests/L0TestResultFilesDoesNotMatchAnyFile.ts @@ -0,0 +1,66 @@ +import ma = require("azure-pipelines-task-lib/mock-answer"); +import tmrm = require("azure-pipelines-task-lib/mock-run"); +import path = require("path"); +import os = require("os"); + +let taskPath = path.join(__dirname, "..", "grunttask.js"); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput("gruntFile", "gruntfile.js"); +tr.setInput("publishJUnitResults", "true"); +tr.setInput("testResultsFiles", "/invalid/input"); +tr.setInput("enableCodeCoverage", "false"); +if (os.type().match(/^Win/)) { + tr.setInput("cwd", "c:/fake/wd"); +} else { + tr.setInput("cwd", "/fake/wd"); +} +tr.setInput("gruntCli", "node_modules/grunt-cli/bin/grunt"); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "grunt": "/usr/local/bin/grunt", + "npm": "/usr/local/bin/npm", + "node": "/usr/local/bin/node", + "istanbulWin": "/usr/local/bin/istanbul", + "istanbul": "/usr/local/bin/node_modules/istanbul/lib/cli.js", + }, + "exec": { + "/usr/local/bin/grunt --gruntfile gruntfile.js": { + "code": 0, + "stdout": "grunt output here", + }, + "/usr/local/bin/npm install istanbul": { + "code": 0, + "stdout": "npm output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i ./**/build/src/*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 0, + "stdout": "istanbul output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i .\\**\\build\\src\\*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 0, + "stdout": "istanbul output here", + }, + }, + "checkPath": { + "/usr/local/bin/grunt": true, + "/usr/local/bin/npm": true, + "/usr/local/bin/node": true, + "/usr/local/bin/istanbul": true, + "/usr/local/bin/node_modules/istanbul/lib/cli.js": true, + "gruntfile.js": true, + "**/build/test/*.js": true, + }, + "exist": { + "/usr/local/bin/grunt": true, + }, + "match": { + "**/TEST-*.xml": ["/user/build/fun/test-123.xml"], + "**/*.js": ["/test/test.js"], + }, +}; +tr.setAnswers(a); + +tr.run(); diff --git a/_generated/GruntV0/Tests/L0TestResultFilesNotSet.ts b/_generated/GruntV0/Tests/L0TestResultFilesNotSet.ts new file mode 100644 index 000000000000..32d4b444f889 --- /dev/null +++ b/_generated/GruntV0/Tests/L0TestResultFilesNotSet.ts @@ -0,0 +1,65 @@ +import ma = require("azure-pipelines-task-lib/mock-answer"); +import tmrm = require("azure-pipelines-task-lib/mock-run"); +import path = require("path"); +import os = require("os"); + +let taskPath = path.join(__dirname, "..", "grunttask.js"); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput("gruntFile", "gruntfile.js"); +tr.setInput("publishJUnitResults", "true"); +tr.setInput("enableCodeCoverage", "false"); +if (os.type().match(/^Win/)) { + tr.setInput("cwd", "c:/fake/wd"); +} else { + tr.setInput("cwd", "/fake/wd"); +} +tr.setInput("gruntCli", "node_modules/grunt-cli/bin/grunt"); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "grunt": "/usr/local/bin/grunt", + "npm": "/usr/local/bin/npm", + "node": "/usr/local/bin/node", + "istanbulWin": "/usr/local/bin/istanbul", + "istanbul": "/usr/local/bin/node_modules/istanbul/lib/cli.js", + }, + "exec": { + "/usr/local/bin/grunt --gruntfile gruntfile.js": { + "code": 0, + "stdout": "grunt output here", + }, + "/usr/local/bin/npm install istanbul": { + "code": 0, + "stdout": "npm output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i ./**/build/src/*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 0, + "stdout": "istanbul output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i .\\**\\build\\src\\*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 0, + "stdout": "istanbul output here", + }, + }, + "checkPath": { + "/usr/local/bin/grunt": true, + "/usr/local/bin/npm": true, + "/usr/local/bin/node": true, + "/usr/local/bin/istanbul": true, + "/usr/local/bin/node_modules/istanbul/lib/cli.js": true, + "gruntfile.js": true, + "**/build/test/*.js": true, + }, + "exist": { + "/usr/local/bin/grunt": true, + }, + "match": { + "**/TEST-*.xml": ["/user/build/fun/test-123.xml"], + "**/*.js": ["/test/test.js"], + }, +}; +tr.setAnswers(a); + +tr.run(); diff --git a/_generated/GruntV0/Tests/L0publishJUnitTestResultIsFalse.ts b/_generated/GruntV0/Tests/L0publishJUnitTestResultIsFalse.ts new file mode 100644 index 000000000000..8f62c10f0550 --- /dev/null +++ b/_generated/GruntV0/Tests/L0publishJUnitTestResultIsFalse.ts @@ -0,0 +1,69 @@ +import ma = require("azure-pipelines-task-lib/mock-answer"); +import tmrm = require("azure-pipelines-task-lib/mock-run"); +import path = require("path"); +import os = require("os"); + +let taskPath = path.join(__dirname, "..", "grunttask.js"); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput("gruntFile", "gruntfile.js"); +tr.setInput("publishJUnitResults", "false"); +tr.setInput("enableCodeCoverage", "false"); +if (os.type().match(/^Win/)) { + tr.setInput("cwd", "c:/fake/wd"); +} else { + tr.setInput("cwd", "/fake/wd"); +} + +tr.setInput("gruntCli", "node_modules/grunt-cli/bin/grunt"); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "grunt": "/usr/local/bin/grunt", + "npm": "/usr/local/bin/npm", + "node": "/usr/local/bin/node", + "istanbulWin": "/usr/local/bin/istanbul", + "istanbul": "/usr/local/bin/node_modules/istanbul/lib/cli.js", + }, + "exec": { + "/usr/local/bin/grunt --gruntfile gruntfile.js": { + "code": 0, + "stdout": "grunt output here", + }, + "/usr/local/bin/npm install istanbul": { + "code": 0, + "stdout": "npm output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i ./**/build/src/*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 0, + "stdout": "istanbul output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i .\\**\\build\\src\\*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 0, + "stdout": "istanbul output here", + }, + }, + "checkPath": { + "/usr/local/bin/grunt": true, + "/usr/local/bin/npm": true, + "/usr/local/bin/node": true, + "/usr/local/bin/istanbul": true, + "/usr/local/bin/node_modules/istanbul/lib/cli.js": true, + "gruntfile.js": true, + "**/build/test/*.js": true, + }, + "exist": { + "/usr/local/bin/grunt": true, + }, + "match": { + "**/TEST-*.xml": ["/user/build/fun/test-123.xml"], + "**/*.js": ["/test/test.js"], + }, + "getVariable": { + "System.DefaultWorkingDirectory": "/user/build", + }, +}; +tr.setAnswers(a); + +tr.run(); diff --git a/_generated/GruntV0/Tests/package-lock.json b/_generated/GruntV0/Tests/package-lock.json new file mode 100644 index 000000000000..e0ee3d5cab23 --- /dev/null +++ b/_generated/GruntV0/Tests/package-lock.json @@ -0,0 +1,14 @@ +{ + "name": "grunt-tests", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/mocha": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", + "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==", + "dev": true + } + } +} diff --git a/_generated/GruntV0/Tests/package.json b/_generated/GruntV0/Tests/package.json new file mode 100644 index 000000000000..d1e8e3584150 --- /dev/null +++ b/_generated/GruntV0/Tests/package.json @@ -0,0 +1,22 @@ +{ + "name": "grunt-tests", + "version": "1.0.0", + "description": "Azure Pipelines Grunt V0 Task Tests", + "main": "L0.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/Microsoft/azure-pipelines-tasks.git" + }, + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Microsoft/azure-pipelines-tasks/issues" + }, + "homepage": "https://github.com/Microsoft/azure-pipelines-tasks#readme", + "devDependencies": { + "@types/mocha": "^5.2.0" + } +} diff --git a/_generated/GruntV0/grunttask.ts b/_generated/GruntV0/grunttask.ts new file mode 100644 index 000000000000..92be8b15bc98 --- /dev/null +++ b/_generated/GruntV0/grunttask.ts @@ -0,0 +1,118 @@ +import path = require('path'); +import tl = require('azure-pipelines-task-lib/task'); +import minimatch = require('minimatch'); + +tl.setResourcePath(path.join(__dirname, 'task.json')); + +var gruntFile = tl.getPathInput('gruntFile', true, true); +tl.debug('check grunt file :' + gruntFile); +var grunt = tl.which('grunt', false); +var isCodeCoverageEnabled = tl.getBoolInput('enableCodeCoverage'); +var publishJUnitResults = tl.getBoolInput('publishJUnitResults'); +var testResultsFiles = tl.getInput('testResultsFiles', publishJUnitResults); +var cwd = tl.getPathInput('cwd', true, false); +tl.mkdirP(cwd); +tl.cd(cwd); + +tl.debug('check path : ' + grunt); +if (!tl.exist(grunt)) { + tl.debug('not found global installed grunt-cli, try to find grunt-cli locally.'); + var gt = tl.tool(tl.which('node', true)); + var gtcli = tl.getInput('gruntCli', true); + gtcli = path.resolve(cwd, gtcli); + tl.debug('check path : ' + gtcli); + if (!tl.exist(gtcli)) { + tl.setResult(tl.TaskResult.Failed, tl.loc('GruntCliNotInstalled', gtcli)); + } + gt.arg(gtcli); +} +else { + var gt = tl.tool(grunt); +} + +if (isCodeCoverageEnabled) { + var npm = tl.tool(tl.which('npm', true)); + npm.line('install istanbul'); + var testFramework = tl.getInput('testFramework', true); + var srcFiles = tl.getInput('srcFiles', false); + var testSrc = tl.getPathInput('testFiles', true, false); + var istanbul = tl.tool(tl.which('node', true)); + istanbul.arg('./node_modules/istanbul/lib/cli.js'); + istanbul.line('cover --report cobertura --report html'); + if (srcFiles) { + istanbul.line('-i .' + path.sep + path.join(srcFiles)); + } + if (testFramework.toLowerCase() == 'jasmine') { + istanbul.line('./node_modules/jasmine/bin/jasmine.js JASMINE_CONFIG_PATH=node_modules/jasmine/lib/examples/jasmine.json'); + } else { + istanbul.arg('./node_modules/mocha/bin/_mocha'); + } + istanbul.arg(testSrc); + var summaryFile = path.join(cwd, 'coverage/cobertura-coverage.xml'); + var reportDirectory = path.join(cwd, 'coverage/'); +} + +// optional - no targets will concat nothing +gt.arg(tl.getDelimitedInput('targets', ' ', false)); +gt.arg(['--gruntfile', gruntFile]); +gt.line(tl.getInput('arguments', false)); +gt.exec().then(function (code) { + publishTestResults(publishJUnitResults, testResultsFiles); + if (isCodeCoverageEnabled) { + npm.exec().then(function () { + istanbul.exec().then(function (code) { + publishCodeCoverage(summaryFile); + tl.setResult(tl.TaskResult.Succeeded, tl.loc('GruntReturnCode', code)); + }).fail(function (err) { + publishCodeCoverage(summaryFile); + tl.debug('taskRunner fail'); + tl.setResult(tl.TaskResult.Failed, tl.loc('IstanbulFailed', err.message)); + }); + }).fail(function (err) { + tl.debug('taskRunner fail'); + tl.setResult(tl.TaskResult.Failed, tl.loc('NpmFailed', err.message)); + }) + } else { + tl.setResult(tl.TaskResult.Succeeded, tl.loc('GruntReturnCode', code)); + } +}).fail(function (err) { + publishTestResults(publishJUnitResults, testResultsFiles); + tl.debug('taskRunner fail'); + tl.setResult(tl.TaskResult.Failed, tl.loc('GruntFailed', err.message)); +}) + +function publishTestResults(publishJUnitResults, testResultsFiles: string) { + if (publishJUnitResults) { + //check for pattern in testResultsFiles + if (testResultsFiles.indexOf('*') >= 0 || testResultsFiles.indexOf('?') >= 0) { + tl.debug('Pattern found in testResultsFiles parameter'); + var buildFolder = tl.getVariable('System.DefaultWorkingDirectory'); + var allFiles = tl.find(buildFolder); + var matchingTestResultsFiles = minimatch.match(allFiles, testResultsFiles, { matchBase: true }); + } + else { + tl.debug('No pattern found in testResultsFiles parameter'); + var matchingTestResultsFiles = [testResultsFiles]; + } + if (!matchingTestResultsFiles  ||  matchingTestResultsFiles.length  ==  0) { + tl.warning('No test result files matching ' + testResultsFiles + ' were found, so publishing JUnit test results is being skipped.'); + return 0; + } + var tp = new tl.TestPublisher("JUnit"); + try { + tp.publish(matchingTestResultsFiles, 'true', "", "", "", 'true'); + } catch (error) { + tl.warning(error); + } + } +} + +function publishCodeCoverage(summaryFile) { + try { + var ccPublisher = new tl.CodeCoveragePublisher(); + ccPublisher.publish('cobertura', summaryFile, reportDirectory, ""); + } catch (error) { + tl.debug(error); + throw error; + } +} \ No newline at end of file diff --git a/_generated/GruntV0/icon.png b/_generated/GruntV0/icon.png new file mode 100644 index 000000000000..d13a10008561 Binary files /dev/null and b/_generated/GruntV0/icon.png differ diff --git a/_generated/GruntV0/icon.svg b/_generated/GruntV0/icon.svg new file mode 100644 index 000000000000..69d4fc4db23c --- /dev/null +++ b/_generated/GruntV0/icon.svg @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_generated/GruntV0/package-lock.json b/_generated/GruntV0/package-lock.json new file mode 100644 index 000000000000..40456472266b --- /dev/null +++ b/_generated/GruntV0/package-lock.json @@ -0,0 +1,483 @@ +{ + "name": "vsts-grunt-task", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/concat-stream": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz", + "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==", + "requires": { + "@types/node": "*" + } + }, + "@types/form-data": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", + "integrity": "sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==", + "requires": { + "@types/node": "*" + } + }, + "@types/mocha": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", + "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==" + }, + "@types/node": { + "version": "16.11.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.60.tgz", + "integrity": "sha512-kYIYa1D1L+HDv5M5RXQeEu1o0FKA6yedZIoyugm/MBPROkLpX4L7HRxMrPVyo8bnvjpW/wDlqFNGzXNMb7AdRw==" + }, + "@types/qs": { + "version": "6.9.8", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.8.tgz", + "integrity": "sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg==" + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "azure-pipelines-task-lib": { + "version": "5.0.0-preview.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-5.0.0-preview.0.tgz", + "integrity": "sha512-uQJEv+q3/7RD7kgphFd33uXijaPwA1ePYoNkAgZpUhbZUtc2u4JL4ujTT/JJfgXBNW/QQNAiDQ2OC7vOQG/0tg==", + "requires": { + "minimatch": "3.0.5", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "sync-request": "6.1.0", + "uuid": "^3.0.1" + }, + "dependencies": { + "minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, + "form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + } + }, + "get-port": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", + "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==" + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "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" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==" + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "http-basic": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", + "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", + "requires": { + "caseless": "^0.12.0", + "concat-stream": "^1.6.2", + "http-response-object": "^3.0.1", + "parse-cache-control": "^1.0.1" + } + }, + "http-response-object": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", + "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", + "requires": { + "@types/node": "^10.0.3" + }, + "dependencies": { + "@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + } + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" + }, + "is-core-module": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "requires": { + "has": "^1.0.3" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, + "parse-cache-control": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", + "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "promise": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", + "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", + "requires": { + "asap": "~2.0.6" + } + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==" + }, + "qs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "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" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "requires": { + "resolve": "^1.1.6" + } + }, + "resolve": { + "version": "1.22.6", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.6.tgz", + "integrity": "sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==", + "requires": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" + }, + "shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, + "sync-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", + "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==", + "requires": { + "http-response-object": "^3.0.1", + "sync-rpc": "^1.2.1", + "then-request": "^6.0.0" + } + }, + "sync-rpc": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz", + "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==", + "requires": { + "get-port": "^3.1.0" + } + }, + "then-request": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", + "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", + "requires": { + "@types/concat-stream": "^1.6.0", + "@types/form-data": "0.0.33", + "@types/node": "^8.0.0", + "@types/qs": "^6.2.31", + "caseless": "~0.12.0", + "concat-stream": "^1.6.0", + "form-data": "^2.2.0", + "http-basic": "^8.1.1", + "http-response-object": "^3.0.1", + "promise": "^8.0.0", + "qs": "^6.4.0" + }, + "dependencies": { + "@types/node": { + "version": "8.10.66", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", + "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==" + } + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, + "typescript": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.2.tgz", + "integrity": "sha512-e4ERvRV2wb+rRZ/IQeb3jm2VxBsirQLpQhdxplZ2MEzGvDkkMmPglecnNDfSUBivMjP93vRbngYYDQqQ/78bcQ==", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + } + } +} diff --git a/_generated/GruntV0/package.json b/_generated/GruntV0/package.json new file mode 100644 index 000000000000..71868740f98e --- /dev/null +++ b/_generated/GruntV0/package.json @@ -0,0 +1,28 @@ +{ + "name": "vsts-grunt-task", + "version": "1.0.0", + "description": "Azure Pipelines Grunt Task", + "main": "grunttask.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/Microsoft/azure-pipelines-tasks.git" + }, + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Microsoft/azure-pipelines-tasks/issues" + }, + "homepage": "https://github.com/Microsoft/azure-pipelines-tasks#readme", + "dependencies": { + "azure-pipelines-task-lib": "^5.0.0-preview.0", + "minimatch": "^3.0.4", + "@types/node": "^16.11.39", + "@types/mocha": "^5.2.7" + }, + "devDependencies": { + "typescript": "4.0.2" + } +} diff --git a/_generated/GruntV0/task.json b/_generated/GruntV0/task.json new file mode 100644 index 000000000000..4a0ed8a9d26e --- /dev/null +++ b/_generated/GruntV0/task.json @@ -0,0 +1,182 @@ +{ + "id": "521D1E15-F5FB-4B73-A93B-B2FE88A9A286", + "name": "Grunt", + "friendlyName": "Grunt", + "description": "Run the Grunt JavaScript task runner", + "helpUrl": "https://docs.microsoft.com/azure/devops/pipelines/tasks/build/grunt", + "helpMarkDown": "[Learn more about this task](https://go.microsoft.com/fwlink/?LinkID=627413) or [see the Grunt documentation](https://gruntjs.com/getting-started)", + "category": "Build", + "visibility": [ + "Build" + ], + "runsOn": [ + "Agent", + "DeploymentGroup" + ], + "author": "Microsoft Corporation", + "version": { + "Major": 0, + "Minor": 229, + "Patch": 0 + }, + "demands": [ + "node.js" + ], + "minimumAgentVersion": "1.91.0", + "groups": [ + { + "name": "advanced", + "displayName": "Advanced", + "isExpanded": false + }, + { + "name": "junitTestResults", + "displayName": "JUnit Test Results", + "isExpanded": true + }, + { + "name": "codeCoverage", + "displayName": "Code Coverage", + "isExpanded": true + } + ], + "instanceNameFormat": "grunt $(targets)", + "inputs": [ + { + "name": "gruntFile", + "type": "filePath", + "label": "Grunt File Path", + "defaultValue": "gruntfile.js", + "required": true, + "helpMarkDown": "Relative path from repo root of the grunt file script file to run." + }, + { + "name": "targets", + "type": "string", + "label": "Grunt Task(s)", + "defaultValue": "", + "helpMarkDown": "Optional. Space delimited list of tasks to run. If not specified, the default task will run.", + "required": false + }, + { + "name": "arguments", + "type": "string", + "label": "Arguments", + "defaultValue": "", + "helpMarkDown": "Additional arguments passed to grunt. --gruntfile is not needed since already added via gruntFile input above.", + "required": false + }, + { + "name": "cwd", + "aliases": [ + "workingDirectory" + ], + "type": "filePath", + "label": "Working Directory", + "defaultValue": "", + "required": false, + "helpMarkDown": "Current working directory when script is run. Defaults to the folder where the script is located.", + "groupName": "advanced" + }, + { + "name": "gruntCli", + "type": "string", + "label": "grunt-cli location", + "defaultValue": "node_modules/grunt-cli/bin/grunt", + "required": true, + "helpMarkDown": "grunt-cli to run when agent can't find global installed grunt-cli Defaults to the grunt-cli under node_modules folder of the working directory.", + "groupName": "advanced" + }, + { + "name": "publishJUnitResults", + "type": "boolean", + "label": "Publish to Azure Pipelines", + "defaultValue": "false", + "groupName": "junitTestResults", + "helpMarkDown": "Select this option to publish JUnit test results produced by the Grunt build to Azure Pipelines." + }, + { + "name": "testResultsFiles", + "type": "filePath", + "label": "Test Results Files", + "defaultValue": "**/TEST-*.xml", + "required": true, + "groupName": "junitTestResults", + "helpMarkDown": "Test results files path. Wildcards can be used. For example, `**/TEST-*.xml` for all XML files whose name starts with TEST-.", + "visibleRule": "publishJUnitResults = true" + }, + { + "name": "testRunTitle", + "type": "string", + "label": "Test Run Title", + "defaultValue": "", + "required": false, + "groupName": "junitTestResults", + "helpMarkDown": "Provide a name for the test run.", + "visibleRule": "publishJUnitResults = true" + }, + { + "name": "enableCodeCoverage", + "type": "boolean", + "label": "Enable Code Coverage", + "defaultValue": "false", + "groupName": "codeCoverage", + "helpMarkDown": "Select this option to enable Code Coverage using Istanbul." + }, + { + "name": "testFramework", + "type": "pickList", + "label": "Test Framework", + "required": false, + "groupName": "codeCoverage", + "defaultValue": "Mocha", + "helpMarkDown": "Select your test framework.", + "options": { + "Mocha": "Mocha", + "Jasmine": "Jasmine" + }, + "visibleRule": "enableCodeCoverage = true" + }, + { + "name": "srcFiles", + "type": "string", + "label": "Source Files", + "defaultValue": "", + "required": false, + "groupName": "codeCoverage", + "helpMarkDown": "Provide the path to your source files which you want to hookRequire()", + "visibleRule": "enableCodeCoverage = true" + }, + { + "name": "testFiles", + "type": "string", + "label": "Test Script Files", + "defaultValue": "test/*.js", + "required": true, + "groupName": "codeCoverage", + "helpMarkDown": "Provide the path to your test script files", + "visibleRule": "enableCodeCoverage = true" + } + ], + "execution": { + "Node10": { + "target": "grunttask.js", + "argumentFormat": "" + }, + "Node16": { + "target": "grunttask.js", + "argumentFormat": "" + } + }, + "messages": { + "GruntCliNotInstalled": "Grunt-cli is not installed globally (or is not in the path of the user the agent is running as) and it is not in the local working folder: %s", + "GruntReturnCode": "Grunt exited with return code: %d", + "GruntFailed": "Grunt failed with error: %s", + "NpmFailed": "Npm failed with error: %s", + "IstanbulFailed": "Istanbul failed with error: %s" + }, + "_buildConfigMapping": { + "Default": "0.229.0", + "Node20-225": "0.229.1" + } +} \ No newline at end of file diff --git a/_generated/GruntV0/task.loc.json b/_generated/GruntV0/task.loc.json new file mode 100644 index 000000000000..cd26bc37f28f --- /dev/null +++ b/_generated/GruntV0/task.loc.json @@ -0,0 +1,182 @@ +{ + "id": "521D1E15-F5FB-4B73-A93B-B2FE88A9A286", + "name": "Grunt", + "friendlyName": "ms-resource:loc.friendlyName", + "description": "ms-resource:loc.description", + "helpUrl": "https://docs.microsoft.com/azure/devops/pipelines/tasks/build/grunt", + "helpMarkDown": "ms-resource:loc.helpMarkDown", + "category": "Build", + "visibility": [ + "Build" + ], + "runsOn": [ + "Agent", + "DeploymentGroup" + ], + "author": "Microsoft Corporation", + "version": { + "Major": 0, + "Minor": 229, + "Patch": 0 + }, + "demands": [ + "node.js" + ], + "minimumAgentVersion": "1.91.0", + "groups": [ + { + "name": "advanced", + "displayName": "ms-resource:loc.group.displayName.advanced", + "isExpanded": false + }, + { + "name": "junitTestResults", + "displayName": "ms-resource:loc.group.displayName.junitTestResults", + "isExpanded": true + }, + { + "name": "codeCoverage", + "displayName": "ms-resource:loc.group.displayName.codeCoverage", + "isExpanded": true + } + ], + "instanceNameFormat": "ms-resource:loc.instanceNameFormat", + "inputs": [ + { + "name": "gruntFile", + "type": "filePath", + "label": "ms-resource:loc.input.label.gruntFile", + "defaultValue": "gruntfile.js", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.gruntFile" + }, + { + "name": "targets", + "type": "string", + "label": "ms-resource:loc.input.label.targets", + "defaultValue": "", + "helpMarkDown": "ms-resource:loc.input.help.targets", + "required": false + }, + { + "name": "arguments", + "type": "string", + "label": "ms-resource:loc.input.label.arguments", + "defaultValue": "", + "helpMarkDown": "ms-resource:loc.input.help.arguments", + "required": false + }, + { + "name": "cwd", + "aliases": [ + "workingDirectory" + ], + "type": "filePath", + "label": "ms-resource:loc.input.label.cwd", + "defaultValue": "", + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.cwd", + "groupName": "advanced" + }, + { + "name": "gruntCli", + "type": "string", + "label": "ms-resource:loc.input.label.gruntCli", + "defaultValue": "node_modules/grunt-cli/bin/grunt", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.gruntCli", + "groupName": "advanced" + }, + { + "name": "publishJUnitResults", + "type": "boolean", + "label": "ms-resource:loc.input.label.publishJUnitResults", + "defaultValue": "false", + "groupName": "junitTestResults", + "helpMarkDown": "ms-resource:loc.input.help.publishJUnitResults" + }, + { + "name": "testResultsFiles", + "type": "filePath", + "label": "ms-resource:loc.input.label.testResultsFiles", + "defaultValue": "**/TEST-*.xml", + "required": true, + "groupName": "junitTestResults", + "helpMarkDown": "ms-resource:loc.input.help.testResultsFiles", + "visibleRule": "publishJUnitResults = true" + }, + { + "name": "testRunTitle", + "type": "string", + "label": "ms-resource:loc.input.label.testRunTitle", + "defaultValue": "", + "required": false, + "groupName": "junitTestResults", + "helpMarkDown": "ms-resource:loc.input.help.testRunTitle", + "visibleRule": "publishJUnitResults = true" + }, + { + "name": "enableCodeCoverage", + "type": "boolean", + "label": "ms-resource:loc.input.label.enableCodeCoverage", + "defaultValue": "false", + "groupName": "codeCoverage", + "helpMarkDown": "ms-resource:loc.input.help.enableCodeCoverage" + }, + { + "name": "testFramework", + "type": "pickList", + "label": "ms-resource:loc.input.label.testFramework", + "required": false, + "groupName": "codeCoverage", + "defaultValue": "Mocha", + "helpMarkDown": "ms-resource:loc.input.help.testFramework", + "options": { + "Mocha": "Mocha", + "Jasmine": "Jasmine" + }, + "visibleRule": "enableCodeCoverage = true" + }, + { + "name": "srcFiles", + "type": "string", + "label": "ms-resource:loc.input.label.srcFiles", + "defaultValue": "", + "required": false, + "groupName": "codeCoverage", + "helpMarkDown": "ms-resource:loc.input.help.srcFiles", + "visibleRule": "enableCodeCoverage = true" + }, + { + "name": "testFiles", + "type": "string", + "label": "ms-resource:loc.input.label.testFiles", + "defaultValue": "test/*.js", + "required": true, + "groupName": "codeCoverage", + "helpMarkDown": "ms-resource:loc.input.help.testFiles", + "visibleRule": "enableCodeCoverage = true" + } + ], + "execution": { + "Node10": { + "target": "grunttask.js", + "argumentFormat": "" + }, + "Node16": { + "target": "grunttask.js", + "argumentFormat": "" + } + }, + "messages": { + "GruntCliNotInstalled": "ms-resource:loc.messages.GruntCliNotInstalled", + "GruntReturnCode": "ms-resource:loc.messages.GruntReturnCode", + "GruntFailed": "ms-resource:loc.messages.GruntFailed", + "NpmFailed": "ms-resource:loc.messages.NpmFailed", + "IstanbulFailed": "ms-resource:loc.messages.IstanbulFailed" + }, + "_buildConfigMapping": { + "Default": "0.229.0", + "Node20-225": "0.229.1" + } +} \ No newline at end of file diff --git a/_generated/GruntV0/tsconfig.json b/_generated/GruntV0/tsconfig.json new file mode 100644 index 000000000000..0438b79f69ac --- /dev/null +++ b/_generated/GruntV0/tsconfig.json @@ -0,0 +1,6 @@ +{ + "compilerOptions": { + "target": "ES6", + "module": "commonjs" + } +} \ No newline at end of file diff --git a/_generated/GruntV0_Node20/.npmrc b/_generated/GruntV0_Node20/.npmrc new file mode 100644 index 000000000000..5fca0d518be7 --- /dev/null +++ b/_generated/GruntV0_Node20/.npmrc @@ -0,0 +1 @@ +scripts-prepend-node-path=true diff --git a/_generated/GruntV0_Node20/Strings/resources.resjson/de-DE/resources.resjson b/_generated/GruntV0_Node20/Strings/resources.resjson/de-DE/resources.resjson new file mode 100644 index 000000000000..b48a7375bc13 --- /dev/null +++ b/_generated/GruntV0_Node20/Strings/resources.resjson/de-DE/resources.resjson @@ -0,0 +1,38 @@ +{ + "loc.friendlyName": "Grunt", + "loc.helpMarkDown": "[Weitere Informationen zu dieser Aufgabe](https://go.microsoft.com/fwlink/?LinkID=627413) oder [Grunt-Dokumentation anzeigen](https://gruntjs.com/getting-started)", + "loc.description": "Grunt-JavaScript-Aufgabenausführung ausführen", + "loc.instanceNameFormat": "grunt $(targets)", + "loc.group.displayName.advanced": "Erweitert", + "loc.group.displayName.junitTestResults": "JUnit-Testergebnisse", + "loc.group.displayName.codeCoverage": "Code Coverage", + "loc.input.label.gruntFile": "Grunt-Dateipfad", + "loc.input.help.gruntFile": "Der relative Pfad vom Repositorystamm der auszuführenden Grunt-Skriptdatei.", + "loc.input.label.targets": "Grunt-Aufgabe(n)", + "loc.input.help.targets": "Optional. Mit Leerzeichen getrennte Liste der auszuführenden Aufgaben. Wenn nicht angegeben, wird die Standardaufgabe ausgeführt.", + "loc.input.label.arguments": "Argumente", + "loc.input.help.arguments": "Zusätzliche Argumente, die an Grunt übergeben werden. \"-gruntfile\" wurde bereits über die gruntFile-Eingabe weiter oben hinzugefügt und ist daher nicht erforderlich.", + "loc.input.label.cwd": "Arbeitsverzeichnis", + "loc.input.help.cwd": "Aktuelles Arbeitsverzeichnis bei Skriptausführung. Standardmäßig der Ordner, in dem das Skript gespeichert ist.", + "loc.input.label.gruntCli": "Speicherort der Grunt-CLI", + "loc.input.help.gruntCli": "Die auszuführende Grunt-CLI, wenn der Agent keine globale Installation der Grunt-CLI findet. Standardmäßig wird die Grunt-CLI im Ordner \"node_modules\" des Arbeitsverzeichnisses verwendet.", + "loc.input.label.publishJUnitResults": "In Azure Pipelines veröffentlichen", + "loc.input.help.publishJUnitResults": "Wählen Sie diese Option aus, um vom Grunt-Bild generierte JUnit-Testergebnisse in Azure Pipelines zu veröffentlichen.", + "loc.input.label.testResultsFiles": "Testergebnisdateien", + "loc.input.help.testResultsFiles": "Der Pfad der Testergebnisdateien. Platzhalter können verwendet werden. Beispiel: \"**/TEST-*.xml\" für alle XML-Dateien, deren Name mit \"TEST-\" beginnt.", + "loc.input.label.testRunTitle": "Testlauftitel", + "loc.input.help.testRunTitle": "Geben Sie einen Namen für den Testlauf an.", + "loc.input.label.enableCodeCoverage": "Code Coverage aktivieren", + "loc.input.help.enableCodeCoverage": "Wählen Sie diese Option aus, um Code Coverage mithilfe von Istanbul zu aktivieren.", + "loc.input.label.testFramework": "Testframework", + "loc.input.help.testFramework": "Wählen Sie das Testframework aus.", + "loc.input.label.srcFiles": "Quelldateien", + "loc.input.help.srcFiles": "Geben Sie den Pfad zu Ihren Quelldateien an, für die hookRequire() gelten soll.", + "loc.input.label.testFiles": "Testskriptdateien", + "loc.input.help.testFiles": "Geben Sie den Pfad zu Ihren Testskriptdateien an.", + "loc.messages.GruntCliNotInstalled": "Die Grunt-CLI ist nicht global installiert (oder befindet sich nicht im Pfad des Benutzers, als der der Agent ausgeführt wird) und befindet sich nicht im lokalen Arbeitsordner: %s", + "loc.messages.GruntReturnCode": "Grunt wurde mit dem folgenden Rückgabecode beendet: %d", + "loc.messages.GruntFailed": "Grunt-Fehler: %s", + "loc.messages.NpmFailed": "Npm-Fehler: %s", + "loc.messages.IstanbulFailed": "Istanbul-Fehler: %s" +} \ No newline at end of file diff --git a/_generated/GruntV0_Node20/Strings/resources.resjson/en-US/resources.resjson b/_generated/GruntV0_Node20/Strings/resources.resjson/en-US/resources.resjson new file mode 100644 index 000000000000..a4d1762ad542 --- /dev/null +++ b/_generated/GruntV0_Node20/Strings/resources.resjson/en-US/resources.resjson @@ -0,0 +1,38 @@ +{ + "loc.friendlyName": "Grunt", + "loc.helpMarkDown": "[Learn more about this task](https://go.microsoft.com/fwlink/?LinkID=627413) or [see the Grunt documentation](https://gruntjs.com/getting-started)", + "loc.description": "Run the Grunt JavaScript task runner", + "loc.instanceNameFormat": "grunt $(targets)", + "loc.group.displayName.advanced": "Advanced", + "loc.group.displayName.junitTestResults": "JUnit Test Results", + "loc.group.displayName.codeCoverage": "Code Coverage", + "loc.input.label.gruntFile": "Grunt File Path", + "loc.input.help.gruntFile": "Relative path from repo root of the grunt file script file to run.", + "loc.input.label.targets": "Grunt Task(s)", + "loc.input.help.targets": "Optional. Space delimited list of tasks to run. If not specified, the default task will run.", + "loc.input.label.arguments": "Arguments", + "loc.input.help.arguments": "Additional arguments passed to grunt. --gruntfile is not needed since already added via gruntFile input above.", + "loc.input.label.cwd": "Working Directory", + "loc.input.help.cwd": "Current working directory when script is run. Defaults to the folder where the script is located.", + "loc.input.label.gruntCli": "grunt-cli location", + "loc.input.help.gruntCli": "grunt-cli to run when agent can't find global installed grunt-cli Defaults to the grunt-cli under node_modules folder of the working directory.", + "loc.input.label.publishJUnitResults": "Publish to Azure Pipelines", + "loc.input.help.publishJUnitResults": "Select this option to publish JUnit test results produced by the Grunt build to Azure Pipelines.", + "loc.input.label.testResultsFiles": "Test Results Files", + "loc.input.help.testResultsFiles": "Test results files path. Wildcards can be used. For example, `**/TEST-*.xml` for all XML files whose name starts with TEST-.", + "loc.input.label.testRunTitle": "Test Run Title", + "loc.input.help.testRunTitle": "Provide a name for the test run.", + "loc.input.label.enableCodeCoverage": "Enable Code Coverage", + "loc.input.help.enableCodeCoverage": "Select this option to enable Code Coverage using Istanbul.", + "loc.input.label.testFramework": "Test Framework", + "loc.input.help.testFramework": "Select your test framework.", + "loc.input.label.srcFiles": "Source Files", + "loc.input.help.srcFiles": "Provide the path to your source files which you want to hookRequire()", + "loc.input.label.testFiles": "Test Script Files", + "loc.input.help.testFiles": "Provide the path to your test script files", + "loc.messages.GruntCliNotInstalled": "Grunt-cli is not installed globally (or is not in the path of the user the agent is running as) and it is not in the local working folder: %s", + "loc.messages.GruntReturnCode": "Grunt exited with return code: %d", + "loc.messages.GruntFailed": "Grunt failed with error: %s", + "loc.messages.NpmFailed": "Npm failed with error: %s", + "loc.messages.IstanbulFailed": "Istanbul failed with error: %s" +} \ No newline at end of file diff --git a/_generated/GruntV0_Node20/Strings/resources.resjson/es-ES/resources.resjson b/_generated/GruntV0_Node20/Strings/resources.resjson/es-ES/resources.resjson new file mode 100644 index 000000000000..1ade6d0a0fe4 --- /dev/null +++ b/_generated/GruntV0_Node20/Strings/resources.resjson/es-ES/resources.resjson @@ -0,0 +1,38 @@ +{ + "loc.friendlyName": "Grunt", + "loc.helpMarkDown": "[Obtener más información acerca de esta tarea](https://go.microsoft.com/fwlink/?LinkID=627413) o [consultar la documentación de Grunt](https://gruntjs.com/getting-started)", + "loc.description": "Inicia el ejecutor Grunt de tareas de JavaScript.", + "loc.instanceNameFormat": "$(targets) de Grunt", + "loc.group.displayName.advanced": "Avanzado", + "loc.group.displayName.junitTestResults": "Resultados de pruebas JUnit", + "loc.group.displayName.codeCoverage": "Cobertura de código", + "loc.input.label.gruntFile": "Ruta de acceso del archivo de Grunt", + "loc.input.help.gruntFile": "Ruta de acceso relativa de la raíz del repositorio del archivo de script Grunt que se va a ejecutar.", + "loc.input.label.targets": "Tarea o tareas de Grunt", + "loc.input.help.targets": "Opcional. Lista de tareas para ejecutar delimitada por espacios. Si no se especifica, se ejecutará la tarea predeterminada.", + "loc.input.label.arguments": "Argumentos", + "loc.input.help.arguments": "Se pasaron argumentos adicionales a Grunt. --gruntfile no es necesario puesto que ya se agregó a través de la entrada gruntFile anterior.", + "loc.input.label.cwd": "Directorio de trabajo", + "loc.input.help.cwd": "Directorio de trabajo actual cuando el script se ejecuta. Se establece de forma predeterminada en la carpeta en la que se encuentra el script.", + "loc.input.label.gruntCli": "ubicación de grunt-cli", + "loc.input.help.gruntCli": "grunt-cli que se ejecuta cuando el agente no encuentra el grunt-cli instalado a nivel global. El elemento grunt-cli de la carpeta node_modules del directorio de trabajo es la opción predeterminada.", + "loc.input.label.publishJUnitResults": "Publicar en Azure Pipelines", + "loc.input.help.publishJUnitResults": "Seleccione esta opción para publicar los resultados de pruebas JUnit generados por la compilación de Grunt en Azure Pipelines.", + "loc.input.label.testResultsFiles": "Archivos de resultados de pruebas", + "loc.input.help.testResultsFiles": "Ruta de acceso a los archivos de resultados de pruebas. Se pueden usar caracteres comodín. Por ejemplo, \"**/TEST-*.xml\" para todos los archivos XML cuyos nombres empiecen por TEST-.", + "loc.input.label.testRunTitle": "Título de la serie de pruebas", + "loc.input.help.testRunTitle": "Asigne un nombre a la serie de pruebas.", + "loc.input.label.enableCodeCoverage": "Habilitar Cobertura de código", + "loc.input.help.enableCodeCoverage": "Seleccione esta opción para habilitar Cobertura de código con Istanbul.", + "loc.input.label.testFramework": "Marco de pruebas", + "loc.input.help.testFramework": "Seleccione su marco de pruebas.", + "loc.input.label.srcFiles": "Archivos de origen", + "loc.input.help.srcFiles": "Proporcione la ruta de acceso a los archivos de origen que quiera para hookRequire().", + "loc.input.label.testFiles": "Archivos de script de prueba", + "loc.input.help.testFiles": "Proporcione la ruta de acceso a sus archivos de script de prueba.", + "loc.messages.GruntCliNotInstalled": "Grunt-cli no está instalado a nivel global (o no está en la ruta del usuario con el que se ejecuta el agente) y no está en la carpeta de trabajo local: %s", + "loc.messages.GruntReturnCode": "Grunt se cerró con el código de retorno: %d", + "loc.messages.GruntFailed": "Error de Grunt: %s", + "loc.messages.NpmFailed": "Error de Npm: %s", + "loc.messages.IstanbulFailed": "Error de Istanbul: %s" +} \ No newline at end of file diff --git a/_generated/GruntV0_Node20/Strings/resources.resjson/fr-FR/resources.resjson b/_generated/GruntV0_Node20/Strings/resources.resjson/fr-FR/resources.resjson new file mode 100644 index 000000000000..8e03a6749118 --- /dev/null +++ b/_generated/GruntV0_Node20/Strings/resources.resjson/fr-FR/resources.resjson @@ -0,0 +1,38 @@ +{ + "loc.friendlyName": "Grunt", + "loc.helpMarkDown": "[En savoir plus sur cette tâche](https://go.microsoft.com/fwlink/?LinkID=627413) ou [consulter la documentation de Grunt](https://gruntjs.com/getting-started)", + "loc.description": "Lancer l'exécuteur de tâches JavaScript Grunt", + "loc.instanceNameFormat": "grunt $(targets)", + "loc.group.displayName.advanced": "Avancé", + "loc.group.displayName.junitTestResults": "Résultats du test JUnit", + "loc.group.displayName.codeCoverage": "Couverture du code", + "loc.input.label.gruntFile": "Chemin d'accès du fichier grunt", + "loc.input.help.gruntFile": "Chemin relatif de la racine de dépôt du fichier script du fichier grunt à exécuter.", + "loc.input.label.targets": "Tâche(s) grunt", + "loc.input.help.targets": "Facultatif. Liste des tâches à exécuter délimitées par des espaces. Si elle n'est pas spécifiée, la tâche par défaut est exécutée.", + "loc.input.label.arguments": "Arguments", + "loc.input.help.arguments": "Arguments supplémentaires passés à grunt. --gruntfile n'est pas nécessaire, car il est déjà ajouté via l'entrée gruntFile ci-dessus.", + "loc.input.label.cwd": "Répertoire de travail", + "loc.input.help.cwd": "Répertoire de travail actuel quand le script est exécuté. Il s'agit généralement du dossier dans lequel se trouve le script.", + "loc.input.label.gruntCli": "Emplacement de grunt-cli", + "loc.input.help.gruntCli": "grunt-cli à exécuter quand l'agent ne trouve pas de grunt-cli global installé. Correspond par défaut à grunt-cli sous le dossier node_modules du répertoire de travail.", + "loc.input.label.publishJUnitResults": "Publier sur Azure Pipelines", + "loc.input.help.publishJUnitResults": "Sélectionnez cette option pour publier les résultats des tests JUnit produits par la build Grunt sur Azure Pipelines.", + "loc.input.label.testResultsFiles": "Fichiers des résultats des tests", + "loc.input.help.testResultsFiles": "Chemin des fichiers de résultats des tests. Les caractères génériques sont autorisés. Par exemple, '**/TEST-*.xml' correspond à tous les fichiers XML dont le nom commence par TEST-.", + "loc.input.label.testRunTitle": "Titre de l'exécution du test", + "loc.input.help.testRunTitle": "Indiquez le nom de la série de tests.", + "loc.input.label.enableCodeCoverage": "Activer la couverture du code", + "loc.input.help.enableCodeCoverage": "Sélectionnez cette option pour activer la couverture du code à l'aide d'Istanbul.", + "loc.input.label.testFramework": "Framework de tests", + "loc.input.help.testFramework": "Sélectionnez votre framework de tests.", + "loc.input.label.srcFiles": "Fichiers sources", + "loc.input.help.srcFiles": "Indiquez le chemin des fichiers sources auxquels vous voulez appliquer hookRequire()", + "loc.input.label.testFiles": "Fichiers de script de test", + "loc.input.help.testFiles": "Indiquez le chemin de vos fichiers de script de test", + "loc.messages.GruntCliNotInstalled": "Grunt-cli n'est pas installé de manière globale, ou ne se trouve pas dans le chemin de l'utilisateur via lequel l'agent s'exécute. De plus, il ne se trouve pas dans le dossier de travail local : %s", + "loc.messages.GruntReturnCode": "Sortie de Grunt. Code de retour : %d", + "loc.messages.GruntFailed": "Échec de Grunt. Erreur : %s", + "loc.messages.NpmFailed": "Échec de Npm. Erreur : %s", + "loc.messages.IstanbulFailed": "Échec d'Istanbul avec l'erreur : %s" +} \ No newline at end of file diff --git a/_generated/GruntV0_Node20/Strings/resources.resjson/it-IT/resources.resjson b/_generated/GruntV0_Node20/Strings/resources.resjson/it-IT/resources.resjson new file mode 100644 index 000000000000..1bcba294fc5e --- /dev/null +++ b/_generated/GruntV0_Node20/Strings/resources.resjson/it-IT/resources.resjson @@ -0,0 +1,38 @@ +{ + "loc.friendlyName": "Grunt", + "loc.helpMarkDown": "[Altre informazioni su questa attività](https://go.microsoft.com/fwlink/?LinkID=627413). In alternativa [vedere la documentazione di Grunt](https://gruntjs.com/getting-started)", + "loc.description": "Esegue lo strumento di esecuzione attività JavaScript di Grunt", + "loc.instanceNameFormat": "grunt $(targets)", + "loc.group.displayName.advanced": "Avanzate", + "loc.group.displayName.junitTestResults": "Risultati del test JUnit", + "loc.group.displayName.codeCoverage": "Code coverage", + "loc.input.label.gruntFile": "Percorso file di grunt", + "loc.input.help.gruntFile": "Percorso relativo dalla radice del repository del file di script del file grunt da eseguire.", + "loc.input.label.targets": "Attività di grunt", + "loc.input.help.targets": "Facoltativo. Elenco di attività delimitate da spazio da eseguire. Se non è specificato, viene eseguita l'attività predefinita.", + "loc.input.label.arguments": "Argomenti", + "loc.input.help.arguments": "Argomenti aggiuntivi passati a grunt. --gruntfile non è necessario perché è stato già aggiunto con l'input gruntFile precedente.", + "loc.input.label.cwd": "Directory di lavoro", + "loc.input.help.cwd": "Directory di lavoro corrente durante l'esecuzione dello script. Per impostazione predefinita, corrisponde alla cartella in cui si trova lo script.", + "loc.input.label.gruntCli": "Percorso grunt-cli", + "loc.input.help.gruntCli": "File grunt-cli da eseguire quando l'agente non riesce a trovare il file grunt-cli installato globale. Per impostazione predefinita, viene usato il file grunt-cli presente nella cartella node_modules della directory di lavoro.", + "loc.input.label.publishJUnitResults": "Pubblica in Azure Pipelines", + "loc.input.help.publishJUnitResults": "Selezionare questa opzione per pubblicare in Azure Pipelines i risultati di test JUnit ottenuti con la compilazione Grunt.", + "loc.input.label.testResultsFiles": "File dei risultati del test", + "loc.input.help.testResultsFiles": "Percorso dei file dei risultati del test. È possibile usare i caratteri jolly, ad esempio `**/TEST-*.xml` per individuare tutti i file XML il cui nome inizia con TEST-.", + "loc.input.label.testRunTitle": "Titolo esecuzione dei test", + "loc.input.help.testRunTitle": "Consente di specificare un nome per l'esecuzione dei test.", + "loc.input.label.enableCodeCoverage": "Abilita code coverage", + "loc.input.help.enableCodeCoverage": "Selezionare questa opzione per abilitare il code coverage con Istanbul.", + "loc.input.label.testFramework": "Framework di test", + "loc.input.help.testFramework": "Consente di selezionare il framework di test.", + "loc.input.label.srcFiles": "File di origine", + "loc.input.help.srcFiles": "Consente di specificare il percorso dei file di origine per hookRequire()", + "loc.input.label.testFiles": "File di script di test", + "loc.input.help.testFiles": "Consente di specificare il percorso dei file di script di test", + "loc.messages.GruntCliNotInstalled": "Grunt-cli non è installato globalmente oppure non è presente nel percorso dell'utente con cui viene eseguito l'agente e non è incluso nella cartella di lavoro locale %s", + "loc.messages.GruntReturnCode": "Grunt terminato. Codice restituito: %d", + "loc.messages.GruntFailed": "Grunt non riuscito. Errore: %s", + "loc.messages.NpmFailed": "Npm non riuscito. Errore: %s", + "loc.messages.IstanbulFailed": "Istanbul non riuscito. Errore: %s" +} \ No newline at end of file diff --git a/_generated/GruntV0_Node20/Strings/resources.resjson/ja-JP/resources.resjson b/_generated/GruntV0_Node20/Strings/resources.resjson/ja-JP/resources.resjson new file mode 100644 index 000000000000..eb8a32712ba8 --- /dev/null +++ b/_generated/GruntV0_Node20/Strings/resources.resjson/ja-JP/resources.resjson @@ -0,0 +1,38 @@ +{ + "loc.friendlyName": "Grunt", + "loc.helpMarkDown": "[このタスクの詳細を表示](https://go.microsoft.com/fwlink/?LinkID=627413)、または [Grunt のドキュメントを参照](https://gruntjs.com/getting-started)", + "loc.description": "Grunt JavaScript タスク ランナーを実行します", + "loc.instanceNameFormat": "grunt $(targets)", + "loc.group.displayName.advanced": "詳細設定", + "loc.group.displayName.junitTestResults": "JUnit のテスト結果", + "loc.group.displayName.codeCoverage": "コード カバレッジ", + "loc.input.label.gruntFile": "Grunt ファイルのパス", + "loc.input.help.gruntFile": "実行する Grunt スクリプト ファイルのリポジトリのルートからの相対パス。", + "loc.input.label.targets": "Grunt タスク", + "loc.input.help.targets": "(省略可能) スペース区切りの実行タスクのリスト。指定しない場合は、既定のタスクが実行されます。", + "loc.input.label.arguments": "引数", + "loc.input.help.arguments": "Grunt に渡される追加引数。上記の gruntFile 入力で既に追加されているので、--gruntfile は不要です。", + "loc.input.label.cwd": "作業ディレクトリ", + "loc.input.help.cwd": "スクリプトの実行時の現行の作業ディレクトリ。スクリプトが配置されているフォルダーを既定値に使用します。", + "loc.input.label.gruntCli": "grunt-cli の場所", + "loc.input.help.gruntCli": "グローバルにインストールされた grunt-cli をエージェントが見つけられない場合に実行する grunt-cli。既定値は、作業ディレクトリの node_modules フォルダーの下にある grunt-cli です。", + "loc.input.label.publishJUnitResults": "Azure Pipelines に公開する", + "loc.input.help.publishJUnitResults": "Grunt のビルドによって生成される JUnit のテスト結果を Azure Pipelines に公開するには、このオプションを選びます。", + "loc.input.label.testResultsFiles": "テスト結果のファイル", + "loc.input.help.testResultsFiles": "テスト結果ファイルのパス。ワイルドカードを使用できます。たとえば、名前が TEST- で始まるすべての XML ファイルの場合は `**/TEST-*.xml` です。", + "loc.input.label.testRunTitle": "テスト実行のタイトル", + "loc.input.help.testRunTitle": "テストの実行の名前を指定します。", + "loc.input.label.enableCodeCoverage": "コード カバレッジを有効にする", + "loc.input.help.enableCodeCoverage": "Istanbul を使用してコード カバレッジを有効にするには、このオプションを選びます。", + "loc.input.label.testFramework": "テスト フレームワーク", + "loc.input.help.testFramework": "テスト フレームワークを選びます。", + "loc.input.label.srcFiles": "ソース ファイル", + "loc.input.help.srcFiles": "hookRequire() を実行しようとしているソース ファイルへのパスを指定します", + "loc.input.label.testFiles": "テスト スクリプト ファイル", + "loc.input.help.testFiles": "テスト スクリプト ファイルへのパスを指定します", + "loc.messages.GruntCliNotInstalled": "Grunt-cli はグローバルにインストールされていません (またはエージェントが実行しているユーザーのパスにありません)。またローカル作業フォルダーにありません: %s", + "loc.messages.GruntReturnCode": "Grunt は、リターン コードを伴って終了しました: %d", + "loc.messages.GruntFailed": "Grunt でエラーが発生しました: %s", + "loc.messages.NpmFailed": "Npm でエラーが発生しました: %s", + "loc.messages.IstanbulFailed": "Istanbul でエラーが発生しました: %s" +} \ No newline at end of file diff --git a/_generated/GruntV0_Node20/Strings/resources.resjson/ko-KR/resources.resjson b/_generated/GruntV0_Node20/Strings/resources.resjson/ko-KR/resources.resjson new file mode 100644 index 000000000000..90bb41e452c5 --- /dev/null +++ b/_generated/GruntV0_Node20/Strings/resources.resjson/ko-KR/resources.resjson @@ -0,0 +1,38 @@ +{ + "loc.friendlyName": "Grunt", + "loc.helpMarkDown": "[이 작업에 대한 자세한 정보](https://go.microsoft.com/fwlink/?LinkID=627413) 또는 [Grunt 설명서 참조](https://gruntjs.com/getting-started)", + "loc.description": "Grunt JavaScript 작업 실행기를 실행합니다.", + "loc.instanceNameFormat": "grunt $(targets)", + "loc.group.displayName.advanced": "고급", + "loc.group.displayName.junitTestResults": "JUnit 테스트 결과", + "loc.group.displayName.codeCoverage": "코드 검사", + "loc.input.label.gruntFile": "Grunt 파일 경로", + "loc.input.help.gruntFile": "실행할 grunt 파일 스크립트 파일의 리포 루트로부터의 상대 경로입니다.", + "loc.input.label.targets": "Grunt 작업", + "loc.input.help.targets": "선택 사항. 공백으로 구분된 실행할 작업 목록입니다. 지정하지 않을 경우 기본 작업이 실행됩니다.", + "loc.input.label.arguments": "인수", + "loc.input.help.arguments": "추가 인수가 grunt로 전달되었습니다. --gruntfile은 위의 gruntFile 입력을 통해 이미 추가되었으므로 필요하지 않습니다.", + "loc.input.label.cwd": "작업 디렉터리", + "loc.input.help.cwd": "스크립트 실행 시 현재 작업 디렉터리입니다. 기본값을 스크립트가 있는 폴더로 지정합니다.", + "loc.input.label.gruntCli": "Grunt-cli 위치", + "loc.input.help.gruntCli": "에이전트에서 전역 설치 Grunt-cli를 찾을 수 없을 때 실행할 Grunt-cli입니다. 기본값은 작업 디렉터리의 node_modules 폴더 아래에 있는 Grunt-cli입니다.", + "loc.input.label.publishJUnitResults": "Azure Pipelines/에 게시", + "loc.input.help.publishJUnitResults": "Grunt 빌드에서 생성된 JUnit 테스트 결과를 Azure Pipelines에 게시하려면 이 옵션을 선택합니다.", + "loc.input.label.testResultsFiles": "테스트 결과 파일", + "loc.input.help.testResultsFiles": "테스트 결과 파일 경로입니다. 와일드카드를 사용할 수 있습니다. 예를 들어, 이름이 TEST-로 시작하는 모든 XML 파일을 표시하기 위해 `**/TEST-*.xml`을 사용할 수 있습니다.", + "loc.input.label.testRunTitle": "테스트 실행 제목", + "loc.input.help.testRunTitle": "테스트 실행의 이름을 지정하세요.", + "loc.input.label.enableCodeCoverage": "코드 검사 사용", + "loc.input.help.enableCodeCoverage": "Istanbul을 사용하여 코드 검사를 사용하도록 설정하려면 이 옵션을 선택하세요.", + "loc.input.label.testFramework": "테스트 프레임워크", + "loc.input.help.testFramework": "테스트 프레임워크를 선택하세요.", + "loc.input.label.srcFiles": "소스 파일", + "loc.input.help.srcFiles": "hookRequire()를 적용할 소스 파일의 경로를 지정하세요.", + "loc.input.label.testFiles": "테스트 스크립트 파일", + "loc.input.help.testFiles": "테스트 스크립트 파일의 경로를 지정하세요.", + "loc.messages.GruntCliNotInstalled": "Grunt-cli가 전역으로 설치되지 않았거나 에이전트가 실행 중인 사용자 경로에 없으며 로컬 작업 폴더 %s에 없습니다.", + "loc.messages.GruntReturnCode": "반환 코드 %d(으)로 Grunt 종료", + "loc.messages.GruntFailed": "오류 %s(으)로 Grunt 실패", + "loc.messages.NpmFailed": "오류 %s(으)로 Npm 실패", + "loc.messages.IstanbulFailed": "다음 오류가 발생하여 Istanbul이 실패했습니다. %s" +} \ No newline at end of file diff --git a/_generated/GruntV0_Node20/Strings/resources.resjson/ru-RU/resources.resjson b/_generated/GruntV0_Node20/Strings/resources.resjson/ru-RU/resources.resjson new file mode 100644 index 000000000000..601fe1618204 --- /dev/null +++ b/_generated/GruntV0_Node20/Strings/resources.resjson/ru-RU/resources.resjson @@ -0,0 +1,38 @@ +{ + "loc.friendlyName": "Grunt", + "loc.helpMarkDown": "[См. дополнительные сведения об этой задаче](https://go.microsoft.com/fwlink/?LinkID=627413) или [документацию по Grunt](https://gruntjs.com/getting-started)", + "loc.description": "Запустить запускатель задач JavaScript Grunt", + "loc.instanceNameFormat": "grunt $(targets)", + "loc.group.displayName.advanced": "Дополнительно", + "loc.group.displayName.junitTestResults": "Результаты теста JUnit", + "loc.group.displayName.codeCoverage": "Объем протестированного кода", + "loc.input.label.gruntFile": "Путь к файлу Grunt", + "loc.input.help.gruntFile": "Относительный путь от корня репозитория для запускаемого файла скрипта файла Grunt.", + "loc.input.label.targets": "Задачи Grunt", + "loc.input.help.targets": "Необязательно. Список запускаемых задач с разделителями-пробелами. Если он не указан, будет запущена задача по умолчанию.", + "loc.input.label.arguments": "Аргументы", + "loc.input.help.arguments": "Дополнительные аргументы, переданные Grunt. Параметр --gruntfile не требуется, так как он уже добавлен с помощью ввода gruntFile выше.", + "loc.input.label.cwd": "Рабочий каталог", + "loc.input.help.cwd": "Текущий рабочий каталог при выполнении сценария. По умолчанию используется папка, в которой находится сценарий.", + "loc.input.label.gruntCli": "Расположение grunt-cli", + "loc.input.help.gruntCli": "Grunt-cli, который будет запущен, если агенту не удастся найти глобально установленный grunt-cli. Значение по умолчанию — grunt-cli в папке node_modules в рабочем каталоге.", + "loc.input.label.publishJUnitResults": "Опубликовать в Azure Pipelines", + "loc.input.help.publishJUnitResults": "Выберите этот параметр, чтобы опубликовать результаты тестов JUnit, созданные сборкой Grunt, в Azure Pipelines.", + "loc.input.label.testResultsFiles": "Файлы результатов тестов", + "loc.input.help.testResultsFiles": "Путь к файлам результатов тестов. Можно использовать подстановочные знаки. Пример: \"**/TEST-*.xml\" для всех XML-файлов, имена которых начинаются с \"TEST-\".", + "loc.input.label.testRunTitle": "Заголовок тестового запуска", + "loc.input.help.testRunTitle": "Укажите имя для тестового запуска.", + "loc.input.label.enableCodeCoverage": "Включить оценку объема протестированного кода", + "loc.input.help.enableCodeCoverage": "Выберите этот параметр, чтобы включить оценку объема протестированного кода с помощью Istanbul.", + "loc.input.label.testFramework": "Платформа тестирования", + "loc.input.help.testFramework": "Выберите платформу тестирования.", + "loc.input.label.srcFiles": "Исходные файлы", + "loc.input.help.srcFiles": "Укажите путь к исходным файлам, к которым необходимо применить метод hookRequire()", + "loc.input.label.testFiles": "Файлы скриптов тестирования", + "loc.input.help.testFiles": "Укажите путь к файлам скриптов тестирования", + "loc.messages.GruntCliNotInstalled": "Grunt-cli не установлен глобально (или не находится в пути пользователя, от имени которого выполняется агент) и не находится в локальной рабочей папке: %s", + "loc.messages.GruntReturnCode": "Завершение работы Grunt с кодом возврата: %d", + "loc.messages.GruntFailed": "Сбой Grunt с ошибкой: %s", + "loc.messages.NpmFailed": "Сбой NPM с ошибкой: %s", + "loc.messages.IstanbulFailed": "Сбой Istanbul с ошибкой: %s" +} \ No newline at end of file diff --git a/_generated/GruntV0_Node20/Strings/resources.resjson/zh-CN/resources.resjson b/_generated/GruntV0_Node20/Strings/resources.resjson/zh-CN/resources.resjson new file mode 100644 index 000000000000..8a429de31c3c --- /dev/null +++ b/_generated/GruntV0_Node20/Strings/resources.resjson/zh-CN/resources.resjson @@ -0,0 +1,38 @@ +{ + "loc.friendlyName": "Grunt", + "loc.helpMarkDown": "[详细了解此任务](https://go.microsoft.com/fwlink/?LinkID=627413)或[参阅 Grunt 文档](https://gruntjs.com/getting-started)", + "loc.description": "运行 Grunt JavaScript 任务运行程序", + "loc.instanceNameFormat": "Grunt $(targets)", + "loc.group.displayName.advanced": "高级", + "loc.group.displayName.junitTestResults": "JUnit 测试结果", + "loc.group.displayName.codeCoverage": "代码覆盖率", + "loc.input.label.gruntFile": "Grunt 文件路径", + "loc.input.help.gruntFile": "待运行 Grunt 文件脚本文件的存储库根路径的相对路径。", + "loc.input.label.targets": "Grunt 任务", + "loc.input.help.targets": "可选。待运行任务的列表,以空格分隔。如未指定,则将运行默认任务。", + "loc.input.label.arguments": "参数", + "loc.input.help.arguments": "传递给 Grunt 的其他参数。不需要 --gruntfile,因为已通过上面的 gruntFile 输入进行添加。", + "loc.input.label.cwd": "工作目录", + "loc.input.help.cwd": "脚本运行时的当前工作目录。默认为脚本所处的文件夹。", + "loc.input.label.gruntCli": "Grunt-cli 位置", + "loc.input.help.gruntCli": "代理找不到全局安装的 Grunt-cli 时要运行的 Grunt-cli。默认为工作目录的 node_modules 文件夹下的 Grunt-cli。", + "loc.input.label.publishJUnitResults": "发布到 Azure Pipelines", + "loc.input.help.publishJUnitResults": "选择此选项可将 Grunt 生成产生的 JUnit 测试结果发布到 Azure Pipelines。", + "loc.input.label.testResultsFiles": "测试结果文件", + "loc.input.help.testResultsFiles": "测试结果文件路径。可以使用通配符。例如,\"**/TEST-*.xml\" 表示名称以 TEST- 开头的所有 XML 文件。", + "loc.input.label.testRunTitle": "测试运行标题", + "loc.input.help.testRunTitle": "为测试运行提供一个名称。", + "loc.input.label.enableCodeCoverage": "启用代码覆盖率", + "loc.input.help.enableCodeCoverage": "选择此选项以使用 Istanbul 启用代码覆盖率。", + "loc.input.label.testFramework": "测试框架", + "loc.input.help.testFramework": "选择你的测试框架。", + "loc.input.label.srcFiles": "源文件", + "loc.input.help.srcFiles": "将你所需的源文件路径提供给 hookRequire()", + "loc.input.label.testFiles": "测试脚本文件", + "loc.input.help.testFiles": "提供测试脚本文件的路径", + "loc.messages.GruntCliNotInstalled": "Grunt-cli 未全局安装(或不位于代理运行身份用户的路径下),且不位于本地工作文件夹中: %s", + "loc.messages.GruntReturnCode": "Grunt 已退出,返回代码为: %d", + "loc.messages.GruntFailed": "Grunt 失败,出现错误: %s", + "loc.messages.NpmFailed": "Npm 失败,出现错误: %s", + "loc.messages.IstanbulFailed": "Istanbul 失败,出现错误: %s" +} \ No newline at end of file diff --git a/_generated/GruntV0_Node20/Strings/resources.resjson/zh-TW/resources.resjson b/_generated/GruntV0_Node20/Strings/resources.resjson/zh-TW/resources.resjson new file mode 100644 index 000000000000..0077270bdd41 --- /dev/null +++ b/_generated/GruntV0_Node20/Strings/resources.resjson/zh-TW/resources.resjson @@ -0,0 +1,38 @@ +{ + "loc.friendlyName": "Grunt", + "loc.helpMarkDown": "[深入了解此工作](https://go.microsoft.com/fwlink/?LinkID=627413)或[參閱 Grunt 文件](https://gruntjs.com/getting-started)", + "loc.description": "執行 Grunt JavaScript 工作執行器", + "loc.instanceNameFormat": "Grunt $(targets)", + "loc.group.displayName.advanced": "進階", + "loc.group.displayName.junitTestResults": "JUnit 測試結果", + "loc.group.displayName.codeCoverage": "程式碼涵蓋範圍", + "loc.input.label.gruntFile": "Grunt 檔案路徑", + "loc.input.help.gruntFile": "要執行之 grunt 檔案指令檔存放庫根路徑目錄的相對路徑。", + "loc.input.label.targets": "Grunt 工作", + "loc.input.help.targets": "可省略。以空格分隔要執行之工作的清單。若未指定,將會執行預設工作。", + "loc.input.label.arguments": "引數", + "loc.input.help.arguments": "傳遞給 Grunt 的額外引數。 因為 --gruntfile 已經由前述的 gruntFile 輸入加入,所以無須再提供。", + "loc.input.label.cwd": "工作目錄", + "loc.input.help.cwd": "執行指令碼後的目前工作目錄。預設為指令碼所在的資料夾。", + "loc.input.label.gruntCli": "grunt-cli 位置", + "loc.input.help.gruntCli": "當代理程式找不到全域安裝的 grunt-cli 時所要執行的 grunt-cli,預設為工作目錄 node_modules 資料夾下的 grunt-cli。", + "loc.input.label.publishJUnitResults": "發佈至 Azure Pipelines", + "loc.input.help.publishJUnitResults": "選取此選項會將 Grunt 組建所產生的 JUnit 測試結果發佈至 Azure Pipelines。", + "loc.input.label.testResultsFiles": "測試結果檔案", + "loc.input.help.testResultsFiles": "測試結果檔案路徑。可使用萬用字元。例如 `**/TEST-*.xml` 即適用於所有名稱開頭為 TEST- 的 XML 檔案。", + "loc.input.label.testRunTitle": "測試回合標題", + "loc.input.help.testRunTitle": "提供測試回合的名稱。", + "loc.input.label.enableCodeCoverage": "啟用程式碼涵蓋範圍", + "loc.input.help.enableCodeCoverage": "選取這個選項,以使用 Istanbul 啟用程式碼涵蓋範圍。", + "loc.input.label.testFramework": "測試架構", + "loc.input.help.testFramework": "選取測試架構。", + "loc.input.label.srcFiles": "原始程式檔", + "loc.input.help.srcFiles": "提供要進行 hookRequire() 之原始程式檔的路徑", + "loc.input.label.testFiles": "測試指令檔", + "loc.input.help.testFiles": "提供測試指令碼檔案的路徑", + "loc.messages.GruntCliNotInstalled": "Grunt-cli 未全域安裝 (或不在作為代理程式執行身分的使用者路徑中) 且不在本機工作資料夾: %s", + "loc.messages.GruntReturnCode": "Grunt 已結束,傳回碼為: %d", + "loc.messages.GruntFailed": "Grunt 失敗,錯誤為: %s", + "loc.messages.NpmFailed": "Npm 失敗,錯誤為: %s", + "loc.messages.IstanbulFailed": "Istanbul 失敗,錯誤為: %s" +} \ No newline at end of file diff --git a/_generated/GruntV0_Node20/Tests/L0.ts b/_generated/GruntV0_Node20/Tests/L0.ts new file mode 100644 index 000000000000..f799f61e4710 --- /dev/null +++ b/_generated/GruntV0_Node20/Tests/L0.ts @@ -0,0 +1,244 @@ +import fs = require('fs'); +import os = require('os'); +import assert = require('assert'); +import path = require('path'); +import * as ttm from 'azure-pipelines-task-lib/mock-test'; + +const isWin = os.type().match(/^Win/); + +describe('GruntV0 Suite', function () { + this.timeout(parseInt(process.env.TASK_TEST_TIMEOUT) || 20000); + + before((done: Mocha.Done) => { + process.env['SYSTEM_DEFAULTWORKINGDIRECTORY'] = '/user/build'; + done(); + }); + + it('runs a gruntFile through global grunt-cli', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0GruntGlobalGood.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.ran('/usr/local/bin/grunt --gruntfile gruntfile.js'), 'it should have run grunt'); + assert(tr.invokedToolCount == 1, 'should have only run grunt'); + assert(tr.stderr.length == 0, 'should not have written to stderr'); + assert(tr.succeeded, 'task should have succeeded'); + + done(); + }); + + it('runs a gruntFile through local grunt-cli', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0GruntLocalGood.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + if (isWin) { + assert( + tr.ran('/usr/local/bin/node c:\\fake\\wd\\node_modules\\grunt-cli\\bin\\grunt --gruntfile gruntfile.js'), + 'it should have run grunt' + ); + } else { + assert( + tr.ran('/usr/local/bin/node /fake/wd/node_modules/grunt-cli/bin/grunt --gruntfile gruntfile.js'), + 'it should have run grunt' + ); + } + assert(tr.invokedToolCount == 1, 'should have only run grunt'); + assert(tr.stderr.length == 0, 'should not have written to stderr'); + assert(tr.succeeded, 'task should have succeeded'); + + done(); + }); + + it('runs a gruntFile when code coverage is enabled', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0GruntFileWithCodeCoverage.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.ran('/usr/local/bin/grunt --gruntfile gruntfile.js'), 'it should have run grunt'); + assert(tr.invokedToolCount == 3, 'should have only npm, grunt and istanbul'); + assert(tr.stderr.length == 0, 'should not have written to stderr'); + assert(tr.succeeded, 'task should have succeeded'); + + done(); + }); + + it('runs a gruntFile when publishJUnitTestResults is false', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0publishJUnitTestResultIsFalse.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.ran('/usr/local/bin/grunt --gruntfile gruntfile.js'), 'it should have run grunt'); + assert(tr.invokedToolCount == 1, 'should have only run grunt'); + assert(tr.stderr.length == 0, 'should not have written to stderr'); + assert(tr.succeeded, 'task should have succeeded'); + + done(); + }); + + it('fails if grunt-cli no exist globally and locally', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0GruntNoGruntCli.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.stdOutContained('loc_mock_GruntCliNotInstalled'), 'Should have printed: loc_mock_GruntCliNotInstalled'); + assert(tr.failed, 'task should have failed'); + + done(); + }); + + it('errors if gruntfile not found', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0NoGruntFile.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.stdOutContained('Not found gruntfile.js'), 'Should have printed: Not found gruntfile.js'); + assert(tr.invokedToolCount == 0, 'should exit before running Grunt'); + assert(tr.failed, 'should have failed'); + + done(); + }); + + it('fails if npm fails', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0NpmFails.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.invokedToolCount == 2, 'should have only run npm'); + assert(tr.stdOutContained('loc_mock_NpmFailed'), 'Should have printed: loc_mock_NpmFailed'); + assert(tr.failed, 'task should have failed'); + + done(); + }); + + it('fails if grunt fails', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0GruntFails.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.ran('/usr/local/bin/grunt build test --gruntfile gruntfile.js -v'), 'it should have run grunt'); + assert(tr.invokedToolCount == 1, 'should have only run npm and Grunt'); + // success scripts don't necessarily set a result + assert(tr.stdOutContained('loc_mock_GruntFailed'), 'Should have printed: loc_mock_GruntFailed'); + assert(tr.failed, 'task should have failed'); + + done(); + }); + + it('fails if istanbul fails', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0IstanbulFails.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.invokedToolCount == 3, 'should have only run npm and Grunt'); + assert(tr.stdOutContained('loc_mock_IstanbulFailed'), 'Should have printed: loc_mock_IstanbulFailed'); + assert(tr.failed, 'task should have failed'); + + done(); + }); + + it('errors if cwd not set', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0CwdNotSet.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.stdOutContained('Input required: cwd'), 'Should have printed: Input required: cwd'); + assert(tr.invokedToolCount == 0, 'should exit before running Grunt'); + assert(tr.failed, 'should have failed'); + + done(); + }); + + it('errors if gruntFile not set', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0GruntFileNotSet.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.stdOutContained('Input required: gruntFile'), 'Should have printed: Input required: gruntFile'); + assert(tr.invokedToolCount == 0, 'should exit before running Grunt'); + assert(tr.failed, 'should have failed'); + + done(); + }); + + it('errors if gruntCli not set', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0GruntCliNotSet.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.stdOutContained('Input required: gruntCli'), 'Should have printed: Input required: gruntCli'); + assert(tr.invokedToolCount == 0, 'should exit before running Grunt'); + assert(tr.failed, 'should have failed'); + + done(); + }); + + it('Fails when test result files input is not provided', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0TestResultFilesNotSet.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.invokedToolCount == 0, 'should exit before running gulp'); + assert(tr.failed, 'task should have failed'); + assert(tr.stdOutContained('Input required: testResultsFiles'), 'Should have printed: Input required: testResultsFiles'); + + done(); + }); + + it('gives warning and runs when test result files input does not match any file', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0TestResultFilesDoesNotMatchAnyFile.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.ran('/usr/local/bin/grunt --gruntfile gruntfile.js'), 'it should have run grunt'); + assert(tr.invokedToolCount == 1, 'should run completely'); + assert( + tr.stdout.search('No pattern found in testResultsFiles parameter') >= 0, + 'should give a warning for test file pattern not matched.' + ); + assert(tr.succeeded, 'task should have succeeded'); + + done(); + }); + + it('Fails when test source files input is not provided for coverage', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0NoTestSourceFiles.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.invokedToolCount == 0, 'should exit before running grunt'); + assert(tr.stdOutContained('Input required: testFiles'), 'Should have printed: Input required: testFiles'); + assert(tr.failed, 'task should have failed'); + + done(); + }); + + it('fails when test source files input does not match any file', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0InvalidTestSource.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.failed, 'task should have failed'); + assert(tr.invokedToolCount == 3, 'should exit while running istanbul'); + assert(tr.stdOutContained('loc_mock_IstanbulFailed'), 'Should have printed: loc_mock_IstanbulFailed'); + assert(tr.failed, 'task should have failed'); + + done(); + }); +}); diff --git a/_generated/GruntV0_Node20/Tests/L0CwdNotSet.ts b/_generated/GruntV0_Node20/Tests/L0CwdNotSet.ts new file mode 100644 index 000000000000..21a2bd95150b --- /dev/null +++ b/_generated/GruntV0_Node20/Tests/L0CwdNotSet.ts @@ -0,0 +1,60 @@ +import ma = require("azure-pipelines-task-lib/mock-answer"); +import tmrm = require("azure-pipelines-task-lib/mock-run"); +import path = require("path"); + +let taskPath = path.join(__dirname, "..", "grunttask.js"); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput("gruntFile", "gruntfile.js"); +tr.setInput("publishJUnitResults", "true"); +tr.setInput("testResultsFiles", "**/build/test-results/TEST-*.xml"); +tr.setInput("enableCodeCoverage", "false"); +tr.setInput("gruntCli", "node_modules/grunt-cli/bin/grunt"); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "grunt": "/usr/local/bin/grunt", + "npm": "/usr/local/bin/npm", + "node": "/usr/local/bin/node", + "istanbulWin": "/usr/local/bin/istanbul", + "istanbul": "/usr/local/bin/node_modules/istanbul/lib/cli.js", + }, + "exec": { + "/usr/local/bin/grunt --gruntfile gruntfile.js": { + "code": 0, + "stdout": "grunt output here", + }, + "/usr/local/bin/npm install istanbul": { + "code": 0, + "stdout": "npm output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i ./**/build/src/*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 0, + "stdout": "istanbul output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i .\\**\\build\\src\\*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 0, + "stdout": "istanbul output here", + }, + }, + "checkPath": { + "/usr/local/bin/grunt": true, + "/usr/local/bin/npm": true, + "/usr/local/bin/node": true, + "/usr/local/bin/istanbul": true, + "/usr/local/bin/node_modules/istanbul/lib/cli.js": true, + "gruntfile.js": true, + "**/build/test/*.js": true, + }, + "exist": { + "/usr/local/bin/grunt": true, + }, + "match": { + "**/TEST-*.xml": ["/user/build/fun/test-123.xml"], + "**/*.js": ["/test/test.js"], + }, +}; +tr.setAnswers(a); + +tr.run(); diff --git a/_generated/GruntV0_Node20/Tests/L0GruntCliNotSet.ts b/_generated/GruntV0_Node20/Tests/L0GruntCliNotSet.ts new file mode 100644 index 000000000000..fc3b09ed8d4e --- /dev/null +++ b/_generated/GruntV0_Node20/Tests/L0GruntCliNotSet.ts @@ -0,0 +1,57 @@ +import ma = require("azure-pipelines-task-lib/mock-answer"); +import tmrm = require("azure-pipelines-task-lib/mock-run"); +import path = require("path"); + +let taskPath = path.join(__dirname, "..", "grunttask.js"); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput("gruntFile", "gruntfile.js"); +tr.setInput("cwd", "fake/wd"); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "grunt": "/usr/local/bin/grunt", + "npm": "/usr/local/bin/npm", + "node": "/usr/local/bin/node", + "istanbulWin": "/usr/local/bin/istanbul", + "istanbul": "/usr/local/bin/node_modules/istanbul/lib/cli.js", + }, + "exec": { + "/usr/local/bin/grunt --gruntfile gruntfile.js": { + "code": 0, + "stdout": "grunt output here", + }, + "/usr/local/bin/npm install istanbul": { + "code": 0, + "stdout": "npm output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i ./**/build/src/*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 0, + "stdout": "istanbul output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i .\\**\\build\\src\\*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 0, + "stdout": "istanbul output here", + }, + }, + "checkPath": { + "/usr/local/bin/grunt": true, + "/usr/local/bin/npm": true, + "/usr/local/bin/node": true, + "/usr/local/bin/istanbul": true, + "/usr/local/bin/node_modules/istanbul/lib/cli.js": true, + "gruntfile.js": true, + "**/build/test/*.js": true, + }, + "exist": { + "/usr/local/bin/grunt": false, + }, + "match": { + "**/TEST-*.xml": ["/user/build/fun/test-123.xml"], + "**/*.js": ["/test/test.js"], + }, +}; +tr.setAnswers(a); + +tr.run(); diff --git a/_generated/GruntV0_Node20/Tests/L0GruntFails.ts b/_generated/GruntV0_Node20/Tests/L0GruntFails.ts new file mode 100644 index 000000000000..0dedef59fe59 --- /dev/null +++ b/_generated/GruntV0_Node20/Tests/L0GruntFails.ts @@ -0,0 +1,63 @@ +import ma = require("azure-pipelines-task-lib/mock-answer"); +import tmrm = require("azure-pipelines-task-lib/mock-run"); +import path = require("path"); +import os = require("os"); + +let taskPath = path.join(__dirname, "..", "grunttask.js"); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput("gruntFile", "gruntfile.js"); +tr.setInput("publishJUnitResults", "true"); +tr.setInput("testResultsFiles", "**/build/test-results/TEST-*.xml"); +tr.setInput("enableCodeCoverage", "false"); +if (os.type().match(/^Win/)) { + tr.setInput("cwd", "c:/fake/wd"); +} else { + tr.setInput("cwd", "/fake/wd"); +} +tr.setInput("targets", "build test"); +tr.setInput("arguments", "-v"); +tr.setInput("gruntCli", "node_modules/grunt-cli/bin/grunt"); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "grunt": "/usr/local/bin/grunt", + "npm": "/usr/local/bin/npm", + "node": "/usr/local/bin/node", + "istanbulWin": "/usr/local/bin/istanbul", + "istanbul": "/usr/local/bin/node_modules/istanbul/lib/cli.js", + }, + "exec": { + "/usr/local/bin/grunt build test --gruntfile gruntfile.js -v": { + "code": 1, + "stdout": "grunt output here", + "stderr": "grunt failed with this output", + }, + "/usr/local/bin/npm install istanbul": { + "code": 0, + "stdout": "npm output here", + }, + }, + "checkPath": { + "/usr/local/bin/grunt": true, + "/usr/local/bin/npm": true, + "/usr/local/bin/node": true, + "/usr/local/bin/istanbul": true, + "/usr/local/bin/node_modules/istanbul/lib/cli.js": true, + "gruntfile.js": true, + }, + "exist": { + "/usr/local/bin/grunt": true, + }, + "find": { + "/user/build": ["/user/build/fun/test-123.xml"], + }, + "match": { + "**/TEST-*.xml": ["/user/build/fun/test-123.xml"], + }, +}; + +tr.setAnswers(a); + +tr.run(); diff --git a/_generated/GruntV0_Node20/Tests/L0GruntFileNotSet.ts b/_generated/GruntV0_Node20/Tests/L0GruntFileNotSet.ts new file mode 100644 index 000000000000..0cc260b29fad --- /dev/null +++ b/_generated/GruntV0_Node20/Tests/L0GruntFileNotSet.ts @@ -0,0 +1,65 @@ +import ma = require("azure-pipelines-task-lib/mock-answer"); +import tmrm = require("azure-pipelines-task-lib/mock-run"); +import path = require("path"); +import os = require("os"); + +let taskPath = path.join(__dirname, "..", "grunttask.js"); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput("publishJUnitResults", "true"); +tr.setInput("testResultsFiles", "**/build/test-results/TEST-*.xml"); +tr.setInput("enableCodeCoverage", "false"); +if (os.type().match(/^Win/)) { + tr.setInput("cwd", "c:/fake/wd"); +} else { + tr.setInput("cwd", "/fake/wd"); +} +tr.setInput("gruntCli", "node_modules/grunt-cli/bin/grunt"); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "grunt": "/usr/local/bin/grunt", + "npm": "/usr/local/bin/npm", + "node": "/usr/local/bin/node", + "istanbulWin": "/usr/local/bin/istanbul", + "istanbul": "/usr/local/bin/node_modules/istanbul/lib/cli.js", + }, + "exec": { + "/usr/local/bin/grunt --gruntfile gruntfile.js": { + "code": 0, + "stdout": "grunt output here", + }, + "/usr/local/bin/npm install istanbul": { + "code": 0, + "stdout": "npm output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i ./**/build/src/*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 0, + "stdout": "istanbul output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i .\\**\\build\\src\\*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 0, + "stdout": "istanbul output here", + }, + }, + "checkPath": { + "/usr/local/bin/grunt": true, + "/usr/local/bin/npm": true, + "/usr/local/bin/node": true, + "/usr/local/bin/istanbul": true, + "/usr/local/bin/node_modules/istanbul/lib/cli.js": true, + "gruntfile.js": true, + "**/build/test/*.js": true, + }, + "exist": { + "/usr/local/bin/grunt": true, + }, + "match": { + "**/TEST-*.xml": ["/user/build/fun/test-123.xml"], + "**/*.js": ["/test/test.js"], + }, +}; +tr.setAnswers(a); + +tr.run(); diff --git a/_generated/GruntV0_Node20/Tests/L0GruntFileWithCodeCoverage.ts b/_generated/GruntV0_Node20/Tests/L0GruntFileWithCodeCoverage.ts new file mode 100644 index 000000000000..5859070abba8 --- /dev/null +++ b/_generated/GruntV0_Node20/Tests/L0GruntFileWithCodeCoverage.ts @@ -0,0 +1,75 @@ +import ma = require("azure-pipelines-task-lib/mock-answer"); +import tmrm = require("azure-pipelines-task-lib/mock-run"); +import path = require("path"); +import os = require("os"); + +let taskPath = path.join(__dirname, "..", "grunttask.js"); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput("gruntFile", "gruntfile.js"); +tr.setInput("publishJUnitResults", "true"); +tr.setInput("testResultsFiles", "**/build/test-results/TEST-*.xml"); +tr.setInput("enableCodeCoverage", "true"); +tr.setInput("testFramework", "Mocha"); +tr.setInput("srcFiles", "**/build/src/*.js"); +tr.setInput("testFiles", "**/build/test/*.js"); +if (os.type().match(/^Win/)) { + tr.setInput("cwd", "c:/fake/wd"); +} else { + tr.setInput("cwd", "/fake/wd"); +} +tr.setInput("gruntCli", "node_modules/grunt-cli/bin/grunt"); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "grunt": "/usr/local/bin/grunt", + "npm": "/usr/local/bin/npm", + "node": "/usr/local/bin/node", + "istanbulWin": "/usr/local/bin/istanbul", + "istanbul": "/usr/local/bin/node_modules/istanbul/lib/cli.js", + }, + "exec": { + "/usr/local/bin/grunt --gruntfile gruntfile.js": { + "code": 0, + "stdout": "grunt output here", + }, + "/usr/local/bin/npm install istanbul": { + "code": 0, + "stdout": "npm output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i ./**/build/src/*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 0, + "stdout": "istanbul output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i .\\**\\build\\src\\*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 0, + "stdout": "istanbul output here", + }, + }, + "checkPath": { + "/usr/local/bin/grunt": true, + "/usr/local/bin/npm": true, + "/usr/local/bin/node": true, + "/usr/local/bin/istanbul": true, + "/usr/local/bin/node_modules/istanbul/lib/cli.js": true, + "gruntfile.js": true, + "**/build/test/*.js": true, + }, + "exist": { + "/usr/local/bin/grunt": true, + }, + "match": { + "**/TEST-*.xml": ["/user/build/fun/test-123.xml"], + "**/*.js": ["/test/test.js"], + }, + "find": { + "/user/build": ["/user/build/fun/test-123.xml"], + }, + "getVariable": { + "System.DefaultWorkingDirectory": "/user/build", + }, +}; +tr.setAnswers(a); + +tr.run(); diff --git a/_generated/GruntV0_Node20/Tests/L0GruntGlobalGood.ts b/_generated/GruntV0_Node20/Tests/L0GruntGlobalGood.ts new file mode 100644 index 000000000000..71b92ea9cfca --- /dev/null +++ b/_generated/GruntV0_Node20/Tests/L0GruntGlobalGood.ts @@ -0,0 +1,69 @@ +import ma = require("azure-pipelines-task-lib/mock-answer"); +import tmrm = require("azure-pipelines-task-lib/mock-run"); +import path = require("path"); +import os = require("os"); + +let taskPath = path.join(__dirname, "..", "grunttask.js"); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput("gruntFile", "gruntfile.js"); +tr.setInput("publishJUnitResults", "true"); +tr.setInput("testResultsFiles", "**/build/test-results/TEST-*.xml"); +tr.setInput("enableCodeCoverage", "false"); +if (os.type().match(/^Win/)) { + tr.setInput("cwd", "c:/fake/wd"); +} else { + tr.setInput("cwd", "/fake/wd"); +} +tr.setInput("gruntCli", "node_modules/grunt-cli/bin/grunt"); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "grunt": "/usr/local/bin/grunt", + "npm": "/usr/local/bin/npm", + "node": "/usr/local/bin/node", + "istanbulWin": "/usr/local/bin/istanbul", + "istanbul": "/usr/local/bin/node_modules/istanbul/lib/cli.js", + }, + "exec": { + "/usr/local/bin/grunt --gruntfile gruntfile.js": { + "code": 0, + "stdout": "grunt output here", + }, + "/usr/local/bin/npm install istanbul": { + "code": 0, + "stdout": "npm output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i ./**/build/src/*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 0, + "stdout": "istanbul output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i .\\**\\build\\src\\*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 0, + "stdout": "istanbul output here", + }, + }, + "checkPath": { + "/usr/local/bin/grunt": true, + "/usr/local/bin/npm": true, + "/usr/local/bin/node": true, + "/usr/local/bin/istanbul": true, + "/usr/local/bin/node_modules/istanbul/lib/cli.js": true, + "gruntfile.js": true, + "**/build/test/*.js": true, + }, + "exist": { + "/usr/local/bin/grunt": true, + }, + "match": { + "**/TEST-*.xml": ["/user/build/fun/test-123.xml"], + "**/*.js": ["/test/test.js"], + }, + "find": { + "/user/build": ["/user/build/fun/test-123.xml"] + } +}; +tr.setAnswers(a); + +tr.run(); diff --git a/_generated/GruntV0_Node20/Tests/L0GruntLocalGood.ts b/_generated/GruntV0_Node20/Tests/L0GruntLocalGood.ts new file mode 100644 index 000000000000..b0d184689b05 --- /dev/null +++ b/_generated/GruntV0_Node20/Tests/L0GruntLocalGood.ts @@ -0,0 +1,62 @@ +import ma = require("azure-pipelines-task-lib/mock-answer"); +import tmrm = require("azure-pipelines-task-lib/mock-run"); +import path = require("path"); +import os = require("os"); + +let taskPath = path.join(__dirname, "..", "grunttask.js"); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput("gruntFile", "gruntfile.js"); +tr.setInput("publishJUnitResults", "true"); +tr.setInput("testResultsFiles", "**/test-*.xml"); +tr.setInput("enableCodeCoverage", "false"); +if (os.type().match(/^Win/)) { + tr.setInput("cwd", "c:/fake/wd"); +} else { + tr.setInput("cwd", "/fake/wd"); +} +tr.setInput("gruntCli", "node_modules/grunt-cli/bin/grunt"); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "npm": "/usr/local/bin/npm", + "node": "/usr/local/bin/node", + "istanbulWin": "/usr/local/bin/istanbul", + "istanbul": "/usr/local/bin/node_modules/istanbul/lib/cli.js", + }, + "exec": { + "/usr/local/bin/node /fake/wd/node_modules/grunt-cli/bin/grunt --gruntfile gruntfile.js": { + "code": 0, + "stdout": "grunt output here", + }, + "/usr/local/bin/node c:\\fake\\wd\\node_modules\\grunt-cli\\bin\\grunt --gruntfile gruntfile.js": { + "code": 0, + "stdout": "grunt output here", + }, + }, + "checkPath": { + "/usr/local/bin/node": true, + "/usr/local/bin/npm": true, + "/usr/local/bin/istanbul": true, + "/usr/local/bin/node_modules/istanbul/lib/cli.js": true, + "gruntfile.js": true, + }, + "exist": { + "/fake/wd/node_modules/grunt-cli/bin/grunt": true, + "c:\\fake\\wd\\node_modules\\grunt-cli\\bin\\grunt": true, + }, + "find": { + "/user/build": ["/user/build/fun/test-123.xml"], + }, + "match": { + "**/test-*.xml": ["/user/build/fun/test-123.xml"], + }, + "getVariable": { + "System.DefaultWorkingDirectory": "/user/build", + }, +}; + +tr.setAnswers(a); + +tr.run(); diff --git a/_generated/GruntV0_Node20/Tests/L0GruntNoGruntCli.ts b/_generated/GruntV0_Node20/Tests/L0GruntNoGruntCli.ts new file mode 100644 index 000000000000..45e79be85b26 --- /dev/null +++ b/_generated/GruntV0_Node20/Tests/L0GruntNoGruntCli.ts @@ -0,0 +1,42 @@ +import ma = require("azure-pipelines-task-lib/mock-answer"); +import tmrm = require("azure-pipelines-task-lib/mock-run"); +import path = require("path"); +import os = require("os"); + +let taskPath = path.join(__dirname, "..", "grunttask.js"); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput("gruntFile", "gruntfile.js"); +tr.setInput("publishJUnitResults", "true"); +tr.setInput("testResultsFiles", "**/build/test-results/TEST-*.xml"); +tr.setInput("enableCodeCoverage", "false"); +if (os.type().match(/^Win/)) { + tr.setInput("cwd", "c:/fake/wd"); +} else { + tr.setInput("cwd", "/fake/wd"); +} +tr.setInput("gruntCli", "node_modules/grunt-cli/bin/grunt"); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "npm": "/usr/local/bin/npm", + "node": "/usr/local/bin/node", + "istanbulWin": "/usr/local/bin/istanbul", + "istanbul": "/usr/local/bin/node_modules/istanbul/lib/cli.js", + }, + "checkPath": { + "/usr/local/bin/npm": true, + "/usr/local/bin/node": true, + "/usr/local/bin/istanbul": true, + "/usr/local/bin/node_modules/istanbul/lib/cli.js": true, + "gruntfile.js": true, + }, + "match": { + "**/TEST-*.xml": ["/user/build/fun/test-123.xml"], + }, +}; + +tr.setAnswers(a); + +tr.run(); diff --git a/_generated/GruntV0_Node20/Tests/L0InvalidTestSource.ts b/_generated/GruntV0_Node20/Tests/L0InvalidTestSource.ts new file mode 100644 index 000000000000..ad351f87af3f --- /dev/null +++ b/_generated/GruntV0_Node20/Tests/L0InvalidTestSource.ts @@ -0,0 +1,75 @@ +import ma = require("azure-pipelines-task-lib/mock-answer"); +import tmrm = require("azure-pipelines-task-lib/mock-run"); +import path = require("path"); +import os = require("os"); + +let taskPath = path.join(__dirname, "..", "grunttask.js"); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput("gruntFile", "gruntfile.js"); +tr.setInput("publishJUnitResults", "true"); +tr.setInput("testResultsFiles", "**/build/test-results/TEST-*.xml"); +tr.setInput("enableCodeCoverage", "true"); +tr.setInput("testFramework", "Mocha"); +tr.setInput("srcFiles", "**/build/src/*.js"); +tr.setInput("testFiles", "/invalid/input"); +if (os.type().match(/^Win/)) { + tr.setInput("cwd", "c:/fake/wd"); +} else { + tr.setInput("cwd", "/fake/wd"); +} +tr.setInput("gruntCli", "node_modules/grunt-cli/bin/grunt"); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "grunt": "/usr/local/bin/grunt", + "npm": "/usr/local/bin/npm", + "node": "/usr/local/bin/node", + "istanbulWin": "/usr/local/bin/istanbul", + "istanbul": "/usr/local/bin/node_modules/istanbul/lib/cli.js", + }, + "exec": { + "/usr/local/bin/grunt --gruntfile gruntfile.js": { + "code": 0, + "stdout": "grunt output here", + }, + "/usr/local/bin/npm install istanbul": { + "code": 0, + "stdout": "npm output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i ./**/build/src/*.js ./node_modules/mocha/bin/_mocha /invalid/input": { + "code": 1, + "stdout": "istanbul output here", + "stderr": "istanbul failed with this output", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i .\\**\\build\\src\\*.js ./node_modules/mocha/bin/_mocha /invalid/input": { + "code": 1, + "stdout": "istanbul output here", + "stderr": "istanbul failed with this output", + }, + }, + "checkPath": { + "/usr/local/bin/grunt": true, + "/usr/local/bin/npm": true, + "/usr/local/bin/node": true, + "/usr/local/bin/istanbul": true, + "/usr/local/bin/node_modules/istanbul/lib/cli.js": true, + "gruntfile.js": true, + "**/build/test/*.js": true, + }, + "exist": { + "/usr/local/bin/grunt": true, + }, + "match": { + "**/TEST-*.xml": ["/user/build/fun/test-123.xml"], + "**/*.js": ["/test/test.js"], + }, + "find": { + "/user/build": ["/user/build/fun/test-123.xml"], + }, +}; + +tr.setAnswers(a); + +tr.run(); diff --git a/_generated/GruntV0_Node20/Tests/L0IstanbulFails.ts b/_generated/GruntV0_Node20/Tests/L0IstanbulFails.ts new file mode 100644 index 000000000000..440b053218f2 --- /dev/null +++ b/_generated/GruntV0_Node20/Tests/L0IstanbulFails.ts @@ -0,0 +1,75 @@ +import ma = require("azure-pipelines-task-lib/mock-answer"); +import tmrm = require("azure-pipelines-task-lib/mock-run"); +import path = require("path"); +import os = require("os"); + +let taskPath = path.join(__dirname, "..", "grunttask.js"); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput("gruntFile", "gruntfile.js"); +tr.setInput("publishJUnitResults", "true"); +tr.setInput("testResultsFiles", "**/build/test-results/TEST-*.xml"); +tr.setInput("enableCodeCoverage", "true"); +tr.setInput("testFramework", "Mocha"); +tr.setInput("srcFiles", "**/build/src/*.js"); +tr.setInput("testFiles", "**/build/test/*.js"); +if (os.type().match(/^Win/)) { + tr.setInput("cwd", "c:/fake/wd"); +} else { + tr.setInput("cwd", "/fake/wd"); +} +tr.setInput("gruntCli", "node_modules/grunt-cli/bin/grunt"); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "grunt": "/usr/local/bin/grunt", + "npm": "/usr/local/bin/npm", + "node": "/usr/local/bin/node", + "istanbulWin": "/usr/local/bin/istanbul", + "istanbul": "/usr/local/bin/node_modules/istanbul/lib/cli.js", + }, + "exec": { + "/usr/local/bin/grunt --gruntfile gruntfile.js": { + "code": 0, + "stdout": "grunt output here", + }, + "/usr/local/bin/npm install istanbul": { + "code": 0, + "stdout": "npm output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i ./**/build/src/*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 1, + "stdout": "istanbul output here", + "stderr": "istanbul failed with this output", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i .\\**\\build\\src\\*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 1, + "stdout": "istanbul output here", + "stderr": "istanbul failed with this output", + }, + }, + "checkPath": { + "/usr/local/bin/grunt": true, + "/usr/local/bin/npm": true, + "/usr/local/bin/node": true, + "/usr/local/bin/istanbul": true, + "/usr/local/bin/node_modules/istanbul/lib/cli.js": true, + "gruntfile.js": true, + "**/build/test/*.js": true, + }, + "exist": { + "/usr/local/bin/grunt": true, + }, + "find": { + "/user/build": ["/user/build/fun/test-123.xml"], + }, + "match": { + "**/TEST-*.xml": ["/user/build/fun/test-123.xml"], + "**/*.js": ["/test/test.js"], + }, +}; + +tr.setAnswers(a); + +tr.run(); diff --git a/_generated/GruntV0_Node20/Tests/L0NoGruntFile.ts b/_generated/GruntV0_Node20/Tests/L0NoGruntFile.ts new file mode 100644 index 000000000000..d6a417e10c4c --- /dev/null +++ b/_generated/GruntV0_Node20/Tests/L0NoGruntFile.ts @@ -0,0 +1,30 @@ +import ma = require("azure-pipelines-task-lib/mock-answer"); +import tmrm = require("azure-pipelines-task-lib/mock-run"); +import path = require("path"); +import os = require("os"); + +let taskPath = path.join(__dirname, "..", "grunttask.js"); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput("gruntFile", "gruntfile.js"); +if (os.type().match(/^Win/)) { + tr.setInput("cwd", "c:/fake/wd"); +} else { + tr.setInput("cwd", "/fake/wd"); +} +tr.setInput("gruntCli", "node_modules/grunt-cli/bin/grunt"); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "node": "/usr/local/bin/node", + }, + "checkPath": { + "/usr/local/bin/node": true, + "gruntfile.js": false, + }, +}; + +tr.setAnswers(a); + +tr.run(); diff --git a/_generated/GruntV0_Node20/Tests/L0NoTestSourceFiles.ts b/_generated/GruntV0_Node20/Tests/L0NoTestSourceFiles.ts new file mode 100644 index 000000000000..30a610046fdb --- /dev/null +++ b/_generated/GruntV0_Node20/Tests/L0NoTestSourceFiles.ts @@ -0,0 +1,68 @@ +import ma = require("azure-pipelines-task-lib/mock-answer"); +import tmrm = require("azure-pipelines-task-lib/mock-run"); +import path = require("path"); +import os = require("os"); + +let taskPath = path.join(__dirname, "..", "grunttask.js"); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput("gruntFile", "gruntfile.js"); +tr.setInput("publishJUnitResults", "true"); +tr.setInput("testResultsFiles", "**/build/test-results/TEST-*.xml"); +tr.setInput("enableCodeCoverage", "true"); +tr.setInput("testFramework", "Mocha"); +tr.setInput("srcFiles", "**/build/src/*.js"); +if (os.type().match(/^Win/)) { + tr.setInput("cwd", "c:/fake/wd"); +} else { + tr.setInput("cwd", "/fake/wd"); +} +tr.setInput("gruntCli", "node_modules/grunt-cli/bin/grunt"); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "grunt": "/usr/local/bin/grunt", + "npm": "/usr/local/bin/npm", + "node": "/usr/local/bin/node", + "istanbulWin": "/usr/local/bin/istanbul", + "istanbul": "/usr/local/bin/node_modules/istanbul/lib/cli.js", + }, + "exec": { + "/usr/local/bin/grunt --gruntfile gruntfile.js": { + "code": 0, + "stdout": "grunt output here", + }, + "/usr/local/bin/npm install istanbul": { + "code": 0, + "stdout": "npm output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i ./**/build/src/*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 0, + "stdout": "istanbul output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i .\\**\\build\\src\\*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 0, + "stdout": "istanbul output here", + }, + }, + "checkPath": { + "/usr/local/bin/grunt": true, + "/usr/local/bin/npm": true, + "/usr/local/bin/node": true, + "/usr/local/bin/istanbul": true, + "/usr/local/bin/node_modules/istanbul/lib/cli.js": true, + "gruntfile.js": true, + "**/build/test/*.js": true, + }, + "exist": { + "/usr/local/bin/grunt": true, + }, + "match": { + "**/TEST-*.xml": ["/user/build/fun/test-123.xml"], + "**/*.js": ["/test/test.js"], + }, +}; +tr.setAnswers(a); + +tr.run(); diff --git a/_generated/GruntV0_Node20/Tests/L0NpmFails.ts b/_generated/GruntV0_Node20/Tests/L0NpmFails.ts new file mode 100644 index 000000000000..e86709c4c894 --- /dev/null +++ b/_generated/GruntV0_Node20/Tests/L0NpmFails.ts @@ -0,0 +1,65 @@ +import ma = require("azure-pipelines-task-lib/mock-answer"); +import tmrm = require("azure-pipelines-task-lib/mock-run"); +import path = require("path"); +import os = require("os"); + +let taskPath = path.join(__dirname, "..", "grunttask.js"); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput("gruntFile", "gruntfile.js"); +tr.setInput("publishJUnitResults", "true"); +tr.setInput("testResultsFiles", "**/build/test-results/TEST-*.xml"); +tr.setInput("enableCodeCoverage", "true"); +tr.setInput("testFramework", "Mocha"); +tr.setInput("srcFiles", "**/build/src/*.js"); +tr.setInput("testFiles", "**/build/test/*.js"); +if (os.type().match(/^Win/)) { + tr.setInput("cwd", "c:/fake/wd"); +} else { + tr.setInput("cwd", "/fake/wd"); +} +tr.setInput("gruntCli", "node_modules/grunt-cli/bin/grunt"); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "grunt": "/usr/local/bin/grunt", + "npm": "/usr/local/bin/npm", + "node": "/usr/local/bin/node", + "istanbulWin": "/usr/local/bin/istanbul", + "istanbul": "/usr/local/bin/node_modules/istanbul/lib/cli.js", + }, + "exec": { + "/usr/local/bin/grunt --gruntfile gruntfile.js": { + "code": 0, + "stdout": "grunt output here", + }, + "/usr/local/bin/npm install istanbul": { + "code": 1, + "stdout": "npm output here", + "stderr": "npm failed with this output", + }, + }, + "checkPath": { + "/usr/local/bin/grunt": true, + "/usr/local/bin/npm": true, + "/usr/local/bin/node": true, + "/usr/local/bin/istanbul": true, + "/usr/local/bin/node_modules/istanbul/lib/cli.js": true, + "gruntfile.js": true, + }, + "exist": { + "/usr/local/bin/grunt": true, + }, + "match": { + "**/TEST-*.xml": ["/user/build/fun/test-123.xml"], + "**/*.js": ["/test/test.js"], + }, + "find": { + "/user/build": ["/user/build/fun/test-123.xml"], + }, +}; + +tr.setAnswers(a); + +tr.run(); diff --git a/_generated/GruntV0_Node20/Tests/L0TestResultFilesDoesNotMatchAnyFile.ts b/_generated/GruntV0_Node20/Tests/L0TestResultFilesDoesNotMatchAnyFile.ts new file mode 100644 index 000000000000..16912fdd6b9a --- /dev/null +++ b/_generated/GruntV0_Node20/Tests/L0TestResultFilesDoesNotMatchAnyFile.ts @@ -0,0 +1,66 @@ +import ma = require("azure-pipelines-task-lib/mock-answer"); +import tmrm = require("azure-pipelines-task-lib/mock-run"); +import path = require("path"); +import os = require("os"); + +let taskPath = path.join(__dirname, "..", "grunttask.js"); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput("gruntFile", "gruntfile.js"); +tr.setInput("publishJUnitResults", "true"); +tr.setInput("testResultsFiles", "/invalid/input"); +tr.setInput("enableCodeCoverage", "false"); +if (os.type().match(/^Win/)) { + tr.setInput("cwd", "c:/fake/wd"); +} else { + tr.setInput("cwd", "/fake/wd"); +} +tr.setInput("gruntCli", "node_modules/grunt-cli/bin/grunt"); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "grunt": "/usr/local/bin/grunt", + "npm": "/usr/local/bin/npm", + "node": "/usr/local/bin/node", + "istanbulWin": "/usr/local/bin/istanbul", + "istanbul": "/usr/local/bin/node_modules/istanbul/lib/cli.js", + }, + "exec": { + "/usr/local/bin/grunt --gruntfile gruntfile.js": { + "code": 0, + "stdout": "grunt output here", + }, + "/usr/local/bin/npm install istanbul": { + "code": 0, + "stdout": "npm output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i ./**/build/src/*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 0, + "stdout": "istanbul output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i .\\**\\build\\src\\*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 0, + "stdout": "istanbul output here", + }, + }, + "checkPath": { + "/usr/local/bin/grunt": true, + "/usr/local/bin/npm": true, + "/usr/local/bin/node": true, + "/usr/local/bin/istanbul": true, + "/usr/local/bin/node_modules/istanbul/lib/cli.js": true, + "gruntfile.js": true, + "**/build/test/*.js": true, + }, + "exist": { + "/usr/local/bin/grunt": true, + }, + "match": { + "**/TEST-*.xml": ["/user/build/fun/test-123.xml"], + "**/*.js": ["/test/test.js"], + }, +}; +tr.setAnswers(a); + +tr.run(); diff --git a/_generated/GruntV0_Node20/Tests/L0TestResultFilesNotSet.ts b/_generated/GruntV0_Node20/Tests/L0TestResultFilesNotSet.ts new file mode 100644 index 000000000000..32d4b444f889 --- /dev/null +++ b/_generated/GruntV0_Node20/Tests/L0TestResultFilesNotSet.ts @@ -0,0 +1,65 @@ +import ma = require("azure-pipelines-task-lib/mock-answer"); +import tmrm = require("azure-pipelines-task-lib/mock-run"); +import path = require("path"); +import os = require("os"); + +let taskPath = path.join(__dirname, "..", "grunttask.js"); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput("gruntFile", "gruntfile.js"); +tr.setInput("publishJUnitResults", "true"); +tr.setInput("enableCodeCoverage", "false"); +if (os.type().match(/^Win/)) { + tr.setInput("cwd", "c:/fake/wd"); +} else { + tr.setInput("cwd", "/fake/wd"); +} +tr.setInput("gruntCli", "node_modules/grunt-cli/bin/grunt"); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "grunt": "/usr/local/bin/grunt", + "npm": "/usr/local/bin/npm", + "node": "/usr/local/bin/node", + "istanbulWin": "/usr/local/bin/istanbul", + "istanbul": "/usr/local/bin/node_modules/istanbul/lib/cli.js", + }, + "exec": { + "/usr/local/bin/grunt --gruntfile gruntfile.js": { + "code": 0, + "stdout": "grunt output here", + }, + "/usr/local/bin/npm install istanbul": { + "code": 0, + "stdout": "npm output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i ./**/build/src/*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 0, + "stdout": "istanbul output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i .\\**\\build\\src\\*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 0, + "stdout": "istanbul output here", + }, + }, + "checkPath": { + "/usr/local/bin/grunt": true, + "/usr/local/bin/npm": true, + "/usr/local/bin/node": true, + "/usr/local/bin/istanbul": true, + "/usr/local/bin/node_modules/istanbul/lib/cli.js": true, + "gruntfile.js": true, + "**/build/test/*.js": true, + }, + "exist": { + "/usr/local/bin/grunt": true, + }, + "match": { + "**/TEST-*.xml": ["/user/build/fun/test-123.xml"], + "**/*.js": ["/test/test.js"], + }, +}; +tr.setAnswers(a); + +tr.run(); diff --git a/_generated/GruntV0_Node20/Tests/L0publishJUnitTestResultIsFalse.ts b/_generated/GruntV0_Node20/Tests/L0publishJUnitTestResultIsFalse.ts new file mode 100644 index 000000000000..8f62c10f0550 --- /dev/null +++ b/_generated/GruntV0_Node20/Tests/L0publishJUnitTestResultIsFalse.ts @@ -0,0 +1,69 @@ +import ma = require("azure-pipelines-task-lib/mock-answer"); +import tmrm = require("azure-pipelines-task-lib/mock-run"); +import path = require("path"); +import os = require("os"); + +let taskPath = path.join(__dirname, "..", "grunttask.js"); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput("gruntFile", "gruntfile.js"); +tr.setInput("publishJUnitResults", "false"); +tr.setInput("enableCodeCoverage", "false"); +if (os.type().match(/^Win/)) { + tr.setInput("cwd", "c:/fake/wd"); +} else { + tr.setInput("cwd", "/fake/wd"); +} + +tr.setInput("gruntCli", "node_modules/grunt-cli/bin/grunt"); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "grunt": "/usr/local/bin/grunt", + "npm": "/usr/local/bin/npm", + "node": "/usr/local/bin/node", + "istanbulWin": "/usr/local/bin/istanbul", + "istanbul": "/usr/local/bin/node_modules/istanbul/lib/cli.js", + }, + "exec": { + "/usr/local/bin/grunt --gruntfile gruntfile.js": { + "code": 0, + "stdout": "grunt output here", + }, + "/usr/local/bin/npm install istanbul": { + "code": 0, + "stdout": "npm output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i ./**/build/src/*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 0, + "stdout": "istanbul output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i .\\**\\build\\src\\*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 0, + "stdout": "istanbul output here", + }, + }, + "checkPath": { + "/usr/local/bin/grunt": true, + "/usr/local/bin/npm": true, + "/usr/local/bin/node": true, + "/usr/local/bin/istanbul": true, + "/usr/local/bin/node_modules/istanbul/lib/cli.js": true, + "gruntfile.js": true, + "**/build/test/*.js": true, + }, + "exist": { + "/usr/local/bin/grunt": true, + }, + "match": { + "**/TEST-*.xml": ["/user/build/fun/test-123.xml"], + "**/*.js": ["/test/test.js"], + }, + "getVariable": { + "System.DefaultWorkingDirectory": "/user/build", + }, +}; +tr.setAnswers(a); + +tr.run(); diff --git a/_generated/GruntV0_Node20/Tests/package-lock.json b/_generated/GruntV0_Node20/Tests/package-lock.json new file mode 100644 index 000000000000..e0ee3d5cab23 --- /dev/null +++ b/_generated/GruntV0_Node20/Tests/package-lock.json @@ -0,0 +1,14 @@ +{ + "name": "grunt-tests", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/mocha": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", + "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==", + "dev": true + } + } +} diff --git a/_generated/GruntV0_Node20/Tests/package.json b/_generated/GruntV0_Node20/Tests/package.json new file mode 100644 index 000000000000..d1e8e3584150 --- /dev/null +++ b/_generated/GruntV0_Node20/Tests/package.json @@ -0,0 +1,22 @@ +{ + "name": "grunt-tests", + "version": "1.0.0", + "description": "Azure Pipelines Grunt V0 Task Tests", + "main": "L0.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/Microsoft/azure-pipelines-tasks.git" + }, + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Microsoft/azure-pipelines-tasks/issues" + }, + "homepage": "https://github.com/Microsoft/azure-pipelines-tasks#readme", + "devDependencies": { + "@types/mocha": "^5.2.0" + } +} diff --git a/_generated/GruntV0_Node20/grunttask.ts b/_generated/GruntV0_Node20/grunttask.ts new file mode 100644 index 000000000000..92be8b15bc98 --- /dev/null +++ b/_generated/GruntV0_Node20/grunttask.ts @@ -0,0 +1,118 @@ +import path = require('path'); +import tl = require('azure-pipelines-task-lib/task'); +import minimatch = require('minimatch'); + +tl.setResourcePath(path.join(__dirname, 'task.json')); + +var gruntFile = tl.getPathInput('gruntFile', true, true); +tl.debug('check grunt file :' + gruntFile); +var grunt = tl.which('grunt', false); +var isCodeCoverageEnabled = tl.getBoolInput('enableCodeCoverage'); +var publishJUnitResults = tl.getBoolInput('publishJUnitResults'); +var testResultsFiles = tl.getInput('testResultsFiles', publishJUnitResults); +var cwd = tl.getPathInput('cwd', true, false); +tl.mkdirP(cwd); +tl.cd(cwd); + +tl.debug('check path : ' + grunt); +if (!tl.exist(grunt)) { + tl.debug('not found global installed grunt-cli, try to find grunt-cli locally.'); + var gt = tl.tool(tl.which('node', true)); + var gtcli = tl.getInput('gruntCli', true); + gtcli = path.resolve(cwd, gtcli); + tl.debug('check path : ' + gtcli); + if (!tl.exist(gtcli)) { + tl.setResult(tl.TaskResult.Failed, tl.loc('GruntCliNotInstalled', gtcli)); + } + gt.arg(gtcli); +} +else { + var gt = tl.tool(grunt); +} + +if (isCodeCoverageEnabled) { + var npm = tl.tool(tl.which('npm', true)); + npm.line('install istanbul'); + var testFramework = tl.getInput('testFramework', true); + var srcFiles = tl.getInput('srcFiles', false); + var testSrc = tl.getPathInput('testFiles', true, false); + var istanbul = tl.tool(tl.which('node', true)); + istanbul.arg('./node_modules/istanbul/lib/cli.js'); + istanbul.line('cover --report cobertura --report html'); + if (srcFiles) { + istanbul.line('-i .' + path.sep + path.join(srcFiles)); + } + if (testFramework.toLowerCase() == 'jasmine') { + istanbul.line('./node_modules/jasmine/bin/jasmine.js JASMINE_CONFIG_PATH=node_modules/jasmine/lib/examples/jasmine.json'); + } else { + istanbul.arg('./node_modules/mocha/bin/_mocha'); + } + istanbul.arg(testSrc); + var summaryFile = path.join(cwd, 'coverage/cobertura-coverage.xml'); + var reportDirectory = path.join(cwd, 'coverage/'); +} + +// optional - no targets will concat nothing +gt.arg(tl.getDelimitedInput('targets', ' ', false)); +gt.arg(['--gruntfile', gruntFile]); +gt.line(tl.getInput('arguments', false)); +gt.exec().then(function (code) { + publishTestResults(publishJUnitResults, testResultsFiles); + if (isCodeCoverageEnabled) { + npm.exec().then(function () { + istanbul.exec().then(function (code) { + publishCodeCoverage(summaryFile); + tl.setResult(tl.TaskResult.Succeeded, tl.loc('GruntReturnCode', code)); + }).fail(function (err) { + publishCodeCoverage(summaryFile); + tl.debug('taskRunner fail'); + tl.setResult(tl.TaskResult.Failed, tl.loc('IstanbulFailed', err.message)); + }); + }).fail(function (err) { + tl.debug('taskRunner fail'); + tl.setResult(tl.TaskResult.Failed, tl.loc('NpmFailed', err.message)); + }) + } else { + tl.setResult(tl.TaskResult.Succeeded, tl.loc('GruntReturnCode', code)); + } +}).fail(function (err) { + publishTestResults(publishJUnitResults, testResultsFiles); + tl.debug('taskRunner fail'); + tl.setResult(tl.TaskResult.Failed, tl.loc('GruntFailed', err.message)); +}) + +function publishTestResults(publishJUnitResults, testResultsFiles: string) { + if (publishJUnitResults) { + //check for pattern in testResultsFiles + if (testResultsFiles.indexOf('*') >= 0 || testResultsFiles.indexOf('?') >= 0) { + tl.debug('Pattern found in testResultsFiles parameter'); + var buildFolder = tl.getVariable('System.DefaultWorkingDirectory'); + var allFiles = tl.find(buildFolder); + var matchingTestResultsFiles = minimatch.match(allFiles, testResultsFiles, { matchBase: true }); + } + else { + tl.debug('No pattern found in testResultsFiles parameter'); + var matchingTestResultsFiles = [testResultsFiles]; + } + if (!matchingTestResultsFiles  ||  matchingTestResultsFiles.length  ==  0) { + tl.warning('No test result files matching ' + testResultsFiles + ' were found, so publishing JUnit test results is being skipped.'); + return 0; + } + var tp = new tl.TestPublisher("JUnit"); + try { + tp.publish(matchingTestResultsFiles, 'true', "", "", "", 'true'); + } catch (error) { + tl.warning(error); + } + } +} + +function publishCodeCoverage(summaryFile) { + try { + var ccPublisher = new tl.CodeCoveragePublisher(); + ccPublisher.publish('cobertura', summaryFile, reportDirectory, ""); + } catch (error) { + tl.debug(error); + throw error; + } +} \ No newline at end of file diff --git a/_generated/GruntV0_Node20/icon.png b/_generated/GruntV0_Node20/icon.png new file mode 100644 index 000000000000..d13a10008561 Binary files /dev/null and b/_generated/GruntV0_Node20/icon.png differ diff --git a/_generated/GruntV0_Node20/icon.svg b/_generated/GruntV0_Node20/icon.svg new file mode 100644 index 000000000000..69d4fc4db23c --- /dev/null +++ b/_generated/GruntV0_Node20/icon.svg @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_generated/GruntV0_Node20/package-lock.json b/_generated/GruntV0_Node20/package-lock.json new file mode 100644 index 000000000000..91d1b0046a9a --- /dev/null +++ b/_generated/GruntV0_Node20/package-lock.json @@ -0,0 +1,483 @@ +{ + "name": "vsts-grunt-task", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/concat-stream": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz", + "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==", + "requires": { + "@types/node": "*" + } + }, + "@types/form-data": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", + "integrity": "sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==", + "requires": { + "@types/node": "*" + } + }, + "@types/mocha": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", + "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==" + }, + "@types/node": { + "version": "20.7.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.7.0.tgz", + "integrity": "sha512-zI22/pJW2wUZOVyguFaUL1HABdmSVxpXrzIqkjsHmyUjNhPoWM1CKfvVuXfetHhIok4RY573cqS0mZ1SJEnoTg==" + }, + "@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "azure-pipelines-task-lib": { + "version": "4.0.0-preview", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-4.0.0-preview.tgz", + "integrity": "sha512-BK+VOo42Bec72Wic6Vsm2MaAJezNyF05OYAQS5FuZJM5Z972lZqYpujtSc4BFKUhC3HO+F/Yf4xhAV2tZCzN9Q==", + "requires": { + "minimatch": "3.0.5", + "mockery": "^1.7.0", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "sync-request": "6.1.0", + "uuid": "^3.0.1" + }, + "dependencies": { + "minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, + "form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-intrinsic": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", + "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + } + }, + "get-port": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", + "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==" + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "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" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "http-basic": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", + "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", + "requires": { + "caseless": "^0.12.0", + "concat-stream": "^1.6.2", + "http-response-object": "^3.0.1", + "parse-cache-control": "^1.0.1" + } + }, + "http-response-object": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", + "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", + "requires": { + "@types/node": "^10.0.3" + }, + "dependencies": { + "@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + } + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" + }, + "is-core-module": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", + "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", + "requires": { + "has": "^1.0.3" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "mockery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/mockery/-/mockery-1.7.0.tgz", + "integrity": "sha512-gUQA33ayi0tuAhr/rJNZPr7Q7uvlBt4gyJPbi0CDcAfIzIrDu1YgGMFgmAu3stJqBpK57m7+RxUbcS+pt59fKQ==" + }, + "object-inspect": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, + "parse-cache-control": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", + "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "promise": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.2.0.tgz", + "integrity": "sha512-+CMAlLHqwRYwBMXKCP+o8ns7DN+xHDUiI+0nArsiJ9y+kJVPLFxEaSw6Ha9s9H0tftxg2Yzl25wqj9G7m5wLZg==", + "requires": { + "asap": "~2.0.6" + } + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==" + }, + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "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" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "requires": { + "resolve": "^1.1.6" + } + }, + "resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "requires": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, + "sync-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", + "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==", + "requires": { + "http-response-object": "^3.0.1", + "sync-rpc": "^1.2.1", + "then-request": "^6.0.0" + } + }, + "sync-rpc": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz", + "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==", + "requires": { + "get-port": "^3.1.0" + } + }, + "then-request": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", + "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", + "requires": { + "@types/concat-stream": "^1.6.0", + "@types/form-data": "0.0.33", + "@types/node": "^8.0.0", + "@types/qs": "^6.2.31", + "caseless": "~0.12.0", + "concat-stream": "^1.6.0", + "form-data": "^2.2.0", + "http-basic": "^8.1.1", + "http-response-object": "^3.0.1", + "promise": "^8.0.0", + "qs": "^6.4.0" + }, + "dependencies": { + "@types/node": { + "version": "8.10.66", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", + "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==" + } + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, + "typescript": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + } + } +} diff --git a/_generated/GruntV0_Node20/package.json b/_generated/GruntV0_Node20/package.json new file mode 100644 index 000000000000..48cb92d6b225 --- /dev/null +++ b/_generated/GruntV0_Node20/package.json @@ -0,0 +1,28 @@ +{ + "name": "vsts-grunt-task", + "version": "1.0.0", + "description": "Azure Pipelines Grunt Task", + "main": "grunttask.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/Microsoft/azure-pipelines-tasks.git" + }, + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Microsoft/azure-pipelines-tasks/issues" + }, + "homepage": "https://github.com/Microsoft/azure-pipelines-tasks#readme", + "dependencies": { + "azure-pipelines-task-lib": "^4.0.0-preview", + "minimatch": "^3.0.4", + "@types/node": "^20.3.1", + "@types/mocha": "^5.2.7" + }, + "devDependencies": { + "typescript": "5.1.6" + } +} diff --git a/_generated/GruntV0_Node20/task.json b/_generated/GruntV0_Node20/task.json new file mode 100644 index 000000000000..21f544d6cd8e --- /dev/null +++ b/_generated/GruntV0_Node20/task.json @@ -0,0 +1,186 @@ +{ + "id": "521D1E15-F5FB-4B73-A93B-B2FE88A9A286", + "name": "Grunt", + "friendlyName": "Grunt", + "description": "Run the Grunt JavaScript task runner", + "helpUrl": "https://docs.microsoft.com/azure/devops/pipelines/tasks/build/grunt", + "helpMarkDown": "[Learn more about this task](https://go.microsoft.com/fwlink/?LinkID=627413) or [see the Grunt documentation](https://gruntjs.com/getting-started)", + "category": "Build", + "visibility": [ + "Build" + ], + "runsOn": [ + "Agent", + "DeploymentGroup" + ], + "author": "Microsoft Corporation", + "version": { + "Major": 0, + "Minor": 229, + "Patch": 1 + }, + "demands": [ + "node.js" + ], + "minimumAgentVersion": "1.91.0", + "groups": [ + { + "name": "advanced", + "displayName": "Advanced", + "isExpanded": false + }, + { + "name": "junitTestResults", + "displayName": "JUnit Test Results", + "isExpanded": true + }, + { + "name": "codeCoverage", + "displayName": "Code Coverage", + "isExpanded": true + } + ], + "instanceNameFormat": "grunt $(targets)", + "inputs": [ + { + "name": "gruntFile", + "type": "filePath", + "label": "Grunt File Path", + "defaultValue": "gruntfile.js", + "required": true, + "helpMarkDown": "Relative path from repo root of the grunt file script file to run." + }, + { + "name": "targets", + "type": "string", + "label": "Grunt Task(s)", + "defaultValue": "", + "helpMarkDown": "Optional. Space delimited list of tasks to run. If not specified, the default task will run.", + "required": false + }, + { + "name": "arguments", + "type": "string", + "label": "Arguments", + "defaultValue": "", + "helpMarkDown": "Additional arguments passed to grunt. --gruntfile is not needed since already added via gruntFile input above.", + "required": false + }, + { + "name": "cwd", + "aliases": [ + "workingDirectory" + ], + "type": "filePath", + "label": "Working Directory", + "defaultValue": "", + "required": false, + "helpMarkDown": "Current working directory when script is run. Defaults to the folder where the script is located.", + "groupName": "advanced" + }, + { + "name": "gruntCli", + "type": "string", + "label": "grunt-cli location", + "defaultValue": "node_modules/grunt-cli/bin/grunt", + "required": true, + "helpMarkDown": "grunt-cli to run when agent can't find global installed grunt-cli Defaults to the grunt-cli under node_modules folder of the working directory.", + "groupName": "advanced" + }, + { + "name": "publishJUnitResults", + "type": "boolean", + "label": "Publish to Azure Pipelines", + "defaultValue": "false", + "groupName": "junitTestResults", + "helpMarkDown": "Select this option to publish JUnit test results produced by the Grunt build to Azure Pipelines." + }, + { + "name": "testResultsFiles", + "type": "filePath", + "label": "Test Results Files", + "defaultValue": "**/TEST-*.xml", + "required": true, + "groupName": "junitTestResults", + "helpMarkDown": "Test results files path. Wildcards can be used. For example, `**/TEST-*.xml` for all XML files whose name starts with TEST-.", + "visibleRule": "publishJUnitResults = true" + }, + { + "name": "testRunTitle", + "type": "string", + "label": "Test Run Title", + "defaultValue": "", + "required": false, + "groupName": "junitTestResults", + "helpMarkDown": "Provide a name for the test run.", + "visibleRule": "publishJUnitResults = true" + }, + { + "name": "enableCodeCoverage", + "type": "boolean", + "label": "Enable Code Coverage", + "defaultValue": "false", + "groupName": "codeCoverage", + "helpMarkDown": "Select this option to enable Code Coverage using Istanbul." + }, + { + "name": "testFramework", + "type": "pickList", + "label": "Test Framework", + "required": false, + "groupName": "codeCoverage", + "defaultValue": "Mocha", + "helpMarkDown": "Select your test framework.", + "options": { + "Mocha": "Mocha", + "Jasmine": "Jasmine" + }, + "visibleRule": "enableCodeCoverage = true" + }, + { + "name": "srcFiles", + "type": "string", + "label": "Source Files", + "defaultValue": "", + "required": false, + "groupName": "codeCoverage", + "helpMarkDown": "Provide the path to your source files which you want to hookRequire()", + "visibleRule": "enableCodeCoverage = true" + }, + { + "name": "testFiles", + "type": "string", + "label": "Test Script Files", + "defaultValue": "test/*.js", + "required": true, + "groupName": "codeCoverage", + "helpMarkDown": "Provide the path to your test script files", + "visibleRule": "enableCodeCoverage = true" + } + ], + "execution": { + "Node10": { + "target": "grunttask.js", + "argumentFormat": "" + }, + "Node16": { + "target": "grunttask.js", + "argumentFormat": "" + }, + "Node20": { + "target": "grunttask.js", + "argumentFormat": "" + } + }, + "messages": { + "GruntCliNotInstalled": "Grunt-cli is not installed globally (or is not in the path of the user the agent is running as) and it is not in the local working folder: %s", + "GruntReturnCode": "Grunt exited with return code: %d", + "GruntFailed": "Grunt failed with error: %s", + "NpmFailed": "Npm failed with error: %s", + "IstanbulFailed": "Istanbul failed with error: %s" + }, + "_buildConfigMapping": { + "Default": "0.229.0", + "Node20-225": "0.229.1" + } +} \ No newline at end of file diff --git a/_generated/GruntV0_Node20/task.loc.json b/_generated/GruntV0_Node20/task.loc.json new file mode 100644 index 000000000000..ff459ca861e7 --- /dev/null +++ b/_generated/GruntV0_Node20/task.loc.json @@ -0,0 +1,186 @@ +{ + "id": "521D1E15-F5FB-4B73-A93B-B2FE88A9A286", + "name": "Grunt", + "friendlyName": "ms-resource:loc.friendlyName", + "description": "ms-resource:loc.description", + "helpUrl": "https://docs.microsoft.com/azure/devops/pipelines/tasks/build/grunt", + "helpMarkDown": "ms-resource:loc.helpMarkDown", + "category": "Build", + "visibility": [ + "Build" + ], + "runsOn": [ + "Agent", + "DeploymentGroup" + ], + "author": "Microsoft Corporation", + "version": { + "Major": 0, + "Minor": 229, + "Patch": 1 + }, + "demands": [ + "node.js" + ], + "minimumAgentVersion": "1.91.0", + "groups": [ + { + "name": "advanced", + "displayName": "ms-resource:loc.group.displayName.advanced", + "isExpanded": false + }, + { + "name": "junitTestResults", + "displayName": "ms-resource:loc.group.displayName.junitTestResults", + "isExpanded": true + }, + { + "name": "codeCoverage", + "displayName": "ms-resource:loc.group.displayName.codeCoverage", + "isExpanded": true + } + ], + "instanceNameFormat": "ms-resource:loc.instanceNameFormat", + "inputs": [ + { + "name": "gruntFile", + "type": "filePath", + "label": "ms-resource:loc.input.label.gruntFile", + "defaultValue": "gruntfile.js", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.gruntFile" + }, + { + "name": "targets", + "type": "string", + "label": "ms-resource:loc.input.label.targets", + "defaultValue": "", + "helpMarkDown": "ms-resource:loc.input.help.targets", + "required": false + }, + { + "name": "arguments", + "type": "string", + "label": "ms-resource:loc.input.label.arguments", + "defaultValue": "", + "helpMarkDown": "ms-resource:loc.input.help.arguments", + "required": false + }, + { + "name": "cwd", + "aliases": [ + "workingDirectory" + ], + "type": "filePath", + "label": "ms-resource:loc.input.label.cwd", + "defaultValue": "", + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.cwd", + "groupName": "advanced" + }, + { + "name": "gruntCli", + "type": "string", + "label": "ms-resource:loc.input.label.gruntCli", + "defaultValue": "node_modules/grunt-cli/bin/grunt", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.gruntCli", + "groupName": "advanced" + }, + { + "name": "publishJUnitResults", + "type": "boolean", + "label": "ms-resource:loc.input.label.publishJUnitResults", + "defaultValue": "false", + "groupName": "junitTestResults", + "helpMarkDown": "ms-resource:loc.input.help.publishJUnitResults" + }, + { + "name": "testResultsFiles", + "type": "filePath", + "label": "ms-resource:loc.input.label.testResultsFiles", + "defaultValue": "**/TEST-*.xml", + "required": true, + "groupName": "junitTestResults", + "helpMarkDown": "ms-resource:loc.input.help.testResultsFiles", + "visibleRule": "publishJUnitResults = true" + }, + { + "name": "testRunTitle", + "type": "string", + "label": "ms-resource:loc.input.label.testRunTitle", + "defaultValue": "", + "required": false, + "groupName": "junitTestResults", + "helpMarkDown": "ms-resource:loc.input.help.testRunTitle", + "visibleRule": "publishJUnitResults = true" + }, + { + "name": "enableCodeCoverage", + "type": "boolean", + "label": "ms-resource:loc.input.label.enableCodeCoverage", + "defaultValue": "false", + "groupName": "codeCoverage", + "helpMarkDown": "ms-resource:loc.input.help.enableCodeCoverage" + }, + { + "name": "testFramework", + "type": "pickList", + "label": "ms-resource:loc.input.label.testFramework", + "required": false, + "groupName": "codeCoverage", + "defaultValue": "Mocha", + "helpMarkDown": "ms-resource:loc.input.help.testFramework", + "options": { + "Mocha": "Mocha", + "Jasmine": "Jasmine" + }, + "visibleRule": "enableCodeCoverage = true" + }, + { + "name": "srcFiles", + "type": "string", + "label": "ms-resource:loc.input.label.srcFiles", + "defaultValue": "", + "required": false, + "groupName": "codeCoverage", + "helpMarkDown": "ms-resource:loc.input.help.srcFiles", + "visibleRule": "enableCodeCoverage = true" + }, + { + "name": "testFiles", + "type": "string", + "label": "ms-resource:loc.input.label.testFiles", + "defaultValue": "test/*.js", + "required": true, + "groupName": "codeCoverage", + "helpMarkDown": "ms-resource:loc.input.help.testFiles", + "visibleRule": "enableCodeCoverage = true" + } + ], + "execution": { + "Node10": { + "target": "grunttask.js", + "argumentFormat": "" + }, + "Node16": { + "target": "grunttask.js", + "argumentFormat": "" + }, + "Node20": { + "target": "grunttask.js", + "argumentFormat": "" + } + }, + "messages": { + "GruntCliNotInstalled": "ms-resource:loc.messages.GruntCliNotInstalled", + "GruntReturnCode": "ms-resource:loc.messages.GruntReturnCode", + "GruntFailed": "ms-resource:loc.messages.GruntFailed", + "NpmFailed": "ms-resource:loc.messages.NpmFailed", + "IstanbulFailed": "ms-resource:loc.messages.IstanbulFailed" + }, + "_buildConfigMapping": { + "Default": "0.229.0", + "Node20-225": "0.229.1" + } +} \ No newline at end of file diff --git a/_generated/GruntV0_Node20/tsconfig.json b/_generated/GruntV0_Node20/tsconfig.json new file mode 100644 index 000000000000..0438b79f69ac --- /dev/null +++ b/_generated/GruntV0_Node20/tsconfig.json @@ -0,0 +1,6 @@ +{ + "compilerOptions": { + "target": "ES6", + "module": "commonjs" + } +} \ No newline at end of file diff --git a/_generated/GulpV0.versionmap.txt b/_generated/GulpV0.versionmap.txt new file mode 100644 index 000000000000..378f4c63ee24 --- /dev/null +++ b/_generated/GulpV0.versionmap.txt @@ -0,0 +1,2 @@ +Default|0.229.0 +Node20-225|0.229.1 diff --git a/_generated/GulpV0/Strings/resources.resjson/de-DE/resources.resjson b/_generated/GulpV0/Strings/resources.resjson/de-DE/resources.resjson new file mode 100644 index 000000000000..f851f3285163 --- /dev/null +++ b/_generated/GulpV0/Strings/resources.resjson/de-DE/resources.resjson @@ -0,0 +1,38 @@ +{ + "loc.friendlyName": "gulp", + "loc.helpMarkDown": "[Weitere Informationen zu dieser Aufgabe](https://go.microsoft.com/fwlink/?LinkID=613721)", + "loc.description": "Hiermit wird das aufgabenbasierte Node.js-Streamingbuildsystem gulp ausgeführt.", + "loc.instanceNameFormat": "gulp $(targets)", + "loc.group.displayName.advanced": "Erweitert", + "loc.group.displayName.junitTestResults": "JUnit-Testergebnisse", + "loc.group.displayName.codeCoverage": "Code Coverage", + "loc.input.label.gulpFile": "gulp-Dateipfad", + "loc.input.help.gulpFile": "Der relative Pfad vom Repositorystamm der auszuführenden gulp-Skriptdatei.", + "loc.input.label.targets": "gulp-Aufgabe(n)", + "loc.input.help.targets": "Optional. Mit Leerzeichen getrennte Liste der auszuführenden Aufgaben. Wenn nicht angegeben, wird die Standardaufgabe ausgeführt.", + "loc.input.label.arguments": "Argumente", + "loc.input.help.arguments": "Zusätzliche Argumente, die an Gulp übergeben werden. \"-gulpfile\" wurde bereits über die gulpFile-Eingabe weiter oben hinzugefügt und ist daher nicht erforderlich.", + "loc.input.label.cwd": "Arbeitsverzeichnis", + "loc.input.help.cwd": "Aktuelles Arbeitsverzeichnis bei Skriptausführung. Standardmäßig der Ordner, in dem das Skript gespeichert ist.", + "loc.input.label.gulpjs": "Speicherort von \"gulp.js\"", + "loc.input.help.gulpjs": "Die auszuführende Datei \"gulp.js\", wenn der Agent keine globale Installation von Gulp findet. Standardmäßig wird die Datei \"gulp.js\" im Ordner \"node_modules\" des Arbeitsverzeichnisses verwendet.", + "loc.input.label.publishJUnitResults": "In Azure Pipelines veröffentlichen", + "loc.input.help.publishJUnitResults": "Wählen Sie diese Option aus, um vom gulp-Build erzeugte JUnit-Testergebnisse in Azure Pipelines zu veröffentlichen.", + "loc.input.label.testResultsFiles": "Testergebnisdateien", + "loc.input.help.testResultsFiles": "Der Pfad der Testergebnisdateien. Platzhalter können verwendet werden. Beispiel: \"**/TEST-*.xml\" für alle XML-Dateien, deren Name mit \"TEST-\" beginnt.", + "loc.input.label.testRunTitle": "Testlauftitel", + "loc.input.help.testRunTitle": "Geben Sie einen Namen für den Testlauf an.", + "loc.input.label.enableCodeCoverage": "Code Coverage aktivieren", + "loc.input.help.enableCodeCoverage": "Wählen Sie diese Option aus, um Code Coverage mithilfe von Istanbul zu aktivieren.", + "loc.input.label.testFramework": "Testframework", + "loc.input.help.testFramework": "Wählen Sie das Testframework aus.", + "loc.input.label.srcFiles": "Quelldateien", + "loc.input.help.srcFiles": "Geben Sie den Pfad zu Ihren Quelldateien an, für die hookRequire() gelten soll.", + "loc.input.label.testFiles": "Testskriptdateien", + "loc.input.help.testFiles": "Geben Sie den Pfad zu Ihren Testskriptdateien an.", + "loc.messages.GulpNotInstalled": "gulp ist nicht global installiert (oder ist nicht im Pfad des Benutzers enthalten, als der der Agent ausgeführt wird) und befindet sich nicht im lokalen Arbeitsordner: %s", + "loc.messages.GulpReturnCode": "gulp wurde mit dem folgenden Rückgabecode beendet: %d", + "loc.messages.GulpFailed": "gulp-Fehler: %s", + "loc.messages.NpmFailed": "Npm-Fehler: %s", + "loc.messages.IstanbulFailed": "Istanbul-Fehler: %s" +} \ No newline at end of file diff --git a/_generated/GulpV0/Strings/resources.resjson/en-US/resources.resjson b/_generated/GulpV0/Strings/resources.resjson/en-US/resources.resjson new file mode 100644 index 000000000000..63a9644c3c00 --- /dev/null +++ b/_generated/GulpV0/Strings/resources.resjson/en-US/resources.resjson @@ -0,0 +1,38 @@ +{ + "loc.friendlyName": "gulp", + "loc.helpMarkDown": "[Learn more about this task](https://go.microsoft.com/fwlink/?LinkID=613721)", + "loc.description": "Run the gulp Node.js streaming task-based build system", + "loc.instanceNameFormat": "gulp $(targets)", + "loc.group.displayName.advanced": "Advanced", + "loc.group.displayName.junitTestResults": "JUnit Test Results", + "loc.group.displayName.codeCoverage": "Code Coverage", + "loc.input.label.gulpFile": "gulp File Path", + "loc.input.help.gulpFile": "Relative path from repo root of the gulp file script file to run.", + "loc.input.label.targets": "gulp Task(s)", + "loc.input.help.targets": "Optional. Space delimited list of tasks to run. If not specified, the default task will run.", + "loc.input.label.arguments": "Arguments", + "loc.input.help.arguments": "Additional arguments passed to gulp. --gulpfile is not needed since already added via gulpFile input above.", + "loc.input.label.cwd": "Working Directory", + "loc.input.help.cwd": "Current working directory when script is run. Defaults to the folder where the script is located.", + "loc.input.label.gulpjs": "gulp.js location", + "loc.input.help.gulpjs": "gulp.js to run when agent can't find global installed gulp. Defaults to the gulp.js under node_modules folder of the working directory.", + "loc.input.label.publishJUnitResults": "Publish to Azure Pipelines", + "loc.input.help.publishJUnitResults": "Select this option to publish JUnit test results produced by the gulp build to Azure Pipelines.", + "loc.input.label.testResultsFiles": "Test Results Files", + "loc.input.help.testResultsFiles": "Test results files path. Wildcards can be used. For example, `**/TEST-*.xml` for all XML files whose name starts with TEST-.", + "loc.input.label.testRunTitle": "Test Run Title", + "loc.input.help.testRunTitle": "Provide a name for the test run.", + "loc.input.label.enableCodeCoverage": "Enable code Coverage", + "loc.input.help.enableCodeCoverage": "Select this option to enable Code Coverage using Istanbul.", + "loc.input.label.testFramework": "Test Framework", + "loc.input.help.testFramework": "Select your test framework.", + "loc.input.label.srcFiles": "Source Files", + "loc.input.help.srcFiles": "Provide the path to your source files which you want to hookRequire()", + "loc.input.label.testFiles": "Test Script Files", + "loc.input.help.testFiles": "Provide the path to your test script files", + "loc.messages.GulpNotInstalled": "gulp is not installed globally (or is not in the path of the user the agent is running as) and it is not in the local working folder: %s", + "loc.messages.GulpReturnCode": "gulp exited with return code: %d", + "loc.messages.GulpFailed": "gulp failed with error: %s", + "loc.messages.NpmFailed": "Npm failed with error: %s", + "loc.messages.IstanbulFailed": "Istanbul failed with error: %s" +} \ No newline at end of file diff --git a/_generated/GulpV0/Strings/resources.resjson/es-ES/resources.resjson b/_generated/GulpV0/Strings/resources.resjson/es-ES/resources.resjson new file mode 100644 index 000000000000..d17e30890fdd --- /dev/null +++ b/_generated/GulpV0/Strings/resources.resjson/es-ES/resources.resjson @@ -0,0 +1,38 @@ +{ + "loc.friendlyName": "gulp", + "loc.helpMarkDown": "[Obtener más información acerca de esta tarea](https://go.microsoft.com/fwlink/?LinkID=613721)", + "loc.description": "Ejecute el sistema de compilación basado en tareas de streaming de Node.js con gulp.", + "loc.instanceNameFormat": "$(targets) de Gulp", + "loc.group.displayName.advanced": "Avanzado", + "loc.group.displayName.junitTestResults": "Resultados de pruebas JUnit", + "loc.group.displayName.codeCoverage": "Cobertura de código", + "loc.input.label.gulpFile": "Ruta de acceso del archivo gulp", + "loc.input.help.gulpFile": "Ruta de acceso relativa de la raíz del repositorio del archivo de script Gulp que se va a ejecutar.", + "loc.input.label.targets": "Tareas de gulp", + "loc.input.help.targets": "Opcional. Lista de tareas para ejecutar delimitada por espacios. Si no se especifica, se ejecutará la tarea predeterminada.", + "loc.input.label.arguments": "Argumentos", + "loc.input.help.arguments": "Argumentos adicionales pasados a Gulp. --gulpfile no es necesario porque ya se agregó a través de la entrada gulpFile anterior.", + "loc.input.label.cwd": "Directorio de trabajo", + "loc.input.help.cwd": "Directorio de trabajo actual cuando el script se ejecuta. Se establece de forma predeterminada en la carpeta en la que se encuentra el script.", + "loc.input.label.gulpjs": "Ubicación de gulp.js", + "loc.input.help.gulpjs": "Archivo gulp.js que se va a ejecutar cuando el agente no encuentra el Gulp instalado global. El archivo gulp.js de la carpeta node_modules del directorio de trabajo es la opción predeterminada.", + "loc.input.label.publishJUnitResults": "Publicar en Azure Pipelines", + "loc.input.help.publishJUnitResults": "Seleccione esta opción para publicar los resultados de pruebas JUnit generados por la compilación de gulp en Azure Pipelines.", + "loc.input.label.testResultsFiles": "Archivos de resultados de pruebas", + "loc.input.help.testResultsFiles": "Ruta de acceso a los archivos de resultados de pruebas. Se pueden usar caracteres comodín. Por ejemplo, \"**/TEST-*.xml\" para todos los archivos XML cuyos nombres empiecen por TEST-.", + "loc.input.label.testRunTitle": "Título de la serie de pruebas", + "loc.input.help.testRunTitle": "Asigne un nombre a la serie de pruebas.", + "loc.input.label.enableCodeCoverage": "Habilitar Cobertura de código", + "loc.input.help.enableCodeCoverage": "Seleccione esta opción para habilitar Cobertura de código con Istanbul.", + "loc.input.label.testFramework": "Marco de pruebas", + "loc.input.help.testFramework": "Seleccione su marco de pruebas.", + "loc.input.label.srcFiles": "Archivos de origen", + "loc.input.help.srcFiles": "Proporcione la ruta de acceso a los archivos de origen que quiera para hookRequire().", + "loc.input.label.testFiles": "Archivos de script de prueba", + "loc.input.help.testFiles": "Proporcione la ruta de acceso a sus archivos de script de prueba.", + "loc.messages.GulpNotInstalled": "No se ha instalado gulp a nivel global (o no está en la ruta del usuario con el que se ejecuta el agente) y no está en la carpeta de trabajo local: %s", + "loc.messages.GulpReturnCode": "Se ha cerrado gulp con el código de retorno: %d", + "loc.messages.GulpFailed": "Error de gulp: %s", + "loc.messages.NpmFailed": "Error de Npm: %s", + "loc.messages.IstanbulFailed": "Error de Istanbul: %s" +} \ No newline at end of file diff --git a/_generated/GulpV0/Strings/resources.resjson/fr-FR/resources.resjson b/_generated/GulpV0/Strings/resources.resjson/fr-FR/resources.resjson new file mode 100644 index 000000000000..93d7f79849cb --- /dev/null +++ b/_generated/GulpV0/Strings/resources.resjson/fr-FR/resources.resjson @@ -0,0 +1,38 @@ +{ + "loc.friendlyName": "gulp", + "loc.helpMarkDown": "[En savoir plus sur cette tâche](https://go.microsoft.com/fwlink/?LinkID=613721)", + "loc.description": "Exécuter le système de build basé sur les tâches de streaming Node.js de gulp", + "loc.instanceNameFormat": "gulp $(targets)", + "loc.group.displayName.advanced": "Avancé", + "loc.group.displayName.junitTestResults": "Résultats du test JUnit", + "loc.group.displayName.codeCoverage": "Couverture du code", + "loc.input.label.gulpFile": "Chemin de fichier gulp", + "loc.input.help.gulpFile": "Chemin relatif de la racine de dépôt du fichier script du fichier gulp à exécuter.", + "loc.input.label.targets": "Tâche(s) gulp", + "loc.input.help.targets": "Facultatif. Liste des tâches à exécuter délimitées par des espaces. Si elle n'est pas spécifiée, la tâche par défaut est exécutée.", + "loc.input.label.arguments": "Arguments", + "loc.input.help.arguments": "Arguments supplémentaires passés à gulp. --gulpfile n'est pas nécessaire, car il est déjà ajouté via l'entrée gulpFile ci-dessus.", + "loc.input.label.cwd": "Répertoire de travail", + "loc.input.help.cwd": "Répertoire de travail actuel quand le script est exécuté. Il s'agit généralement du dossier dans lequel se trouve le script.", + "loc.input.label.gulpjs": "Emplacement de gulp.js", + "loc.input.help.gulpjs": "Fichier gulp.js à exécuter quand l'agent ne trouve pas le gulp installé global. Correspond par défaut au fichier gulp.js sous le dossier node_modules du répertoire de travail.", + "loc.input.label.publishJUnitResults": "Publier sur Azure Pipelines", + "loc.input.help.publishJUnitResults": "Sélectionnez cette option pour publier les résultats des tests JUnit produits par la build gulp sur Azure Pipelines.", + "loc.input.label.testResultsFiles": "Fichiers des résultats des tests", + "loc.input.help.testResultsFiles": "Chemin des fichiers de résultats des tests. Les caractères génériques sont autorisés. Par exemple, '**/TEST-*.xml' correspond à tous les fichiers XML dont le nom commence par TEST-.", + "loc.input.label.testRunTitle": "Titre de l'exécution du test", + "loc.input.help.testRunTitle": "Indiquez le nom de la série de tests.", + "loc.input.label.enableCodeCoverage": "Activer la couverture du code", + "loc.input.help.enableCodeCoverage": "Sélectionnez cette option pour activer la couverture du code à l'aide d'Istanbul.", + "loc.input.label.testFramework": "Framework de tests", + "loc.input.help.testFramework": "Sélectionnez votre framework de tests.", + "loc.input.label.srcFiles": "Fichiers sources", + "loc.input.help.srcFiles": "Indiquez le chemin des fichiers sources auxquels vous voulez appliquer hookRequire()", + "loc.input.label.testFiles": "Fichiers de script de test", + "loc.input.help.testFiles": "Indiquez le chemin de vos fichiers de script de test", + "loc.messages.GulpNotInstalled": "gulp n'est pas installé de manière globale ou ne se trouve pas dans le chemin de l'utilisateur via lequel l'agent s'exécute. De plus, il ne se trouve pas dans le dossier de travail local : %s", + "loc.messages.GulpReturnCode": "Sortie de gulp. Code de retour : %d", + "loc.messages.GulpFailed": "Échec de gulp. Erreur : %s", + "loc.messages.NpmFailed": "Échec de Npm. Erreur : %s", + "loc.messages.IstanbulFailed": "Échec d'Istanbul avec l'erreur : %s" +} \ No newline at end of file diff --git a/_generated/GulpV0/Strings/resources.resjson/it-IT/resources.resjson b/_generated/GulpV0/Strings/resources.resjson/it-IT/resources.resjson new file mode 100644 index 000000000000..63cb429d56f8 --- /dev/null +++ b/_generated/GulpV0/Strings/resources.resjson/it-IT/resources.resjson @@ -0,0 +1,38 @@ +{ + "loc.friendlyName": "gulp", + "loc.helpMarkDown": "[Altre informazioni su questa attività](https://go.microsoft.com/fwlink/?LinkID=613721)", + "loc.description": "Esegue il sistema di compilazione basato su attività di streaming Node.js di gulp", + "loc.instanceNameFormat": "gulp $(targets)", + "loc.group.displayName.advanced": "Avanzate", + "loc.group.displayName.junitTestResults": "Risultati del test JUnit", + "loc.group.displayName.codeCoverage": "Code coverage", + "loc.input.label.gulpFile": "Percorso file di gulp", + "loc.input.help.gulpFile": "Percorso relativo dalla radice del repository del file di script del file gulp da eseguire.", + "loc.input.label.targets": "Attività di gulp", + "loc.input.help.targets": "Facoltativo. Elenco di attività delimitate da spazio da eseguire. Se non è specificato, viene eseguita l'attività predefinita.", + "loc.input.label.arguments": "Argomenti", + "loc.input.help.arguments": "Argomenti aggiuntivi passati a gulp. --gulpfile non è necessario dal momento che è già stato aggiunto tramite l'input di gulpFile in precedenza.", + "loc.input.label.cwd": "Directory di lavoro", + "loc.input.help.cwd": "Directory di lavoro corrente durante l'esecuzione dello script. Per impostazione predefinita, corrisponde alla cartella in cui si trova lo script.", + "loc.input.label.gulpjs": "Percorso di gulp.js", + "loc.input.help.gulpjs": "File gulp.js da eseguire quando l'agente non riesce a trovare il file gulp installato globale. Per impostazione predefinita, viene usato il file gulp.js presente nella cartella node_modules della directory di lavoro.", + "loc.input.label.publishJUnitResults": "Pubblica in Azure Pipelines", + "loc.input.help.publishJUnitResults": "Selezionare questa opzione per pubblicare in Azure Pipelines i risultati di test JUnit ottenuti con la compilazione gulp.", + "loc.input.label.testResultsFiles": "File dei risultati del test", + "loc.input.help.testResultsFiles": "Percorso dei file dei risultati del test. È possibile usare i caratteri jolly, ad esempio `**/TEST-*.xml` per individuare tutti i file XML il cui nome inizia con TEST-.", + "loc.input.label.testRunTitle": "Titolo esecuzione dei test", + "loc.input.help.testRunTitle": "Consente di specificare un nome per l'esecuzione dei test.", + "loc.input.label.enableCodeCoverage": "Abilita code coverage", + "loc.input.help.enableCodeCoverage": "Selezionare questa opzione per abilitare il code coverage con Istanbul.", + "loc.input.label.testFramework": "Framework di test", + "loc.input.help.testFramework": "Consente di selezionare il framework di test.", + "loc.input.label.srcFiles": "File di origine", + "loc.input.help.srcFiles": "Consente di specificare il percorso dei file di origine per hookRequire()", + "loc.input.label.testFiles": "File di script di test", + "loc.input.help.testFiles": "Consente di specificare il percorso dei file di script di test", + "loc.messages.GulpNotInstalled": "gulp non è installato globalmente oppure non è presente nel percorso dell'utente con cui viene eseguito l'agente e non è incluso nella cartella di lavoro locale %s", + "loc.messages.GulpReturnCode": "gulp terminato. Codice restituito: %d", + "loc.messages.GulpFailed": "gulp non riuscito. Errore: %s", + "loc.messages.NpmFailed": "Npm non riuscito. Errore: %s", + "loc.messages.IstanbulFailed": "Istanbul non riuscito. Errore: %s" +} \ No newline at end of file diff --git a/_generated/GulpV0/Strings/resources.resjson/ja-JP/resources.resjson b/_generated/GulpV0/Strings/resources.resjson/ja-JP/resources.resjson new file mode 100644 index 000000000000..6643f9e5b65a --- /dev/null +++ b/_generated/GulpV0/Strings/resources.resjson/ja-JP/resources.resjson @@ -0,0 +1,38 @@ +{ + "loc.friendlyName": "gulp", + "loc.helpMarkDown": "[このタスクの詳細を表示](https://go.microsoft.com/fwlink/?LinkID=613721)", + "loc.description": "Node.js のストリーミング タスクベースのビルド システムである gulp を実行します", + "loc.instanceNameFormat": "gulp $(targets)", + "loc.group.displayName.advanced": "詳細設定", + "loc.group.displayName.junitTestResults": "JUnit のテスト結果", + "loc.group.displayName.codeCoverage": "コード カバレッジ", + "loc.input.label.gulpFile": "gulp ファイル パス", + "loc.input.help.gulpFile": "リポジトリのルートを基準として指定する、実行する gulp スクリプト ファイルの相対パス。", + "loc.input.label.targets": "gulp タスク", + "loc.input.help.targets": "(省略可能) スペース区切りの実行タスクのリスト。指定しない場合は、既定のタスクが実行されます。", + "loc.input.label.arguments": "引数", + "loc.input.help.arguments": "gulp に渡される追加の引数。上記の gulpFile 入力で既に追加されているので、--gulpfile は不要です。", + "loc.input.label.cwd": "作業ディレクトリ", + "loc.input.help.cwd": "スクリプトの実行時の現行の作業ディレクトリ。スクリプトが配置されているフォルダーを既定値に使用します。", + "loc.input.label.gulpjs": "gulp.js の場所", + "loc.input.help.gulpjs": "グローバルにインストールされた gulp をエージェントが見つけられない場合に実行する gulp.js。既定値は、作業ディレクトリの node_modules フォルダーの下にある gulp.js です。", + "loc.input.label.publishJUnitResults": "Azure Pipelines に公開する", + "loc.input.help.publishJUnitResults": "gulp のビルドによって生成される JUnit のテスト結果を Azure Pipelines に公開するには、このオプションを選びます。", + "loc.input.label.testResultsFiles": "テスト結果のファイル", + "loc.input.help.testResultsFiles": "テスト結果ファイルのパス。ワイルドカードを使用できます。たとえば、名前が TEST- で始まるすべての XML ファイルの場合は `**/TEST-*.xml` です。", + "loc.input.label.testRunTitle": "テスト実行のタイトル", + "loc.input.help.testRunTitle": "テストの実行の名前を指定します。", + "loc.input.label.enableCodeCoverage": "コード カバレッジを有効にする", + "loc.input.help.enableCodeCoverage": "Istanbul を使用してコード カバレッジを有効にするには、このオプションを選びます。", + "loc.input.label.testFramework": "テスト フレームワーク", + "loc.input.help.testFramework": "テスト フレームワークを選びます。", + "loc.input.label.srcFiles": "ソース ファイル", + "loc.input.help.srcFiles": "hookRequire() を実行しようとしているソース ファイルへのパスを指定します", + "loc.input.label.testFiles": "テスト スクリプト ファイル", + "loc.input.help.testFiles": "テスト スクリプト ファイルへのパスを指定します", + "loc.messages.GulpNotInstalled": "gulp はグローバルにインストールされていません (またはエージェントが実行しているユーザーのパスにありません)。またローカル作業フォルダーにありません: %s", + "loc.messages.GulpReturnCode": "gulp は、次のリターン コードで終了しました: %d", + "loc.messages.GulpFailed": "gulp が次のエラーで失敗しました: %s", + "loc.messages.NpmFailed": "Npm でエラーが発生しました: %s", + "loc.messages.IstanbulFailed": "Istanbul でエラーが発生しました: %s" +} \ No newline at end of file diff --git a/_generated/GulpV0/Strings/resources.resjson/ko-KR/resources.resjson b/_generated/GulpV0/Strings/resources.resjson/ko-KR/resources.resjson new file mode 100644 index 000000000000..26cb1b22149c --- /dev/null +++ b/_generated/GulpV0/Strings/resources.resjson/ko-KR/resources.resjson @@ -0,0 +1,38 @@ +{ + "loc.friendlyName": "gulp", + "loc.helpMarkDown": "[이 작업에 대한 자세한 정보](https://go.microsoft.com/fwlink/?LinkID=613721)", + "loc.description": "gulp Node.js 스트리밍 작업 기반 빌드 시스템을 실행합니다.", + "loc.instanceNameFormat": "gulp $(targets)", + "loc.group.displayName.advanced": "고급", + "loc.group.displayName.junitTestResults": "JUnit 테스트 결과", + "loc.group.displayName.codeCoverage": "코드 검사", + "loc.input.label.gulpFile": "gulp 파일 경로", + "loc.input.help.gulpFile": "실행할 gulp 파일 스크립트 파일의 리포 루트로부터의 상대 경로입니다.", + "loc.input.label.targets": "gulp 작업", + "loc.input.help.targets": "선택 사항. 공백으로 구분된 실행할 작업 목록입니다. 지정하지 않을 경우 기본 작업이 실행됩니다.", + "loc.input.label.arguments": "인수", + "loc.input.help.arguments": "추가 인수를 gulp에 전달했습니다. --gulpfile은 위의 gulpFile 입력을 통해 이미 추가되었으므로 필요하지 않습니다.", + "loc.input.label.cwd": "작업 디렉터리", + "loc.input.help.cwd": "스크립트 실행 시 현재 작업 디렉터리입니다. 기본값을 스크립트가 있는 폴더로 지정합니다.", + "loc.input.label.gulpjs": "gulp.js 위치", + "loc.input.help.gulpjs": "에이전트에서 전역 설치 Gulp를 찾을 수 없을 때 실행할 gulp.js입니다. 기본값은 작업 디렉터리의 node_modules 폴더 아래에 있는 gulp.js입니다.", + "loc.input.label.publishJUnitResults": "Azure Pipelines/에 게시", + "loc.input.help.publishJUnitResults": "gulp 빌드에서 생성된 JUnit 테스트 결과를 Azure Pipelines에 게시하려면 이 옵션을 선택합니다.", + "loc.input.label.testResultsFiles": "테스트 결과 파일", + "loc.input.help.testResultsFiles": "테스트 결과 파일 경로입니다. 와일드카드를 사용할 수 있습니다. 예를 들어, 이름이 TEST-로 시작하는 모든 XML 파일을 표시하기 위해 `**/TEST-*.xml`을 사용할 수 있습니다.", + "loc.input.label.testRunTitle": "테스트 실행 제목", + "loc.input.help.testRunTitle": "테스트 실행의 이름을 지정하세요.", + "loc.input.label.enableCodeCoverage": "코드 검사 사용", + "loc.input.help.enableCodeCoverage": "Istanbul을 사용하여 코드 검사를 사용하도록 설정하려면 이 옵션을 선택하세요.", + "loc.input.label.testFramework": "테스트 프레임워크", + "loc.input.help.testFramework": "테스트 프레임워크를 선택하세요.", + "loc.input.label.srcFiles": "소스 파일", + "loc.input.help.srcFiles": "hookRequire()를 적용할 소스 파일의 경로를 지정하세요.", + "loc.input.label.testFiles": "테스트 스크립트 파일", + "loc.input.help.testFiles": "테스트 스크립트 파일의 경로를 지정하세요.", + "loc.messages.GulpNotInstalled": "gulp가 전역으로 설치되지 않았거나 에이전트를 실행 중인 사용자의 경로에 없으며 로컬 작업 폴더 %s에 없습니다.", + "loc.messages.GulpReturnCode": "gulp가 종료되었습니다(반환 코드: %d).", + "loc.messages.GulpFailed": "오류가 발생하여 gulp에 실패했습니다. %s", + "loc.messages.NpmFailed": "오류 %s(으)로 Npm 실패", + "loc.messages.IstanbulFailed": "다음 오류가 발생하여 Istanbul이 실패했습니다. %s" +} \ No newline at end of file diff --git a/_generated/GulpV0/Strings/resources.resjson/ru-RU/resources.resjson b/_generated/GulpV0/Strings/resources.resjson/ru-RU/resources.resjson new file mode 100644 index 000000000000..288cabd1e2d6 --- /dev/null +++ b/_generated/GulpV0/Strings/resources.resjson/ru-RU/resources.resjson @@ -0,0 +1,38 @@ +{ + "loc.friendlyName": "gulp", + "loc.helpMarkDown": "[См. дополнительные сведения об этой задаче](https://go.microsoft.com/fwlink/?LinkID=613721)", + "loc.description": "Запуск системы сборки, основанной на задачах потоковой передачи Node.js gulp", + "loc.instanceNameFormat": "Gulp $(targets)", + "loc.group.displayName.advanced": "Дополнительно", + "loc.group.displayName.junitTestResults": "Результаты теста JUnit", + "loc.group.displayName.codeCoverage": "Объем протестированного кода", + "loc.input.label.gulpFile": "Путь к файлу gulp", + "loc.input.help.gulpFile": "Относительный путь от корня репозитория к файлу сценария Gulp, который подлежит выполнению.", + "loc.input.label.targets": "Задачи gulp", + "loc.input.help.targets": "Необязательно. Список запускаемых задач с разделителями-пробелами. Если он не указан, будет запущена задача по умолчанию.", + "loc.input.label.arguments": "Аргументы", + "loc.input.help.arguments": "Дополнительные аргументы, передаваемые в Gulp. Аргумент --gulpfile не требуется, так как он уже добавлен с помощью входного файла gulpFile выше.", + "loc.input.label.cwd": "Рабочий каталог", + "loc.input.help.cwd": "Текущий рабочий каталог при выполнении сценария. По умолчанию используется папка, в которой находится сценарий.", + "loc.input.label.gulpjs": "Расположение gulp.js", + "loc.input.help.gulpjs": "Gulp.js, который будет запущен, если агенту не удастся найти глобально установленный gulp. Значение по умолчанию — gulp.js в папке node_modules в рабочем каталоге.", + "loc.input.label.publishJUnitResults": "Опубликовать в Azure Pipelines", + "loc.input.help.publishJUnitResults": "Выберите этот параметр, чтобы опубликовать результаты тестов JUnit, созданные сборкой gulp, в Azure Pipelines.", + "loc.input.label.testResultsFiles": "Файлы результатов тестов", + "loc.input.help.testResultsFiles": "Путь к файлам результатов тестов. Можно использовать подстановочные знаки. Пример: \"**/TEST-*.xml\" для всех XML-файлов, имена которых начинаются с \"TEST-\".", + "loc.input.label.testRunTitle": "Заголовок тестового запуска", + "loc.input.help.testRunTitle": "Укажите имя для тестового запуска.", + "loc.input.label.enableCodeCoverage": "Включить оценку объема протестированного кода", + "loc.input.help.enableCodeCoverage": "Выберите этот параметр, чтобы включить оценку объема протестированного кода с помощью Istanbul.", + "loc.input.label.testFramework": "Платформа тестирования", + "loc.input.help.testFramework": "Выберите платформу тестирования.", + "loc.input.label.srcFiles": "Исходные файлы", + "loc.input.help.srcFiles": "Укажите путь к исходным файлам, к которым необходимо применить метод hookRequire()", + "loc.input.label.testFiles": "Файлы скриптов тестирования", + "loc.input.help.testFiles": "Укажите путь к файлам скриптов тестирования", + "loc.messages.GulpNotInstalled": "Набор gulp не установлен глобально (или не находится в пути пользователя, от имени которого выполняется агент) и не находится в локальной рабочей папке: %s", + "loc.messages.GulpReturnCode": "Завершение работы gulp с кодом возврата: %d", + "loc.messages.GulpFailed": "Сбой gulp с ошибкой: %s", + "loc.messages.NpmFailed": "Сбой NPM с ошибкой: %s", + "loc.messages.IstanbulFailed": "Сбой Istanbul с ошибкой: %s" +} \ No newline at end of file diff --git a/_generated/GulpV0/Strings/resources.resjson/zh-CN/resources.resjson b/_generated/GulpV0/Strings/resources.resjson/zh-CN/resources.resjson new file mode 100644 index 000000000000..c11e77dfc838 --- /dev/null +++ b/_generated/GulpV0/Strings/resources.resjson/zh-CN/resources.resjson @@ -0,0 +1,38 @@ +{ + "loc.friendlyName": "Gulp", + "loc.helpMarkDown": "[详细了解此任务](https://go.microsoft.com/fwlink/?LinkID=613721)", + "loc.description": "运行 Gulp 基于 Node.js 流任务的生成系统", + "loc.instanceNameFormat": "Gulp $(targets)", + "loc.group.displayName.advanced": "高级", + "loc.group.displayName.junitTestResults": "JUnit 测试结果", + "loc.group.displayName.codeCoverage": "代码覆盖率", + "loc.input.label.gulpFile": "Gulp 文件路径", + "loc.input.help.gulpFile": "要运行的 Gulp 文件脚本文件的存储库根路径的相对路径。", + "loc.input.label.targets": "Gulp 任务", + "loc.input.help.targets": "可选。待运行任务的列表,以空格分隔。如未指定,则将运行默认任务。", + "loc.input.label.arguments": "参数", + "loc.input.help.arguments": "传递给 Gulp 的其他参数。无需 --gulpfile,因为已通过上面的 gulpFile 输入添加。", + "loc.input.label.cwd": "工作目录", + "loc.input.help.cwd": "脚本运行时的当前工作目录。默认为脚本所处的文件夹。", + "loc.input.label.gulpjs": "gulp.js 位置", + "loc.input.help.gulpjs": "代理找不到全局安装的 Gulp 时要运行的 gulp.js。默认为工作目录的 node_modules 文件夹下的 gulp.js。", + "loc.input.label.publishJUnitResults": "发布到 Azure Pipelines", + "loc.input.help.publishJUnitResults": "选择此选项可将 Gulp 生成产生的 JUnit 测试结果发布到 Azure Pipelines。", + "loc.input.label.testResultsFiles": "测试结果文件", + "loc.input.help.testResultsFiles": "测试结果文件路径。可以使用通配符。例如,\"**/TEST-*.xml\" 表示名称以 TEST- 开头的所有 XML 文件。", + "loc.input.label.testRunTitle": "测试运行标题", + "loc.input.help.testRunTitle": "为测试运行提供一个名称。", + "loc.input.label.enableCodeCoverage": "启用代码覆盖率", + "loc.input.help.enableCodeCoverage": "选择此选项以使用 Istanbul 启用代码覆盖率。", + "loc.input.label.testFramework": "测试框架", + "loc.input.help.testFramework": "选择你的测试框架。", + "loc.input.label.srcFiles": "源文件", + "loc.input.help.srcFiles": "将你所需的源文件路径提供给 hookRequire()", + "loc.input.label.testFiles": "测试脚本文件", + "loc.input.help.testFiles": "提供测试脚本文件的路径", + "loc.messages.GulpNotInstalled": "Gulp 未在全局进行安装(或不位于代理运行身份用户的路径下),且不位于本地工作文件夹 %s 中", + "loc.messages.GulpReturnCode": "Gulp 已退出,返回代码为: %d", + "loc.messages.GulpFailed": "Gulp 失败,出现错误: %s", + "loc.messages.NpmFailed": "Npm 失败,出现错误: %s", + "loc.messages.IstanbulFailed": "Istanbul 失败,出现错误: %s" +} \ No newline at end of file diff --git a/_generated/GulpV0/Strings/resources.resjson/zh-TW/resources.resjson b/_generated/GulpV0/Strings/resources.resjson/zh-TW/resources.resjson new file mode 100644 index 000000000000..9232df910539 --- /dev/null +++ b/_generated/GulpV0/Strings/resources.resjson/zh-TW/resources.resjson @@ -0,0 +1,38 @@ +{ + "loc.friendlyName": "gulp", + "loc.helpMarkDown": "[深入了解此工作](https://go.microsoft.com/fwlink/?LinkID=613721)", + "loc.description": "執行 gulp Node.js 串流工作型建置系統", + "loc.instanceNameFormat": "Gulp $(targets)", + "loc.group.displayName.advanced": "進階", + "loc.group.displayName.junitTestResults": "JUnit 測試結果", + "loc.group.displayName.codeCoverage": "程式碼涵蓋範圍", + "loc.input.label.gulpFile": "gulp 檔案路徑", + "loc.input.help.gulpFile": "要執行的 gulp 檔指令檔存放庫根路徑相對路徑。", + "loc.input.label.targets": "gulp 工作", + "loc.input.help.targets": "可省略。以空格分隔要執行之工作的清單。若未指定,將會執行預設工作。", + "loc.input.label.arguments": "引數", + "loc.input.help.arguments": "傳遞至 Gulp 的額外引數。 --不需要 gulpfile 因為已透過上述 gulpFile 輸入加入。", + "loc.input.label.cwd": "工作目錄", + "loc.input.help.cwd": "執行指令碼後的目前工作目錄。預設為指令碼所在的資料夾。", + "loc.input.label.gulpjs": "gulp.js 的位置", + "loc.input.help.gulpjs": "當代理程式找不到全域安裝的 Gulp 時所要執行的 gulp.js,預設為工作目錄 node_modules 資料夾下的 gulp.js。", + "loc.input.label.publishJUnitResults": "發佈至 Azure Pipelines", + "loc.input.help.publishJUnitResults": "選取此選項會將 gulp 組建所產生的 JUnit 測試結果發佈至 Azure Pipelines。", + "loc.input.label.testResultsFiles": "測試結果檔案", + "loc.input.help.testResultsFiles": "測試結果檔案路徑。可使用萬用字元。例如 `**/TEST-*.xml` 即適用於所有名稱開頭為 TEST- 的 XML 檔案。", + "loc.input.label.testRunTitle": "測試回合標題", + "loc.input.help.testRunTitle": "提供測試回合的名稱。", + "loc.input.label.enableCodeCoverage": "啟用程式碼涵蓋範圍", + "loc.input.help.enableCodeCoverage": "選取這個選項,以使用 Istanbul 啟用程式碼涵蓋範圍。", + "loc.input.label.testFramework": "測試架構", + "loc.input.help.testFramework": "選取測試架構。", + "loc.input.label.srcFiles": "原始程式檔", + "loc.input.help.srcFiles": "提供要進行 hookRequire() 之原始程式檔的路徑", + "loc.input.label.testFiles": "測試指令檔", + "loc.input.help.testFiles": "提供測試指令碼檔案的路徑", + "loc.messages.GulpNotInstalled": "gulp 未全域安裝 (或不在作為代理程式執行身分的使用者路徑中) 且不在本機工作資料夾: %s", + "loc.messages.GulpReturnCode": "gulp 已結束,傳回碼: %d", + "loc.messages.GulpFailed": "gulp 失敗,錯誤: %s", + "loc.messages.NpmFailed": "Npm 失敗,錯誤為: %s", + "loc.messages.IstanbulFailed": "Istanbul 失敗,錯誤為: %s" +} \ No newline at end of file diff --git a/_generated/GulpV0/Tests/L0.ts b/_generated/GulpV0/Tests/L0.ts new file mode 100644 index 000000000000..3837407049fc --- /dev/null +++ b/_generated/GulpV0/Tests/L0.ts @@ -0,0 +1,242 @@ +import assert = require('assert'); +import path = require('path'); +import os = require('os'); +import * as ttm from 'azure-pipelines-task-lib/mock-test'; + +const isWin = os.type().match(/^Win/); + +describe('GulpV0 Suite', function () { + this.timeout(parseInt(process.env.TASK_TEST_TIMEOUT) || 20000); + + before((done: Mocha.Done) => { + process.env['SYSTEM_DEFAULTWORKINGDIRECTORY'] = '/user/build'; + done(); + }); + + it('runs a gulpfile through global gulp', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0GulpGlobalGood.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.ran('/usr/local/bin/gulp --gulpfile gulpfile.js'), 'it should have run Gulp'); + assert(tr.invokedToolCount == 1, 'should have only run gulp'); + assert(tr.stderr.length == 0, 'should not have written to stderr'); + assert(tr.succeeded, 'task should have succeeded'); + + done(); + }); + + it('runs a gulpfile through local gulp', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0GulpLocalGood.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + if (isWin) { + assert( + tr.ran('/usr/local/bin/node c:\\fake\\wd\\node_modules\\gulp\\gulp.js --gulpfile gulpfile.js'), + 'it should have run gulp' + ); + } else { + assert( + tr.ran('/usr/local/bin/node /fake/wd/node_modules/gulp/gulp.js --gulpfile gulpfile.js'), + 'it should have run gulp' + ); + } + assert(tr.invokedToolCount == 1, 'should have only run gulp'); + assert(tr.stderr.length == 0, 'should not have written to stderr'); + assert(tr.succeeded, 'task should have succeeded'); + + done(); + }); + + it('runs gulp when code coverage is enabled', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0GulpGlobalGoodWithCodeCoverage.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.ran('/usr/local/bin/gulp --gulpfile gulpfile.js'), 'it should have run Gulp'); + assert(tr.invokedToolCount == 3, 'should have run npm, Gulp and istanbul'); + assert(tr.stderr.length == 0, 'should not have written to stderr'); + assert(tr.succeeded, 'task should have succeeded'); + + done(); + }); + + it('runs a gulpFile when publishJUnitTestResults is false', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0PublishJUnitTestResultsFalse.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.ran('/usr/local/bin/gulp --gulpfile gulpfile.js'), 'it should have run Gulp'); + assert(tr.invokedToolCount == 1, 'should have only run Gulp'); + assert(tr.stderr.length == 0, 'should not have written to stderr'); + assert(tr.succeeded, 'task should have succeeded'); + + done(); + }); + + it('fails if gulpFile not set', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0GulpFileNotSet.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.stdOutContained('Input required: gulpFile'), 'Should have printed: Input required: gulpFile'); + assert(tr.invokedToolCount == 0, 'should exit before running Gulp'); + assert(tr.failed, 'should have failed'); + + done(); + }); + + it('fails if cwd not set', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0CwdNotSet.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.stdOutContained('Input required: cwd'), 'Should have printed: Input required: cwd'); + assert(tr.invokedToolCount == 0, 'should exit before running Gulp'); + assert(tr.failed, 'should have failed'); + + done(); + }); + + it('fails if gulpjs not set', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0GulpjsNotSet.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.stdOutContained('Input required: gulpjs'), 'Should have printed: Input required: gulpjs'); + assert(tr.invokedToolCount == 0, 'should exit before running Gulp'); + assert(tr.failed, 'should have failed'); + + done(); + }); + + it('fails if gulpFile not found', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0NoGulpFile.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.stdOutContained('Not found gulpfile.js'), 'Should have printed: Not found gulpfile.js'); + assert(tr.invokedToolCount == 0, 'should exit before running Gulp'); + assert(tr.failed, 'should have failed'); + + done(); + }); + + it('fails if gulp no exist globally and locally', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0NoGulp.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.stdOutContained('loc_mock_GulpNotInstalled'), 'Should have printed: loc_mock_GulpNotInstalled'); + assert(tr.failed, 'should have failed'); + + done(); + }); + + it('fails if npm fails', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0NpmFails.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.stdOutContained('loc_mock_NpmFailed'), 'Should have printed: loc_mock_NpmFailed'); + assert(tr.invokedToolCount == 2, 'should exit before running Gulp'); + assert(tr.failed, 'should have failed'); + + done(); + }); + + it('fails if gulp fails', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0GulpFails.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.ran('/usr/local/bin/gulp --gulpfile gulpfile.js'), 'it should have run gulp'); + assert(tr.stdOutContained('loc_mock_GulpFailed'), 'Should have printed: loc_mock_GulpFailed'); + assert(tr.invokedToolCount == 1, 'should have run npm and gulp'); + assert(tr.failed, 'should have failed'); + + done(); + }); + + it('fails if istanbul fails', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0IstanbulFails.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.ran('/usr/local/bin/gulp --gulpfile gulpfile.js'), 'it should have run gulp'); + assert(tr.stdOutContained('loc_mock_IstanbulFailed'), 'Should have printed: loc_mock_IstanbulFailed'); + assert(tr.invokedToolCount == 3, 'should have run npm, gulp and istanbul'); + assert(tr.failed, 'should have failed'); + + done(); + }); + + it('fails when test result files input is not provided', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0TestResultFilesNotSet.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.stdOutContained('Input required: testResultsFiles'), 'Should have printed: Input required: testResultsFiles'); + assert(tr.invokedToolCount == 0, 'should exit before running Gulp'); + assert(tr.failed, 'should have failed'); + + done(); + }); + + it('gives warning and runs when test result files input does not match any file', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0TestResultFilesDoesNotMatchAnyFile.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.ran('/usr/local/bin/gulp --gulpfile gulpfile.js'), 'it should have run gulp'); + assert(tr.invokedToolCount == 1, 'should run completely'); + assert( + tr.stdout.search('No pattern found in testResultsFiles parameter') >= 0, + 'should give a warning for test file pattern not matched.' + ); + assert(tr.succeeded, 'task should have succeeded'); + + done(); + }); + + it('fails when test source files input is not provided for coverage', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0NoTestSourceFiles.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.stdOutContained('Input required: testFiles'), 'Should have printed: Input required: testFiles'); + assert(tr.invokedToolCount == 0, 'should exit before running Gulp'); + assert(tr.failed, 'should have failed'); + + done(); + }); + + it('fails when test source files input does not match any file', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0InvalidTestSource.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.stdOutContained('loc_mock_IstanbulFaile'), 'Should have printed: loc_mock_IstanbulFaile'); + assert(tr.invokedToolCount == 3, 'should exit while running istanbul'); + assert(tr.failed, 'should have failed'); + + done(); + }); +}); diff --git a/_generated/GulpV0/Tests/L0CwdNotSet.ts b/_generated/GulpV0/Tests/L0CwdNotSet.ts new file mode 100644 index 000000000000..e804d2031ac1 --- /dev/null +++ b/_generated/GulpV0/Tests/L0CwdNotSet.ts @@ -0,0 +1,60 @@ +import ma = require("azure-pipelines-task-lib/mock-answer"); +import tmrm = require("azure-pipelines-task-lib/mock-run"); +import path = require("path"); + +let taskPath = path.join(__dirname, "..", "gulptask.js"); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput("gulpFile", "gulpfile.js"); +tr.setInput("gulpjs", "node_modules/gulp/gulp.js"); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "gulp": "/usr/local/bin/gulp", + "npm": "/usr/local/bin/npm", + "node": "/usr/local/bin/node", + "istanbulWin": "/usr/local/bin/istanbul", + "istanbul": "/usr/local/bin/node_modules/istanbul/lib/cli.js", + }, + "exec": { + "/usr/local/bin/gulp --gulpfile gulpfile.js": { + "code": 0, + "stdout": "gulp output here", + }, + "/usr/local/bin/npm install istanbul": { + "code": 0, + "stdout": "npm output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i ./**/build/src/*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 0, + "stdout": "istanbul output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i .\\**\\build\\src\\*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 0, + "stdout": "istanbul output here", + }, + }, + "checkPath": { + "/usr/local/bin/gulp": true, + "/usr/local/bin/npm": true, + "/usr/local/bin/node": true, + "/usr/local/bin/istanbul": true, + "/usr/local/bin/node_modules/istanbul/lib/cli.js": true, + "gulpfile.js": true, + "**/build/test/*.js": true, + }, + "exist": { + "/usr/local/bin/gulp": true, + }, + "match": { + "**/TEST-*.xml": ["/user/build/fun/test-123.xml"], + "**/*.js": ["/test/test.js"], + }, + "getVariable": { + "System.DefaultWorkingDirectory": "/user/build", + }, +}; +tr.setAnswers(a); + +tr.run(); diff --git a/_generated/GulpV0/Tests/L0GulpFails.ts b/_generated/GulpV0/Tests/L0GulpFails.ts new file mode 100644 index 000000000000..322b131d9d60 --- /dev/null +++ b/_generated/GulpV0/Tests/L0GulpFails.ts @@ -0,0 +1,61 @@ +import ma = require("azure-pipelines-task-lib/mock-answer"); +import tmrm = require("azure-pipelines-task-lib/mock-run"); +import path = require("path"); +import os = require("os"); + +let taskPath = path.join(__dirname, "..", "gulptask.js"); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +if (os.type().match(/^Win/)) { + tr.setInput("cwd", "c:/fake/wd"); +} else { + tr.setInput("cwd", "/fake/wd"); +} + +tr.setInput("gulpFile", "gulpfile.js"); +tr.setInput("publishJUnitResults", "true"); +tr.setInput("testResultsFiles", "**/build/test-results/TEST-*.xml"); +tr.setInput("enableCodeCoverage", "false"); +tr.setInput("gulpjs", "node_modules/gulp/gulp.js"); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "gulp": "/usr/local/bin/gulp", + "npm": "/usr/local/bin/npm", + "node": "/usr/local/bin/node", + "istanbulWin": "/usr/local/bin/istanbul", + "istanbul": "/usr/local/bin/node_modules/istanbul/lib/cli.js", + }, + "exec": { + "/usr/local/bin/gulp --gulpfile gulpfile.js": { + "code": 1, + "stdout": "gulp output here", + "stderr": "gulp failed with this output", + }, + "/usr/local/bin/npm install istanbul": { + "code": 0, + "stdout": "npm output here", + }, + }, + "checkPath": { + "/usr/local/bin/gulp": true, + "/usr/local/bin/npm": true, + "/usr/local/bin/node": true, + "/usr/local/bin/istanbul": true, + "/usr/local/bin/node_modules/istanbul/lib/cli.js": true, + "gulpfile.js": true, + }, + "exist": { + "/usr/local/bin/gulp": true, + }, + "find": { + "/user/build": ["/user/build/fun/test-123.xml"], + }, + "match": { + "**/TEST-*.xml": ["/user/build/fun/test-123.xml"], + }, +}; +tr.setAnswers(a); + +tr.run(); diff --git a/_generated/GulpV0/Tests/L0GulpFileNotSet.ts b/_generated/GulpV0/Tests/L0GulpFileNotSet.ts new file mode 100644 index 000000000000..72b5b64c15e9 --- /dev/null +++ b/_generated/GulpV0/Tests/L0GulpFileNotSet.ts @@ -0,0 +1,66 @@ +import ma = require("azure-pipelines-task-lib/mock-answer"); +import tmrm = require("azure-pipelines-task-lib/mock-run"); +import path = require("path"); +import os = require("os"); + +let taskPath = path.join(__dirname, "..", "gulptask.js"); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +if (os.type().match(/^Win/)) { + tr.setInput("cwd", "c:/fake/wd"); +} else { + tr.setInput("cwd", "/fake/wd"); +} + +tr.setInput("gulpjs", "node_modules/gulp/gulp.js"); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "gulp": "/usr/local/bin/gulp", + "npm": "/usr/local/bin/npm", + "node": "/usr/local/bin/node", + "istanbulWin": "/usr/local/bin/istanbul", + "istanbul": "/usr/local/bin/node_modules/istanbul/lib/cli.js", + }, + "exec": { + "/usr/local/bin/gulp --gulpfile gulpfile.js": { + "code": 0, + "stdout": "gulp output here", + }, + "/usr/local/bin/npm install istanbul": { + "code": 0, + "stdout": "npm output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i ./**/build/src/*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 0, + "stdout": "istanbul output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i .\\**\\build\\src\\*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 0, + "stdout": "istanbul output here", + }, + }, + "checkPath": { + "/usr/local/bin/gulp": true, + "/usr/local/bin/npm": true, + "/usr/local/bin/node": true, + "/usr/local/bin/istanbul": true, + "/usr/local/bin/node_modules/istanbul/lib/cli.js": true, + "gulpfile.js": true, + "**/build/test/*.js": true, + }, + "exist": { + "/usr/local/bin/gulp": true, + }, + "match": { + "**/TEST-*.xml": ["/user/build/fun/test-123.xml"], + "**/*.js": ["/test/test.js"], + }, + "getVariable": { + "System.DefaultWorkingDirectory": "/user/build", + }, +}; +tr.setAnswers(a); + +tr.run(); diff --git a/_generated/GulpV0/Tests/L0GulpGlobalGood.ts b/_generated/GulpV0/Tests/L0GulpGlobalGood.ts new file mode 100644 index 000000000000..5d700ee98ee0 --- /dev/null +++ b/_generated/GulpV0/Tests/L0GulpGlobalGood.ts @@ -0,0 +1,72 @@ +import ma = require("azure-pipelines-task-lib/mock-answer"); +import tmrm = require("azure-pipelines-task-lib/mock-run"); +import path = require("path"); +import os = require("os"); + +let taskPath = path.join(__dirname, "..", "gulptask.js"); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +if (os.type().match(/^Win/)) { + tr.setInput("cwd", "c:/fake/wd"); +} else { + tr.setInput("cwd", "/fake/wd"); +} + +tr.setInput("gulpFile", "gulpfile.js"); +tr.setInput("publishJUnitResults", "true"); +tr.setInput("testResultsFiles", "**/build/test-results/TEST-*.xml"); +tr.setInput("enableCodeCoverage", "false"); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "gulp": "/usr/local/bin/gulp", + "npm": "/usr/local/bin/npm", + "node": "/usr/local/bin/node", + "istanbulWin": "/usr/local/bin/istanbul", + "istanbul": "/usr/local/bin/node_modules/istanbul/lib/cli.js", + }, + "exec": { + "/usr/local/bin/gulp --gulpfile gulpfile.js": { + "code": 0, + "stdout": "gulp output here", + }, + "/usr/local/bin/npm install istanbul": { + "code": 0, + "stdout": "npm output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i ./**/build/src/*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 0, + "stdout": "istanbul output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i .\\**\\build\\src\\*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 0, + "stdout": "istanbul output here", + }, + }, + "checkPath": { + "/usr/local/bin/gulp": true, + "/usr/local/bin/npm": true, + "/usr/local/bin/node": true, + "/usr/local/bin/istanbul": true, + "/usr/local/bin/node_modules/istanbul/lib/cli.js": true, + "gulpfile.js": true, + "**/build/test/*.js": true, + }, + "exist": { + "/usr/local/bin/gulp": true, + }, + "match": { + "**/TEST-*.xml": ["/user/build/fun/test-123.xml"], + "**/*.js": ["/test/test.js"], + }, + "getVariable": { + "System.DefaultWorkingDirectory": "/user/build", + }, + "find": { + "/user/build": ["/user/build/fun/test-123.xml"], + } +}; +tr.setAnswers(a); + +tr.run(); diff --git a/_generated/GulpV0/Tests/L0GulpGlobalGoodWithCodeCoverage.ts b/_generated/GulpV0/Tests/L0GulpGlobalGoodWithCodeCoverage.ts new file mode 100644 index 000000000000..23953fc00f5b --- /dev/null +++ b/_generated/GulpV0/Tests/L0GulpGlobalGoodWithCodeCoverage.ts @@ -0,0 +1,76 @@ +import ma = require("azure-pipelines-task-lib/mock-answer"); +import tmrm = require("azure-pipelines-task-lib/mock-run"); +import path = require("path"); +import os = require("os"); + +let taskPath = path.join(__dirname, "..", "gulptask.js"); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +if (os.type().match(/^Win/)) { + tr.setInput("cwd", "c:/fake/wd"); +} else { + tr.setInput("cwd", "/fake/wd"); +} + +tr.setInput("gulpFile", "gulpfile.js"); +tr.setInput("publishJUnitResults", "true"); +tr.setInput("testResultsFiles", "**/build/test-results/TEST-*.xml"); +tr.setInput("enableCodeCoverage", "true"); +tr.setInput("testFramework", "Mocha"); +tr.setInput("srcFiles", "**/build/src/*.js"); +tr.setInput("testFiles", "**/build/test/*.js"); +tr.setInput("gulpjs", "node_modules/gulp/gulp.js"); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "gulp": "/usr/local/bin/gulp", + "npm": "/usr/local/bin/npm", + "node": "/usr/local/bin/node", + "istanbulWin": "/usr/local/bin/istanbul", + "istanbul": "/usr/local/bin/node_modules/istanbul/lib/cli.js", + }, + "exec": { + "/usr/local/bin/gulp --gulpfile gulpfile.js": { + "code": 0, + "stdout": "gulp output here", + }, + "/usr/local/bin/npm install istanbul": { + "code": 0, + "stdout": "npm output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i ./**/build/src/*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 0, + "stdout": "istanbul output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i .\\**\\build\\src\\*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 0, + "stdout": "istanbul output here", + }, + }, + "checkPath": { + "/usr/local/bin/gulp": true, + "/usr/local/bin/npm": true, + "/usr/local/bin/node": true, + "/usr/local/bin/istanbul": true, + "/usr/local/bin/node_modules/istanbul/lib/cli.js": true, + "gulpfile.js": true, + "**/build/test/*.js": true, + }, + "exist": { + "/usr/local/bin/gulp": true, + }, + "match": { + "**/TEST-*.xml": ["/user/build/fun/test-123.xml"], + "**/*.js": ["/test/test.js"], + }, + "find": { + "/user/build": ["/user/build/fun/test-123.xml"], + }, + "getVariable": { + "System.DefaultWorkingDirectory": "/user/build", + }, +}; +tr.setAnswers(a); + +tr.run(); diff --git a/_generated/GulpV0/Tests/L0GulpLocalGood.ts b/_generated/GulpV0/Tests/L0GulpLocalGood.ts new file mode 100644 index 000000000000..78813ff8a8a4 --- /dev/null +++ b/_generated/GulpV0/Tests/L0GulpLocalGood.ts @@ -0,0 +1,59 @@ +import ma = require("azure-pipelines-task-lib/mock-answer"); +import tmrm = require("azure-pipelines-task-lib/mock-run"); +import path = require("path"); +import os = require("os"); + +let taskPath = path.join(__dirname, "..", "gulptask.js"); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +if (os.type().match(/^Win/)) { + tr.setInput("cwd", "c:/fake/wd"); +} else { + tr.setInput("cwd", "/fake/wd"); +} + +tr.setInput("gulpFile", "gulpfile.js"); +tr.setInput("publishJUnitResults", "true"); +tr.setInput("testResultsFiles", "**/build/test-results/TEST-*.xml"); +tr.setInput("enableCodeCoverage", "false"); +tr.setInput("gulpjs", "node_modules/gulp/gulp.js"); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "npm": "/usr/local/bin/npm", + "node": "/usr/local/bin/node", + "istanbulWin": "/usr/local/bin/istanbul", + "istanbul": "/usr/local/bin/node_modules/istanbul/lib/cli.js", + }, + "exec": { + "/usr/local/bin/node /fake/wd/node_modules/gulp/gulp.js --gulpfile gulpfile.js": { + "code": 0, + "stdout": "gulp output here", + }, + "/usr/local/bin/node c:\\fake\\wd\\node_modules\\gulp\\gulp.js --gulpfile gulpfile.js": { + "code": 0, + "stdout": "gulp output here", + }, + }, + "checkPath": { + "/usr/local/bin/node": true, + "/usr/local/bin/npm": true, + "/usr/local/bin/istanbul": true, + "/usr/local/bin/node_modules/istanbul/lib/cli.js": true, + "gulpfile.js": true, + }, + "exist": { + "/fake/wd/node_modules/gulp/gulp.js": true, + "c:\\fake\\wd\\node_modules\\gulp\\gulp.js": true, + }, + "match": { + "**/TEST-*.xml": ["/user/build/fun/test-123.xml"], + }, + "find": { + "/user/build": ["/user/build/fun/test-123.xml"], + } +}; +tr.setAnswers(a); + +tr.run(); diff --git a/_generated/GulpV0/Tests/L0GulpjsNotSet.ts b/_generated/GulpV0/Tests/L0GulpjsNotSet.ts new file mode 100644 index 000000000000..a3b041745ec5 --- /dev/null +++ b/_generated/GulpV0/Tests/L0GulpjsNotSet.ts @@ -0,0 +1,52 @@ +import ma = require("azure-pipelines-task-lib/mock-answer"); +import tmrm = require("azure-pipelines-task-lib/mock-run"); +import path = require("path"); +import os = require("os"); + +let taskPath = path.join(__dirname, "..", "gulptask.js"); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +if (os.type().match(/^Win/)) { + tr.setInput("cwd", "c:/fake/wd"); +} else { + tr.setInput("cwd", "/fake/wd"); +} + +tr.setInput("gulpFile", "gulpfile.js"); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "npm": "/usr/local/bin/npm", + "node": "/usr/local/bin/node", + "istanbulWin": "/usr/local/bin/istanbul", + "istanbul": "/usr/local/bin/node_modules/istanbul/lib/cli.js", + }, + "exec": { + "/usr/local/bin/node /fake/wd/node_modules/gulp/gulp.js --gulpfile gulpfile.js": { + "code": 0, + "stdout": "gulp output here", + }, + "/usr/local/bin/node c:\\fake\\wd\\node_modules\\gulp\\gulp.js --gulpfile gulpfile.js": { + "code": 0, + "stdout": "gulp output here", + }, + }, + "checkPath": { + "/usr/local/bin/node": true, + "/usr/local/bin/npm": true, + "/usr/local/bin/istanbul": true, + "/usr/local/bin/node_modules/istanbul/lib/cli.js": true, + "gulpfile.js": true, + }, + "exist": { + "/fake/wd/node_modules/gulp/gulp.js": true, + "c:\\fake\\wd\\node_modules\\gulp\\gulp.js": true, + }, + "match": { + "**/TEST-*.xml": ["/user/build/fun/test-123.xml"], + }, +}; +tr.setAnswers(a); + +tr.run(); diff --git a/_generated/GulpV0/Tests/L0InvalidTestSource.ts b/_generated/GulpV0/Tests/L0InvalidTestSource.ts new file mode 100644 index 000000000000..df3ebfb2c9f7 --- /dev/null +++ b/_generated/GulpV0/Tests/L0InvalidTestSource.ts @@ -0,0 +1,78 @@ +import ma = require("azure-pipelines-task-lib/mock-answer"); +import tmrm = require("azure-pipelines-task-lib/mock-run"); +import path = require("path"); +import os = require("os"); + +let taskPath = path.join(__dirname, "..", "gulptask.js"); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +if (os.type().match(/^Win/)) { + tr.setInput("cwd", "c:/fake/wd"); +} else { + tr.setInput("cwd", "/fake/wd"); +} + +tr.setInput("gulpFile", "gulpfile.js"); +tr.setInput("publishJUnitResults", "true"); +tr.setInput("testResultsFiles", "**/build/test-results/TEST-*.xml"); +tr.setInput("enableCodeCoverage", "true"); +tr.setInput("testFramework", "Mocha"); +tr.setInput("srcFiles", "**/build/src/*.js"); +tr.setInput("testFiles", "/invalid/input"); +tr.setInput("gulpjs", "node_modules/gulp/gulp.js"); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "gulp": "/usr/local/bin/gulp", + "npm": "/usr/local/bin/npm", + "node": "/usr/local/bin/node", + "istanbulWin": "/usr/local/bin/istanbul", + "istanbul": "/usr/local/bin/node_modules/istanbul/lib/cli.js", + }, + "exec": { + "/usr/local/bin/gulp --gulpfile gulpfile.js": { + "code": 0, + "stdout": "gulp output here", + }, + "/usr/local/bin/npm install istanbul": { + "code": 0, + "stdout": "npm output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i ./**/build/src/*.js ./node_modules/mocha/bin/_mocha /invalid/input": { + "code": 1, + "stdout": "istanbul output here", + "stderr": "istanbul failed with this output", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i .\\**\\build\\src\\*.js ./node_modules/mocha/bin/_mocha /invalid/input": { + "code": 1, + "stdout": "istanbul output here", + "stderr": "istanbul failed with this output", + }, + }, + "checkPath": { + "/usr/local/bin/gulp": true, + "/usr/local/bin/npm": true, + "/usr/local/bin/node": true, + "/usr/local/bin/istanbul": true, + "/usr/local/bin/node_modules/istanbul/lib/cli.js": true, + "gulpfile.js": true, + "**/build/test/*.js": true, + }, + "exist": { + "/usr/local/bin/gulp": true, + }, + "match": { + "**/TEST-*.xml": ["/user/build/fun/test-123.xml"], + "**/*.js": ["/test/test.js"], + }, + "find": { + "/user/build": ["/user/build/fun/test-123.xml"], + }, + "getVariable": { + "System.DefaultWorkingDirectory": "/user/build", + }, +}; +tr.setAnswers(a); + +tr.run(); diff --git a/_generated/GulpV0/Tests/L0IstanbulFails.ts b/_generated/GulpV0/Tests/L0IstanbulFails.ts new file mode 100644 index 000000000000..bbc09004c99a --- /dev/null +++ b/_generated/GulpV0/Tests/L0IstanbulFails.ts @@ -0,0 +1,78 @@ +import ma = require("azure-pipelines-task-lib/mock-answer"); +import tmrm = require("azure-pipelines-task-lib/mock-run"); +import path = require("path"); +import os = require("os"); + +let taskPath = path.join(__dirname, "..", "gulptask.js"); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +if (os.type().match(/^Win/)) { + tr.setInput("cwd", "c:/fake/wd"); +} else { + tr.setInput("cwd", "/fake/wd"); +} + +tr.setInput("gulpFile", "gulpfile.js"); +tr.setInput("publishJUnitResults", "true"); +tr.setInput("testResultsFiles", "**/build/test-results/TEST-*.xml"); +tr.setInput("enableCodeCoverage", "true"); +tr.setInput("testFramework", "Mocha"); +tr.setInput("srcFiles", "**/build/src/*.js"); +tr.setInput("testFiles", "**/build/test/*.js"); +tr.setInput("gulpjs", "node_modules/gulp/gulp.js"); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "gulp": "/usr/local/bin/gulp", + "npm": "/usr/local/bin/npm", + "node": "/usr/local/bin/node", + "istanbulWin": "/usr/local/bin/istanbul", + "istanbul": "/usr/local/bin/node_modules/istanbul/lib/cli.js", + }, + "exec": { + "/usr/local/bin/gulp --gulpfile gulpfile.js": { + "code": 0, + "stdout": "gulp output here", + }, + "/usr/local/bin/npm install istanbul": { + "code": 0, + "stdout": "npm output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i ./**/build/src/*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 1, + "stdout": "istanbul output here", + "stderr": "istanbul failed with this output", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i .\\**\\build\\src\\*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 1, + "stdout": "istanbul output here", + "stderr": "istanbul failed with this output", + }, + }, + "checkPath": { + "/usr/local/bin/gulp": true, + "/usr/local/bin/npm": true, + "/usr/local/bin/node": true, + "/usr/local/bin/istanbul": true, + "/usr/local/bin/node_modules/istanbul/lib/cli.js": true, + "gulpfile.js": true, + "**/build/test/*.js": true, + }, + "exist": { + "/usr/local/bin/gulp": true, + }, + "match": { + "**/TEST-*.xml": ["/user/build/fun/test-123.xml"], + "**/*.js": ["/test/test.js"], + }, + "find": { + "/user/build": ["/user/build/fun/test-123.xml"], + }, + "getVariable": { + "System.DefaultWorkingDirectory": "/user/build", + }, +}; +tr.setAnswers(a); + +tr.run(); diff --git a/_generated/GulpV0/Tests/L0NoGulp.ts b/_generated/GulpV0/Tests/L0NoGulp.ts new file mode 100644 index 000000000000..1c2e8b62b4a7 --- /dev/null +++ b/_generated/GulpV0/Tests/L0NoGulp.ts @@ -0,0 +1,42 @@ +import ma = require("azure-pipelines-task-lib/mock-answer"); +import tmrm = require("azure-pipelines-task-lib/mock-run"); +import path = require("path"); +import os = require("os"); + +let taskPath = path.join(__dirname, "..", "gulptask.js"); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +if (os.type().match(/^Win/)) { + tr.setInput("cwd", "c:/fake/wd"); +} else { + tr.setInput("cwd", "/fake/wd"); +} + +tr.setInput("gulpFile", "gulpfile.js"); +tr.setInput("publishJUnitResults", "true"); +tr.setInput("testResultsFiles", "**/build/test-results/TEST-*.xml"); +tr.setInput("enableCodeCoverage", "false"); +tr.setInput("gulpjs", "node_modules/gulp/gulp.js"); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "npm": "/usr/local/bin/npm", + "node": "/usr/local/bin/node", + "istanbulWin": "/usr/local/bin/istanbul", + "istanbul": "/usr/local/bin/node_modules/istanbul/lib/cli.js", + }, + "checkPath": { + "/usr/local/bin/npm": true, + "/usr/local/bin/node": true, + "/usr/local/bin/istanbul": true, + "/usr/local/bin/node_modules/istanbul/lib/cli.js": true, + "gulpfile.js": true, + }, + "match": { + "**/TEST-*.xml": ["/user/build/fun/test-123.xml"], + }, +}; +tr.setAnswers(a); + +tr.run(); diff --git a/_generated/GulpV0/Tests/L0NoGulpFile.ts b/_generated/GulpV0/Tests/L0NoGulpFile.ts new file mode 100644 index 000000000000..c454170f153e --- /dev/null +++ b/_generated/GulpV0/Tests/L0NoGulpFile.ts @@ -0,0 +1,26 @@ +import ma = require("azure-pipelines-task-lib/mock-answer"); +import tmrm = require("azure-pipelines-task-lib/mock-run"); +import path = require("path"); +import os = require("os"); + +let taskPath = path.join(__dirname, "..", "gulptask.js"); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +if (os.type().match(/^Win/)) { + tr.setInput("cwd", "c:/fake/wd"); +} else { + tr.setInput("cwd", "/fake/wd"); +} + +tr.setInput("gulpFile", "gulpfile.js"); +tr.setInput("gulpjs", "node_modules/gulp/gulp.js"); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "checkPath": { + "gulpfile.js": false, + }, +}; +tr.setAnswers(a); + +tr.run(); diff --git a/_generated/GulpV0/Tests/L0NoTestSourceFiles.ts b/_generated/GulpV0/Tests/L0NoTestSourceFiles.ts new file mode 100644 index 000000000000..c7f7a391ef2b --- /dev/null +++ b/_generated/GulpV0/Tests/L0NoTestSourceFiles.ts @@ -0,0 +1,72 @@ +import ma = require("azure-pipelines-task-lib/mock-answer"); +import tmrm = require("azure-pipelines-task-lib/mock-run"); +import path = require("path"); +import os = require("os"); + +let taskPath = path.join(__dirname, "..", "gulptask.js"); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +if (os.type().match(/^Win/)) { + tr.setInput("cwd", "c:/fake/wd"); +} else { + tr.setInput("cwd", "/fake/wd"); +} + +tr.setInput("gulpFile", "gulpfile.js"); +tr.setInput("publishJUnitResults", "true"); +tr.setInput("testResultsFiles", "**/build/test-results/TEST-*.xml"); +tr.setInput("enableCodeCoverage", "true"); +tr.setInput("testFramework", "Mocha"); +tr.setInput("srcFiles", "**/build/src/*.js"); +tr.setInput("gulpjs", "node_modules/gulp/gulp.js"); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "gulp": "/usr/local/bin/gulp", + "npm": "/usr/local/bin/npm", + "node": "/usr/local/bin/node", + "istanbulWin": "/usr/local/bin/istanbul", + "istanbul": "/usr/local/bin/node_modules/istanbul/lib/cli.js", + }, + "exec": { + "/usr/local/bin/gulp --gulpfile gulpfile.js": { + "code": 0, + "stdout": "gulp output here", + }, + "/usr/local/bin/npm install istanbul": { + "code": 0, + "stdout": "npm output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i ./**/build/src/*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 0, + "stdout": "istanbul output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i .\\**\\build\\src\\*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 0, + "stdout": "istanbul output here", + }, + }, + "checkPath": { + "/usr/local/bin/gulp": true, + "/usr/local/bin/npm": true, + "/usr/local/bin/node": true, + "/usr/local/bin/istanbul": true, + "/usr/local/bin/node_modules/istanbul/lib/cli.js": true, + "gulpfile.js": true, + "**/build/test/*.js": true, + }, + "exist": { + "/usr/local/bin/gulp": true, + }, + "match": { + "**/TEST-*.xml": ["/user/build/fun/test-123.xml"], + "**/*.js": ["/test/test.js"], + }, + "getVariable": { + "System.DefaultWorkingDirectory": "/user/build", + }, +}; +tr.setAnswers(a); + +tr.run(); diff --git a/_generated/GulpV0/Tests/L0NpmFails.ts b/_generated/GulpV0/Tests/L0NpmFails.ts new file mode 100644 index 000000000000..cb620ab155f3 --- /dev/null +++ b/_generated/GulpV0/Tests/L0NpmFails.ts @@ -0,0 +1,68 @@ +import ma = require("azure-pipelines-task-lib/mock-answer"); +import tmrm = require("azure-pipelines-task-lib/mock-run"); +import path = require("path"); +import os = require("os"); + +let taskPath = path.join(__dirname, "..", "gulptask.js"); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +if (os.type().match(/^Win/)) { + tr.setInput("cwd", "c:/fake/wd"); +} else { + tr.setInput("cwd", "/fake/wd"); +} + +tr.setInput("gulpFile", "gulpfile.js"); +tr.setInput("publishJUnitResults", "true"); +tr.setInput("testResultsFiles", "**/build/test-results/TEST-*.xml"); +tr.setInput("enableCodeCoverage", "true"); +tr.setInput("testFramework", "Mocha"); +tr.setInput("srcFiles", "**/build/src/*.js"); +tr.setInput("testFiles", "**/build/test/*.js"); +tr.setInput("gulpjs", "node_modules/gulp/gulp.js"); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "gulp": "/usr/local/bin/gulp", + "npm": "/usr/local/bin/npm", + "node": "/usr/local/bin/node", + "istanbulWin": "/usr/local/bin/istanbul", + "istanbul": "/usr/local/bin/node_modules/istanbul/lib/cli.js", + }, + "exec": { + "/usr/local/bin/gulp --gulpfile gulpfile.js": { + "code": 0, + "stdout": "gulp output here", + }, + "/usr/local/bin/npm install istanbul": { + "code": 1, + "stdout": "npm output here", + "stderr": "npm failed with this output", + }, + }, + "checkPath": { + "/usr/local/bin/gulp": true, + "/usr/local/bin/npm": true, + "/usr/local/bin/node": true, + "/usr/local/bin/istanbul": true, + "/usr/local/bin/node_modules/istanbul/lib/cli.js": true, + "gulpfile.js": true, + }, + "exist": { + "/usr/local/bin/gulp": true, + }, + "match": { + "**/TEST-*.xml": ["/user/build/fun/test-123.xml"], + "**/*.js": ["/test/test.js"], + }, + "find": { + "/user/build": ["/user/build/fun/test-123.xml"], + }, + "getVariable": { + "System.DefaultWorkingDirectory": "/user/build", + }, +}; +tr.setAnswers(a); + +tr.run(); diff --git a/_generated/GulpV0/Tests/L0PublishJUnitTestResultsFalse.ts b/_generated/GulpV0/Tests/L0PublishJUnitTestResultsFalse.ts new file mode 100644 index 000000000000..747c1730fdb7 --- /dev/null +++ b/_generated/GulpV0/Tests/L0PublishJUnitTestResultsFalse.ts @@ -0,0 +1,69 @@ +import ma = require("azure-pipelines-task-lib/mock-answer"); +import tmrm = require("azure-pipelines-task-lib/mock-run"); +import path = require("path"); +import os = require("os"); + +let taskPath = path.join(__dirname, "..", "gulptask.js"); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +if (os.type().match(/^Win/)) { + tr.setInput("cwd", "c:/fake/wd"); +} else { + tr.setInput("cwd", "/fake/wd"); +} + +tr.setInput("gulpFile", "gulpfile.js"); +tr.setInput("publishJUnitResults", "false"); +tr.setInput("enableCodeCoverage", "false"); +tr.setInput("gulpjs", "node_modules/gulp/gulp.js"); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "gulp": "/usr/local/bin/gulp", + "npm": "/usr/local/bin/npm", + "node": "/usr/local/bin/node", + "istanbulWin": "/usr/local/bin/istanbul", + "istanbul": "/usr/local/bin/node_modules/istanbul/lib/cli.js", + }, + "exec": { + "/usr/local/bin/gulp --gulpfile gulpfile.js": { + "code": 0, + "stdout": "gulp output here", + }, + "/usr/local/bin/npm install istanbul": { + "code": 0, + "stdout": "npm output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i ./**/build/src/*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 0, + "stdout": "istanbul output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i .\\**\\build\\src\\*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 0, + "stdout": "istanbul output here", + }, + }, + "checkPath": { + "/usr/local/bin/gulp": true, + "/usr/local/bin/npm": true, + "/usr/local/bin/node": true, + "/usr/local/bin/istanbul": true, + "/usr/local/bin/node_modules/istanbul/lib/cli.js": true, + "gulpfile.js": true, + "**/build/test/*.js": true, + }, + "exist": { + "/usr/local/bin/gulp": true, + }, + "match": { + "**/TEST-*.xml": ["/user/build/fun/test-123.xml"], + "**/*.js": ["/test/test.js"], + }, + "getVariable": { + "System.DefaultWorkingDirectory": "/user/build", + }, +}; +tr.setAnswers(a); + +tr.run(); diff --git a/_generated/GulpV0/Tests/L0TestResultFilesDoesNotMatchAnyFile.ts b/_generated/GulpV0/Tests/L0TestResultFilesDoesNotMatchAnyFile.ts new file mode 100644 index 000000000000..c6a9d7bdcbe6 --- /dev/null +++ b/_generated/GulpV0/Tests/L0TestResultFilesDoesNotMatchAnyFile.ts @@ -0,0 +1,70 @@ +import ma = require("azure-pipelines-task-lib/mock-answer"); +import tmrm = require("azure-pipelines-task-lib/mock-run"); +import path = require("path"); +import os = require("os"); + +let taskPath = path.join(__dirname, "..", "gulptask.js"); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +if (os.type().match(/^Win/)) { + tr.setInput("cwd", "c:/fake/wd"); +} else { + tr.setInput("cwd", "/fake/wd"); +} + +tr.setInput("gulpFile", "gulpfile.js"); +tr.setInput("publishJUnitResults", "true"); +tr.setInput("testResultsFiles", "/invalid/input"); +tr.setInput("enableCodeCoverage", "false"); +tr.setInput("gulpjs", "node_modules/gulp/gulp.js"); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "gulp": "/usr/local/bin/gulp", + "npm": "/usr/local/bin/npm", + "node": "/usr/local/bin/node", + "istanbulWin": "/usr/local/bin/istanbul", + "istanbul": "/usr/local/bin/node_modules/istanbul/lib/cli.js", + }, + "exec": { + "/usr/local/bin/gulp --gulpfile gulpfile.js": { + "code": 0, + "stdout": "gulp output here", + }, + "/usr/local/bin/npm install istanbul": { + "code": 0, + "stdout": "npm output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i ./**/build/src/*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 0, + "stdout": "istanbul output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i .\\**\\build\\src\\*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 0, + "stdout": "istanbul output here", + }, + }, + "checkPath": { + "/usr/local/bin/gulp": true, + "/usr/local/bin/npm": true, + "/usr/local/bin/node": true, + "/usr/local/bin/istanbul": true, + "/usr/local/bin/node_modules/istanbul/lib/cli.js": true, + "gulpfile.js": true, + "**/build/test/*.js": true, + }, + "exist": { + "/usr/local/bin/gulp": true, + }, + "match": { + "**/TEST-*.xml": ["/user/build/fun/test-123.xml"], + "**/*.js": ["/test/test.js"], + }, + "getVariable": { + "System.DefaultWorkingDirectory": "/user/build", + }, +}; +tr.setAnswers(a); + +tr.run(); diff --git a/_generated/GulpV0/Tests/L0TestResultFilesNotSet.ts b/_generated/GulpV0/Tests/L0TestResultFilesNotSet.ts new file mode 100644 index 000000000000..fdb5d458ac4b --- /dev/null +++ b/_generated/GulpV0/Tests/L0TestResultFilesNotSet.ts @@ -0,0 +1,69 @@ +import ma = require("azure-pipelines-task-lib/mock-answer"); +import tmrm = require("azure-pipelines-task-lib/mock-run"); +import path = require("path"); +import os = require("os"); + +let taskPath = path.join(__dirname, "..", "gulptask.js"); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +if (os.type().match(/^Win/)) { + tr.setInput("cwd", "c:/fake/wd"); +} else { + tr.setInput("cwd", "/fake/wd"); +} + +tr.setInput("gulpFile", "gulpfile.js"); +tr.setInput("publishJUnitResults", "true"); +tr.setInput("enableCodeCoverage", "false"); +tr.setInput("gulpjs", "node_modules/gulp/gulp.js"); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "gulp": "/usr/local/bin/gulp", + "npm": "/usr/local/bin/npm", + "node": "/usr/local/bin/node", + "istanbulWin": "/usr/local/bin/istanbul", + "istanbul": "/usr/local/bin/node_modules/istanbul/lib/cli.js", + }, + "exec": { + "/usr/local/bin/gulp --gulpfile gulpfile.js": { + "code": 0, + "stdout": "gulp output here", + }, + "/usr/local/bin/npm install istanbul": { + "code": 0, + "stdout": "npm output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i ./**/build/src/*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 0, + "stdout": "istanbul output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i .\\**\\build\\src\\*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 0, + "stdout": "istanbul output here", + }, + }, + "checkPath": { + "/usr/local/bin/gulp": true, + "/usr/local/bin/npm": true, + "/usr/local/bin/node": true, + "/usr/local/bin/istanbul": true, + "/usr/local/bin/node_modules/istanbul/lib/cli.js": true, + "gulpfile.js": true, + "**/build/test/*.js": true, + }, + "exist": { + "/usr/local/bin/gulp": true, + }, + "match": { + "**/TEST-*.xml": ["/user/build/fun/test-123.xml"], + "**/*.js": ["/test/test.js"], + }, + "getVariable": { + "System.DefaultWorkingDirectory": "/user/build", + }, +}; +tr.setAnswers(a); + +tr.run(); diff --git a/_generated/GulpV0/Tests/package-lock.json b/_generated/GulpV0/Tests/package-lock.json new file mode 100644 index 000000000000..b4c44bb0b819 --- /dev/null +++ b/_generated/GulpV0/Tests/package-lock.json @@ -0,0 +1,14 @@ +{ + "name": "gulp-tests", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/mocha": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", + "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==", + "dev": true + } + } +} diff --git a/_generated/GulpV0/Tests/package.json b/_generated/GulpV0/Tests/package.json new file mode 100644 index 000000000000..baedf0fe682c --- /dev/null +++ b/_generated/GulpV0/Tests/package.json @@ -0,0 +1,22 @@ +{ + "name": "gulp-tests", + "version": "1.0.0", + "description": "Azure Pipelines Gulp V0 Task Tests", + "main": "L0.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/Microsoft/azure-pipelines-tasks.git" + }, + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Microsoft/azure-pipelines-tasks/issues" + }, + "homepage": "https://github.com/Microsoft/azure-pipelines-tasks#readme", + "devDependencies": { + "@types/mocha": "^5.2.7" + } +} diff --git a/_generated/GulpV0/gulptask.ts b/_generated/GulpV0/gulptask.ts new file mode 100644 index 000000000000..c287772b3aae --- /dev/null +++ b/_generated/GulpV0/gulptask.ts @@ -0,0 +1,118 @@ +import path = require('path'); +import tl = require('azure-pipelines-task-lib/task'); +import minimatch = require('minimatch'); + +tl.setResourcePath(path.join(__dirname, 'task.json')); + +var gulpFile = tl.getPathInput('gulpFile', true, true); +tl.debug('check gulp file :' + gulpFile); +var gulp = tl.which('gulp', false); +var isCodeCoverageEnabled = tl.getBoolInput('enableCodeCoverage'); +var publishJUnitResults = tl.getBoolInput('publishJUnitResults'); +var testResultsFiles = tl.getInput('testResultsFiles', publishJUnitResults); +var cwd = tl.getPathInput('cwd', true, false); +tl.mkdirP(cwd); +tl.cd(cwd); + +tl.debug('check path : ' + gulp); +if (!tl.exist(gulp)) { + tl.debug('not found global installed gulp, try to find gulp locally.'); + var gt = tl.tool(tl.which('node', true)); + var gulpjs = tl.getInput('gulpjs', true); + gulpjs = path.resolve(cwd, gulpjs); + tl.debug('check path : ' + gulpjs); + if (!tl.exist(gulpjs)) { + tl.setResult(tl.TaskResult.Failed, tl.loc('GulpNotInstalled', gulpjs)); + } + gt.arg(gulpjs); +} +else { + var gt = tl.tool(gulp); +} + +if (isCodeCoverageEnabled) { + var npm = tl.tool(tl.which('npm', true)); + npm.line('install istanbul'); + var testFramework = tl.getInput('testFramework', true); + var srcFiles = tl.getInput('srcFiles', false); + var testSrc = tl.getPathInput('testFiles', true, false); + var istanbul = tl.tool(tl.which('node', true)); + istanbul.arg('./node_modules/istanbul/lib/cli.js'); + istanbul.line('cover --report cobertura --report html'); + if (srcFiles) { + istanbul.line('-i .' + path.sep + path.join(srcFiles)); + } + if (testFramework.toLowerCase() == 'jasmine') { + istanbul.line('./node_modules/jasmine/bin/jasmine.js JASMINE_CONFIG_PATH=node_modules/jasmine/lib/examples/jasmine.json'); + } else { + istanbul.arg('./node_modules/mocha/bin/_mocha'); + } + istanbul.arg(testSrc); + var summaryFile = path.join(cwd, 'coverage/cobertura-coverage.xml'); + var reportDirectory = path.join(cwd, 'coverage/'); +} + +// optional - no targets will concat nothing +gt.arg(tl.getDelimitedInput('targets', ' ', false)); +gt.arg(['--gulpfile', gulpFile]); +gt.line(tl.getInput('arguments', false)); +gt.exec().then(function (code) { + publishTestResults(publishJUnitResults, testResultsFiles); + if (isCodeCoverageEnabled) { + npm.exec().then(function () { + istanbul.exec().then(function (code) { + publishCodeCoverage(summaryFile); + tl.setResult(tl.TaskResult.Succeeded, tl.loc('GulpReturnCode', code)); + }).fail(function (err) { + publishCodeCoverage(summaryFile); + tl.debug('taskRunner fail'); + tl.setResult(tl.TaskResult.Failed, tl.loc('IstanbulFailed', err.message)); + }); + }).fail(function (err) { + tl.debug('taskRunner fail'); + tl.setResult(tl.TaskResult.Failed, tl.loc('NpmFailed', err.message)); + }) + } else { + tl.setResult(tl.TaskResult.Succeeded, tl.loc('GulpReturnCode', code)); + } +}).fail(function (err) { + publishTestResults(publishJUnitResults, testResultsFiles); + tl.debug('taskRunner fail'); + tl.setResult(tl.TaskResult.Failed, tl.loc('GulpFailed', err.message)); +}) + +function publishTestResults(publishJUnitResults, testResultsFiles: string) { + if (publishJUnitResults) { + //check for pattern in testResultsFiles + if (testResultsFiles.indexOf('*') >= 0 || testResultsFiles.indexOf('?') >= 0) { + tl.debug('Pattern found in testResultsFiles parameter'); + var buildFolder = tl.getVariable('System.DefaultWorkingDirectory'); + var allFiles = tl.find(buildFolder); + var matchingTestResultsFiles = minimatch.match(allFiles, testResultsFiles, { matchBase: true }); + } + else { + tl.debug('No pattern found in testResultsFiles parameter'); + var matchingTestResultsFiles = [testResultsFiles]; + } + if (!matchingTestResultsFiles || matchingTestResultsFiles.length == 0) { + tl.warning('No test result files matching ' + testResultsFiles + ' were found, so publishing JUnit test results is being skipped.'); + return 0; + } + var tp = new tl.TestPublisher("JUnit"); + try { + tp.publish(matchingTestResultsFiles, 'true', "", "", "", 'true'); + } catch (error) { + tl.warning(error); + } + } +} + +function publishCodeCoverage(summaryFile) { + try { + var ccPublisher = new tl.CodeCoveragePublisher(); + ccPublisher.publish('cobertura', summaryFile, reportDirectory, ""); + } catch (error) { + tl.warning(error); + throw error; + } +} \ No newline at end of file diff --git a/_generated/GulpV0/icon.png b/_generated/GulpV0/icon.png new file mode 100644 index 000000000000..10372dbd6051 Binary files /dev/null and b/_generated/GulpV0/icon.png differ diff --git a/_generated/GulpV0/icon.svg b/_generated/GulpV0/icon.svg new file mode 100644 index 000000000000..ab3c0435f0b3 --- /dev/null +++ b/_generated/GulpV0/icon.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/_generated/GulpV0/package-lock.json b/_generated/GulpV0/package-lock.json new file mode 100644 index 000000000000..f8aa80188c1f --- /dev/null +++ b/_generated/GulpV0/package-lock.json @@ -0,0 +1,492 @@ +{ + "name": "vsts-gulp-task", + "requires": true, + "lockfileVersion": 1, + "dependencies": { + "@types/concat-stream": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz", + "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==", + "requires": { + "@types/node": "*" + } + }, + "@types/form-data": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", + "integrity": "sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==", + "requires": { + "@types/node": "*" + } + }, + "@types/mocha": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", + "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==" + }, + "@types/node": { + "version": "16.11.58", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.58.tgz", + "integrity": "sha512-uMVxJ111wpHzkx/vshZFb6Qni3BOMnlWLq7q9jrwej7Yw/KvjsEbpxCCxw+hLKxexFMc8YmpG8J9tnEe/rKsIg==" + }, + "@types/qs": { + "version": "6.9.8", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.8.tgz", + "integrity": "sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg==" + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "azure-pipelines-task-lib": { + "version": "5.0.0-preview.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-5.0.0-preview.0.tgz", + "integrity": "sha512-uQJEv+q3/7RD7kgphFd33uXijaPwA1ePYoNkAgZpUhbZUtc2u4JL4ujTT/JJfgXBNW/QQNAiDQ2OC7vOQG/0tg==", + "requires": { + "minimatch": "3.0.5", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "sync-request": "6.1.0", + "uuid": "^3.0.1" + }, + "dependencies": { + "minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "brace-expansion": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", + "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, + "form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + } + }, + "get-port": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", + "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==" + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "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" + }, + "dependencies": { + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==" + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "http-basic": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", + "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", + "requires": { + "caseless": "^0.12.0", + "concat-stream": "^1.6.2", + "http-response-object": "^3.0.1", + "parse-cache-control": "^1.0.1" + } + }, + "http-response-object": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", + "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", + "requires": { + "@types/node": "^10.0.3" + }, + "dependencies": { + "@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + } + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" + }, + "is-core-module": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "requires": { + "has": "^1.0.3" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, + "parse-cache-control": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", + "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "promise": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", + "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", + "requires": { + "asap": "~2.0.6" + } + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==" + }, + "qs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "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" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "requires": { + "resolve": "^1.1.6" + } + }, + "resolve": { + "version": "1.22.6", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.6.tgz", + "integrity": "sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==", + "requires": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" + }, + "shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, + "sync-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", + "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==", + "requires": { + "http-response-object": "^3.0.1", + "sync-rpc": "^1.2.1", + "then-request": "^6.0.0" + } + }, + "sync-rpc": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz", + "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==", + "requires": { + "get-port": "^3.1.0" + } + }, + "then-request": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", + "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", + "requires": { + "@types/concat-stream": "^1.6.0", + "@types/form-data": "0.0.33", + "@types/node": "^8.0.0", + "@types/qs": "^6.2.31", + "caseless": "~0.12.0", + "concat-stream": "^1.6.0", + "form-data": "^2.2.0", + "http-basic": "^8.1.1", + "http-response-object": "^3.0.1", + "promise": "^8.0.0", + "qs": "^6.4.0" + }, + "dependencies": { + "@types/node": { + "version": "8.10.66", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", + "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==" + } + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, + "typescript": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.2.tgz", + "integrity": "sha512-e4ERvRV2wb+rRZ/IQeb3jm2VxBsirQLpQhdxplZ2MEzGvDkkMmPglecnNDfSUBivMjP93vRbngYYDQqQ/78bcQ==", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + } + } +} diff --git a/_generated/GulpV0/package.json b/_generated/GulpV0/package.json new file mode 100644 index 000000000000..2185a264da8e --- /dev/null +++ b/_generated/GulpV0/package.json @@ -0,0 +1,23 @@ +{ + "name": "vsts-gulp-task", + "description": "Azure Pipelines gulp tasks", + "repository": { + "type": "git", + "url": "git+https://github.com/Microsoft/azure-pipelines-tasks.git" + }, + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Microsoft/azure-pipelines-tasks/issues" + }, + "homepage": "https://github.com/Microsoft/azure-pipelines-tasks#readme", + "dependencies": { + "azure-pipelines-task-lib": "^5.0.0-preview.0", + "minimatch": "^3.0.4", + "@types/node": "^16.11.39", + "@types/mocha": "^5.2.7" + }, + "devDependencies": { + "typescript": "4.0.2" + } +} diff --git a/_generated/GulpV0/task.json b/_generated/GulpV0/task.json new file mode 100644 index 000000000000..b01404ffeb45 --- /dev/null +++ b/_generated/GulpV0/task.json @@ -0,0 +1,183 @@ +{ + "id": "B82CFBE4-34F9-40F5-889E-C8842CA9DD9D", + "name": "gulp", + "friendlyName": "gulp", + "description": "Run the gulp Node.js streaming task-based build system", + "helpUrl": "https://docs.microsoft.com/azure/devops/pipelines/tasks/build/gulp", + "helpMarkDown": "[Learn more about this task](https://go.microsoft.com/fwlink/?LinkID=613721)", + "category": "Build", + "visibility": [ + "Build" + ], + "runsOn": [ + "Agent", + "DeploymentGroup" + ], + "author": "Microsoft Corporation", + "version": { + "Major": 0, + "Minor": 229, + "Patch": 0 + }, + "demands": [ + "node.js" + ], + "minimumAgentVersion": "1.91.0", + "groups": [ + { + "name": "advanced", + "displayName": "Advanced", + "isExpanded": false + }, + { + "name": "junitTestResults", + "displayName": "JUnit Test Results", + "isExpanded": true + }, + { + "name": "codeCoverage", + "displayName": "Code Coverage", + "isExpanded": true + } + ], + "instanceNameFormat": "gulp $(targets)", + "inputs": [ + { + "name": "gulpFile", + "type": "filePath", + "label": "gulp File Path", + "defaultValue": "gulpfile.js", + "required": true, + "helpMarkDown": "Relative path from repo root of the gulp file script file to run." + }, + { + "name": "targets", + "type": "string", + "label": "gulp Task(s)", + "defaultValue": "", + "helpMarkDown": "Optional. Space delimited list of tasks to run. If not specified, the default task will run.", + "required": false + }, + { + "name": "arguments", + "type": "string", + "label": "Arguments", + "defaultValue": "", + "helpMarkDown": "Additional arguments passed to gulp. --gulpfile is not needed since already added via gulpFile input above.", + "required": false + }, + { + "name": "cwd", + "aliases": [ + "workingDirectory" + ], + "type": "filePath", + "label": "Working Directory", + "defaultValue": "", + "required": false, + "helpMarkDown": "Current working directory when script is run. Defaults to the folder where the script is located.", + "groupName": "advanced" + }, + { + "name": "gulpjs", + "type": "string", + "label": "gulp.js location", + "defaultValue": "node_modules/gulp/bin/gulp.js", + "required": true, + "helpMarkDown": "gulp.js to run when agent can't find global installed gulp. Defaults to the gulp.js under node_modules folder of the working directory.", + "groupName": "advanced" + }, + { + "name": "publishJUnitResults", + "type": "boolean", + "label": "Publish to Azure Pipelines", + "defaultValue": "false", + "groupName": "junitTestResults", + "helpMarkDown": "Select this option to publish JUnit test results produced by the gulp build to Azure Pipelines." + }, + { + "name": "testResultsFiles", + "type": "filePath", + "label": "Test Results Files", + "defaultValue": "**/TEST-*.xml", + "required": true, + "groupName": "junitTestResults", + "helpMarkDown": "Test results files path. Wildcards can be used. For example, `**/TEST-*.xml` for all XML files whose name starts with TEST-.", + "visibleRule": "publishJUnitResults = true" + }, + { + "name": "testRunTitle", + "type": "string", + "label": "Test Run Title", + "defaultValue": "", + "required": false, + "groupName": "junitTestResults", + "helpMarkDown": "Provide a name for the test run.", + "visibleRule": "publishJUnitResults = true" + }, + { + "name": "enableCodeCoverage", + "type": "boolean", + "label": "Enable code Coverage", + "required": true, + "defaultValue": "false", + "groupName": "codeCoverage", + "helpMarkDown": "Select this option to enable Code Coverage using Istanbul." + }, + { + "name": "testFramework", + "type": "pickList", + "label": "Test Framework", + "required": false, + "groupName": "codeCoverage", + "defaultValue": "Mocha", + "helpMarkDown": "Select your test framework.", + "options": { + "Mocha": "Mocha", + "Jasmine": "Jasmine" + }, + "visibleRule": "enableCodeCoverage = true" + }, + { + "name": "srcFiles", + "type": "string", + "label": "Source Files", + "defaultValue": "", + "required": false, + "groupName": "codeCoverage", + "helpMarkDown": "Provide the path to your source files which you want to hookRequire()", + "visibleRule": "enableCodeCoverage = true" + }, + { + "name": "testFiles", + "type": "string", + "label": "Test Script Files", + "defaultValue": "test/*.js", + "required": true, + "groupName": "codeCoverage", + "helpMarkDown": "Provide the path to your test script files", + "visibleRule": "enableCodeCoverage = true" + } + ], + "execution": { + "Node10": { + "target": "gulptask.js", + "argumentFormat": "" + }, + "Node16": { + "target": "gulptask.js", + "argumentFormat": "" + } + }, + "messages": { + "GulpNotInstalled": "gulp is not installed globally (or is not in the path of the user the agent is running as) and it is not in the local working folder: %s", + "GulpReturnCode": "gulp exited with return code: %d", + "GulpFailed": "gulp failed with error: %s", + "NpmFailed": "Npm failed with error: %s", + "IstanbulFailed": "Istanbul failed with error: %s" + }, + "_buildConfigMapping": { + "Default": "0.229.0", + "Node20-225": "0.229.1" + } +} \ No newline at end of file diff --git a/_generated/GulpV0/task.loc.json b/_generated/GulpV0/task.loc.json new file mode 100644 index 000000000000..587ffdfce1f9 --- /dev/null +++ b/_generated/GulpV0/task.loc.json @@ -0,0 +1,183 @@ +{ + "id": "B82CFBE4-34F9-40F5-889E-C8842CA9DD9D", + "name": "gulp", + "friendlyName": "ms-resource:loc.friendlyName", + "description": "ms-resource:loc.description", + "helpUrl": "https://docs.microsoft.com/azure/devops/pipelines/tasks/build/gulp", + "helpMarkDown": "ms-resource:loc.helpMarkDown", + "category": "Build", + "visibility": [ + "Build" + ], + "runsOn": [ + "Agent", + "DeploymentGroup" + ], + "author": "Microsoft Corporation", + "version": { + "Major": 0, + "Minor": 229, + "Patch": 0 + }, + "demands": [ + "node.js" + ], + "minimumAgentVersion": "1.91.0", + "groups": [ + { + "name": "advanced", + "displayName": "ms-resource:loc.group.displayName.advanced", + "isExpanded": false + }, + { + "name": "junitTestResults", + "displayName": "ms-resource:loc.group.displayName.junitTestResults", + "isExpanded": true + }, + { + "name": "codeCoverage", + "displayName": "ms-resource:loc.group.displayName.codeCoverage", + "isExpanded": true + } + ], + "instanceNameFormat": "ms-resource:loc.instanceNameFormat", + "inputs": [ + { + "name": "gulpFile", + "type": "filePath", + "label": "ms-resource:loc.input.label.gulpFile", + "defaultValue": "gulpfile.js", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.gulpFile" + }, + { + "name": "targets", + "type": "string", + "label": "ms-resource:loc.input.label.targets", + "defaultValue": "", + "helpMarkDown": "ms-resource:loc.input.help.targets", + "required": false + }, + { + "name": "arguments", + "type": "string", + "label": "ms-resource:loc.input.label.arguments", + "defaultValue": "", + "helpMarkDown": "ms-resource:loc.input.help.arguments", + "required": false + }, + { + "name": "cwd", + "aliases": [ + "workingDirectory" + ], + "type": "filePath", + "label": "ms-resource:loc.input.label.cwd", + "defaultValue": "", + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.cwd", + "groupName": "advanced" + }, + { + "name": "gulpjs", + "type": "string", + "label": "ms-resource:loc.input.label.gulpjs", + "defaultValue": "node_modules/gulp/bin/gulp.js", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.gulpjs", + "groupName": "advanced" + }, + { + "name": "publishJUnitResults", + "type": "boolean", + "label": "ms-resource:loc.input.label.publishJUnitResults", + "defaultValue": "false", + "groupName": "junitTestResults", + "helpMarkDown": "ms-resource:loc.input.help.publishJUnitResults" + }, + { + "name": "testResultsFiles", + "type": "filePath", + "label": "ms-resource:loc.input.label.testResultsFiles", + "defaultValue": "**/TEST-*.xml", + "required": true, + "groupName": "junitTestResults", + "helpMarkDown": "ms-resource:loc.input.help.testResultsFiles", + "visibleRule": "publishJUnitResults = true" + }, + { + "name": "testRunTitle", + "type": "string", + "label": "ms-resource:loc.input.label.testRunTitle", + "defaultValue": "", + "required": false, + "groupName": "junitTestResults", + "helpMarkDown": "ms-resource:loc.input.help.testRunTitle", + "visibleRule": "publishJUnitResults = true" + }, + { + "name": "enableCodeCoverage", + "type": "boolean", + "label": "ms-resource:loc.input.label.enableCodeCoverage", + "required": true, + "defaultValue": "false", + "groupName": "codeCoverage", + "helpMarkDown": "ms-resource:loc.input.help.enableCodeCoverage" + }, + { + "name": "testFramework", + "type": "pickList", + "label": "ms-resource:loc.input.label.testFramework", + "required": false, + "groupName": "codeCoverage", + "defaultValue": "Mocha", + "helpMarkDown": "ms-resource:loc.input.help.testFramework", + "options": { + "Mocha": "Mocha", + "Jasmine": "Jasmine" + }, + "visibleRule": "enableCodeCoverage = true" + }, + { + "name": "srcFiles", + "type": "string", + "label": "ms-resource:loc.input.label.srcFiles", + "defaultValue": "", + "required": false, + "groupName": "codeCoverage", + "helpMarkDown": "ms-resource:loc.input.help.srcFiles", + "visibleRule": "enableCodeCoverage = true" + }, + { + "name": "testFiles", + "type": "string", + "label": "ms-resource:loc.input.label.testFiles", + "defaultValue": "test/*.js", + "required": true, + "groupName": "codeCoverage", + "helpMarkDown": "ms-resource:loc.input.help.testFiles", + "visibleRule": "enableCodeCoverage = true" + } + ], + "execution": { + "Node10": { + "target": "gulptask.js", + "argumentFormat": "" + }, + "Node16": { + "target": "gulptask.js", + "argumentFormat": "" + } + }, + "messages": { + "GulpNotInstalled": "ms-resource:loc.messages.GulpNotInstalled", + "GulpReturnCode": "ms-resource:loc.messages.GulpReturnCode", + "GulpFailed": "ms-resource:loc.messages.GulpFailed", + "NpmFailed": "ms-resource:loc.messages.NpmFailed", + "IstanbulFailed": "ms-resource:loc.messages.IstanbulFailed" + }, + "_buildConfigMapping": { + "Default": "0.229.0", + "Node20-225": "0.229.1" + } +} \ No newline at end of file diff --git a/_generated/GulpV0/tsconfig.json b/_generated/GulpV0/tsconfig.json new file mode 100644 index 000000000000..0438b79f69ac --- /dev/null +++ b/_generated/GulpV0/tsconfig.json @@ -0,0 +1,6 @@ +{ + "compilerOptions": { + "target": "ES6", + "module": "commonjs" + } +} \ No newline at end of file diff --git a/_generated/GulpV0_Node20/.npmrc b/_generated/GulpV0_Node20/.npmrc new file mode 100644 index 000000000000..5fca0d518be7 --- /dev/null +++ b/_generated/GulpV0_Node20/.npmrc @@ -0,0 +1 @@ +scripts-prepend-node-path=true diff --git a/_generated/GulpV0_Node20/Strings/resources.resjson/de-DE/resources.resjson b/_generated/GulpV0_Node20/Strings/resources.resjson/de-DE/resources.resjson new file mode 100644 index 000000000000..f851f3285163 --- /dev/null +++ b/_generated/GulpV0_Node20/Strings/resources.resjson/de-DE/resources.resjson @@ -0,0 +1,38 @@ +{ + "loc.friendlyName": "gulp", + "loc.helpMarkDown": "[Weitere Informationen zu dieser Aufgabe](https://go.microsoft.com/fwlink/?LinkID=613721)", + "loc.description": "Hiermit wird das aufgabenbasierte Node.js-Streamingbuildsystem gulp ausgeführt.", + "loc.instanceNameFormat": "gulp $(targets)", + "loc.group.displayName.advanced": "Erweitert", + "loc.group.displayName.junitTestResults": "JUnit-Testergebnisse", + "loc.group.displayName.codeCoverage": "Code Coverage", + "loc.input.label.gulpFile": "gulp-Dateipfad", + "loc.input.help.gulpFile": "Der relative Pfad vom Repositorystamm der auszuführenden gulp-Skriptdatei.", + "loc.input.label.targets": "gulp-Aufgabe(n)", + "loc.input.help.targets": "Optional. Mit Leerzeichen getrennte Liste der auszuführenden Aufgaben. Wenn nicht angegeben, wird die Standardaufgabe ausgeführt.", + "loc.input.label.arguments": "Argumente", + "loc.input.help.arguments": "Zusätzliche Argumente, die an Gulp übergeben werden. \"-gulpfile\" wurde bereits über die gulpFile-Eingabe weiter oben hinzugefügt und ist daher nicht erforderlich.", + "loc.input.label.cwd": "Arbeitsverzeichnis", + "loc.input.help.cwd": "Aktuelles Arbeitsverzeichnis bei Skriptausführung. Standardmäßig der Ordner, in dem das Skript gespeichert ist.", + "loc.input.label.gulpjs": "Speicherort von \"gulp.js\"", + "loc.input.help.gulpjs": "Die auszuführende Datei \"gulp.js\", wenn der Agent keine globale Installation von Gulp findet. Standardmäßig wird die Datei \"gulp.js\" im Ordner \"node_modules\" des Arbeitsverzeichnisses verwendet.", + "loc.input.label.publishJUnitResults": "In Azure Pipelines veröffentlichen", + "loc.input.help.publishJUnitResults": "Wählen Sie diese Option aus, um vom gulp-Build erzeugte JUnit-Testergebnisse in Azure Pipelines zu veröffentlichen.", + "loc.input.label.testResultsFiles": "Testergebnisdateien", + "loc.input.help.testResultsFiles": "Der Pfad der Testergebnisdateien. Platzhalter können verwendet werden. Beispiel: \"**/TEST-*.xml\" für alle XML-Dateien, deren Name mit \"TEST-\" beginnt.", + "loc.input.label.testRunTitle": "Testlauftitel", + "loc.input.help.testRunTitle": "Geben Sie einen Namen für den Testlauf an.", + "loc.input.label.enableCodeCoverage": "Code Coverage aktivieren", + "loc.input.help.enableCodeCoverage": "Wählen Sie diese Option aus, um Code Coverage mithilfe von Istanbul zu aktivieren.", + "loc.input.label.testFramework": "Testframework", + "loc.input.help.testFramework": "Wählen Sie das Testframework aus.", + "loc.input.label.srcFiles": "Quelldateien", + "loc.input.help.srcFiles": "Geben Sie den Pfad zu Ihren Quelldateien an, für die hookRequire() gelten soll.", + "loc.input.label.testFiles": "Testskriptdateien", + "loc.input.help.testFiles": "Geben Sie den Pfad zu Ihren Testskriptdateien an.", + "loc.messages.GulpNotInstalled": "gulp ist nicht global installiert (oder ist nicht im Pfad des Benutzers enthalten, als der der Agent ausgeführt wird) und befindet sich nicht im lokalen Arbeitsordner: %s", + "loc.messages.GulpReturnCode": "gulp wurde mit dem folgenden Rückgabecode beendet: %d", + "loc.messages.GulpFailed": "gulp-Fehler: %s", + "loc.messages.NpmFailed": "Npm-Fehler: %s", + "loc.messages.IstanbulFailed": "Istanbul-Fehler: %s" +} \ No newline at end of file diff --git a/_generated/GulpV0_Node20/Strings/resources.resjson/en-US/resources.resjson b/_generated/GulpV0_Node20/Strings/resources.resjson/en-US/resources.resjson new file mode 100644 index 000000000000..63a9644c3c00 --- /dev/null +++ b/_generated/GulpV0_Node20/Strings/resources.resjson/en-US/resources.resjson @@ -0,0 +1,38 @@ +{ + "loc.friendlyName": "gulp", + "loc.helpMarkDown": "[Learn more about this task](https://go.microsoft.com/fwlink/?LinkID=613721)", + "loc.description": "Run the gulp Node.js streaming task-based build system", + "loc.instanceNameFormat": "gulp $(targets)", + "loc.group.displayName.advanced": "Advanced", + "loc.group.displayName.junitTestResults": "JUnit Test Results", + "loc.group.displayName.codeCoverage": "Code Coverage", + "loc.input.label.gulpFile": "gulp File Path", + "loc.input.help.gulpFile": "Relative path from repo root of the gulp file script file to run.", + "loc.input.label.targets": "gulp Task(s)", + "loc.input.help.targets": "Optional. Space delimited list of tasks to run. If not specified, the default task will run.", + "loc.input.label.arguments": "Arguments", + "loc.input.help.arguments": "Additional arguments passed to gulp. --gulpfile is not needed since already added via gulpFile input above.", + "loc.input.label.cwd": "Working Directory", + "loc.input.help.cwd": "Current working directory when script is run. Defaults to the folder where the script is located.", + "loc.input.label.gulpjs": "gulp.js location", + "loc.input.help.gulpjs": "gulp.js to run when agent can't find global installed gulp. Defaults to the gulp.js under node_modules folder of the working directory.", + "loc.input.label.publishJUnitResults": "Publish to Azure Pipelines", + "loc.input.help.publishJUnitResults": "Select this option to publish JUnit test results produced by the gulp build to Azure Pipelines.", + "loc.input.label.testResultsFiles": "Test Results Files", + "loc.input.help.testResultsFiles": "Test results files path. Wildcards can be used. For example, `**/TEST-*.xml` for all XML files whose name starts with TEST-.", + "loc.input.label.testRunTitle": "Test Run Title", + "loc.input.help.testRunTitle": "Provide a name for the test run.", + "loc.input.label.enableCodeCoverage": "Enable code Coverage", + "loc.input.help.enableCodeCoverage": "Select this option to enable Code Coverage using Istanbul.", + "loc.input.label.testFramework": "Test Framework", + "loc.input.help.testFramework": "Select your test framework.", + "loc.input.label.srcFiles": "Source Files", + "loc.input.help.srcFiles": "Provide the path to your source files which you want to hookRequire()", + "loc.input.label.testFiles": "Test Script Files", + "loc.input.help.testFiles": "Provide the path to your test script files", + "loc.messages.GulpNotInstalled": "gulp is not installed globally (or is not in the path of the user the agent is running as) and it is not in the local working folder: %s", + "loc.messages.GulpReturnCode": "gulp exited with return code: %d", + "loc.messages.GulpFailed": "gulp failed with error: %s", + "loc.messages.NpmFailed": "Npm failed with error: %s", + "loc.messages.IstanbulFailed": "Istanbul failed with error: %s" +} \ No newline at end of file diff --git a/_generated/GulpV0_Node20/Strings/resources.resjson/es-ES/resources.resjson b/_generated/GulpV0_Node20/Strings/resources.resjson/es-ES/resources.resjson new file mode 100644 index 000000000000..d17e30890fdd --- /dev/null +++ b/_generated/GulpV0_Node20/Strings/resources.resjson/es-ES/resources.resjson @@ -0,0 +1,38 @@ +{ + "loc.friendlyName": "gulp", + "loc.helpMarkDown": "[Obtener más información acerca de esta tarea](https://go.microsoft.com/fwlink/?LinkID=613721)", + "loc.description": "Ejecute el sistema de compilación basado en tareas de streaming de Node.js con gulp.", + "loc.instanceNameFormat": "$(targets) de Gulp", + "loc.group.displayName.advanced": "Avanzado", + "loc.group.displayName.junitTestResults": "Resultados de pruebas JUnit", + "loc.group.displayName.codeCoverage": "Cobertura de código", + "loc.input.label.gulpFile": "Ruta de acceso del archivo gulp", + "loc.input.help.gulpFile": "Ruta de acceso relativa de la raíz del repositorio del archivo de script Gulp que se va a ejecutar.", + "loc.input.label.targets": "Tareas de gulp", + "loc.input.help.targets": "Opcional. Lista de tareas para ejecutar delimitada por espacios. Si no se especifica, se ejecutará la tarea predeterminada.", + "loc.input.label.arguments": "Argumentos", + "loc.input.help.arguments": "Argumentos adicionales pasados a Gulp. --gulpfile no es necesario porque ya se agregó a través de la entrada gulpFile anterior.", + "loc.input.label.cwd": "Directorio de trabajo", + "loc.input.help.cwd": "Directorio de trabajo actual cuando el script se ejecuta. Se establece de forma predeterminada en la carpeta en la que se encuentra el script.", + "loc.input.label.gulpjs": "Ubicación de gulp.js", + "loc.input.help.gulpjs": "Archivo gulp.js que se va a ejecutar cuando el agente no encuentra el Gulp instalado global. El archivo gulp.js de la carpeta node_modules del directorio de trabajo es la opción predeterminada.", + "loc.input.label.publishJUnitResults": "Publicar en Azure Pipelines", + "loc.input.help.publishJUnitResults": "Seleccione esta opción para publicar los resultados de pruebas JUnit generados por la compilación de gulp en Azure Pipelines.", + "loc.input.label.testResultsFiles": "Archivos de resultados de pruebas", + "loc.input.help.testResultsFiles": "Ruta de acceso a los archivos de resultados de pruebas. Se pueden usar caracteres comodín. Por ejemplo, \"**/TEST-*.xml\" para todos los archivos XML cuyos nombres empiecen por TEST-.", + "loc.input.label.testRunTitle": "Título de la serie de pruebas", + "loc.input.help.testRunTitle": "Asigne un nombre a la serie de pruebas.", + "loc.input.label.enableCodeCoverage": "Habilitar Cobertura de código", + "loc.input.help.enableCodeCoverage": "Seleccione esta opción para habilitar Cobertura de código con Istanbul.", + "loc.input.label.testFramework": "Marco de pruebas", + "loc.input.help.testFramework": "Seleccione su marco de pruebas.", + "loc.input.label.srcFiles": "Archivos de origen", + "loc.input.help.srcFiles": "Proporcione la ruta de acceso a los archivos de origen que quiera para hookRequire().", + "loc.input.label.testFiles": "Archivos de script de prueba", + "loc.input.help.testFiles": "Proporcione la ruta de acceso a sus archivos de script de prueba.", + "loc.messages.GulpNotInstalled": "No se ha instalado gulp a nivel global (o no está en la ruta del usuario con el que se ejecuta el agente) y no está en la carpeta de trabajo local: %s", + "loc.messages.GulpReturnCode": "Se ha cerrado gulp con el código de retorno: %d", + "loc.messages.GulpFailed": "Error de gulp: %s", + "loc.messages.NpmFailed": "Error de Npm: %s", + "loc.messages.IstanbulFailed": "Error de Istanbul: %s" +} \ No newline at end of file diff --git a/_generated/GulpV0_Node20/Strings/resources.resjson/fr-FR/resources.resjson b/_generated/GulpV0_Node20/Strings/resources.resjson/fr-FR/resources.resjson new file mode 100644 index 000000000000..93d7f79849cb --- /dev/null +++ b/_generated/GulpV0_Node20/Strings/resources.resjson/fr-FR/resources.resjson @@ -0,0 +1,38 @@ +{ + "loc.friendlyName": "gulp", + "loc.helpMarkDown": "[En savoir plus sur cette tâche](https://go.microsoft.com/fwlink/?LinkID=613721)", + "loc.description": "Exécuter le système de build basé sur les tâches de streaming Node.js de gulp", + "loc.instanceNameFormat": "gulp $(targets)", + "loc.group.displayName.advanced": "Avancé", + "loc.group.displayName.junitTestResults": "Résultats du test JUnit", + "loc.group.displayName.codeCoverage": "Couverture du code", + "loc.input.label.gulpFile": "Chemin de fichier gulp", + "loc.input.help.gulpFile": "Chemin relatif de la racine de dépôt du fichier script du fichier gulp à exécuter.", + "loc.input.label.targets": "Tâche(s) gulp", + "loc.input.help.targets": "Facultatif. Liste des tâches à exécuter délimitées par des espaces. Si elle n'est pas spécifiée, la tâche par défaut est exécutée.", + "loc.input.label.arguments": "Arguments", + "loc.input.help.arguments": "Arguments supplémentaires passés à gulp. --gulpfile n'est pas nécessaire, car il est déjà ajouté via l'entrée gulpFile ci-dessus.", + "loc.input.label.cwd": "Répertoire de travail", + "loc.input.help.cwd": "Répertoire de travail actuel quand le script est exécuté. Il s'agit généralement du dossier dans lequel se trouve le script.", + "loc.input.label.gulpjs": "Emplacement de gulp.js", + "loc.input.help.gulpjs": "Fichier gulp.js à exécuter quand l'agent ne trouve pas le gulp installé global. Correspond par défaut au fichier gulp.js sous le dossier node_modules du répertoire de travail.", + "loc.input.label.publishJUnitResults": "Publier sur Azure Pipelines", + "loc.input.help.publishJUnitResults": "Sélectionnez cette option pour publier les résultats des tests JUnit produits par la build gulp sur Azure Pipelines.", + "loc.input.label.testResultsFiles": "Fichiers des résultats des tests", + "loc.input.help.testResultsFiles": "Chemin des fichiers de résultats des tests. Les caractères génériques sont autorisés. Par exemple, '**/TEST-*.xml' correspond à tous les fichiers XML dont le nom commence par TEST-.", + "loc.input.label.testRunTitle": "Titre de l'exécution du test", + "loc.input.help.testRunTitle": "Indiquez le nom de la série de tests.", + "loc.input.label.enableCodeCoverage": "Activer la couverture du code", + "loc.input.help.enableCodeCoverage": "Sélectionnez cette option pour activer la couverture du code à l'aide d'Istanbul.", + "loc.input.label.testFramework": "Framework de tests", + "loc.input.help.testFramework": "Sélectionnez votre framework de tests.", + "loc.input.label.srcFiles": "Fichiers sources", + "loc.input.help.srcFiles": "Indiquez le chemin des fichiers sources auxquels vous voulez appliquer hookRequire()", + "loc.input.label.testFiles": "Fichiers de script de test", + "loc.input.help.testFiles": "Indiquez le chemin de vos fichiers de script de test", + "loc.messages.GulpNotInstalled": "gulp n'est pas installé de manière globale ou ne se trouve pas dans le chemin de l'utilisateur via lequel l'agent s'exécute. De plus, il ne se trouve pas dans le dossier de travail local : %s", + "loc.messages.GulpReturnCode": "Sortie de gulp. Code de retour : %d", + "loc.messages.GulpFailed": "Échec de gulp. Erreur : %s", + "loc.messages.NpmFailed": "Échec de Npm. Erreur : %s", + "loc.messages.IstanbulFailed": "Échec d'Istanbul avec l'erreur : %s" +} \ No newline at end of file diff --git a/_generated/GulpV0_Node20/Strings/resources.resjson/it-IT/resources.resjson b/_generated/GulpV0_Node20/Strings/resources.resjson/it-IT/resources.resjson new file mode 100644 index 000000000000..63cb429d56f8 --- /dev/null +++ b/_generated/GulpV0_Node20/Strings/resources.resjson/it-IT/resources.resjson @@ -0,0 +1,38 @@ +{ + "loc.friendlyName": "gulp", + "loc.helpMarkDown": "[Altre informazioni su questa attività](https://go.microsoft.com/fwlink/?LinkID=613721)", + "loc.description": "Esegue il sistema di compilazione basato su attività di streaming Node.js di gulp", + "loc.instanceNameFormat": "gulp $(targets)", + "loc.group.displayName.advanced": "Avanzate", + "loc.group.displayName.junitTestResults": "Risultati del test JUnit", + "loc.group.displayName.codeCoverage": "Code coverage", + "loc.input.label.gulpFile": "Percorso file di gulp", + "loc.input.help.gulpFile": "Percorso relativo dalla radice del repository del file di script del file gulp da eseguire.", + "loc.input.label.targets": "Attività di gulp", + "loc.input.help.targets": "Facoltativo. Elenco di attività delimitate da spazio da eseguire. Se non è specificato, viene eseguita l'attività predefinita.", + "loc.input.label.arguments": "Argomenti", + "loc.input.help.arguments": "Argomenti aggiuntivi passati a gulp. --gulpfile non è necessario dal momento che è già stato aggiunto tramite l'input di gulpFile in precedenza.", + "loc.input.label.cwd": "Directory di lavoro", + "loc.input.help.cwd": "Directory di lavoro corrente durante l'esecuzione dello script. Per impostazione predefinita, corrisponde alla cartella in cui si trova lo script.", + "loc.input.label.gulpjs": "Percorso di gulp.js", + "loc.input.help.gulpjs": "File gulp.js da eseguire quando l'agente non riesce a trovare il file gulp installato globale. Per impostazione predefinita, viene usato il file gulp.js presente nella cartella node_modules della directory di lavoro.", + "loc.input.label.publishJUnitResults": "Pubblica in Azure Pipelines", + "loc.input.help.publishJUnitResults": "Selezionare questa opzione per pubblicare in Azure Pipelines i risultati di test JUnit ottenuti con la compilazione gulp.", + "loc.input.label.testResultsFiles": "File dei risultati del test", + "loc.input.help.testResultsFiles": "Percorso dei file dei risultati del test. È possibile usare i caratteri jolly, ad esempio `**/TEST-*.xml` per individuare tutti i file XML il cui nome inizia con TEST-.", + "loc.input.label.testRunTitle": "Titolo esecuzione dei test", + "loc.input.help.testRunTitle": "Consente di specificare un nome per l'esecuzione dei test.", + "loc.input.label.enableCodeCoverage": "Abilita code coverage", + "loc.input.help.enableCodeCoverage": "Selezionare questa opzione per abilitare il code coverage con Istanbul.", + "loc.input.label.testFramework": "Framework di test", + "loc.input.help.testFramework": "Consente di selezionare il framework di test.", + "loc.input.label.srcFiles": "File di origine", + "loc.input.help.srcFiles": "Consente di specificare il percorso dei file di origine per hookRequire()", + "loc.input.label.testFiles": "File di script di test", + "loc.input.help.testFiles": "Consente di specificare il percorso dei file di script di test", + "loc.messages.GulpNotInstalled": "gulp non è installato globalmente oppure non è presente nel percorso dell'utente con cui viene eseguito l'agente e non è incluso nella cartella di lavoro locale %s", + "loc.messages.GulpReturnCode": "gulp terminato. Codice restituito: %d", + "loc.messages.GulpFailed": "gulp non riuscito. Errore: %s", + "loc.messages.NpmFailed": "Npm non riuscito. Errore: %s", + "loc.messages.IstanbulFailed": "Istanbul non riuscito. Errore: %s" +} \ No newline at end of file diff --git a/_generated/GulpV0_Node20/Strings/resources.resjson/ja-JP/resources.resjson b/_generated/GulpV0_Node20/Strings/resources.resjson/ja-JP/resources.resjson new file mode 100644 index 000000000000..6643f9e5b65a --- /dev/null +++ b/_generated/GulpV0_Node20/Strings/resources.resjson/ja-JP/resources.resjson @@ -0,0 +1,38 @@ +{ + "loc.friendlyName": "gulp", + "loc.helpMarkDown": "[このタスクの詳細を表示](https://go.microsoft.com/fwlink/?LinkID=613721)", + "loc.description": "Node.js のストリーミング タスクベースのビルド システムである gulp を実行します", + "loc.instanceNameFormat": "gulp $(targets)", + "loc.group.displayName.advanced": "詳細設定", + "loc.group.displayName.junitTestResults": "JUnit のテスト結果", + "loc.group.displayName.codeCoverage": "コード カバレッジ", + "loc.input.label.gulpFile": "gulp ファイル パス", + "loc.input.help.gulpFile": "リポジトリのルートを基準として指定する、実行する gulp スクリプト ファイルの相対パス。", + "loc.input.label.targets": "gulp タスク", + "loc.input.help.targets": "(省略可能) スペース区切りの実行タスクのリスト。指定しない場合は、既定のタスクが実行されます。", + "loc.input.label.arguments": "引数", + "loc.input.help.arguments": "gulp に渡される追加の引数。上記の gulpFile 入力で既に追加されているので、--gulpfile は不要です。", + "loc.input.label.cwd": "作業ディレクトリ", + "loc.input.help.cwd": "スクリプトの実行時の現行の作業ディレクトリ。スクリプトが配置されているフォルダーを既定値に使用します。", + "loc.input.label.gulpjs": "gulp.js の場所", + "loc.input.help.gulpjs": "グローバルにインストールされた gulp をエージェントが見つけられない場合に実行する gulp.js。既定値は、作業ディレクトリの node_modules フォルダーの下にある gulp.js です。", + "loc.input.label.publishJUnitResults": "Azure Pipelines に公開する", + "loc.input.help.publishJUnitResults": "gulp のビルドによって生成される JUnit のテスト結果を Azure Pipelines に公開するには、このオプションを選びます。", + "loc.input.label.testResultsFiles": "テスト結果のファイル", + "loc.input.help.testResultsFiles": "テスト結果ファイルのパス。ワイルドカードを使用できます。たとえば、名前が TEST- で始まるすべての XML ファイルの場合は `**/TEST-*.xml` です。", + "loc.input.label.testRunTitle": "テスト実行のタイトル", + "loc.input.help.testRunTitle": "テストの実行の名前を指定します。", + "loc.input.label.enableCodeCoverage": "コード カバレッジを有効にする", + "loc.input.help.enableCodeCoverage": "Istanbul を使用してコード カバレッジを有効にするには、このオプションを選びます。", + "loc.input.label.testFramework": "テスト フレームワーク", + "loc.input.help.testFramework": "テスト フレームワークを選びます。", + "loc.input.label.srcFiles": "ソース ファイル", + "loc.input.help.srcFiles": "hookRequire() を実行しようとしているソース ファイルへのパスを指定します", + "loc.input.label.testFiles": "テスト スクリプト ファイル", + "loc.input.help.testFiles": "テスト スクリプト ファイルへのパスを指定します", + "loc.messages.GulpNotInstalled": "gulp はグローバルにインストールされていません (またはエージェントが実行しているユーザーのパスにありません)。またローカル作業フォルダーにありません: %s", + "loc.messages.GulpReturnCode": "gulp は、次のリターン コードで終了しました: %d", + "loc.messages.GulpFailed": "gulp が次のエラーで失敗しました: %s", + "loc.messages.NpmFailed": "Npm でエラーが発生しました: %s", + "loc.messages.IstanbulFailed": "Istanbul でエラーが発生しました: %s" +} \ No newline at end of file diff --git a/_generated/GulpV0_Node20/Strings/resources.resjson/ko-KR/resources.resjson b/_generated/GulpV0_Node20/Strings/resources.resjson/ko-KR/resources.resjson new file mode 100644 index 000000000000..26cb1b22149c --- /dev/null +++ b/_generated/GulpV0_Node20/Strings/resources.resjson/ko-KR/resources.resjson @@ -0,0 +1,38 @@ +{ + "loc.friendlyName": "gulp", + "loc.helpMarkDown": "[이 작업에 대한 자세한 정보](https://go.microsoft.com/fwlink/?LinkID=613721)", + "loc.description": "gulp Node.js 스트리밍 작업 기반 빌드 시스템을 실행합니다.", + "loc.instanceNameFormat": "gulp $(targets)", + "loc.group.displayName.advanced": "고급", + "loc.group.displayName.junitTestResults": "JUnit 테스트 결과", + "loc.group.displayName.codeCoverage": "코드 검사", + "loc.input.label.gulpFile": "gulp 파일 경로", + "loc.input.help.gulpFile": "실행할 gulp 파일 스크립트 파일의 리포 루트로부터의 상대 경로입니다.", + "loc.input.label.targets": "gulp 작업", + "loc.input.help.targets": "선택 사항. 공백으로 구분된 실행할 작업 목록입니다. 지정하지 않을 경우 기본 작업이 실행됩니다.", + "loc.input.label.arguments": "인수", + "loc.input.help.arguments": "추가 인수를 gulp에 전달했습니다. --gulpfile은 위의 gulpFile 입력을 통해 이미 추가되었으므로 필요하지 않습니다.", + "loc.input.label.cwd": "작업 디렉터리", + "loc.input.help.cwd": "스크립트 실행 시 현재 작업 디렉터리입니다. 기본값을 스크립트가 있는 폴더로 지정합니다.", + "loc.input.label.gulpjs": "gulp.js 위치", + "loc.input.help.gulpjs": "에이전트에서 전역 설치 Gulp를 찾을 수 없을 때 실행할 gulp.js입니다. 기본값은 작업 디렉터리의 node_modules 폴더 아래에 있는 gulp.js입니다.", + "loc.input.label.publishJUnitResults": "Azure Pipelines/에 게시", + "loc.input.help.publishJUnitResults": "gulp 빌드에서 생성된 JUnit 테스트 결과를 Azure Pipelines에 게시하려면 이 옵션을 선택합니다.", + "loc.input.label.testResultsFiles": "테스트 결과 파일", + "loc.input.help.testResultsFiles": "테스트 결과 파일 경로입니다. 와일드카드를 사용할 수 있습니다. 예를 들어, 이름이 TEST-로 시작하는 모든 XML 파일을 표시하기 위해 `**/TEST-*.xml`을 사용할 수 있습니다.", + "loc.input.label.testRunTitle": "테스트 실행 제목", + "loc.input.help.testRunTitle": "테스트 실행의 이름을 지정하세요.", + "loc.input.label.enableCodeCoverage": "코드 검사 사용", + "loc.input.help.enableCodeCoverage": "Istanbul을 사용하여 코드 검사를 사용하도록 설정하려면 이 옵션을 선택하세요.", + "loc.input.label.testFramework": "테스트 프레임워크", + "loc.input.help.testFramework": "테스트 프레임워크를 선택하세요.", + "loc.input.label.srcFiles": "소스 파일", + "loc.input.help.srcFiles": "hookRequire()를 적용할 소스 파일의 경로를 지정하세요.", + "loc.input.label.testFiles": "테스트 스크립트 파일", + "loc.input.help.testFiles": "테스트 스크립트 파일의 경로를 지정하세요.", + "loc.messages.GulpNotInstalled": "gulp가 전역으로 설치되지 않았거나 에이전트를 실행 중인 사용자의 경로에 없으며 로컬 작업 폴더 %s에 없습니다.", + "loc.messages.GulpReturnCode": "gulp가 종료되었습니다(반환 코드: %d).", + "loc.messages.GulpFailed": "오류가 발생하여 gulp에 실패했습니다. %s", + "loc.messages.NpmFailed": "오류 %s(으)로 Npm 실패", + "loc.messages.IstanbulFailed": "다음 오류가 발생하여 Istanbul이 실패했습니다. %s" +} \ No newline at end of file diff --git a/_generated/GulpV0_Node20/Strings/resources.resjson/ru-RU/resources.resjson b/_generated/GulpV0_Node20/Strings/resources.resjson/ru-RU/resources.resjson new file mode 100644 index 000000000000..288cabd1e2d6 --- /dev/null +++ b/_generated/GulpV0_Node20/Strings/resources.resjson/ru-RU/resources.resjson @@ -0,0 +1,38 @@ +{ + "loc.friendlyName": "gulp", + "loc.helpMarkDown": "[См. дополнительные сведения об этой задаче](https://go.microsoft.com/fwlink/?LinkID=613721)", + "loc.description": "Запуск системы сборки, основанной на задачах потоковой передачи Node.js gulp", + "loc.instanceNameFormat": "Gulp $(targets)", + "loc.group.displayName.advanced": "Дополнительно", + "loc.group.displayName.junitTestResults": "Результаты теста JUnit", + "loc.group.displayName.codeCoverage": "Объем протестированного кода", + "loc.input.label.gulpFile": "Путь к файлу gulp", + "loc.input.help.gulpFile": "Относительный путь от корня репозитория к файлу сценария Gulp, который подлежит выполнению.", + "loc.input.label.targets": "Задачи gulp", + "loc.input.help.targets": "Необязательно. Список запускаемых задач с разделителями-пробелами. Если он не указан, будет запущена задача по умолчанию.", + "loc.input.label.arguments": "Аргументы", + "loc.input.help.arguments": "Дополнительные аргументы, передаваемые в Gulp. Аргумент --gulpfile не требуется, так как он уже добавлен с помощью входного файла gulpFile выше.", + "loc.input.label.cwd": "Рабочий каталог", + "loc.input.help.cwd": "Текущий рабочий каталог при выполнении сценария. По умолчанию используется папка, в которой находится сценарий.", + "loc.input.label.gulpjs": "Расположение gulp.js", + "loc.input.help.gulpjs": "Gulp.js, который будет запущен, если агенту не удастся найти глобально установленный gulp. Значение по умолчанию — gulp.js в папке node_modules в рабочем каталоге.", + "loc.input.label.publishJUnitResults": "Опубликовать в Azure Pipelines", + "loc.input.help.publishJUnitResults": "Выберите этот параметр, чтобы опубликовать результаты тестов JUnit, созданные сборкой gulp, в Azure Pipelines.", + "loc.input.label.testResultsFiles": "Файлы результатов тестов", + "loc.input.help.testResultsFiles": "Путь к файлам результатов тестов. Можно использовать подстановочные знаки. Пример: \"**/TEST-*.xml\" для всех XML-файлов, имена которых начинаются с \"TEST-\".", + "loc.input.label.testRunTitle": "Заголовок тестового запуска", + "loc.input.help.testRunTitle": "Укажите имя для тестового запуска.", + "loc.input.label.enableCodeCoverage": "Включить оценку объема протестированного кода", + "loc.input.help.enableCodeCoverage": "Выберите этот параметр, чтобы включить оценку объема протестированного кода с помощью Istanbul.", + "loc.input.label.testFramework": "Платформа тестирования", + "loc.input.help.testFramework": "Выберите платформу тестирования.", + "loc.input.label.srcFiles": "Исходные файлы", + "loc.input.help.srcFiles": "Укажите путь к исходным файлам, к которым необходимо применить метод hookRequire()", + "loc.input.label.testFiles": "Файлы скриптов тестирования", + "loc.input.help.testFiles": "Укажите путь к файлам скриптов тестирования", + "loc.messages.GulpNotInstalled": "Набор gulp не установлен глобально (или не находится в пути пользователя, от имени которого выполняется агент) и не находится в локальной рабочей папке: %s", + "loc.messages.GulpReturnCode": "Завершение работы gulp с кодом возврата: %d", + "loc.messages.GulpFailed": "Сбой gulp с ошибкой: %s", + "loc.messages.NpmFailed": "Сбой NPM с ошибкой: %s", + "loc.messages.IstanbulFailed": "Сбой Istanbul с ошибкой: %s" +} \ No newline at end of file diff --git a/_generated/GulpV0_Node20/Strings/resources.resjson/zh-CN/resources.resjson b/_generated/GulpV0_Node20/Strings/resources.resjson/zh-CN/resources.resjson new file mode 100644 index 000000000000..c11e77dfc838 --- /dev/null +++ b/_generated/GulpV0_Node20/Strings/resources.resjson/zh-CN/resources.resjson @@ -0,0 +1,38 @@ +{ + "loc.friendlyName": "Gulp", + "loc.helpMarkDown": "[详细了解此任务](https://go.microsoft.com/fwlink/?LinkID=613721)", + "loc.description": "运行 Gulp 基于 Node.js 流任务的生成系统", + "loc.instanceNameFormat": "Gulp $(targets)", + "loc.group.displayName.advanced": "高级", + "loc.group.displayName.junitTestResults": "JUnit 测试结果", + "loc.group.displayName.codeCoverage": "代码覆盖率", + "loc.input.label.gulpFile": "Gulp 文件路径", + "loc.input.help.gulpFile": "要运行的 Gulp 文件脚本文件的存储库根路径的相对路径。", + "loc.input.label.targets": "Gulp 任务", + "loc.input.help.targets": "可选。待运行任务的列表,以空格分隔。如未指定,则将运行默认任务。", + "loc.input.label.arguments": "参数", + "loc.input.help.arguments": "传递给 Gulp 的其他参数。无需 --gulpfile,因为已通过上面的 gulpFile 输入添加。", + "loc.input.label.cwd": "工作目录", + "loc.input.help.cwd": "脚本运行时的当前工作目录。默认为脚本所处的文件夹。", + "loc.input.label.gulpjs": "gulp.js 位置", + "loc.input.help.gulpjs": "代理找不到全局安装的 Gulp 时要运行的 gulp.js。默认为工作目录的 node_modules 文件夹下的 gulp.js。", + "loc.input.label.publishJUnitResults": "发布到 Azure Pipelines", + "loc.input.help.publishJUnitResults": "选择此选项可将 Gulp 生成产生的 JUnit 测试结果发布到 Azure Pipelines。", + "loc.input.label.testResultsFiles": "测试结果文件", + "loc.input.help.testResultsFiles": "测试结果文件路径。可以使用通配符。例如,\"**/TEST-*.xml\" 表示名称以 TEST- 开头的所有 XML 文件。", + "loc.input.label.testRunTitle": "测试运行标题", + "loc.input.help.testRunTitle": "为测试运行提供一个名称。", + "loc.input.label.enableCodeCoverage": "启用代码覆盖率", + "loc.input.help.enableCodeCoverage": "选择此选项以使用 Istanbul 启用代码覆盖率。", + "loc.input.label.testFramework": "测试框架", + "loc.input.help.testFramework": "选择你的测试框架。", + "loc.input.label.srcFiles": "源文件", + "loc.input.help.srcFiles": "将你所需的源文件路径提供给 hookRequire()", + "loc.input.label.testFiles": "测试脚本文件", + "loc.input.help.testFiles": "提供测试脚本文件的路径", + "loc.messages.GulpNotInstalled": "Gulp 未在全局进行安装(或不位于代理运行身份用户的路径下),且不位于本地工作文件夹 %s 中", + "loc.messages.GulpReturnCode": "Gulp 已退出,返回代码为: %d", + "loc.messages.GulpFailed": "Gulp 失败,出现错误: %s", + "loc.messages.NpmFailed": "Npm 失败,出现错误: %s", + "loc.messages.IstanbulFailed": "Istanbul 失败,出现错误: %s" +} \ No newline at end of file diff --git a/_generated/GulpV0_Node20/Strings/resources.resjson/zh-TW/resources.resjson b/_generated/GulpV0_Node20/Strings/resources.resjson/zh-TW/resources.resjson new file mode 100644 index 000000000000..9232df910539 --- /dev/null +++ b/_generated/GulpV0_Node20/Strings/resources.resjson/zh-TW/resources.resjson @@ -0,0 +1,38 @@ +{ + "loc.friendlyName": "gulp", + "loc.helpMarkDown": "[深入了解此工作](https://go.microsoft.com/fwlink/?LinkID=613721)", + "loc.description": "執行 gulp Node.js 串流工作型建置系統", + "loc.instanceNameFormat": "Gulp $(targets)", + "loc.group.displayName.advanced": "進階", + "loc.group.displayName.junitTestResults": "JUnit 測試結果", + "loc.group.displayName.codeCoverage": "程式碼涵蓋範圍", + "loc.input.label.gulpFile": "gulp 檔案路徑", + "loc.input.help.gulpFile": "要執行的 gulp 檔指令檔存放庫根路徑相對路徑。", + "loc.input.label.targets": "gulp 工作", + "loc.input.help.targets": "可省略。以空格分隔要執行之工作的清單。若未指定,將會執行預設工作。", + "loc.input.label.arguments": "引數", + "loc.input.help.arguments": "傳遞至 Gulp 的額外引數。 --不需要 gulpfile 因為已透過上述 gulpFile 輸入加入。", + "loc.input.label.cwd": "工作目錄", + "loc.input.help.cwd": "執行指令碼後的目前工作目錄。預設為指令碼所在的資料夾。", + "loc.input.label.gulpjs": "gulp.js 的位置", + "loc.input.help.gulpjs": "當代理程式找不到全域安裝的 Gulp 時所要執行的 gulp.js,預設為工作目錄 node_modules 資料夾下的 gulp.js。", + "loc.input.label.publishJUnitResults": "發佈至 Azure Pipelines", + "loc.input.help.publishJUnitResults": "選取此選項會將 gulp 組建所產生的 JUnit 測試結果發佈至 Azure Pipelines。", + "loc.input.label.testResultsFiles": "測試結果檔案", + "loc.input.help.testResultsFiles": "測試結果檔案路徑。可使用萬用字元。例如 `**/TEST-*.xml` 即適用於所有名稱開頭為 TEST- 的 XML 檔案。", + "loc.input.label.testRunTitle": "測試回合標題", + "loc.input.help.testRunTitle": "提供測試回合的名稱。", + "loc.input.label.enableCodeCoverage": "啟用程式碼涵蓋範圍", + "loc.input.help.enableCodeCoverage": "選取這個選項,以使用 Istanbul 啟用程式碼涵蓋範圍。", + "loc.input.label.testFramework": "測試架構", + "loc.input.help.testFramework": "選取測試架構。", + "loc.input.label.srcFiles": "原始程式檔", + "loc.input.help.srcFiles": "提供要進行 hookRequire() 之原始程式檔的路徑", + "loc.input.label.testFiles": "測試指令檔", + "loc.input.help.testFiles": "提供測試指令碼檔案的路徑", + "loc.messages.GulpNotInstalled": "gulp 未全域安裝 (或不在作為代理程式執行身分的使用者路徑中) 且不在本機工作資料夾: %s", + "loc.messages.GulpReturnCode": "gulp 已結束,傳回碼: %d", + "loc.messages.GulpFailed": "gulp 失敗,錯誤: %s", + "loc.messages.NpmFailed": "Npm 失敗,錯誤為: %s", + "loc.messages.IstanbulFailed": "Istanbul 失敗,錯誤為: %s" +} \ No newline at end of file diff --git a/_generated/GulpV0_Node20/Tests/L0.ts b/_generated/GulpV0_Node20/Tests/L0.ts new file mode 100644 index 000000000000..3837407049fc --- /dev/null +++ b/_generated/GulpV0_Node20/Tests/L0.ts @@ -0,0 +1,242 @@ +import assert = require('assert'); +import path = require('path'); +import os = require('os'); +import * as ttm from 'azure-pipelines-task-lib/mock-test'; + +const isWin = os.type().match(/^Win/); + +describe('GulpV0 Suite', function () { + this.timeout(parseInt(process.env.TASK_TEST_TIMEOUT) || 20000); + + before((done: Mocha.Done) => { + process.env['SYSTEM_DEFAULTWORKINGDIRECTORY'] = '/user/build'; + done(); + }); + + it('runs a gulpfile through global gulp', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0GulpGlobalGood.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.ran('/usr/local/bin/gulp --gulpfile gulpfile.js'), 'it should have run Gulp'); + assert(tr.invokedToolCount == 1, 'should have only run gulp'); + assert(tr.stderr.length == 0, 'should not have written to stderr'); + assert(tr.succeeded, 'task should have succeeded'); + + done(); + }); + + it('runs a gulpfile through local gulp', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0GulpLocalGood.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + if (isWin) { + assert( + tr.ran('/usr/local/bin/node c:\\fake\\wd\\node_modules\\gulp\\gulp.js --gulpfile gulpfile.js'), + 'it should have run gulp' + ); + } else { + assert( + tr.ran('/usr/local/bin/node /fake/wd/node_modules/gulp/gulp.js --gulpfile gulpfile.js'), + 'it should have run gulp' + ); + } + assert(tr.invokedToolCount == 1, 'should have only run gulp'); + assert(tr.stderr.length == 0, 'should not have written to stderr'); + assert(tr.succeeded, 'task should have succeeded'); + + done(); + }); + + it('runs gulp when code coverage is enabled', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0GulpGlobalGoodWithCodeCoverage.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.ran('/usr/local/bin/gulp --gulpfile gulpfile.js'), 'it should have run Gulp'); + assert(tr.invokedToolCount == 3, 'should have run npm, Gulp and istanbul'); + assert(tr.stderr.length == 0, 'should not have written to stderr'); + assert(tr.succeeded, 'task should have succeeded'); + + done(); + }); + + it('runs a gulpFile when publishJUnitTestResults is false', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0PublishJUnitTestResultsFalse.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.ran('/usr/local/bin/gulp --gulpfile gulpfile.js'), 'it should have run Gulp'); + assert(tr.invokedToolCount == 1, 'should have only run Gulp'); + assert(tr.stderr.length == 0, 'should not have written to stderr'); + assert(tr.succeeded, 'task should have succeeded'); + + done(); + }); + + it('fails if gulpFile not set', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0GulpFileNotSet.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.stdOutContained('Input required: gulpFile'), 'Should have printed: Input required: gulpFile'); + assert(tr.invokedToolCount == 0, 'should exit before running Gulp'); + assert(tr.failed, 'should have failed'); + + done(); + }); + + it('fails if cwd not set', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0CwdNotSet.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.stdOutContained('Input required: cwd'), 'Should have printed: Input required: cwd'); + assert(tr.invokedToolCount == 0, 'should exit before running Gulp'); + assert(tr.failed, 'should have failed'); + + done(); + }); + + it('fails if gulpjs not set', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0GulpjsNotSet.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.stdOutContained('Input required: gulpjs'), 'Should have printed: Input required: gulpjs'); + assert(tr.invokedToolCount == 0, 'should exit before running Gulp'); + assert(tr.failed, 'should have failed'); + + done(); + }); + + it('fails if gulpFile not found', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0NoGulpFile.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.stdOutContained('Not found gulpfile.js'), 'Should have printed: Not found gulpfile.js'); + assert(tr.invokedToolCount == 0, 'should exit before running Gulp'); + assert(tr.failed, 'should have failed'); + + done(); + }); + + it('fails if gulp no exist globally and locally', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0NoGulp.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.stdOutContained('loc_mock_GulpNotInstalled'), 'Should have printed: loc_mock_GulpNotInstalled'); + assert(tr.failed, 'should have failed'); + + done(); + }); + + it('fails if npm fails', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0NpmFails.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.stdOutContained('loc_mock_NpmFailed'), 'Should have printed: loc_mock_NpmFailed'); + assert(tr.invokedToolCount == 2, 'should exit before running Gulp'); + assert(tr.failed, 'should have failed'); + + done(); + }); + + it('fails if gulp fails', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0GulpFails.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.ran('/usr/local/bin/gulp --gulpfile gulpfile.js'), 'it should have run gulp'); + assert(tr.stdOutContained('loc_mock_GulpFailed'), 'Should have printed: loc_mock_GulpFailed'); + assert(tr.invokedToolCount == 1, 'should have run npm and gulp'); + assert(tr.failed, 'should have failed'); + + done(); + }); + + it('fails if istanbul fails', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0IstanbulFails.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.ran('/usr/local/bin/gulp --gulpfile gulpfile.js'), 'it should have run gulp'); + assert(tr.stdOutContained('loc_mock_IstanbulFailed'), 'Should have printed: loc_mock_IstanbulFailed'); + assert(tr.invokedToolCount == 3, 'should have run npm, gulp and istanbul'); + assert(tr.failed, 'should have failed'); + + done(); + }); + + it('fails when test result files input is not provided', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0TestResultFilesNotSet.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.stdOutContained('Input required: testResultsFiles'), 'Should have printed: Input required: testResultsFiles'); + assert(tr.invokedToolCount == 0, 'should exit before running Gulp'); + assert(tr.failed, 'should have failed'); + + done(); + }); + + it('gives warning and runs when test result files input does not match any file', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0TestResultFilesDoesNotMatchAnyFile.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.ran('/usr/local/bin/gulp --gulpfile gulpfile.js'), 'it should have run gulp'); + assert(tr.invokedToolCount == 1, 'should run completely'); + assert( + tr.stdout.search('No pattern found in testResultsFiles parameter') >= 0, + 'should give a warning for test file pattern not matched.' + ); + assert(tr.succeeded, 'task should have succeeded'); + + done(); + }); + + it('fails when test source files input is not provided for coverage', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0NoTestSourceFiles.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.stdOutContained('Input required: testFiles'), 'Should have printed: Input required: testFiles'); + assert(tr.invokedToolCount == 0, 'should exit before running Gulp'); + assert(tr.failed, 'should have failed'); + + done(); + }); + + it('fails when test source files input does not match any file', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0InvalidTestSource.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.stdOutContained('loc_mock_IstanbulFaile'), 'Should have printed: loc_mock_IstanbulFaile'); + assert(tr.invokedToolCount == 3, 'should exit while running istanbul'); + assert(tr.failed, 'should have failed'); + + done(); + }); +}); diff --git a/_generated/GulpV0_Node20/Tests/L0CwdNotSet.ts b/_generated/GulpV0_Node20/Tests/L0CwdNotSet.ts new file mode 100644 index 000000000000..e804d2031ac1 --- /dev/null +++ b/_generated/GulpV0_Node20/Tests/L0CwdNotSet.ts @@ -0,0 +1,60 @@ +import ma = require("azure-pipelines-task-lib/mock-answer"); +import tmrm = require("azure-pipelines-task-lib/mock-run"); +import path = require("path"); + +let taskPath = path.join(__dirname, "..", "gulptask.js"); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput("gulpFile", "gulpfile.js"); +tr.setInput("gulpjs", "node_modules/gulp/gulp.js"); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "gulp": "/usr/local/bin/gulp", + "npm": "/usr/local/bin/npm", + "node": "/usr/local/bin/node", + "istanbulWin": "/usr/local/bin/istanbul", + "istanbul": "/usr/local/bin/node_modules/istanbul/lib/cli.js", + }, + "exec": { + "/usr/local/bin/gulp --gulpfile gulpfile.js": { + "code": 0, + "stdout": "gulp output here", + }, + "/usr/local/bin/npm install istanbul": { + "code": 0, + "stdout": "npm output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i ./**/build/src/*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 0, + "stdout": "istanbul output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i .\\**\\build\\src\\*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 0, + "stdout": "istanbul output here", + }, + }, + "checkPath": { + "/usr/local/bin/gulp": true, + "/usr/local/bin/npm": true, + "/usr/local/bin/node": true, + "/usr/local/bin/istanbul": true, + "/usr/local/bin/node_modules/istanbul/lib/cli.js": true, + "gulpfile.js": true, + "**/build/test/*.js": true, + }, + "exist": { + "/usr/local/bin/gulp": true, + }, + "match": { + "**/TEST-*.xml": ["/user/build/fun/test-123.xml"], + "**/*.js": ["/test/test.js"], + }, + "getVariable": { + "System.DefaultWorkingDirectory": "/user/build", + }, +}; +tr.setAnswers(a); + +tr.run(); diff --git a/_generated/GulpV0_Node20/Tests/L0GulpFails.ts b/_generated/GulpV0_Node20/Tests/L0GulpFails.ts new file mode 100644 index 000000000000..322b131d9d60 --- /dev/null +++ b/_generated/GulpV0_Node20/Tests/L0GulpFails.ts @@ -0,0 +1,61 @@ +import ma = require("azure-pipelines-task-lib/mock-answer"); +import tmrm = require("azure-pipelines-task-lib/mock-run"); +import path = require("path"); +import os = require("os"); + +let taskPath = path.join(__dirname, "..", "gulptask.js"); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +if (os.type().match(/^Win/)) { + tr.setInput("cwd", "c:/fake/wd"); +} else { + tr.setInput("cwd", "/fake/wd"); +} + +tr.setInput("gulpFile", "gulpfile.js"); +tr.setInput("publishJUnitResults", "true"); +tr.setInput("testResultsFiles", "**/build/test-results/TEST-*.xml"); +tr.setInput("enableCodeCoverage", "false"); +tr.setInput("gulpjs", "node_modules/gulp/gulp.js"); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "gulp": "/usr/local/bin/gulp", + "npm": "/usr/local/bin/npm", + "node": "/usr/local/bin/node", + "istanbulWin": "/usr/local/bin/istanbul", + "istanbul": "/usr/local/bin/node_modules/istanbul/lib/cli.js", + }, + "exec": { + "/usr/local/bin/gulp --gulpfile gulpfile.js": { + "code": 1, + "stdout": "gulp output here", + "stderr": "gulp failed with this output", + }, + "/usr/local/bin/npm install istanbul": { + "code": 0, + "stdout": "npm output here", + }, + }, + "checkPath": { + "/usr/local/bin/gulp": true, + "/usr/local/bin/npm": true, + "/usr/local/bin/node": true, + "/usr/local/bin/istanbul": true, + "/usr/local/bin/node_modules/istanbul/lib/cli.js": true, + "gulpfile.js": true, + }, + "exist": { + "/usr/local/bin/gulp": true, + }, + "find": { + "/user/build": ["/user/build/fun/test-123.xml"], + }, + "match": { + "**/TEST-*.xml": ["/user/build/fun/test-123.xml"], + }, +}; +tr.setAnswers(a); + +tr.run(); diff --git a/_generated/GulpV0_Node20/Tests/L0GulpFileNotSet.ts b/_generated/GulpV0_Node20/Tests/L0GulpFileNotSet.ts new file mode 100644 index 000000000000..72b5b64c15e9 --- /dev/null +++ b/_generated/GulpV0_Node20/Tests/L0GulpFileNotSet.ts @@ -0,0 +1,66 @@ +import ma = require("azure-pipelines-task-lib/mock-answer"); +import tmrm = require("azure-pipelines-task-lib/mock-run"); +import path = require("path"); +import os = require("os"); + +let taskPath = path.join(__dirname, "..", "gulptask.js"); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +if (os.type().match(/^Win/)) { + tr.setInput("cwd", "c:/fake/wd"); +} else { + tr.setInput("cwd", "/fake/wd"); +} + +tr.setInput("gulpjs", "node_modules/gulp/gulp.js"); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "gulp": "/usr/local/bin/gulp", + "npm": "/usr/local/bin/npm", + "node": "/usr/local/bin/node", + "istanbulWin": "/usr/local/bin/istanbul", + "istanbul": "/usr/local/bin/node_modules/istanbul/lib/cli.js", + }, + "exec": { + "/usr/local/bin/gulp --gulpfile gulpfile.js": { + "code": 0, + "stdout": "gulp output here", + }, + "/usr/local/bin/npm install istanbul": { + "code": 0, + "stdout": "npm output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i ./**/build/src/*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 0, + "stdout": "istanbul output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i .\\**\\build\\src\\*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 0, + "stdout": "istanbul output here", + }, + }, + "checkPath": { + "/usr/local/bin/gulp": true, + "/usr/local/bin/npm": true, + "/usr/local/bin/node": true, + "/usr/local/bin/istanbul": true, + "/usr/local/bin/node_modules/istanbul/lib/cli.js": true, + "gulpfile.js": true, + "**/build/test/*.js": true, + }, + "exist": { + "/usr/local/bin/gulp": true, + }, + "match": { + "**/TEST-*.xml": ["/user/build/fun/test-123.xml"], + "**/*.js": ["/test/test.js"], + }, + "getVariable": { + "System.DefaultWorkingDirectory": "/user/build", + }, +}; +tr.setAnswers(a); + +tr.run(); diff --git a/_generated/GulpV0_Node20/Tests/L0GulpGlobalGood.ts b/_generated/GulpV0_Node20/Tests/L0GulpGlobalGood.ts new file mode 100644 index 000000000000..5d700ee98ee0 --- /dev/null +++ b/_generated/GulpV0_Node20/Tests/L0GulpGlobalGood.ts @@ -0,0 +1,72 @@ +import ma = require("azure-pipelines-task-lib/mock-answer"); +import tmrm = require("azure-pipelines-task-lib/mock-run"); +import path = require("path"); +import os = require("os"); + +let taskPath = path.join(__dirname, "..", "gulptask.js"); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +if (os.type().match(/^Win/)) { + tr.setInput("cwd", "c:/fake/wd"); +} else { + tr.setInput("cwd", "/fake/wd"); +} + +tr.setInput("gulpFile", "gulpfile.js"); +tr.setInput("publishJUnitResults", "true"); +tr.setInput("testResultsFiles", "**/build/test-results/TEST-*.xml"); +tr.setInput("enableCodeCoverage", "false"); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "gulp": "/usr/local/bin/gulp", + "npm": "/usr/local/bin/npm", + "node": "/usr/local/bin/node", + "istanbulWin": "/usr/local/bin/istanbul", + "istanbul": "/usr/local/bin/node_modules/istanbul/lib/cli.js", + }, + "exec": { + "/usr/local/bin/gulp --gulpfile gulpfile.js": { + "code": 0, + "stdout": "gulp output here", + }, + "/usr/local/bin/npm install istanbul": { + "code": 0, + "stdout": "npm output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i ./**/build/src/*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 0, + "stdout": "istanbul output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i .\\**\\build\\src\\*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 0, + "stdout": "istanbul output here", + }, + }, + "checkPath": { + "/usr/local/bin/gulp": true, + "/usr/local/bin/npm": true, + "/usr/local/bin/node": true, + "/usr/local/bin/istanbul": true, + "/usr/local/bin/node_modules/istanbul/lib/cli.js": true, + "gulpfile.js": true, + "**/build/test/*.js": true, + }, + "exist": { + "/usr/local/bin/gulp": true, + }, + "match": { + "**/TEST-*.xml": ["/user/build/fun/test-123.xml"], + "**/*.js": ["/test/test.js"], + }, + "getVariable": { + "System.DefaultWorkingDirectory": "/user/build", + }, + "find": { + "/user/build": ["/user/build/fun/test-123.xml"], + } +}; +tr.setAnswers(a); + +tr.run(); diff --git a/_generated/GulpV0_Node20/Tests/L0GulpGlobalGoodWithCodeCoverage.ts b/_generated/GulpV0_Node20/Tests/L0GulpGlobalGoodWithCodeCoverage.ts new file mode 100644 index 000000000000..23953fc00f5b --- /dev/null +++ b/_generated/GulpV0_Node20/Tests/L0GulpGlobalGoodWithCodeCoverage.ts @@ -0,0 +1,76 @@ +import ma = require("azure-pipelines-task-lib/mock-answer"); +import tmrm = require("azure-pipelines-task-lib/mock-run"); +import path = require("path"); +import os = require("os"); + +let taskPath = path.join(__dirname, "..", "gulptask.js"); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +if (os.type().match(/^Win/)) { + tr.setInput("cwd", "c:/fake/wd"); +} else { + tr.setInput("cwd", "/fake/wd"); +} + +tr.setInput("gulpFile", "gulpfile.js"); +tr.setInput("publishJUnitResults", "true"); +tr.setInput("testResultsFiles", "**/build/test-results/TEST-*.xml"); +tr.setInput("enableCodeCoverage", "true"); +tr.setInput("testFramework", "Mocha"); +tr.setInput("srcFiles", "**/build/src/*.js"); +tr.setInput("testFiles", "**/build/test/*.js"); +tr.setInput("gulpjs", "node_modules/gulp/gulp.js"); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "gulp": "/usr/local/bin/gulp", + "npm": "/usr/local/bin/npm", + "node": "/usr/local/bin/node", + "istanbulWin": "/usr/local/bin/istanbul", + "istanbul": "/usr/local/bin/node_modules/istanbul/lib/cli.js", + }, + "exec": { + "/usr/local/bin/gulp --gulpfile gulpfile.js": { + "code": 0, + "stdout": "gulp output here", + }, + "/usr/local/bin/npm install istanbul": { + "code": 0, + "stdout": "npm output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i ./**/build/src/*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 0, + "stdout": "istanbul output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i .\\**\\build\\src\\*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 0, + "stdout": "istanbul output here", + }, + }, + "checkPath": { + "/usr/local/bin/gulp": true, + "/usr/local/bin/npm": true, + "/usr/local/bin/node": true, + "/usr/local/bin/istanbul": true, + "/usr/local/bin/node_modules/istanbul/lib/cli.js": true, + "gulpfile.js": true, + "**/build/test/*.js": true, + }, + "exist": { + "/usr/local/bin/gulp": true, + }, + "match": { + "**/TEST-*.xml": ["/user/build/fun/test-123.xml"], + "**/*.js": ["/test/test.js"], + }, + "find": { + "/user/build": ["/user/build/fun/test-123.xml"], + }, + "getVariable": { + "System.DefaultWorkingDirectory": "/user/build", + }, +}; +tr.setAnswers(a); + +tr.run(); diff --git a/_generated/GulpV0_Node20/Tests/L0GulpLocalGood.ts b/_generated/GulpV0_Node20/Tests/L0GulpLocalGood.ts new file mode 100644 index 000000000000..78813ff8a8a4 --- /dev/null +++ b/_generated/GulpV0_Node20/Tests/L0GulpLocalGood.ts @@ -0,0 +1,59 @@ +import ma = require("azure-pipelines-task-lib/mock-answer"); +import tmrm = require("azure-pipelines-task-lib/mock-run"); +import path = require("path"); +import os = require("os"); + +let taskPath = path.join(__dirname, "..", "gulptask.js"); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +if (os.type().match(/^Win/)) { + tr.setInput("cwd", "c:/fake/wd"); +} else { + tr.setInput("cwd", "/fake/wd"); +} + +tr.setInput("gulpFile", "gulpfile.js"); +tr.setInput("publishJUnitResults", "true"); +tr.setInput("testResultsFiles", "**/build/test-results/TEST-*.xml"); +tr.setInput("enableCodeCoverage", "false"); +tr.setInput("gulpjs", "node_modules/gulp/gulp.js"); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "npm": "/usr/local/bin/npm", + "node": "/usr/local/bin/node", + "istanbulWin": "/usr/local/bin/istanbul", + "istanbul": "/usr/local/bin/node_modules/istanbul/lib/cli.js", + }, + "exec": { + "/usr/local/bin/node /fake/wd/node_modules/gulp/gulp.js --gulpfile gulpfile.js": { + "code": 0, + "stdout": "gulp output here", + }, + "/usr/local/bin/node c:\\fake\\wd\\node_modules\\gulp\\gulp.js --gulpfile gulpfile.js": { + "code": 0, + "stdout": "gulp output here", + }, + }, + "checkPath": { + "/usr/local/bin/node": true, + "/usr/local/bin/npm": true, + "/usr/local/bin/istanbul": true, + "/usr/local/bin/node_modules/istanbul/lib/cli.js": true, + "gulpfile.js": true, + }, + "exist": { + "/fake/wd/node_modules/gulp/gulp.js": true, + "c:\\fake\\wd\\node_modules\\gulp\\gulp.js": true, + }, + "match": { + "**/TEST-*.xml": ["/user/build/fun/test-123.xml"], + }, + "find": { + "/user/build": ["/user/build/fun/test-123.xml"], + } +}; +tr.setAnswers(a); + +tr.run(); diff --git a/_generated/GulpV0_Node20/Tests/L0GulpjsNotSet.ts b/_generated/GulpV0_Node20/Tests/L0GulpjsNotSet.ts new file mode 100644 index 000000000000..a3b041745ec5 --- /dev/null +++ b/_generated/GulpV0_Node20/Tests/L0GulpjsNotSet.ts @@ -0,0 +1,52 @@ +import ma = require("azure-pipelines-task-lib/mock-answer"); +import tmrm = require("azure-pipelines-task-lib/mock-run"); +import path = require("path"); +import os = require("os"); + +let taskPath = path.join(__dirname, "..", "gulptask.js"); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +if (os.type().match(/^Win/)) { + tr.setInput("cwd", "c:/fake/wd"); +} else { + tr.setInput("cwd", "/fake/wd"); +} + +tr.setInput("gulpFile", "gulpfile.js"); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "npm": "/usr/local/bin/npm", + "node": "/usr/local/bin/node", + "istanbulWin": "/usr/local/bin/istanbul", + "istanbul": "/usr/local/bin/node_modules/istanbul/lib/cli.js", + }, + "exec": { + "/usr/local/bin/node /fake/wd/node_modules/gulp/gulp.js --gulpfile gulpfile.js": { + "code": 0, + "stdout": "gulp output here", + }, + "/usr/local/bin/node c:\\fake\\wd\\node_modules\\gulp\\gulp.js --gulpfile gulpfile.js": { + "code": 0, + "stdout": "gulp output here", + }, + }, + "checkPath": { + "/usr/local/bin/node": true, + "/usr/local/bin/npm": true, + "/usr/local/bin/istanbul": true, + "/usr/local/bin/node_modules/istanbul/lib/cli.js": true, + "gulpfile.js": true, + }, + "exist": { + "/fake/wd/node_modules/gulp/gulp.js": true, + "c:\\fake\\wd\\node_modules\\gulp\\gulp.js": true, + }, + "match": { + "**/TEST-*.xml": ["/user/build/fun/test-123.xml"], + }, +}; +tr.setAnswers(a); + +tr.run(); diff --git a/_generated/GulpV0_Node20/Tests/L0InvalidTestSource.ts b/_generated/GulpV0_Node20/Tests/L0InvalidTestSource.ts new file mode 100644 index 000000000000..df3ebfb2c9f7 --- /dev/null +++ b/_generated/GulpV0_Node20/Tests/L0InvalidTestSource.ts @@ -0,0 +1,78 @@ +import ma = require("azure-pipelines-task-lib/mock-answer"); +import tmrm = require("azure-pipelines-task-lib/mock-run"); +import path = require("path"); +import os = require("os"); + +let taskPath = path.join(__dirname, "..", "gulptask.js"); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +if (os.type().match(/^Win/)) { + tr.setInput("cwd", "c:/fake/wd"); +} else { + tr.setInput("cwd", "/fake/wd"); +} + +tr.setInput("gulpFile", "gulpfile.js"); +tr.setInput("publishJUnitResults", "true"); +tr.setInput("testResultsFiles", "**/build/test-results/TEST-*.xml"); +tr.setInput("enableCodeCoverage", "true"); +tr.setInput("testFramework", "Mocha"); +tr.setInput("srcFiles", "**/build/src/*.js"); +tr.setInput("testFiles", "/invalid/input"); +tr.setInput("gulpjs", "node_modules/gulp/gulp.js"); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "gulp": "/usr/local/bin/gulp", + "npm": "/usr/local/bin/npm", + "node": "/usr/local/bin/node", + "istanbulWin": "/usr/local/bin/istanbul", + "istanbul": "/usr/local/bin/node_modules/istanbul/lib/cli.js", + }, + "exec": { + "/usr/local/bin/gulp --gulpfile gulpfile.js": { + "code": 0, + "stdout": "gulp output here", + }, + "/usr/local/bin/npm install istanbul": { + "code": 0, + "stdout": "npm output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i ./**/build/src/*.js ./node_modules/mocha/bin/_mocha /invalid/input": { + "code": 1, + "stdout": "istanbul output here", + "stderr": "istanbul failed with this output", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i .\\**\\build\\src\\*.js ./node_modules/mocha/bin/_mocha /invalid/input": { + "code": 1, + "stdout": "istanbul output here", + "stderr": "istanbul failed with this output", + }, + }, + "checkPath": { + "/usr/local/bin/gulp": true, + "/usr/local/bin/npm": true, + "/usr/local/bin/node": true, + "/usr/local/bin/istanbul": true, + "/usr/local/bin/node_modules/istanbul/lib/cli.js": true, + "gulpfile.js": true, + "**/build/test/*.js": true, + }, + "exist": { + "/usr/local/bin/gulp": true, + }, + "match": { + "**/TEST-*.xml": ["/user/build/fun/test-123.xml"], + "**/*.js": ["/test/test.js"], + }, + "find": { + "/user/build": ["/user/build/fun/test-123.xml"], + }, + "getVariable": { + "System.DefaultWorkingDirectory": "/user/build", + }, +}; +tr.setAnswers(a); + +tr.run(); diff --git a/_generated/GulpV0_Node20/Tests/L0IstanbulFails.ts b/_generated/GulpV0_Node20/Tests/L0IstanbulFails.ts new file mode 100644 index 000000000000..bbc09004c99a --- /dev/null +++ b/_generated/GulpV0_Node20/Tests/L0IstanbulFails.ts @@ -0,0 +1,78 @@ +import ma = require("azure-pipelines-task-lib/mock-answer"); +import tmrm = require("azure-pipelines-task-lib/mock-run"); +import path = require("path"); +import os = require("os"); + +let taskPath = path.join(__dirname, "..", "gulptask.js"); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +if (os.type().match(/^Win/)) { + tr.setInput("cwd", "c:/fake/wd"); +} else { + tr.setInput("cwd", "/fake/wd"); +} + +tr.setInput("gulpFile", "gulpfile.js"); +tr.setInput("publishJUnitResults", "true"); +tr.setInput("testResultsFiles", "**/build/test-results/TEST-*.xml"); +tr.setInput("enableCodeCoverage", "true"); +tr.setInput("testFramework", "Mocha"); +tr.setInput("srcFiles", "**/build/src/*.js"); +tr.setInput("testFiles", "**/build/test/*.js"); +tr.setInput("gulpjs", "node_modules/gulp/gulp.js"); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "gulp": "/usr/local/bin/gulp", + "npm": "/usr/local/bin/npm", + "node": "/usr/local/bin/node", + "istanbulWin": "/usr/local/bin/istanbul", + "istanbul": "/usr/local/bin/node_modules/istanbul/lib/cli.js", + }, + "exec": { + "/usr/local/bin/gulp --gulpfile gulpfile.js": { + "code": 0, + "stdout": "gulp output here", + }, + "/usr/local/bin/npm install istanbul": { + "code": 0, + "stdout": "npm output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i ./**/build/src/*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 1, + "stdout": "istanbul output here", + "stderr": "istanbul failed with this output", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i .\\**\\build\\src\\*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 1, + "stdout": "istanbul output here", + "stderr": "istanbul failed with this output", + }, + }, + "checkPath": { + "/usr/local/bin/gulp": true, + "/usr/local/bin/npm": true, + "/usr/local/bin/node": true, + "/usr/local/bin/istanbul": true, + "/usr/local/bin/node_modules/istanbul/lib/cli.js": true, + "gulpfile.js": true, + "**/build/test/*.js": true, + }, + "exist": { + "/usr/local/bin/gulp": true, + }, + "match": { + "**/TEST-*.xml": ["/user/build/fun/test-123.xml"], + "**/*.js": ["/test/test.js"], + }, + "find": { + "/user/build": ["/user/build/fun/test-123.xml"], + }, + "getVariable": { + "System.DefaultWorkingDirectory": "/user/build", + }, +}; +tr.setAnswers(a); + +tr.run(); diff --git a/_generated/GulpV0_Node20/Tests/L0NoGulp.ts b/_generated/GulpV0_Node20/Tests/L0NoGulp.ts new file mode 100644 index 000000000000..1c2e8b62b4a7 --- /dev/null +++ b/_generated/GulpV0_Node20/Tests/L0NoGulp.ts @@ -0,0 +1,42 @@ +import ma = require("azure-pipelines-task-lib/mock-answer"); +import tmrm = require("azure-pipelines-task-lib/mock-run"); +import path = require("path"); +import os = require("os"); + +let taskPath = path.join(__dirname, "..", "gulptask.js"); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +if (os.type().match(/^Win/)) { + tr.setInput("cwd", "c:/fake/wd"); +} else { + tr.setInput("cwd", "/fake/wd"); +} + +tr.setInput("gulpFile", "gulpfile.js"); +tr.setInput("publishJUnitResults", "true"); +tr.setInput("testResultsFiles", "**/build/test-results/TEST-*.xml"); +tr.setInput("enableCodeCoverage", "false"); +tr.setInput("gulpjs", "node_modules/gulp/gulp.js"); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "npm": "/usr/local/bin/npm", + "node": "/usr/local/bin/node", + "istanbulWin": "/usr/local/bin/istanbul", + "istanbul": "/usr/local/bin/node_modules/istanbul/lib/cli.js", + }, + "checkPath": { + "/usr/local/bin/npm": true, + "/usr/local/bin/node": true, + "/usr/local/bin/istanbul": true, + "/usr/local/bin/node_modules/istanbul/lib/cli.js": true, + "gulpfile.js": true, + }, + "match": { + "**/TEST-*.xml": ["/user/build/fun/test-123.xml"], + }, +}; +tr.setAnswers(a); + +tr.run(); diff --git a/_generated/GulpV0_Node20/Tests/L0NoGulpFile.ts b/_generated/GulpV0_Node20/Tests/L0NoGulpFile.ts new file mode 100644 index 000000000000..c454170f153e --- /dev/null +++ b/_generated/GulpV0_Node20/Tests/L0NoGulpFile.ts @@ -0,0 +1,26 @@ +import ma = require("azure-pipelines-task-lib/mock-answer"); +import tmrm = require("azure-pipelines-task-lib/mock-run"); +import path = require("path"); +import os = require("os"); + +let taskPath = path.join(__dirname, "..", "gulptask.js"); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +if (os.type().match(/^Win/)) { + tr.setInput("cwd", "c:/fake/wd"); +} else { + tr.setInput("cwd", "/fake/wd"); +} + +tr.setInput("gulpFile", "gulpfile.js"); +tr.setInput("gulpjs", "node_modules/gulp/gulp.js"); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "checkPath": { + "gulpfile.js": false, + }, +}; +tr.setAnswers(a); + +tr.run(); diff --git a/_generated/GulpV0_Node20/Tests/L0NoTestSourceFiles.ts b/_generated/GulpV0_Node20/Tests/L0NoTestSourceFiles.ts new file mode 100644 index 000000000000..c7f7a391ef2b --- /dev/null +++ b/_generated/GulpV0_Node20/Tests/L0NoTestSourceFiles.ts @@ -0,0 +1,72 @@ +import ma = require("azure-pipelines-task-lib/mock-answer"); +import tmrm = require("azure-pipelines-task-lib/mock-run"); +import path = require("path"); +import os = require("os"); + +let taskPath = path.join(__dirname, "..", "gulptask.js"); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +if (os.type().match(/^Win/)) { + tr.setInput("cwd", "c:/fake/wd"); +} else { + tr.setInput("cwd", "/fake/wd"); +} + +tr.setInput("gulpFile", "gulpfile.js"); +tr.setInput("publishJUnitResults", "true"); +tr.setInput("testResultsFiles", "**/build/test-results/TEST-*.xml"); +tr.setInput("enableCodeCoverage", "true"); +tr.setInput("testFramework", "Mocha"); +tr.setInput("srcFiles", "**/build/src/*.js"); +tr.setInput("gulpjs", "node_modules/gulp/gulp.js"); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "gulp": "/usr/local/bin/gulp", + "npm": "/usr/local/bin/npm", + "node": "/usr/local/bin/node", + "istanbulWin": "/usr/local/bin/istanbul", + "istanbul": "/usr/local/bin/node_modules/istanbul/lib/cli.js", + }, + "exec": { + "/usr/local/bin/gulp --gulpfile gulpfile.js": { + "code": 0, + "stdout": "gulp output here", + }, + "/usr/local/bin/npm install istanbul": { + "code": 0, + "stdout": "npm output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i ./**/build/src/*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 0, + "stdout": "istanbul output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i .\\**\\build\\src\\*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 0, + "stdout": "istanbul output here", + }, + }, + "checkPath": { + "/usr/local/bin/gulp": true, + "/usr/local/bin/npm": true, + "/usr/local/bin/node": true, + "/usr/local/bin/istanbul": true, + "/usr/local/bin/node_modules/istanbul/lib/cli.js": true, + "gulpfile.js": true, + "**/build/test/*.js": true, + }, + "exist": { + "/usr/local/bin/gulp": true, + }, + "match": { + "**/TEST-*.xml": ["/user/build/fun/test-123.xml"], + "**/*.js": ["/test/test.js"], + }, + "getVariable": { + "System.DefaultWorkingDirectory": "/user/build", + }, +}; +tr.setAnswers(a); + +tr.run(); diff --git a/_generated/GulpV0_Node20/Tests/L0NpmFails.ts b/_generated/GulpV0_Node20/Tests/L0NpmFails.ts new file mode 100644 index 000000000000..cb620ab155f3 --- /dev/null +++ b/_generated/GulpV0_Node20/Tests/L0NpmFails.ts @@ -0,0 +1,68 @@ +import ma = require("azure-pipelines-task-lib/mock-answer"); +import tmrm = require("azure-pipelines-task-lib/mock-run"); +import path = require("path"); +import os = require("os"); + +let taskPath = path.join(__dirname, "..", "gulptask.js"); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +if (os.type().match(/^Win/)) { + tr.setInput("cwd", "c:/fake/wd"); +} else { + tr.setInput("cwd", "/fake/wd"); +} + +tr.setInput("gulpFile", "gulpfile.js"); +tr.setInput("publishJUnitResults", "true"); +tr.setInput("testResultsFiles", "**/build/test-results/TEST-*.xml"); +tr.setInput("enableCodeCoverage", "true"); +tr.setInput("testFramework", "Mocha"); +tr.setInput("srcFiles", "**/build/src/*.js"); +tr.setInput("testFiles", "**/build/test/*.js"); +tr.setInput("gulpjs", "node_modules/gulp/gulp.js"); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "gulp": "/usr/local/bin/gulp", + "npm": "/usr/local/bin/npm", + "node": "/usr/local/bin/node", + "istanbulWin": "/usr/local/bin/istanbul", + "istanbul": "/usr/local/bin/node_modules/istanbul/lib/cli.js", + }, + "exec": { + "/usr/local/bin/gulp --gulpfile gulpfile.js": { + "code": 0, + "stdout": "gulp output here", + }, + "/usr/local/bin/npm install istanbul": { + "code": 1, + "stdout": "npm output here", + "stderr": "npm failed with this output", + }, + }, + "checkPath": { + "/usr/local/bin/gulp": true, + "/usr/local/bin/npm": true, + "/usr/local/bin/node": true, + "/usr/local/bin/istanbul": true, + "/usr/local/bin/node_modules/istanbul/lib/cli.js": true, + "gulpfile.js": true, + }, + "exist": { + "/usr/local/bin/gulp": true, + }, + "match": { + "**/TEST-*.xml": ["/user/build/fun/test-123.xml"], + "**/*.js": ["/test/test.js"], + }, + "find": { + "/user/build": ["/user/build/fun/test-123.xml"], + }, + "getVariable": { + "System.DefaultWorkingDirectory": "/user/build", + }, +}; +tr.setAnswers(a); + +tr.run(); diff --git a/_generated/GulpV0_Node20/Tests/L0PublishJUnitTestResultsFalse.ts b/_generated/GulpV0_Node20/Tests/L0PublishJUnitTestResultsFalse.ts new file mode 100644 index 000000000000..747c1730fdb7 --- /dev/null +++ b/_generated/GulpV0_Node20/Tests/L0PublishJUnitTestResultsFalse.ts @@ -0,0 +1,69 @@ +import ma = require("azure-pipelines-task-lib/mock-answer"); +import tmrm = require("azure-pipelines-task-lib/mock-run"); +import path = require("path"); +import os = require("os"); + +let taskPath = path.join(__dirname, "..", "gulptask.js"); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +if (os.type().match(/^Win/)) { + tr.setInput("cwd", "c:/fake/wd"); +} else { + tr.setInput("cwd", "/fake/wd"); +} + +tr.setInput("gulpFile", "gulpfile.js"); +tr.setInput("publishJUnitResults", "false"); +tr.setInput("enableCodeCoverage", "false"); +tr.setInput("gulpjs", "node_modules/gulp/gulp.js"); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "gulp": "/usr/local/bin/gulp", + "npm": "/usr/local/bin/npm", + "node": "/usr/local/bin/node", + "istanbulWin": "/usr/local/bin/istanbul", + "istanbul": "/usr/local/bin/node_modules/istanbul/lib/cli.js", + }, + "exec": { + "/usr/local/bin/gulp --gulpfile gulpfile.js": { + "code": 0, + "stdout": "gulp output here", + }, + "/usr/local/bin/npm install istanbul": { + "code": 0, + "stdout": "npm output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i ./**/build/src/*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 0, + "stdout": "istanbul output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i .\\**\\build\\src\\*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 0, + "stdout": "istanbul output here", + }, + }, + "checkPath": { + "/usr/local/bin/gulp": true, + "/usr/local/bin/npm": true, + "/usr/local/bin/node": true, + "/usr/local/bin/istanbul": true, + "/usr/local/bin/node_modules/istanbul/lib/cli.js": true, + "gulpfile.js": true, + "**/build/test/*.js": true, + }, + "exist": { + "/usr/local/bin/gulp": true, + }, + "match": { + "**/TEST-*.xml": ["/user/build/fun/test-123.xml"], + "**/*.js": ["/test/test.js"], + }, + "getVariable": { + "System.DefaultWorkingDirectory": "/user/build", + }, +}; +tr.setAnswers(a); + +tr.run(); diff --git a/_generated/GulpV0_Node20/Tests/L0TestResultFilesDoesNotMatchAnyFile.ts b/_generated/GulpV0_Node20/Tests/L0TestResultFilesDoesNotMatchAnyFile.ts new file mode 100644 index 000000000000..c6a9d7bdcbe6 --- /dev/null +++ b/_generated/GulpV0_Node20/Tests/L0TestResultFilesDoesNotMatchAnyFile.ts @@ -0,0 +1,70 @@ +import ma = require("azure-pipelines-task-lib/mock-answer"); +import tmrm = require("azure-pipelines-task-lib/mock-run"); +import path = require("path"); +import os = require("os"); + +let taskPath = path.join(__dirname, "..", "gulptask.js"); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +if (os.type().match(/^Win/)) { + tr.setInput("cwd", "c:/fake/wd"); +} else { + tr.setInput("cwd", "/fake/wd"); +} + +tr.setInput("gulpFile", "gulpfile.js"); +tr.setInput("publishJUnitResults", "true"); +tr.setInput("testResultsFiles", "/invalid/input"); +tr.setInput("enableCodeCoverage", "false"); +tr.setInput("gulpjs", "node_modules/gulp/gulp.js"); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "gulp": "/usr/local/bin/gulp", + "npm": "/usr/local/bin/npm", + "node": "/usr/local/bin/node", + "istanbulWin": "/usr/local/bin/istanbul", + "istanbul": "/usr/local/bin/node_modules/istanbul/lib/cli.js", + }, + "exec": { + "/usr/local/bin/gulp --gulpfile gulpfile.js": { + "code": 0, + "stdout": "gulp output here", + }, + "/usr/local/bin/npm install istanbul": { + "code": 0, + "stdout": "npm output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i ./**/build/src/*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 0, + "stdout": "istanbul output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i .\\**\\build\\src\\*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 0, + "stdout": "istanbul output here", + }, + }, + "checkPath": { + "/usr/local/bin/gulp": true, + "/usr/local/bin/npm": true, + "/usr/local/bin/node": true, + "/usr/local/bin/istanbul": true, + "/usr/local/bin/node_modules/istanbul/lib/cli.js": true, + "gulpfile.js": true, + "**/build/test/*.js": true, + }, + "exist": { + "/usr/local/bin/gulp": true, + }, + "match": { + "**/TEST-*.xml": ["/user/build/fun/test-123.xml"], + "**/*.js": ["/test/test.js"], + }, + "getVariable": { + "System.DefaultWorkingDirectory": "/user/build", + }, +}; +tr.setAnswers(a); + +tr.run(); diff --git a/_generated/GulpV0_Node20/Tests/L0TestResultFilesNotSet.ts b/_generated/GulpV0_Node20/Tests/L0TestResultFilesNotSet.ts new file mode 100644 index 000000000000..fdb5d458ac4b --- /dev/null +++ b/_generated/GulpV0_Node20/Tests/L0TestResultFilesNotSet.ts @@ -0,0 +1,69 @@ +import ma = require("azure-pipelines-task-lib/mock-answer"); +import tmrm = require("azure-pipelines-task-lib/mock-run"); +import path = require("path"); +import os = require("os"); + +let taskPath = path.join(__dirname, "..", "gulptask.js"); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +if (os.type().match(/^Win/)) { + tr.setInput("cwd", "c:/fake/wd"); +} else { + tr.setInput("cwd", "/fake/wd"); +} + +tr.setInput("gulpFile", "gulpfile.js"); +tr.setInput("publishJUnitResults", "true"); +tr.setInput("enableCodeCoverage", "false"); +tr.setInput("gulpjs", "node_modules/gulp/gulp.js"); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "gulp": "/usr/local/bin/gulp", + "npm": "/usr/local/bin/npm", + "node": "/usr/local/bin/node", + "istanbulWin": "/usr/local/bin/istanbul", + "istanbul": "/usr/local/bin/node_modules/istanbul/lib/cli.js", + }, + "exec": { + "/usr/local/bin/gulp --gulpfile gulpfile.js": { + "code": 0, + "stdout": "gulp output here", + }, + "/usr/local/bin/npm install istanbul": { + "code": 0, + "stdout": "npm output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i ./**/build/src/*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 0, + "stdout": "istanbul output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i .\\**\\build\\src\\*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 0, + "stdout": "istanbul output here", + }, + }, + "checkPath": { + "/usr/local/bin/gulp": true, + "/usr/local/bin/npm": true, + "/usr/local/bin/node": true, + "/usr/local/bin/istanbul": true, + "/usr/local/bin/node_modules/istanbul/lib/cli.js": true, + "gulpfile.js": true, + "**/build/test/*.js": true, + }, + "exist": { + "/usr/local/bin/gulp": true, + }, + "match": { + "**/TEST-*.xml": ["/user/build/fun/test-123.xml"], + "**/*.js": ["/test/test.js"], + }, + "getVariable": { + "System.DefaultWorkingDirectory": "/user/build", + }, +}; +tr.setAnswers(a); + +tr.run(); diff --git a/_generated/GulpV0_Node20/Tests/package-lock.json b/_generated/GulpV0_Node20/Tests/package-lock.json new file mode 100644 index 000000000000..b4c44bb0b819 --- /dev/null +++ b/_generated/GulpV0_Node20/Tests/package-lock.json @@ -0,0 +1,14 @@ +{ + "name": "gulp-tests", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/mocha": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", + "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==", + "dev": true + } + } +} diff --git a/_generated/GulpV0_Node20/Tests/package.json b/_generated/GulpV0_Node20/Tests/package.json new file mode 100644 index 000000000000..baedf0fe682c --- /dev/null +++ b/_generated/GulpV0_Node20/Tests/package.json @@ -0,0 +1,22 @@ +{ + "name": "gulp-tests", + "version": "1.0.0", + "description": "Azure Pipelines Gulp V0 Task Tests", + "main": "L0.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/Microsoft/azure-pipelines-tasks.git" + }, + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Microsoft/azure-pipelines-tasks/issues" + }, + "homepage": "https://github.com/Microsoft/azure-pipelines-tasks#readme", + "devDependencies": { + "@types/mocha": "^5.2.7" + } +} diff --git a/_generated/GulpV0_Node20/gulptask.ts b/_generated/GulpV0_Node20/gulptask.ts new file mode 100644 index 000000000000..c287772b3aae --- /dev/null +++ b/_generated/GulpV0_Node20/gulptask.ts @@ -0,0 +1,118 @@ +import path = require('path'); +import tl = require('azure-pipelines-task-lib/task'); +import minimatch = require('minimatch'); + +tl.setResourcePath(path.join(__dirname, 'task.json')); + +var gulpFile = tl.getPathInput('gulpFile', true, true); +tl.debug('check gulp file :' + gulpFile); +var gulp = tl.which('gulp', false); +var isCodeCoverageEnabled = tl.getBoolInput('enableCodeCoverage'); +var publishJUnitResults = tl.getBoolInput('publishJUnitResults'); +var testResultsFiles = tl.getInput('testResultsFiles', publishJUnitResults); +var cwd = tl.getPathInput('cwd', true, false); +tl.mkdirP(cwd); +tl.cd(cwd); + +tl.debug('check path : ' + gulp); +if (!tl.exist(gulp)) { + tl.debug('not found global installed gulp, try to find gulp locally.'); + var gt = tl.tool(tl.which('node', true)); + var gulpjs = tl.getInput('gulpjs', true); + gulpjs = path.resolve(cwd, gulpjs); + tl.debug('check path : ' + gulpjs); + if (!tl.exist(gulpjs)) { + tl.setResult(tl.TaskResult.Failed, tl.loc('GulpNotInstalled', gulpjs)); + } + gt.arg(gulpjs); +} +else { + var gt = tl.tool(gulp); +} + +if (isCodeCoverageEnabled) { + var npm = tl.tool(tl.which('npm', true)); + npm.line('install istanbul'); + var testFramework = tl.getInput('testFramework', true); + var srcFiles = tl.getInput('srcFiles', false); + var testSrc = tl.getPathInput('testFiles', true, false); + var istanbul = tl.tool(tl.which('node', true)); + istanbul.arg('./node_modules/istanbul/lib/cli.js'); + istanbul.line('cover --report cobertura --report html'); + if (srcFiles) { + istanbul.line('-i .' + path.sep + path.join(srcFiles)); + } + if (testFramework.toLowerCase() == 'jasmine') { + istanbul.line('./node_modules/jasmine/bin/jasmine.js JASMINE_CONFIG_PATH=node_modules/jasmine/lib/examples/jasmine.json'); + } else { + istanbul.arg('./node_modules/mocha/bin/_mocha'); + } + istanbul.arg(testSrc); + var summaryFile = path.join(cwd, 'coverage/cobertura-coverage.xml'); + var reportDirectory = path.join(cwd, 'coverage/'); +} + +// optional - no targets will concat nothing +gt.arg(tl.getDelimitedInput('targets', ' ', false)); +gt.arg(['--gulpfile', gulpFile]); +gt.line(tl.getInput('arguments', false)); +gt.exec().then(function (code) { + publishTestResults(publishJUnitResults, testResultsFiles); + if (isCodeCoverageEnabled) { + npm.exec().then(function () { + istanbul.exec().then(function (code) { + publishCodeCoverage(summaryFile); + tl.setResult(tl.TaskResult.Succeeded, tl.loc('GulpReturnCode', code)); + }).fail(function (err) { + publishCodeCoverage(summaryFile); + tl.debug('taskRunner fail'); + tl.setResult(tl.TaskResult.Failed, tl.loc('IstanbulFailed', err.message)); + }); + }).fail(function (err) { + tl.debug('taskRunner fail'); + tl.setResult(tl.TaskResult.Failed, tl.loc('NpmFailed', err.message)); + }) + } else { + tl.setResult(tl.TaskResult.Succeeded, tl.loc('GulpReturnCode', code)); + } +}).fail(function (err) { + publishTestResults(publishJUnitResults, testResultsFiles); + tl.debug('taskRunner fail'); + tl.setResult(tl.TaskResult.Failed, tl.loc('GulpFailed', err.message)); +}) + +function publishTestResults(publishJUnitResults, testResultsFiles: string) { + if (publishJUnitResults) { + //check for pattern in testResultsFiles + if (testResultsFiles.indexOf('*') >= 0 || testResultsFiles.indexOf('?') >= 0) { + tl.debug('Pattern found in testResultsFiles parameter'); + var buildFolder = tl.getVariable('System.DefaultWorkingDirectory'); + var allFiles = tl.find(buildFolder); + var matchingTestResultsFiles = minimatch.match(allFiles, testResultsFiles, { matchBase: true }); + } + else { + tl.debug('No pattern found in testResultsFiles parameter'); + var matchingTestResultsFiles = [testResultsFiles]; + } + if (!matchingTestResultsFiles || matchingTestResultsFiles.length == 0) { + tl.warning('No test result files matching ' + testResultsFiles + ' were found, so publishing JUnit test results is being skipped.'); + return 0; + } + var tp = new tl.TestPublisher("JUnit"); + try { + tp.publish(matchingTestResultsFiles, 'true', "", "", "", 'true'); + } catch (error) { + tl.warning(error); + } + } +} + +function publishCodeCoverage(summaryFile) { + try { + var ccPublisher = new tl.CodeCoveragePublisher(); + ccPublisher.publish('cobertura', summaryFile, reportDirectory, ""); + } catch (error) { + tl.warning(error); + throw error; + } +} \ No newline at end of file diff --git a/_generated/GulpV0_Node20/icon.png b/_generated/GulpV0_Node20/icon.png new file mode 100644 index 000000000000..10372dbd6051 Binary files /dev/null and b/_generated/GulpV0_Node20/icon.png differ diff --git a/_generated/GulpV0_Node20/icon.svg b/_generated/GulpV0_Node20/icon.svg new file mode 100644 index 000000000000..ab3c0435f0b3 --- /dev/null +++ b/_generated/GulpV0_Node20/icon.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/_generated/GulpV0_Node20/package-lock.json b/_generated/GulpV0_Node20/package-lock.json new file mode 100644 index 000000000000..0e58c91cfea1 --- /dev/null +++ b/_generated/GulpV0_Node20/package-lock.json @@ -0,0 +1,492 @@ +{ + "name": "vsts-gulp-task", + "requires": true, + "lockfileVersion": 1, + "dependencies": { + "@types/concat-stream": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz", + "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==", + "requires": { + "@types/node": "*" + } + }, + "@types/form-data": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", + "integrity": "sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==", + "requires": { + "@types/node": "*" + } + }, + "@types/mocha": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", + "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==" + }, + "@types/node": { + "version": "20.7.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.7.0.tgz", + "integrity": "sha512-zI22/pJW2wUZOVyguFaUL1HABdmSVxpXrzIqkjsHmyUjNhPoWM1CKfvVuXfetHhIok4RY573cqS0mZ1SJEnoTg==" + }, + "@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "azure-pipelines-task-lib": { + "version": "4.0.0-preview", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-4.0.0-preview.tgz", + "integrity": "sha512-BK+VOo42Bec72Wic6Vsm2MaAJezNyF05OYAQS5FuZJM5Z972lZqYpujtSc4BFKUhC3HO+F/Yf4xhAV2tZCzN9Q==", + "requires": { + "minimatch": "3.0.5", + "mockery": "^1.7.0", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "sync-request": "6.1.0", + "uuid": "^3.0.1" + }, + "dependencies": { + "minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "brace-expansion": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", + "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, + "form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-intrinsic": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", + "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + } + }, + "get-port": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", + "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==" + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "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" + }, + "dependencies": { + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "http-basic": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", + "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", + "requires": { + "caseless": "^0.12.0", + "concat-stream": "^1.6.2", + "http-response-object": "^3.0.1", + "parse-cache-control": "^1.0.1" + } + }, + "http-response-object": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", + "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", + "requires": { + "@types/node": "^10.0.3" + }, + "dependencies": { + "@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + } + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" + }, + "is-core-module": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", + "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", + "requires": { + "has": "^1.0.3" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "mockery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/mockery/-/mockery-1.7.0.tgz", + "integrity": "sha512-gUQA33ayi0tuAhr/rJNZPr7Q7uvlBt4gyJPbi0CDcAfIzIrDu1YgGMFgmAu3stJqBpK57m7+RxUbcS+pt59fKQ==" + }, + "object-inspect": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, + "parse-cache-control": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", + "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "promise": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.2.0.tgz", + "integrity": "sha512-+CMAlLHqwRYwBMXKCP+o8ns7DN+xHDUiI+0nArsiJ9y+kJVPLFxEaSw6Ha9s9H0tftxg2Yzl25wqj9G7m5wLZg==", + "requires": { + "asap": "~2.0.6" + } + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==" + }, + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "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" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "requires": { + "resolve": "^1.1.6" + } + }, + "resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "requires": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, + "sync-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", + "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==", + "requires": { + "http-response-object": "^3.0.1", + "sync-rpc": "^1.2.1", + "then-request": "^6.0.0" + } + }, + "sync-rpc": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz", + "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==", + "requires": { + "get-port": "^3.1.0" + } + }, + "then-request": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", + "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", + "requires": { + "@types/concat-stream": "^1.6.0", + "@types/form-data": "0.0.33", + "@types/node": "^8.0.0", + "@types/qs": "^6.2.31", + "caseless": "~0.12.0", + "concat-stream": "^1.6.0", + "form-data": "^2.2.0", + "http-basic": "^8.1.1", + "http-response-object": "^3.0.1", + "promise": "^8.0.0", + "qs": "^6.4.0" + }, + "dependencies": { + "@types/node": { + "version": "8.10.66", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", + "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==" + } + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, + "typescript": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + } + } +} diff --git a/_generated/GulpV0_Node20/package.json b/_generated/GulpV0_Node20/package.json new file mode 100644 index 000000000000..b092f36cde67 --- /dev/null +++ b/_generated/GulpV0_Node20/package.json @@ -0,0 +1,23 @@ +{ + "name": "vsts-gulp-task", + "description": "Azure Pipelines gulp tasks", + "repository": { + "type": "git", + "url": "git+https://github.com/Microsoft/azure-pipelines-tasks.git" + }, + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Microsoft/azure-pipelines-tasks/issues" + }, + "homepage": "https://github.com/Microsoft/azure-pipelines-tasks#readme", + "dependencies": { + "azure-pipelines-task-lib": "^4.0.0-preview", + "minimatch": "^3.0.4", + "@types/node": "^20.3.1", + "@types/mocha": "^5.2.7" + }, + "devDependencies": { + "typescript": "5.1.6" + } +} diff --git a/_generated/GulpV0_Node20/task.json b/_generated/GulpV0_Node20/task.json new file mode 100644 index 000000000000..e38c730423e3 --- /dev/null +++ b/_generated/GulpV0_Node20/task.json @@ -0,0 +1,187 @@ +{ + "id": "B82CFBE4-34F9-40F5-889E-C8842CA9DD9D", + "name": "gulp", + "friendlyName": "gulp", + "description": "Run the gulp Node.js streaming task-based build system", + "helpUrl": "https://docs.microsoft.com/azure/devops/pipelines/tasks/build/gulp", + "helpMarkDown": "[Learn more about this task](https://go.microsoft.com/fwlink/?LinkID=613721)", + "category": "Build", + "visibility": [ + "Build" + ], + "runsOn": [ + "Agent", + "DeploymentGroup" + ], + "author": "Microsoft Corporation", + "version": { + "Major": 0, + "Minor": 229, + "Patch": 1 + }, + "demands": [ + "node.js" + ], + "minimumAgentVersion": "1.91.0", + "groups": [ + { + "name": "advanced", + "displayName": "Advanced", + "isExpanded": false + }, + { + "name": "junitTestResults", + "displayName": "JUnit Test Results", + "isExpanded": true + }, + { + "name": "codeCoverage", + "displayName": "Code Coverage", + "isExpanded": true + } + ], + "instanceNameFormat": "gulp $(targets)", + "inputs": [ + { + "name": "gulpFile", + "type": "filePath", + "label": "gulp File Path", + "defaultValue": "gulpfile.js", + "required": true, + "helpMarkDown": "Relative path from repo root of the gulp file script file to run." + }, + { + "name": "targets", + "type": "string", + "label": "gulp Task(s)", + "defaultValue": "", + "helpMarkDown": "Optional. Space delimited list of tasks to run. If not specified, the default task will run.", + "required": false + }, + { + "name": "arguments", + "type": "string", + "label": "Arguments", + "defaultValue": "", + "helpMarkDown": "Additional arguments passed to gulp. --gulpfile is not needed since already added via gulpFile input above.", + "required": false + }, + { + "name": "cwd", + "aliases": [ + "workingDirectory" + ], + "type": "filePath", + "label": "Working Directory", + "defaultValue": "", + "required": false, + "helpMarkDown": "Current working directory when script is run. Defaults to the folder where the script is located.", + "groupName": "advanced" + }, + { + "name": "gulpjs", + "type": "string", + "label": "gulp.js location", + "defaultValue": "node_modules/gulp/bin/gulp.js", + "required": true, + "helpMarkDown": "gulp.js to run when agent can't find global installed gulp. Defaults to the gulp.js under node_modules folder of the working directory.", + "groupName": "advanced" + }, + { + "name": "publishJUnitResults", + "type": "boolean", + "label": "Publish to Azure Pipelines", + "defaultValue": "false", + "groupName": "junitTestResults", + "helpMarkDown": "Select this option to publish JUnit test results produced by the gulp build to Azure Pipelines." + }, + { + "name": "testResultsFiles", + "type": "filePath", + "label": "Test Results Files", + "defaultValue": "**/TEST-*.xml", + "required": true, + "groupName": "junitTestResults", + "helpMarkDown": "Test results files path. Wildcards can be used. For example, `**/TEST-*.xml` for all XML files whose name starts with TEST-.", + "visibleRule": "publishJUnitResults = true" + }, + { + "name": "testRunTitle", + "type": "string", + "label": "Test Run Title", + "defaultValue": "", + "required": false, + "groupName": "junitTestResults", + "helpMarkDown": "Provide a name for the test run.", + "visibleRule": "publishJUnitResults = true" + }, + { + "name": "enableCodeCoverage", + "type": "boolean", + "label": "Enable code Coverage", + "required": true, + "defaultValue": "false", + "groupName": "codeCoverage", + "helpMarkDown": "Select this option to enable Code Coverage using Istanbul." + }, + { + "name": "testFramework", + "type": "pickList", + "label": "Test Framework", + "required": false, + "groupName": "codeCoverage", + "defaultValue": "Mocha", + "helpMarkDown": "Select your test framework.", + "options": { + "Mocha": "Mocha", + "Jasmine": "Jasmine" + }, + "visibleRule": "enableCodeCoverage = true" + }, + { + "name": "srcFiles", + "type": "string", + "label": "Source Files", + "defaultValue": "", + "required": false, + "groupName": "codeCoverage", + "helpMarkDown": "Provide the path to your source files which you want to hookRequire()", + "visibleRule": "enableCodeCoverage = true" + }, + { + "name": "testFiles", + "type": "string", + "label": "Test Script Files", + "defaultValue": "test/*.js", + "required": true, + "groupName": "codeCoverage", + "helpMarkDown": "Provide the path to your test script files", + "visibleRule": "enableCodeCoverage = true" + } + ], + "execution": { + "Node10": { + "target": "gulptask.js", + "argumentFormat": "" + }, + "Node16": { + "target": "gulptask.js", + "argumentFormat": "" + }, + "Node20": { + "target": "gulptask.js", + "argumentFormat": "" + } + }, + "messages": { + "GulpNotInstalled": "gulp is not installed globally (or is not in the path of the user the agent is running as) and it is not in the local working folder: %s", + "GulpReturnCode": "gulp exited with return code: %d", + "GulpFailed": "gulp failed with error: %s", + "NpmFailed": "Npm failed with error: %s", + "IstanbulFailed": "Istanbul failed with error: %s" + }, + "_buildConfigMapping": { + "Default": "0.229.0", + "Node20-225": "0.229.1" + } +} \ No newline at end of file diff --git a/_generated/GulpV0_Node20/task.loc.json b/_generated/GulpV0_Node20/task.loc.json new file mode 100644 index 000000000000..f4dfe70df412 --- /dev/null +++ b/_generated/GulpV0_Node20/task.loc.json @@ -0,0 +1,187 @@ +{ + "id": "B82CFBE4-34F9-40F5-889E-C8842CA9DD9D", + "name": "gulp", + "friendlyName": "ms-resource:loc.friendlyName", + "description": "ms-resource:loc.description", + "helpUrl": "https://docs.microsoft.com/azure/devops/pipelines/tasks/build/gulp", + "helpMarkDown": "ms-resource:loc.helpMarkDown", + "category": "Build", + "visibility": [ + "Build" + ], + "runsOn": [ + "Agent", + "DeploymentGroup" + ], + "author": "Microsoft Corporation", + "version": { + "Major": 0, + "Minor": 229, + "Patch": 1 + }, + "demands": [ + "node.js" + ], + "minimumAgentVersion": "1.91.0", + "groups": [ + { + "name": "advanced", + "displayName": "ms-resource:loc.group.displayName.advanced", + "isExpanded": false + }, + { + "name": "junitTestResults", + "displayName": "ms-resource:loc.group.displayName.junitTestResults", + "isExpanded": true + }, + { + "name": "codeCoverage", + "displayName": "ms-resource:loc.group.displayName.codeCoverage", + "isExpanded": true + } + ], + "instanceNameFormat": "ms-resource:loc.instanceNameFormat", + "inputs": [ + { + "name": "gulpFile", + "type": "filePath", + "label": "ms-resource:loc.input.label.gulpFile", + "defaultValue": "gulpfile.js", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.gulpFile" + }, + { + "name": "targets", + "type": "string", + "label": "ms-resource:loc.input.label.targets", + "defaultValue": "", + "helpMarkDown": "ms-resource:loc.input.help.targets", + "required": false + }, + { + "name": "arguments", + "type": "string", + "label": "ms-resource:loc.input.label.arguments", + "defaultValue": "", + "helpMarkDown": "ms-resource:loc.input.help.arguments", + "required": false + }, + { + "name": "cwd", + "aliases": [ + "workingDirectory" + ], + "type": "filePath", + "label": "ms-resource:loc.input.label.cwd", + "defaultValue": "", + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.cwd", + "groupName": "advanced" + }, + { + "name": "gulpjs", + "type": "string", + "label": "ms-resource:loc.input.label.gulpjs", + "defaultValue": "node_modules/gulp/bin/gulp.js", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.gulpjs", + "groupName": "advanced" + }, + { + "name": "publishJUnitResults", + "type": "boolean", + "label": "ms-resource:loc.input.label.publishJUnitResults", + "defaultValue": "false", + "groupName": "junitTestResults", + "helpMarkDown": "ms-resource:loc.input.help.publishJUnitResults" + }, + { + "name": "testResultsFiles", + "type": "filePath", + "label": "ms-resource:loc.input.label.testResultsFiles", + "defaultValue": "**/TEST-*.xml", + "required": true, + "groupName": "junitTestResults", + "helpMarkDown": "ms-resource:loc.input.help.testResultsFiles", + "visibleRule": "publishJUnitResults = true" + }, + { + "name": "testRunTitle", + "type": "string", + "label": "ms-resource:loc.input.label.testRunTitle", + "defaultValue": "", + "required": false, + "groupName": "junitTestResults", + "helpMarkDown": "ms-resource:loc.input.help.testRunTitle", + "visibleRule": "publishJUnitResults = true" + }, + { + "name": "enableCodeCoverage", + "type": "boolean", + "label": "ms-resource:loc.input.label.enableCodeCoverage", + "required": true, + "defaultValue": "false", + "groupName": "codeCoverage", + "helpMarkDown": "ms-resource:loc.input.help.enableCodeCoverage" + }, + { + "name": "testFramework", + "type": "pickList", + "label": "ms-resource:loc.input.label.testFramework", + "required": false, + "groupName": "codeCoverage", + "defaultValue": "Mocha", + "helpMarkDown": "ms-resource:loc.input.help.testFramework", + "options": { + "Mocha": "Mocha", + "Jasmine": "Jasmine" + }, + "visibleRule": "enableCodeCoverage = true" + }, + { + "name": "srcFiles", + "type": "string", + "label": "ms-resource:loc.input.label.srcFiles", + "defaultValue": "", + "required": false, + "groupName": "codeCoverage", + "helpMarkDown": "ms-resource:loc.input.help.srcFiles", + "visibleRule": "enableCodeCoverage = true" + }, + { + "name": "testFiles", + "type": "string", + "label": "ms-resource:loc.input.label.testFiles", + "defaultValue": "test/*.js", + "required": true, + "groupName": "codeCoverage", + "helpMarkDown": "ms-resource:loc.input.help.testFiles", + "visibleRule": "enableCodeCoverage = true" + } + ], + "execution": { + "Node10": { + "target": "gulptask.js", + "argumentFormat": "" + }, + "Node16": { + "target": "gulptask.js", + "argumentFormat": "" + }, + "Node20": { + "target": "gulptask.js", + "argumentFormat": "" + } + }, + "messages": { + "GulpNotInstalled": "ms-resource:loc.messages.GulpNotInstalled", + "GulpReturnCode": "ms-resource:loc.messages.GulpReturnCode", + "GulpFailed": "ms-resource:loc.messages.GulpFailed", + "NpmFailed": "ms-resource:loc.messages.NpmFailed", + "IstanbulFailed": "ms-resource:loc.messages.IstanbulFailed" + }, + "_buildConfigMapping": { + "Default": "0.229.0", + "Node20-225": "0.229.1" + } +} \ No newline at end of file diff --git a/_generated/GulpV0_Node20/tsconfig.json b/_generated/GulpV0_Node20/tsconfig.json new file mode 100644 index 000000000000..0438b79f69ac --- /dev/null +++ b/_generated/GulpV0_Node20/tsconfig.json @@ -0,0 +1,6 @@ +{ + "compilerOptions": { + "target": "ES6", + "module": "commonjs" + } +} \ No newline at end of file diff --git a/_generated/GulpV1.versionmap.txt b/_generated/GulpV1.versionmap.txt new file mode 100644 index 000000000000..f74febd08e1e --- /dev/null +++ b/_generated/GulpV1.versionmap.txt @@ -0,0 +1,2 @@ +Default|1.229.0 +Node20-225|1.229.1 diff --git a/_generated/GulpV1/Strings/resources.resjson/de-DE/resources.resjson b/_generated/GulpV1/Strings/resources.resjson/de-DE/resources.resjson new file mode 100644 index 000000000000..4aac3a09615e --- /dev/null +++ b/_generated/GulpV1/Strings/resources.resjson/de-DE/resources.resjson @@ -0,0 +1,38 @@ +{ + "loc.friendlyName": "gulp", + "loc.helpMarkDown": "[Weitere Informationen zu dieser Aufgabe](https://go.microsoft.com/fwlink/?LinkID=613721)", + "loc.description": "Hiermit wird das aufgabenbasierte Node.js-Streamingbuildsystem gulp ausgeführt.", + "loc.instanceNameFormat": "gulp $(targets)", + "loc.group.displayName.advanced": "Erweitert", + "loc.group.displayName.junitTestResults": "JUnit-Testergebnisse", + "loc.group.displayName.codeCoverage": "Code Coverage", + "loc.input.label.gulpFile": "gulp-Dateipfad", + "loc.input.help.gulpFile": "Der relative Pfad vom Repositorystamm der auszuführenden gulp-Skriptdatei.", + "loc.input.label.targets": "gulp-Aufgabe(n)", + "loc.input.help.targets": "Optional. Mit Leerzeichen getrennte Liste der auszuführenden Aufgaben. Wenn nicht angegeben, wird die Standardaufgabe ausgeführt.", + "loc.input.label.arguments": "Argumente", + "loc.input.help.arguments": "Zusätzliche Argumente, die an Gulp übergeben werden. \"-gulpfile\" wurde bereits über die gulpFile-Eingabe weiter oben hinzugefügt und ist daher nicht erforderlich.", + "loc.input.label.cwd": "Arbeitsverzeichnis", + "loc.input.help.cwd": "Aktuelles Arbeitsverzeichnis bei Skriptausführung. Standardmäßig der Ordner, in dem das Skript gespeichert ist.", + "loc.input.label.gulpjs": "Speicherort von \"gulp.js\"", + "loc.input.help.gulpjs": "Pfad zu einer alternativen gulp.js-Datei, relativ zum Arbeitsverzeichnis.", + "loc.input.label.publishJUnitResults": "In Azure Pipelines veröffentlichen", + "loc.input.help.publishJUnitResults": "Wählen Sie diese Option aus, um vom gulp-Build erzeugte JUnit-Testergebnisse in Azure Pipelines zu veröffentlichen.", + "loc.input.label.testResultsFiles": "Testergebnisdateien", + "loc.input.help.testResultsFiles": "Der Pfad der Testergebnisdateien. Platzhalter können verwendet werden. Beispiel: \"**/TEST-*.xml\" für alle XML-Dateien, deren Name mit \"TEST-\" beginnt.", + "loc.input.label.testRunTitle": "Testlauftitel", + "loc.input.help.testRunTitle": "Geben Sie einen Namen für den Testlauf an.", + "loc.input.label.enableCodeCoverage": "Code Coverage aktivieren", + "loc.input.help.enableCodeCoverage": "Wählen Sie diese Option aus, um Code Coverage mithilfe von Istanbul zu aktivieren.", + "loc.input.label.testFramework": "Testframework", + "loc.input.help.testFramework": "Wählen Sie das Testframework aus.", + "loc.input.label.srcFiles": "Quelldateien", + "loc.input.help.srcFiles": "Geben Sie den Pfad zu Ihren Quelldateien an, für die hookRequire() gelten soll.", + "loc.input.label.testFiles": "Testskriptdateien", + "loc.input.help.testFiles": "Geben Sie den Pfad zu Ihren Testskriptdateien an.", + "loc.messages.GulpNotInstalled": "gulp ist nicht global installiert (oder ist nicht im Pfad des Benutzers enthalten, als der der Agent ausgeführt wird) und befindet sich nicht im lokalen Arbeitsordner: %s", + "loc.messages.GulpReturnCode": "gulp wurde mit dem folgenden Rückgabecode beendet: %d", + "loc.messages.GulpFailed": "gulp-Fehler: %s", + "loc.messages.NpmFailed": "Npm-Fehler: %s", + "loc.messages.IstanbulFailed": "Istanbul-Fehler: %s" +} \ No newline at end of file diff --git a/_generated/GulpV1/Strings/resources.resjson/en-US/resources.resjson b/_generated/GulpV1/Strings/resources.resjson/en-US/resources.resjson new file mode 100644 index 000000000000..9511bde83ccd --- /dev/null +++ b/_generated/GulpV1/Strings/resources.resjson/en-US/resources.resjson @@ -0,0 +1,38 @@ +{ + "loc.friendlyName": "gulp", + "loc.helpMarkDown": "[Learn more about this task](https://go.microsoft.com/fwlink/?LinkID=613721)", + "loc.description": "Run the gulp Node.js streaming task-based build system", + "loc.instanceNameFormat": "gulp $(targets)", + "loc.group.displayName.advanced": "Advanced", + "loc.group.displayName.junitTestResults": "JUnit Test Results", + "loc.group.displayName.codeCoverage": "Code Coverage", + "loc.input.label.gulpFile": "gulp File Path", + "loc.input.help.gulpFile": "Relative path from repo root of the gulp file script file to run.", + "loc.input.label.targets": "gulp Task(s)", + "loc.input.help.targets": "Optional. Space delimited list of tasks to run. If not specified, the default task will run.", + "loc.input.label.arguments": "Arguments", + "loc.input.help.arguments": "Additional arguments passed to gulp. --gulpfile is not needed since already added via gulpFile input above.", + "loc.input.label.cwd": "Working Directory", + "loc.input.help.cwd": "Current working directory when script is run. Defaults to the folder where the script is located.", + "loc.input.label.gulpjs": "gulp.js location", + "loc.input.help.gulpjs": "Path to an alternative gulp.js, relative to the working directory.", + "loc.input.label.publishJUnitResults": "Publish to Azure Pipelines", + "loc.input.help.publishJUnitResults": "Select this option to publish JUnit test results produced by the gulp build to Azure Pipelines.", + "loc.input.label.testResultsFiles": "Test Results Files", + "loc.input.help.testResultsFiles": "Test results files path. Wildcards can be used. For example, `**/TEST-*.xml` for all XML files whose name starts with TEST-.", + "loc.input.label.testRunTitle": "Test Run Title", + "loc.input.help.testRunTitle": "Provide a name for the test run.", + "loc.input.label.enableCodeCoverage": "Enable code Coverage", + "loc.input.help.enableCodeCoverage": "Select this option to enable Code Coverage using Istanbul.", + "loc.input.label.testFramework": "Test Framework", + "loc.input.help.testFramework": "Select your test framework.", + "loc.input.label.srcFiles": "Source Files", + "loc.input.help.srcFiles": "Provide the path to your source files which you want to hookRequire()", + "loc.input.label.testFiles": "Test Script Files", + "loc.input.help.testFiles": "Provide the path to your test script files", + "loc.messages.GulpNotInstalled": "gulp is not installed globally (or is not in the path of the user the agent is running as) and it is not in the local working folder: %s", + "loc.messages.GulpReturnCode": "gulp exited with return code: %d", + "loc.messages.GulpFailed": "gulp failed with error: %s", + "loc.messages.NpmFailed": "Npm failed with error: %s", + "loc.messages.IstanbulFailed": "Istanbul failed with error: %s" +} \ No newline at end of file diff --git a/_generated/GulpV1/Strings/resources.resjson/es-ES/resources.resjson b/_generated/GulpV1/Strings/resources.resjson/es-ES/resources.resjson new file mode 100644 index 000000000000..57e820ac89c8 --- /dev/null +++ b/_generated/GulpV1/Strings/resources.resjson/es-ES/resources.resjson @@ -0,0 +1,38 @@ +{ + "loc.friendlyName": "gulp", + "loc.helpMarkDown": "[Obtener más información acerca de esta tarea](https://go.microsoft.com/fwlink/?LinkID=613721)", + "loc.description": "Ejecute el sistema de compilación basado en tareas de streaming de Node.js con gulp.", + "loc.instanceNameFormat": "$(targets) de Gulp", + "loc.group.displayName.advanced": "Avanzado", + "loc.group.displayName.junitTestResults": "Resultados de pruebas JUnit", + "loc.group.displayName.codeCoverage": "Cobertura de código", + "loc.input.label.gulpFile": "Ruta de acceso del archivo gulp", + "loc.input.help.gulpFile": "Ruta de acceso relativa de la raíz del repositorio del archivo de script Gulp que se va a ejecutar.", + "loc.input.label.targets": "Tareas de gulp", + "loc.input.help.targets": "Opcional. Lista de tareas para ejecutar delimitada por espacios. Si no se especifica, se ejecutará la tarea predeterminada.", + "loc.input.label.arguments": "Argumentos", + "loc.input.help.arguments": "Argumentos adicionales pasados a Gulp. --gulpfile no es necesario porque ya se agregó a través de la entrada gulpFile anterior.", + "loc.input.label.cwd": "Directorio de trabajo", + "loc.input.help.cwd": "Directorio de trabajo actual cuando el script se ejecuta. Se establece de forma predeterminada en la carpeta en la que se encuentra el script.", + "loc.input.label.gulpjs": "Ubicación de gulp.js", + "loc.input.help.gulpjs": "Ruta de acceso a un archivo gulp.js alternativo, relativo al directorio de trabajo.", + "loc.input.label.publishJUnitResults": "Publicar en Azure Pipelines", + "loc.input.help.publishJUnitResults": "Seleccione esta opción para publicar los resultados de pruebas JUnit generados por la compilación de gulp en Azure Pipelines.", + "loc.input.label.testResultsFiles": "Archivos de resultados de pruebas", + "loc.input.help.testResultsFiles": "Ruta de acceso a los archivos de resultados de pruebas. Se pueden usar caracteres comodín. Por ejemplo, \"**/TEST-*.xml\" para todos los archivos XML cuyos nombres empiecen por TEST-.", + "loc.input.label.testRunTitle": "Título de la serie de pruebas", + "loc.input.help.testRunTitle": "Asigne un nombre a la serie de pruebas.", + "loc.input.label.enableCodeCoverage": "Habilitar Cobertura de código", + "loc.input.help.enableCodeCoverage": "Seleccione esta opción para habilitar Cobertura de código con Istanbul.", + "loc.input.label.testFramework": "Marco de pruebas", + "loc.input.help.testFramework": "Seleccione su marco de pruebas.", + "loc.input.label.srcFiles": "Archivos de origen", + "loc.input.help.srcFiles": "Proporcione la ruta de acceso a los archivos de origen que quiera para hookRequire().", + "loc.input.label.testFiles": "Archivos de script de prueba", + "loc.input.help.testFiles": "Proporcione la ruta de acceso a sus archivos de script de prueba.", + "loc.messages.GulpNotInstalled": "No se ha instalado gulp a nivel global (o no está en la ruta del usuario con el que se ejecuta el agente) y no está en la carpeta de trabajo local: %s", + "loc.messages.GulpReturnCode": "Se ha cerrado gulp con el código de retorno: %d", + "loc.messages.GulpFailed": "Error de gulp: %s", + "loc.messages.NpmFailed": "Error de Npm: %s", + "loc.messages.IstanbulFailed": "Error de Istanbul: %s" +} \ No newline at end of file diff --git a/_generated/GulpV1/Strings/resources.resjson/fr-FR/resources.resjson b/_generated/GulpV1/Strings/resources.resjson/fr-FR/resources.resjson new file mode 100644 index 000000000000..18e7c94697aa --- /dev/null +++ b/_generated/GulpV1/Strings/resources.resjson/fr-FR/resources.resjson @@ -0,0 +1,38 @@ +{ + "loc.friendlyName": "gulp", + "loc.helpMarkDown": "[En savoir plus sur cette tâche](https://go.microsoft.com/fwlink/?LinkID=613721)", + "loc.description": "Exécuter le système de build basé sur les tâches de streaming Node.js de gulp", + "loc.instanceNameFormat": "gulp $(targets)", + "loc.group.displayName.advanced": "Avancé", + "loc.group.displayName.junitTestResults": "Résultats du test JUnit", + "loc.group.displayName.codeCoverage": "Couverture du code", + "loc.input.label.gulpFile": "Chemin de fichier gulp", + "loc.input.help.gulpFile": "Chemin relatif de la racine de dépôt du fichier script du fichier gulp à exécuter.", + "loc.input.label.targets": "Tâche(s) gulp", + "loc.input.help.targets": "Facultatif. Liste des tâches à exécuter délimitées par des espaces. Si elle n'est pas spécifiée, la tâche par défaut est exécutée.", + "loc.input.label.arguments": "Arguments", + "loc.input.help.arguments": "Arguments supplémentaires passés à gulp. --gulpfile n'est pas nécessaire, car il est déjà ajouté via l'entrée gulpFile ci-dessus.", + "loc.input.label.cwd": "Répertoire de travail", + "loc.input.help.cwd": "Répertoire de travail actuel quand le script est exécuté. Il s'agit généralement du dossier dans lequel se trouve le script.", + "loc.input.label.gulpjs": "Emplacement de gulp.js", + "loc.input.help.gulpjs": "Chemin d'un autre fichier gulp.js relatif au répertoire de travail.", + "loc.input.label.publishJUnitResults": "Publier sur Azure Pipelines", + "loc.input.help.publishJUnitResults": "Sélectionnez cette option pour publier les résultats des tests JUnit produits par la build gulp sur Azure Pipelines.", + "loc.input.label.testResultsFiles": "Fichiers des résultats des tests", + "loc.input.help.testResultsFiles": "Chemin des fichiers de résultats des tests. Les caractères génériques sont autorisés. Par exemple, '**/TEST-*.xml' correspond à tous les fichiers XML dont le nom commence par TEST-.", + "loc.input.label.testRunTitle": "Titre de l'exécution du test", + "loc.input.help.testRunTitle": "Indiquez le nom de la série de tests.", + "loc.input.label.enableCodeCoverage": "Activer la couverture du code", + "loc.input.help.enableCodeCoverage": "Sélectionnez cette option pour activer la couverture du code à l'aide d'Istanbul.", + "loc.input.label.testFramework": "Framework de tests", + "loc.input.help.testFramework": "Sélectionnez votre framework de tests.", + "loc.input.label.srcFiles": "Fichiers sources", + "loc.input.help.srcFiles": "Indiquez le chemin des fichiers sources auxquels vous voulez appliquer hookRequire()", + "loc.input.label.testFiles": "Fichiers de script de test", + "loc.input.help.testFiles": "Indiquez le chemin de vos fichiers de script de test", + "loc.messages.GulpNotInstalled": "gulp n'est pas installé de manière globale ou ne se trouve pas dans le chemin de l'utilisateur via lequel l'agent s'exécute. De plus, il ne se trouve pas dans le dossier de travail local : %s", + "loc.messages.GulpReturnCode": "Sortie de gulp. Code de retour : %d", + "loc.messages.GulpFailed": "Échec de gulp. Erreur : %s", + "loc.messages.NpmFailed": "Échec de Npm. Erreur : %s", + "loc.messages.IstanbulFailed": "Échec d'Istanbul avec l'erreur : %s" +} \ No newline at end of file diff --git a/_generated/GulpV1/Strings/resources.resjson/it-IT/resources.resjson b/_generated/GulpV1/Strings/resources.resjson/it-IT/resources.resjson new file mode 100644 index 000000000000..0e81f46aa332 --- /dev/null +++ b/_generated/GulpV1/Strings/resources.resjson/it-IT/resources.resjson @@ -0,0 +1,38 @@ +{ + "loc.friendlyName": "gulp", + "loc.helpMarkDown": "[Altre informazioni su questa attività](https://go.microsoft.com/fwlink/?LinkID=613721)", + "loc.description": "Esegue il sistema di compilazione basato su attività di streaming Node.js di gulp", + "loc.instanceNameFormat": "gulp $(targets)", + "loc.group.displayName.advanced": "Avanzate", + "loc.group.displayName.junitTestResults": "Risultati del test JUnit", + "loc.group.displayName.codeCoverage": "Code coverage", + "loc.input.label.gulpFile": "Percorso file di gulp", + "loc.input.help.gulpFile": "Percorso relativo dalla radice del repository del file di script del file gulp da eseguire.", + "loc.input.label.targets": "Attività di gulp", + "loc.input.help.targets": "Facoltativo. Elenco di attività delimitate da spazio da eseguire. Se non è specificato, viene eseguita l'attività predefinita.", + "loc.input.label.arguments": "Argomenti", + "loc.input.help.arguments": "Argomenti aggiuntivi passati a gulp. --gulpfile non è necessario dal momento che è già stato aggiunto tramite l'input di gulpFile in precedenza.", + "loc.input.label.cwd": "Directory di lavoro", + "loc.input.help.cwd": "Directory di lavoro corrente durante l'esecuzione dello script. Per impostazione predefinita, corrisponde alla cartella in cui si trova lo script.", + "loc.input.label.gulpjs": "Percorso di gulp.js", + "loc.input.help.gulpjs": "Percorso di un file gulp.js alternativo, relativo alla directory di lavoro.", + "loc.input.label.publishJUnitResults": "Pubblica in Azure Pipelines", + "loc.input.help.publishJUnitResults": "Selezionare questa opzione per pubblicare in Azure Pipelines i risultati di test JUnit ottenuti con la compilazione gulp.", + "loc.input.label.testResultsFiles": "File dei risultati del test", + "loc.input.help.testResultsFiles": "Percorso dei file dei risultati del test. È possibile usare i caratteri jolly, ad esempio `**/TEST-*.xml` per individuare tutti i file XML il cui nome inizia con TEST-.", + "loc.input.label.testRunTitle": "Titolo esecuzione dei test", + "loc.input.help.testRunTitle": "Consente di specificare un nome per l'esecuzione dei test.", + "loc.input.label.enableCodeCoverage": "Abilita code coverage", + "loc.input.help.enableCodeCoverage": "Selezionare questa opzione per abilitare il code coverage con Istanbul.", + "loc.input.label.testFramework": "Framework di test", + "loc.input.help.testFramework": "Consente di selezionare il framework di test.", + "loc.input.label.srcFiles": "File di origine", + "loc.input.help.srcFiles": "Consente di specificare il percorso dei file di origine per hookRequire()", + "loc.input.label.testFiles": "File di script di test", + "loc.input.help.testFiles": "Consente di specificare il percorso dei file di script di test", + "loc.messages.GulpNotInstalled": "gulp non è installato globalmente oppure non è presente nel percorso dell'utente con cui viene eseguito l'agente e non è incluso nella cartella di lavoro locale %s", + "loc.messages.GulpReturnCode": "gulp terminato. Codice restituito: %d", + "loc.messages.GulpFailed": "gulp non riuscito. Errore: %s", + "loc.messages.NpmFailed": "Npm non riuscito. Errore: %s", + "loc.messages.IstanbulFailed": "Istanbul non riuscito. Errore: %s" +} \ No newline at end of file diff --git a/_generated/GulpV1/Strings/resources.resjson/ja-JP/resources.resjson b/_generated/GulpV1/Strings/resources.resjson/ja-JP/resources.resjson new file mode 100644 index 000000000000..0e84bbc9ceac --- /dev/null +++ b/_generated/GulpV1/Strings/resources.resjson/ja-JP/resources.resjson @@ -0,0 +1,38 @@ +{ + "loc.friendlyName": "gulp", + "loc.helpMarkDown": "[このタスクの詳細を表示](https://go.microsoft.com/fwlink/?LinkID=613721)", + "loc.description": "Node.js のストリーミング タスクベースのビルド システムである gulp を実行します", + "loc.instanceNameFormat": "gulp $(targets)", + "loc.group.displayName.advanced": "詳細設定", + "loc.group.displayName.junitTestResults": "JUnit のテスト結果", + "loc.group.displayName.codeCoverage": "コード カバレッジ", + "loc.input.label.gulpFile": "gulp ファイル パス", + "loc.input.help.gulpFile": "リポジトリのルートを基準として指定する、実行する gulp スクリプト ファイルの相対パス。", + "loc.input.label.targets": "gulp タスク", + "loc.input.help.targets": "(省略可能) スペース区切りの実行タスクのリスト。指定しない場合は、既定のタスクが実行されます。", + "loc.input.label.arguments": "引数", + "loc.input.help.arguments": "gulp に渡される追加の引数。上記の gulpFile 入力で既に追加されているので、--gulpfile は不要です。", + "loc.input.label.cwd": "作業ディレクトリ", + "loc.input.help.cwd": "スクリプトの実行時の現行の作業ディレクトリ。スクリプトが配置されているフォルダーを既定値に使用します。", + "loc.input.label.gulpjs": "gulp.js の場所", + "loc.input.help.gulpjs": "作業ディレクトリに対する代替の gulp.js へのパス。", + "loc.input.label.publishJUnitResults": "Azure Pipelines に公開する", + "loc.input.help.publishJUnitResults": "gulp のビルドによって生成される JUnit のテスト結果を Azure Pipelines に公開するには、このオプションを選びます。", + "loc.input.label.testResultsFiles": "テスト結果のファイル", + "loc.input.help.testResultsFiles": "テスト結果ファイルのパス。ワイルドカードを使用できます。たとえば、名前が TEST- で始まるすべての XML ファイルの場合は `**/TEST-*.xml` です。", + "loc.input.label.testRunTitle": "テスト実行のタイトル", + "loc.input.help.testRunTitle": "テストの実行の名前を指定します。", + "loc.input.label.enableCodeCoverage": "コード カバレッジを有効にする", + "loc.input.help.enableCodeCoverage": "Istanbul を使用してコード カバレッジを有効にするには、このオプションを選びます。", + "loc.input.label.testFramework": "テスト フレームワーク", + "loc.input.help.testFramework": "テスト フレームワークを選びます。", + "loc.input.label.srcFiles": "ソース ファイル", + "loc.input.help.srcFiles": "hookRequire() を実行しようとしているソース ファイルへのパスを指定します", + "loc.input.label.testFiles": "テスト スクリプト ファイル", + "loc.input.help.testFiles": "テスト スクリプト ファイルへのパスを指定します", + "loc.messages.GulpNotInstalled": "gulp はグローバルにインストールされていません (またはエージェントが実行しているユーザーのパスにありません)。またローカル作業フォルダーにありません: %s", + "loc.messages.GulpReturnCode": "gulp は、次のリターン コードで終了しました: %d", + "loc.messages.GulpFailed": "gulp が次のエラーで失敗しました: %s", + "loc.messages.NpmFailed": "Npm でエラーが発生しました: %s", + "loc.messages.IstanbulFailed": "Istanbul でエラーが発生しました: %s" +} \ No newline at end of file diff --git a/_generated/GulpV1/Strings/resources.resjson/ko-KR/resources.resjson b/_generated/GulpV1/Strings/resources.resjson/ko-KR/resources.resjson new file mode 100644 index 000000000000..9e554b63d9dd --- /dev/null +++ b/_generated/GulpV1/Strings/resources.resjson/ko-KR/resources.resjson @@ -0,0 +1,38 @@ +{ + "loc.friendlyName": "gulp", + "loc.helpMarkDown": "[이 작업에 대한 자세한 정보](https://go.microsoft.com/fwlink/?LinkID=613721)", + "loc.description": "gulp Node.js 스트리밍 작업 기반 빌드 시스템을 실행합니다.", + "loc.instanceNameFormat": "gulp $(targets)", + "loc.group.displayName.advanced": "고급", + "loc.group.displayName.junitTestResults": "JUnit 테스트 결과", + "loc.group.displayName.codeCoverage": "코드 검사", + "loc.input.label.gulpFile": "gulp 파일 경로", + "loc.input.help.gulpFile": "실행할 gulp 파일 스크립트 파일의 리포 루트로부터의 상대 경로입니다.", + "loc.input.label.targets": "gulp 작업", + "loc.input.help.targets": "선택 사항. 공백으로 구분된 실행할 작업 목록입니다. 지정하지 않을 경우 기본 작업이 실행됩니다.", + "loc.input.label.arguments": "인수", + "loc.input.help.arguments": "추가 인수를 gulp에 전달했습니다. --gulpfile은 위의 gulpFile 입력을 통해 이미 추가되었으므로 필요하지 않습니다.", + "loc.input.label.cwd": "작업 디렉터리", + "loc.input.help.cwd": "스크립트 실행 시 현재 작업 디렉터리입니다. 기본값을 스크립트가 있는 폴더로 지정합니다.", + "loc.input.label.gulpjs": "gulp.js 위치", + "loc.input.help.gulpjs": "대체 gulp의 경로로, 작업 디렉터리의 상대 경로입니다.", + "loc.input.label.publishJUnitResults": "Azure Pipelines/에 게시", + "loc.input.help.publishJUnitResults": "gulp 빌드에서 생성된 JUnit 테스트 결과를 Azure Pipelines에 게시하려면 이 옵션을 선택합니다.", + "loc.input.label.testResultsFiles": "테스트 결과 파일", + "loc.input.help.testResultsFiles": "테스트 결과 파일 경로입니다. 와일드카드를 사용할 수 있습니다. 예를 들어, 이름이 TEST-로 시작하는 모든 XML 파일을 표시하기 위해 `**/TEST-*.xml`을 사용할 수 있습니다.", + "loc.input.label.testRunTitle": "테스트 실행 제목", + "loc.input.help.testRunTitle": "테스트 실행의 이름을 지정하세요.", + "loc.input.label.enableCodeCoverage": "코드 검사 사용", + "loc.input.help.enableCodeCoverage": "Istanbul을 사용하여 코드 검사를 사용하도록 설정하려면 이 옵션을 선택하세요.", + "loc.input.label.testFramework": "테스트 프레임워크", + "loc.input.help.testFramework": "테스트 프레임워크를 선택하세요.", + "loc.input.label.srcFiles": "소스 파일", + "loc.input.help.srcFiles": "hookRequire()를 적용할 소스 파일의 경로를 지정하세요.", + "loc.input.label.testFiles": "테스트 스크립트 파일", + "loc.input.help.testFiles": "테스트 스크립트 파일의 경로를 지정하세요.", + "loc.messages.GulpNotInstalled": "gulp가 전역으로 설치되지 않았거나 에이전트를 실행 중인 사용자의 경로에 없으며 로컬 작업 폴더 %s에 없습니다.", + "loc.messages.GulpReturnCode": "gulp가 종료되었습니다(반환 코드: %d).", + "loc.messages.GulpFailed": "오류가 발생하여 gulp에 실패했습니다. %s", + "loc.messages.NpmFailed": "오류 %s(으)로 Npm 실패", + "loc.messages.IstanbulFailed": "다음 오류가 발생하여 Istanbul이 실패했습니다. %s" +} \ No newline at end of file diff --git a/_generated/GulpV1/Strings/resources.resjson/ru-RU/resources.resjson b/_generated/GulpV1/Strings/resources.resjson/ru-RU/resources.resjson new file mode 100644 index 000000000000..f5bf1bdc8fd1 --- /dev/null +++ b/_generated/GulpV1/Strings/resources.resjson/ru-RU/resources.resjson @@ -0,0 +1,38 @@ +{ + "loc.friendlyName": "gulp", + "loc.helpMarkDown": "[См. дополнительные сведения об этой задаче](https://go.microsoft.com/fwlink/?LinkID=613721)", + "loc.description": "Запуск системы сборки, основанной на задачах потоковой передачи Node.js gulp", + "loc.instanceNameFormat": "Gulp $(targets)", + "loc.group.displayName.advanced": "Дополнительно", + "loc.group.displayName.junitTestResults": "Результаты теста JUnit", + "loc.group.displayName.codeCoverage": "Объем протестированного кода", + "loc.input.label.gulpFile": "Путь к файлу gulp", + "loc.input.help.gulpFile": "Относительный путь от корня репозитория к файлу сценария Gulp, который подлежит выполнению.", + "loc.input.label.targets": "Задачи gulp", + "loc.input.help.targets": "Необязательно. Список запускаемых задач с разделителями-пробелами. Если он не указан, будет запущена задача по умолчанию.", + "loc.input.label.arguments": "Аргументы", + "loc.input.help.arguments": "Дополнительные аргументы, передаваемые в Gulp. Аргумент --gulpfile не требуется, так как он уже добавлен с помощью входного файла gulpFile выше.", + "loc.input.label.cwd": "Рабочий каталог", + "loc.input.help.cwd": "Текущий рабочий каталог при выполнении сценария. По умолчанию используется папка, в которой находится сценарий.", + "loc.input.label.gulpjs": "Расположение gulp.js", + "loc.input.help.gulpjs": "Путь к альтернативному gulp.js относительно рабочего каталога.", + "loc.input.label.publishJUnitResults": "Опубликовать в Azure Pipelines", + "loc.input.help.publishJUnitResults": "Выберите этот параметр, чтобы опубликовать результаты тестов JUnit, созданные сборкой gulp, в Azure Pipelines.", + "loc.input.label.testResultsFiles": "Файлы результатов тестов", + "loc.input.help.testResultsFiles": "Путь к файлам результатов тестов. Можно использовать подстановочные знаки. Пример: \"**/TEST-*.xml\" для всех XML-файлов, имена которых начинаются с \"TEST-\".", + "loc.input.label.testRunTitle": "Заголовок тестового запуска", + "loc.input.help.testRunTitle": "Укажите имя для тестового запуска.", + "loc.input.label.enableCodeCoverage": "Включить оценку объема протестированного кода", + "loc.input.help.enableCodeCoverage": "Выберите этот параметр, чтобы включить оценку объема протестированного кода с помощью Istanbul.", + "loc.input.label.testFramework": "Платформа тестирования", + "loc.input.help.testFramework": "Выберите платформу тестирования.", + "loc.input.label.srcFiles": "Исходные файлы", + "loc.input.help.srcFiles": "Укажите путь к исходным файлам, к которым необходимо применить метод hookRequire()", + "loc.input.label.testFiles": "Файлы скриптов тестирования", + "loc.input.help.testFiles": "Укажите путь к файлам скриптов тестирования", + "loc.messages.GulpNotInstalled": "Набор gulp не установлен глобально (или не находится в пути пользователя, от имени которого выполняется агент) и не находится в локальной рабочей папке: %s", + "loc.messages.GulpReturnCode": "Завершение работы gulp с кодом возврата: %d", + "loc.messages.GulpFailed": "Сбой gulp с ошибкой: %s", + "loc.messages.NpmFailed": "Сбой NPM с ошибкой: %s", + "loc.messages.IstanbulFailed": "Сбой Istanbul с ошибкой: %s" +} \ No newline at end of file diff --git a/_generated/GulpV1/Strings/resources.resjson/zh-CN/resources.resjson b/_generated/GulpV1/Strings/resources.resjson/zh-CN/resources.resjson new file mode 100644 index 000000000000..0e559af31329 --- /dev/null +++ b/_generated/GulpV1/Strings/resources.resjson/zh-CN/resources.resjson @@ -0,0 +1,38 @@ +{ + "loc.friendlyName": "Gulp", + "loc.helpMarkDown": "[详细了解此任务](https://go.microsoft.com/fwlink/?LinkID=613721)", + "loc.description": "运行 Gulp 基于 Node.js 流任务的生成系统", + "loc.instanceNameFormat": "Gulp $(targets)", + "loc.group.displayName.advanced": "高级", + "loc.group.displayName.junitTestResults": "JUnit 测试结果", + "loc.group.displayName.codeCoverage": "代码覆盖率", + "loc.input.label.gulpFile": "Gulp 文件路径", + "loc.input.help.gulpFile": "要运行的 Gulp 文件脚本文件的存储库根路径的相对路径。", + "loc.input.label.targets": "Gulp 任务", + "loc.input.help.targets": "可选。待运行任务的列表,以空格分隔。如未指定,则将运行默认任务。", + "loc.input.label.arguments": "参数", + "loc.input.help.arguments": "传递给 Gulp 的其他参数。无需 --gulpfile,因为已通过上面的 gulpFile 输入添加。", + "loc.input.label.cwd": "工作目录", + "loc.input.help.cwd": "脚本运行时的当前工作目录。默认为脚本所处的文件夹。", + "loc.input.label.gulpjs": "gulp.js 位置", + "loc.input.help.gulpjs": "备用 gulp.js 的路径(相对于工作目录)。", + "loc.input.label.publishJUnitResults": "发布到 Azure Pipelines", + "loc.input.help.publishJUnitResults": "选择此选项可将 Gulp 生成产生的 JUnit 测试结果发布到 Azure Pipelines。", + "loc.input.label.testResultsFiles": "测试结果文件", + "loc.input.help.testResultsFiles": "测试结果文件路径。可以使用通配符。例如,\"**/TEST-*.xml\" 表示名称以 TEST- 开头的所有 XML 文件。", + "loc.input.label.testRunTitle": "测试运行标题", + "loc.input.help.testRunTitle": "为测试运行提供一个名称。", + "loc.input.label.enableCodeCoverage": "启用代码覆盖率", + "loc.input.help.enableCodeCoverage": "选择此选项以使用 Istanbul 启用代码覆盖率。", + "loc.input.label.testFramework": "测试框架", + "loc.input.help.testFramework": "选择你的测试框架。", + "loc.input.label.srcFiles": "源文件", + "loc.input.help.srcFiles": "将你所需的源文件路径提供给 hookRequire()", + "loc.input.label.testFiles": "测试脚本文件", + "loc.input.help.testFiles": "提供测试脚本文件的路径", + "loc.messages.GulpNotInstalled": "Gulp 未在全局进行安装(或不位于代理运行身份用户的路径下),且不位于本地工作文件夹 %s 中", + "loc.messages.GulpReturnCode": "Gulp 已退出,返回代码为: %d", + "loc.messages.GulpFailed": "Gulp 失败,出现错误: %s", + "loc.messages.NpmFailed": "Npm 失败,出现错误: %s", + "loc.messages.IstanbulFailed": "Istanbul 失败,出现错误: %s" +} \ No newline at end of file diff --git a/_generated/GulpV1/Strings/resources.resjson/zh-TW/resources.resjson b/_generated/GulpV1/Strings/resources.resjson/zh-TW/resources.resjson new file mode 100644 index 000000000000..ad79d6f7b1d8 --- /dev/null +++ b/_generated/GulpV1/Strings/resources.resjson/zh-TW/resources.resjson @@ -0,0 +1,38 @@ +{ + "loc.friendlyName": "gulp", + "loc.helpMarkDown": "[深入了解此工作](https://go.microsoft.com/fwlink/?LinkID=613721)", + "loc.description": "執行 gulp Node.js 串流工作型建置系統", + "loc.instanceNameFormat": "Gulp $(targets)", + "loc.group.displayName.advanced": "進階", + "loc.group.displayName.junitTestResults": "JUnit 測試結果", + "loc.group.displayName.codeCoverage": "程式碼涵蓋範圍", + "loc.input.label.gulpFile": "gulp 檔案路徑", + "loc.input.help.gulpFile": "要執行的 gulp 檔指令檔存放庫根路徑相對路徑。", + "loc.input.label.targets": "gulp 工作", + "loc.input.help.targets": "可省略。以空格分隔要執行之工作的清單。若未指定,將會執行預設工作。", + "loc.input.label.arguments": "引數", + "loc.input.help.arguments": "傳遞至 Gulp 的額外引數。 --不需要 gulpfile 因為已透過上述 gulpFile 輸入加入。", + "loc.input.label.cwd": "工作目錄", + "loc.input.help.cwd": "執行指令碼後的目前工作目錄。預設為指令碼所在的資料夾。", + "loc.input.label.gulpjs": "gulp.js 的位置", + "loc.input.help.gulpjs": "相對於工作目錄的替代 gulp.js 路徑。", + "loc.input.label.publishJUnitResults": "發佈至 Azure Pipelines", + "loc.input.help.publishJUnitResults": "選取此選項會將 gulp 組建所產生的 JUnit 測試結果發佈至 Azure Pipelines。", + "loc.input.label.testResultsFiles": "測試結果檔案", + "loc.input.help.testResultsFiles": "測試結果檔案路徑。可使用萬用字元。例如 `**/TEST-*.xml` 即適用於所有名稱開頭為 TEST- 的 XML 檔案。", + "loc.input.label.testRunTitle": "測試回合標題", + "loc.input.help.testRunTitle": "提供測試回合的名稱。", + "loc.input.label.enableCodeCoverage": "啟用程式碼涵蓋範圍", + "loc.input.help.enableCodeCoverage": "選取這個選項,以使用 Istanbul 啟用程式碼涵蓋範圍。", + "loc.input.label.testFramework": "測試架構", + "loc.input.help.testFramework": "選取測試架構。", + "loc.input.label.srcFiles": "原始程式檔", + "loc.input.help.srcFiles": "提供要進行 hookRequire() 之原始程式檔的路徑", + "loc.input.label.testFiles": "測試指令檔", + "loc.input.help.testFiles": "提供測試指令碼檔案的路徑", + "loc.messages.GulpNotInstalled": "gulp 未全域安裝 (或不在作為代理程式執行身分的使用者路徑中) 且不在本機工作資料夾: %s", + "loc.messages.GulpReturnCode": "gulp 已結束,傳回碼: %d", + "loc.messages.GulpFailed": "gulp 失敗,錯誤: %s", + "loc.messages.NpmFailed": "Npm 失敗,錯誤為: %s", + "loc.messages.IstanbulFailed": "Istanbul 失敗,錯誤為: %s" +} \ No newline at end of file diff --git a/_generated/GulpV1/Tests/L0.ts b/_generated/GulpV1/Tests/L0.ts new file mode 100644 index 000000000000..856a811be21f --- /dev/null +++ b/_generated/GulpV1/Tests/L0.ts @@ -0,0 +1,292 @@ +import assert = require('assert'); +import path = require('path'); +import os = require('os'); +import * as ttm from 'azure-pipelines-task-lib/mock-test'; + +const isWin = os.type().match(/^Win/); + +describe('GulpV1 Suite', function () { + this.timeout(parseInt(process.env.TASK_TEST_TIMEOUT) || 20000); + + before((done: Mocha.Done) => { + process.env['SYSTEM_DEFAULTWORKINGDIRECTORY'] = '/user/build'; + done(); + }); + + it('runs a gulpfile through global gulp', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0GulpGlobalGood.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.ran('/usr/local/bin/gulp --gulpfile gulpfile.js'), 'it should have run Gulp'); + assert(tr.invokedToolCount == 1, 'should have only run gulp'); + assert(tr.stderr.length == 0, 'should not have written to stderr'); + assert(tr.succeeded, 'task should have succeeded'); + + done(); + }); + + it('runs a gulpfile through local gulp', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0GulpLocalGood.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + if (isWin) { + assert( + tr.ran('/usr/local/bin/node c:\\fake\\wd\\node_modules\\gulp\\gulp.js --gulpfile gulpfile.js'), + 'it should have run gulp' + ); + } else { + assert( + tr.ran('/usr/local/bin/node /fake/wd/node_modules/gulp/gulp.js --gulpfile gulpfile.js'), + 'it should have run gulp' + ); + } + assert(tr.invokedToolCount == 1, 'should have only run gulp'); + assert(tr.stderr.length == 0, 'should not have written to stderr'); + assert(tr.succeeded, 'task should have succeeded'); + + done(); + }); + + it('runs gulp when code coverage is enabled', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0GulpLocalGoodWithCodeCoverage.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + if (isWin) { + assert( + tr.ran('/usr/local/bin/node c:\\fake\\wd\\node_modules\\gulp\\gulp.js --gulpfile gulpfile.js'), + 'it should have run gulp' + ); + } else { + assert( + tr.ran('/usr/local/bin/node /fake/wd/node_modules/gulp/gulp.js --gulpfile gulpfile.js'), + 'it should have run gulp' + ); + } + assert(tr.invokedToolCount == 3, 'should have run npm, Gulp and istanbul'); + assert(tr.stderr.length == 0, 'should not have written to stderr'); + assert(tr.succeeded, 'task should have succeeded'); + + done(); + }); + + it('runs a gulpFile when publishJUnitTestResults is false', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0PublishJUnitTestResultsFalse.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + if (isWin) { + assert( + tr.ran('/usr/local/bin/node c:\\fake\\wd\\node_modules\\gulp\\gulp.js --gulpfile gulpfile.js'), + 'it should have run gulp' + ); + } else { + assert( + tr.ran('/usr/local/bin/node /fake/wd/node_modules/gulp/gulp.js --gulpfile gulpfile.js'), + 'it should have run gulp' + ); + } + assert(tr.invokedToolCount == 1, 'should have only run Gulp'); + assert(tr.stderr.length == 0, 'should not have written to stderr'); + assert(tr.succeeded, 'task should have succeeded'); + + done(); + }); + + it('fails if gulpFile not set', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0GulpFileNotSet.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.stdOutContained('Input required: gulpFile'), 'Should have printed: Input required: gulpFile'); + assert(tr.invokedToolCount == 0, 'should exit before running Gulp'); + assert(tr.failed, 'should have failed'); + + done(); + }); + + it('fails if cwd not set', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0CwdNotSet.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.stdOutContained('Input required: cwd'), 'Should have printed: Input required: cwd'); + assert(tr.invokedToolCount == 0, 'should exit before running Gulp'); + assert(tr.failed, 'should have failed'); + + done(); + }); + + it('runs a gulpfile through global gulp if gulpjs not set', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0GulpjsNotSet.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.stdOutContained('gulpjs not set'), 'Should have printed: gulpjs not set'); + assert(tr.invokedToolCount == 1, 'should have only run Gulp'); + assert(tr.succeeded, 'task should have succeeded'); + + done(); + }); + + it('fails if gulpFile not found', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0NoGulpFile.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.stdOutContained('Not found gulpfile.js'), 'Should have printed: Not found gulpfile.js'); + assert(tr.invokedToolCount == 0, 'should exit before running Gulp'); + assert(tr.failed, 'should have failed'); + + done(); + }); + + it('fails if gulp no exist globally and locally', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0NoGulp.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.stdOutContained('loc_mock_GulpNotInstalled'), 'Should have printed: loc_mock_GulpNotInstalled'); + assert(tr.failed, 'should have failed'); + + done(); + }); + + it('fails if npm fails', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0NpmFails.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.stdOutContained('loc_mock_NpmFailed'), 'Should have printed: loc_mock_NpmFailed'); + assert(tr.invokedToolCount == 2, 'should exit before running Gulp'); + assert(tr.failed, 'should have failed'); + + done(); + }); + + it('fails if gulp fails', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0GulpFails.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + if (isWin) { + assert( + tr.ran('/usr/local/bin/node c:\\fake\\wd\\node_modules\\gulp\\gulp.js --gulpfile gulpfile.js'), + 'it should have run gulp' + ); + } else { + assert( + tr.ran('/usr/local/bin/node /fake/wd/node_modules/gulp/gulp.js --gulpfile gulpfile.js'), + 'it should have run gulp' + ); + } + assert(tr.stdOutContained('loc_mock_GulpFailed'), 'Should have printed: loc_mock_GulpFailed'); + assert(tr.invokedToolCount == 1, 'should have run npm and gulp'); + assert(tr.failed, 'should have failed'); + + done(); + }); + + it('fails if istanbul fails', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0IstanbulFails.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + if (isWin) { + assert( + tr.ran('/usr/local/bin/node c:\\fake\\wd\\node_modules\\gulp\\gulp.js --gulpfile gulpfile.js'), + 'it should have run gulp' + ); + } else { + assert( + tr.ran('/usr/local/bin/node /fake/wd/node_modules/gulp/gulp.js --gulpfile gulpfile.js'), + 'it should have run gulp' + ); + } + assert(tr.stdOutContained('loc_mock_IstanbulFailed'), 'Should have printed: loc_mock_IstanbulFailed'); + assert(tr.invokedToolCount == 3, 'should have run npm, gulp and istanbul'); + assert(tr.failed, 'should have failed'); + + done(); + }); + + it('fails when test result files input is not provided', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0TestResultFilesNotSet.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.stdOutContained('Input required: testResultsFiles'), 'Should have printed: Input required: testResultsFiles'); + assert(tr.invokedToolCount == 0, 'should exit before running Gulp'); + assert(tr.failed, 'should have failed'); + + done(); + }); + + it('gives warning and runs when test result files input does not match any file', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0TestResultFilesDoesNotMatchAnyFile.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + if (isWin) { + assert( + tr.ran('/usr/local/bin/node c:\\fake\\wd\\node_modules\\gulp\\gulp.js --gulpfile gulpfile.js'), + 'it should have run gulp' + ); + } else { + assert( + tr.ran('/usr/local/bin/node /fake/wd/node_modules/gulp/gulp.js --gulpfile gulpfile.js'), + 'it should have run gulp' + ); + } + assert(tr.invokedToolCount == 1, 'should run completely'); + assert( + tr.stdout.search('No pattern found in testResultsFiles parameter') >= 0, + 'should give a warning for test file pattern not matched.' + ); + assert(tr.succeeded, 'task should have succeeded'); + + done(); + }); + + it('fails when test source files input is not provided for coverage', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0NoTestSourceFiles.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.stdOutContained('Input required: testFiles'), 'Should have printed: Input required: testFiles'); + assert(tr.invokedToolCount == 0, 'should exit before running Gulp'); + assert(tr.failed, 'should have failed'); + + done(); + }); + + it('fails when test source files input does not match any file', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0InvalidTestSource.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.stdOutContained('loc_mock_IstanbulFaile'), 'Should have printed: loc_mock_IstanbulFaile'); + assert(tr.invokedToolCount == 3, 'should exit while running istanbul'); + assert(tr.failed, 'should have failed'); + + done(); + }); +}); diff --git a/_generated/GulpV1/Tests/L0CwdNotSet.ts b/_generated/GulpV1/Tests/L0CwdNotSet.ts new file mode 100644 index 000000000000..e804d2031ac1 --- /dev/null +++ b/_generated/GulpV1/Tests/L0CwdNotSet.ts @@ -0,0 +1,60 @@ +import ma = require("azure-pipelines-task-lib/mock-answer"); +import tmrm = require("azure-pipelines-task-lib/mock-run"); +import path = require("path"); + +let taskPath = path.join(__dirname, "..", "gulptask.js"); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput("gulpFile", "gulpfile.js"); +tr.setInput("gulpjs", "node_modules/gulp/gulp.js"); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "gulp": "/usr/local/bin/gulp", + "npm": "/usr/local/bin/npm", + "node": "/usr/local/bin/node", + "istanbulWin": "/usr/local/bin/istanbul", + "istanbul": "/usr/local/bin/node_modules/istanbul/lib/cli.js", + }, + "exec": { + "/usr/local/bin/gulp --gulpfile gulpfile.js": { + "code": 0, + "stdout": "gulp output here", + }, + "/usr/local/bin/npm install istanbul": { + "code": 0, + "stdout": "npm output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i ./**/build/src/*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 0, + "stdout": "istanbul output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i .\\**\\build\\src\\*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 0, + "stdout": "istanbul output here", + }, + }, + "checkPath": { + "/usr/local/bin/gulp": true, + "/usr/local/bin/npm": true, + "/usr/local/bin/node": true, + "/usr/local/bin/istanbul": true, + "/usr/local/bin/node_modules/istanbul/lib/cli.js": true, + "gulpfile.js": true, + "**/build/test/*.js": true, + }, + "exist": { + "/usr/local/bin/gulp": true, + }, + "match": { + "**/TEST-*.xml": ["/user/build/fun/test-123.xml"], + "**/*.js": ["/test/test.js"], + }, + "getVariable": { + "System.DefaultWorkingDirectory": "/user/build", + }, +}; +tr.setAnswers(a); + +tr.run(); diff --git a/_generated/GulpV1/Tests/L0GulpFails.ts b/_generated/GulpV1/Tests/L0GulpFails.ts new file mode 100644 index 000000000000..0b4cabaf0000 --- /dev/null +++ b/_generated/GulpV1/Tests/L0GulpFails.ts @@ -0,0 +1,67 @@ +import ma = require("azure-pipelines-task-lib/mock-answer"); +import tmrm = require("azure-pipelines-task-lib/mock-run"); +import path = require("path"); +import os = require("os"); + +let taskPath = path.join(__dirname, "..", "gulptask.js"); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +if (os.type().match(/^Win/)) { + tr.setInput("cwd", "c:/fake/wd"); +} else { + tr.setInput("cwd", "/fake/wd"); +} + +tr.setInput("gulpFile", "gulpfile.js"); +tr.setInput("publishJUnitResults", "true"); +tr.setInput("testResultsFiles", "**/build/test-results/TEST-*.xml"); +tr.setInput("enableCodeCoverage", "false"); +tr.setInput("gulpjs", "node_modules/gulp/gulp.js"); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "gulp": "/usr/local/bin/gulp", + "npm": "/usr/local/bin/npm", + "node": "/usr/local/bin/node", + "istanbulWin": "/usr/local/bin/istanbul", + "istanbul": "/usr/local/bin/node_modules/istanbul/lib/cli.js", + }, + "exec": { + "/usr/local/bin/node /fake/wd/node_modules/gulp/gulp.js --gulpfile gulpfile.js": { + "code": 1, + "stdout": "gulp output here", + "stderr": "gulp failed with this output", + }, + "/usr/local/bin/node c:\\fake\\wd\\node_modules\\gulp\\gulp.js --gulpfile gulpfile.js": { + "code": 1, + "stdout": "gulp output here", + "stderr": "gulp failed with this output", + }, + "/usr/local/bin/npm install istanbul": { + "code": 0, + "stdout": "npm output here", + }, + }, + "checkPath": { + "/usr/local/bin/gulp": true, + "/usr/local/bin/npm": true, + "/usr/local/bin/node": true, + "/usr/local/bin/istanbul": true, + "/usr/local/bin/node_modules/istanbul/lib/cli.js": true, + "gulpfile.js": true, + }, + "exist": { + "/fake/wd/node_modules/gulp/gulp.js": true, + "c:\\fake\\wd\\node_modules\\gulp\\gulp.js": true, + }, + "find": { + "/user/build": ["/user/build/fun/test-123.xml"], + }, + "match": { + "**/TEST-*.xml": ["/user/build/fun/test-123.xml"], + }, +}; +tr.setAnswers(a); + +tr.run(); diff --git a/_generated/GulpV1/Tests/L0GulpFileNotSet.ts b/_generated/GulpV1/Tests/L0GulpFileNotSet.ts new file mode 100644 index 000000000000..72b5b64c15e9 --- /dev/null +++ b/_generated/GulpV1/Tests/L0GulpFileNotSet.ts @@ -0,0 +1,66 @@ +import ma = require("azure-pipelines-task-lib/mock-answer"); +import tmrm = require("azure-pipelines-task-lib/mock-run"); +import path = require("path"); +import os = require("os"); + +let taskPath = path.join(__dirname, "..", "gulptask.js"); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +if (os.type().match(/^Win/)) { + tr.setInput("cwd", "c:/fake/wd"); +} else { + tr.setInput("cwd", "/fake/wd"); +} + +tr.setInput("gulpjs", "node_modules/gulp/gulp.js"); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "gulp": "/usr/local/bin/gulp", + "npm": "/usr/local/bin/npm", + "node": "/usr/local/bin/node", + "istanbulWin": "/usr/local/bin/istanbul", + "istanbul": "/usr/local/bin/node_modules/istanbul/lib/cli.js", + }, + "exec": { + "/usr/local/bin/gulp --gulpfile gulpfile.js": { + "code": 0, + "stdout": "gulp output here", + }, + "/usr/local/bin/npm install istanbul": { + "code": 0, + "stdout": "npm output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i ./**/build/src/*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 0, + "stdout": "istanbul output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i .\\**\\build\\src\\*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 0, + "stdout": "istanbul output here", + }, + }, + "checkPath": { + "/usr/local/bin/gulp": true, + "/usr/local/bin/npm": true, + "/usr/local/bin/node": true, + "/usr/local/bin/istanbul": true, + "/usr/local/bin/node_modules/istanbul/lib/cli.js": true, + "gulpfile.js": true, + "**/build/test/*.js": true, + }, + "exist": { + "/usr/local/bin/gulp": true, + }, + "match": { + "**/TEST-*.xml": ["/user/build/fun/test-123.xml"], + "**/*.js": ["/test/test.js"], + }, + "getVariable": { + "System.DefaultWorkingDirectory": "/user/build", + }, +}; +tr.setAnswers(a); + +tr.run(); diff --git a/_generated/GulpV1/Tests/L0GulpGlobalGood.ts b/_generated/GulpV1/Tests/L0GulpGlobalGood.ts new file mode 100644 index 000000000000..5d700ee98ee0 --- /dev/null +++ b/_generated/GulpV1/Tests/L0GulpGlobalGood.ts @@ -0,0 +1,72 @@ +import ma = require("azure-pipelines-task-lib/mock-answer"); +import tmrm = require("azure-pipelines-task-lib/mock-run"); +import path = require("path"); +import os = require("os"); + +let taskPath = path.join(__dirname, "..", "gulptask.js"); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +if (os.type().match(/^Win/)) { + tr.setInput("cwd", "c:/fake/wd"); +} else { + tr.setInput("cwd", "/fake/wd"); +} + +tr.setInput("gulpFile", "gulpfile.js"); +tr.setInput("publishJUnitResults", "true"); +tr.setInput("testResultsFiles", "**/build/test-results/TEST-*.xml"); +tr.setInput("enableCodeCoverage", "false"); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "gulp": "/usr/local/bin/gulp", + "npm": "/usr/local/bin/npm", + "node": "/usr/local/bin/node", + "istanbulWin": "/usr/local/bin/istanbul", + "istanbul": "/usr/local/bin/node_modules/istanbul/lib/cli.js", + }, + "exec": { + "/usr/local/bin/gulp --gulpfile gulpfile.js": { + "code": 0, + "stdout": "gulp output here", + }, + "/usr/local/bin/npm install istanbul": { + "code": 0, + "stdout": "npm output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i ./**/build/src/*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 0, + "stdout": "istanbul output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i .\\**\\build\\src\\*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 0, + "stdout": "istanbul output here", + }, + }, + "checkPath": { + "/usr/local/bin/gulp": true, + "/usr/local/bin/npm": true, + "/usr/local/bin/node": true, + "/usr/local/bin/istanbul": true, + "/usr/local/bin/node_modules/istanbul/lib/cli.js": true, + "gulpfile.js": true, + "**/build/test/*.js": true, + }, + "exist": { + "/usr/local/bin/gulp": true, + }, + "match": { + "**/TEST-*.xml": ["/user/build/fun/test-123.xml"], + "**/*.js": ["/test/test.js"], + }, + "getVariable": { + "System.DefaultWorkingDirectory": "/user/build", + }, + "find": { + "/user/build": ["/user/build/fun/test-123.xml"], + } +}; +tr.setAnswers(a); + +tr.run(); diff --git a/_generated/GulpV1/Tests/L0GulpLocalGood.ts b/_generated/GulpV1/Tests/L0GulpLocalGood.ts new file mode 100644 index 000000000000..78813ff8a8a4 --- /dev/null +++ b/_generated/GulpV1/Tests/L0GulpLocalGood.ts @@ -0,0 +1,59 @@ +import ma = require("azure-pipelines-task-lib/mock-answer"); +import tmrm = require("azure-pipelines-task-lib/mock-run"); +import path = require("path"); +import os = require("os"); + +let taskPath = path.join(__dirname, "..", "gulptask.js"); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +if (os.type().match(/^Win/)) { + tr.setInput("cwd", "c:/fake/wd"); +} else { + tr.setInput("cwd", "/fake/wd"); +} + +tr.setInput("gulpFile", "gulpfile.js"); +tr.setInput("publishJUnitResults", "true"); +tr.setInput("testResultsFiles", "**/build/test-results/TEST-*.xml"); +tr.setInput("enableCodeCoverage", "false"); +tr.setInput("gulpjs", "node_modules/gulp/gulp.js"); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "npm": "/usr/local/bin/npm", + "node": "/usr/local/bin/node", + "istanbulWin": "/usr/local/bin/istanbul", + "istanbul": "/usr/local/bin/node_modules/istanbul/lib/cli.js", + }, + "exec": { + "/usr/local/bin/node /fake/wd/node_modules/gulp/gulp.js --gulpfile gulpfile.js": { + "code": 0, + "stdout": "gulp output here", + }, + "/usr/local/bin/node c:\\fake\\wd\\node_modules\\gulp\\gulp.js --gulpfile gulpfile.js": { + "code": 0, + "stdout": "gulp output here", + }, + }, + "checkPath": { + "/usr/local/bin/node": true, + "/usr/local/bin/npm": true, + "/usr/local/bin/istanbul": true, + "/usr/local/bin/node_modules/istanbul/lib/cli.js": true, + "gulpfile.js": true, + }, + "exist": { + "/fake/wd/node_modules/gulp/gulp.js": true, + "c:\\fake\\wd\\node_modules\\gulp\\gulp.js": true, + }, + "match": { + "**/TEST-*.xml": ["/user/build/fun/test-123.xml"], + }, + "find": { + "/user/build": ["/user/build/fun/test-123.xml"], + } +}; +tr.setAnswers(a); + +tr.run(); diff --git a/_generated/GulpV1/Tests/L0GulpLocalGoodWithCodeCoverage.ts b/_generated/GulpV1/Tests/L0GulpLocalGoodWithCodeCoverage.ts new file mode 100644 index 000000000000..ed7df8bfcd5b --- /dev/null +++ b/_generated/GulpV1/Tests/L0GulpLocalGoodWithCodeCoverage.ts @@ -0,0 +1,80 @@ +import ma = require("azure-pipelines-task-lib/mock-answer"); +import tmrm = require("azure-pipelines-task-lib/mock-run"); +import path = require("path"); +import os = require("os"); + +let taskPath = path.join(__dirname, "..", "gulptask.js"); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +if (os.type().match(/^Win/)) { + tr.setInput("cwd", "c:/fake/wd"); +} else { + tr.setInput("cwd", "/fake/wd"); +} + +tr.setInput("gulpFile", "gulpfile.js"); +tr.setInput("publishJUnitResults", "true"); +tr.setInput("testResultsFiles", "**/build/test-results/TEST-*.xml"); +tr.setInput("enableCodeCoverage", "true"); +tr.setInput("testFramework", "Mocha"); +tr.setInput("srcFiles", "**/build/src/*.js"); +tr.setInput("testFiles", "**/build/test/*.js"); +tr.setInput("gulpjs", "node_modules/gulp/gulp.js"); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "gulp": "/usr/local/bin/gulp", + "npm": "/usr/local/bin/npm", + "node": "/usr/local/bin/node", + "istanbulWin": "/usr/local/bin/istanbul", + "istanbul": "/usr/local/bin/node_modules/istanbul/lib/cli.js", + }, + "exec": { + "/usr/local/bin/node /fake/wd/node_modules/gulp/gulp.js --gulpfile gulpfile.js": { + "code": 0, + "stdout": "gulp output here", + }, + "/usr/local/bin/node c:\\fake\\wd\\node_modules\\gulp\\gulp.js --gulpfile gulpfile.js": { + "code": 0, + "stdout": "gulp output here", + }, + "/usr/local/bin/npm install istanbul": { + "code": 0, + "stdout": "npm output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i ./**/build/src/*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 0, + "stdout": "istanbul output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i .\\**\\build\\src\\*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 0, + "stdout": "istanbul output here", + }, + }, + "checkPath": { + "/usr/local/bin/npm": true, + "/usr/local/bin/node": true, + "/usr/local/bin/istanbul": true, + "/usr/local/bin/node_modules/istanbul/lib/cli.js": true, + "gulpfile.js": true, + "**/build/test/*.js": true, + }, + "exist": { + "/fake/wd/node_modules/gulp/gulp.js": true, + "c:\\fake\\wd\\node_modules\\gulp\\gulp.js": true, + }, + "match": { + "**/TEST-*.xml": ["/user/build/fun/test-123.xml"], + "**/*.js": ["/test/test.js"], + }, + "find": { + "/user/build": ["/user/build/fun/test-123.xml"], + }, + "getVariable": { + "System.DefaultWorkingDirectory": "/user/build", + }, +}; +tr.setAnswers(a); + +tr.run(); diff --git a/_generated/GulpV1/Tests/L0GulpjsNotSet.ts b/_generated/GulpV1/Tests/L0GulpjsNotSet.ts new file mode 100644 index 000000000000..d4c39f2f02a2 --- /dev/null +++ b/_generated/GulpV1/Tests/L0GulpjsNotSet.ts @@ -0,0 +1,66 @@ +import ma = require("azure-pipelines-task-lib/mock-answer"); +import tmrm = require("azure-pipelines-task-lib/mock-run"); +import path = require("path"); +import os = require("os"); + +let taskPath = path.join(__dirname, "..", "gulptask.js"); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +if (os.type().match(/^Win/)) { + tr.setInput("cwd", "c:/fake/wd"); +} else { + tr.setInput("cwd", "/fake/wd"); +} + +tr.setInput("gulpFile", "gulpfile.js"); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "gulp": "/usr/local/bin/gulp", + "npm": "/usr/local/bin/npm", + "node": "/usr/local/bin/node", + "istanbulWin": "/usr/local/bin/istanbul", + "istanbul": "/usr/local/bin/node_modules/istanbul/lib/cli.js", + }, + "exec": { + "/usr/local/bin/gulp --gulpfile gulpfile.js": { + "code": 0, + "stdout": "gulp output here", + }, + "/usr/local/bin/npm install istanbul": { + "code": 0, + "stdout": "npm output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i ./**/build/src/*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 0, + "stdout": "istanbul output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i .\\**\\build\\src\\*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 0, + "stdout": "istanbul output here", + }, + }, + "checkPath": { + "/usr/local/bin/gulp": true, + "/usr/local/bin/npm": true, + "/usr/local/bin/node": true, + "/usr/local/bin/istanbul": true, + "/usr/local/bin/node_modules/istanbul/lib/cli.js": true, + "gulpfile.js": true, + "**/build/test/*.js": true, + }, + "exist": { + "/usr/local/bin/gulp": true, + }, + "match": { + "**/TEST-*.xml": ["/user/build/fun/test-123.xml"], + "**/*.js": ["/test/test.js"], + }, + "getVariable": { + "System.DefaultWorkingDirectory": "/user/build", + }, +}; +tr.setAnswers(a); + +tr.run(); diff --git a/_generated/GulpV1/Tests/L0InvalidTestSource.ts b/_generated/GulpV1/Tests/L0InvalidTestSource.ts new file mode 100644 index 000000000000..cfa182b78e83 --- /dev/null +++ b/_generated/GulpV1/Tests/L0InvalidTestSource.ts @@ -0,0 +1,83 @@ +import ma = require("azure-pipelines-task-lib/mock-answer"); +import tmrm = require("azure-pipelines-task-lib/mock-run"); +import path = require("path"); +import os = require("os"); + +let taskPath = path.join(__dirname, "..", "gulptask.js"); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +if (os.type().match(/^Win/)) { + tr.setInput("cwd", "c:/fake/wd"); +} else { + tr.setInput("cwd", "/fake/wd"); +} + +tr.setInput("gulpFile", "gulpfile.js"); +tr.setInput("publishJUnitResults", "true"); +tr.setInput("testResultsFiles", "**/build/test-results/TEST-*.xml"); +tr.setInput("enableCodeCoverage", "true"); +tr.setInput("testFramework", "Mocha"); +tr.setInput("srcFiles", "**/build/src/*.js"); +tr.setInput("testFiles", "/invalid/input"); +tr.setInput("gulpjs", "node_modules/gulp/gulp.js"); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "gulp": "/usr/local/bin/gulp", + "npm": "/usr/local/bin/npm", + "node": "/usr/local/bin/node", + "istanbulWin": "/usr/local/bin/istanbul", + "istanbul": "/usr/local/bin/node_modules/istanbul/lib/cli.js", + }, + "exec": { + "/usr/local/bin/node /fake/wd/node_modules/gulp/gulp.js --gulpfile gulpfile.js": { + "code": 0, + "stdout": "gulp output here", + }, + "/usr/local/bin/node c:\\fake\\wd\\node_modules\\gulp\\gulp.js --gulpfile gulpfile.js": { + "code": 0, + "stdout": "gulp output here", + }, + "/usr/local/bin/npm install istanbul": { + "code": 0, + "stdout": "npm output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i ./**/build/src/*.js ./node_modules/mocha/bin/_mocha /invalid/input": { + "code": 1, + "stdout": "istanbul output here", + "stderr": "istanbul failed with this output", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i .\\**\\build\\src\\*.js ./node_modules/mocha/bin/_mocha /invalid/input": { + "code": 1, + "stdout": "istanbul output here", + "stderr": "istanbul failed with this output", + }, + }, + "checkPath": { + "/usr/local/bin/gulp": true, + "/usr/local/bin/npm": true, + "/usr/local/bin/node": true, + "/usr/local/bin/istanbul": true, + "/usr/local/bin/node_modules/istanbul/lib/cli.js": true, + "gulpfile.js": true, + "**/build/test/*.js": true, + }, + "exist": { + "/fake/wd/node_modules/gulp/gulp.js": true, + "c:\\fake\\wd\\node_modules\\gulp\\gulp.js": true, + }, + "match": { + "**/TEST-*.xml": ["/user/build/fun/test-123.xml"], + "**/*.js": ["/test/test.js"], + }, + "find": { + "/user/build": ["/user/build/fun/test-123.xml"], + }, + "getVariable": { + "System.DefaultWorkingDirectory": "/user/build", + }, +}; +tr.setAnswers(a); + +tr.run(); diff --git a/_generated/GulpV1/Tests/L0IstanbulFails.ts b/_generated/GulpV1/Tests/L0IstanbulFails.ts new file mode 100644 index 000000000000..39553382a7ea --- /dev/null +++ b/_generated/GulpV1/Tests/L0IstanbulFails.ts @@ -0,0 +1,83 @@ +import ma = require("azure-pipelines-task-lib/mock-answer"); +import tmrm = require("azure-pipelines-task-lib/mock-run"); +import path = require("path"); +import os = require("os"); + +let taskPath = path.join(__dirname, "..", "gulptask.js"); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +if (os.type().match(/^Win/)) { + tr.setInput("cwd", "c:/fake/wd"); +} else { + tr.setInput("cwd", "/fake/wd"); +} + +tr.setInput("gulpFile", "gulpfile.js"); +tr.setInput("publishJUnitResults", "true"); +tr.setInput("testResultsFiles", "**/build/test-results/TEST-*.xml"); +tr.setInput("enableCodeCoverage", "true"); +tr.setInput("testFramework", "Mocha"); +tr.setInput("srcFiles", "**/build/src/*.js"); +tr.setInput("testFiles", "**/build/test/*.js"); +tr.setInput("gulpjs", "node_modules/gulp/gulp.js"); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "gulp": "/usr/local/bin/gulp", + "npm": "/usr/local/bin/npm", + "node": "/usr/local/bin/node", + "istanbulWin": "/usr/local/bin/istanbul", + "istanbul": "/usr/local/bin/node_modules/istanbul/lib/cli.js", + }, + "exec": { + "/usr/local/bin/node /fake/wd/node_modules/gulp/gulp.js --gulpfile gulpfile.js": { + "code": 0, + "stdout": "gulp output here", + }, + "/usr/local/bin/node c:\\fake\\wd\\node_modules\\gulp\\gulp.js --gulpfile gulpfile.js": { + "code": 0, + "stdout": "gulp output here", + }, + "/usr/local/bin/npm install istanbul": { + "code": 0, + "stdout": "npm output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i ./**/build/src/*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 1, + "stdout": "istanbul output here", + "stderr": "istanbul failed with this output", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i .\\**\\build\\src\\*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 1, + "stdout": "istanbul output here", + "stderr": "istanbul failed with this output", + }, + }, + "checkPath": { + "/usr/local/bin/gulp": true, + "/usr/local/bin/npm": true, + "/usr/local/bin/node": true, + "/usr/local/bin/istanbul": true, + "/usr/local/bin/node_modules/istanbul/lib/cli.js": true, + "gulpfile.js": true, + "**/build/test/*.js": true, + }, + "exist": { + "/fake/wd/node_modules/gulp/gulp.js": true, + "c:\\fake\\wd\\node_modules\\gulp\\gulp.js": true, + }, + "match": { + "**/TEST-*.xml": ["/user/build/fun/test-123.xml"], + "**/*.js": ["/test/test.js"], + }, + "find": { + "/user/build": ["/user/build/fun/test-123.xml"], + }, + "getVariable": { + "System.DefaultWorkingDirectory": "/user/build", + }, +}; +tr.setAnswers(a); + +tr.run(); diff --git a/_generated/GulpV1/Tests/L0NoGulp.ts b/_generated/GulpV1/Tests/L0NoGulp.ts new file mode 100644 index 000000000000..1c2e8b62b4a7 --- /dev/null +++ b/_generated/GulpV1/Tests/L0NoGulp.ts @@ -0,0 +1,42 @@ +import ma = require("azure-pipelines-task-lib/mock-answer"); +import tmrm = require("azure-pipelines-task-lib/mock-run"); +import path = require("path"); +import os = require("os"); + +let taskPath = path.join(__dirname, "..", "gulptask.js"); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +if (os.type().match(/^Win/)) { + tr.setInput("cwd", "c:/fake/wd"); +} else { + tr.setInput("cwd", "/fake/wd"); +} + +tr.setInput("gulpFile", "gulpfile.js"); +tr.setInput("publishJUnitResults", "true"); +tr.setInput("testResultsFiles", "**/build/test-results/TEST-*.xml"); +tr.setInput("enableCodeCoverage", "false"); +tr.setInput("gulpjs", "node_modules/gulp/gulp.js"); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "npm": "/usr/local/bin/npm", + "node": "/usr/local/bin/node", + "istanbulWin": "/usr/local/bin/istanbul", + "istanbul": "/usr/local/bin/node_modules/istanbul/lib/cli.js", + }, + "checkPath": { + "/usr/local/bin/npm": true, + "/usr/local/bin/node": true, + "/usr/local/bin/istanbul": true, + "/usr/local/bin/node_modules/istanbul/lib/cli.js": true, + "gulpfile.js": true, + }, + "match": { + "**/TEST-*.xml": ["/user/build/fun/test-123.xml"], + }, +}; +tr.setAnswers(a); + +tr.run(); diff --git a/_generated/GulpV1/Tests/L0NoGulpFile.ts b/_generated/GulpV1/Tests/L0NoGulpFile.ts new file mode 100644 index 000000000000..c454170f153e --- /dev/null +++ b/_generated/GulpV1/Tests/L0NoGulpFile.ts @@ -0,0 +1,26 @@ +import ma = require("azure-pipelines-task-lib/mock-answer"); +import tmrm = require("azure-pipelines-task-lib/mock-run"); +import path = require("path"); +import os = require("os"); + +let taskPath = path.join(__dirname, "..", "gulptask.js"); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +if (os.type().match(/^Win/)) { + tr.setInput("cwd", "c:/fake/wd"); +} else { + tr.setInput("cwd", "/fake/wd"); +} + +tr.setInput("gulpFile", "gulpfile.js"); +tr.setInput("gulpjs", "node_modules/gulp/gulp.js"); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "checkPath": { + "gulpfile.js": false, + }, +}; +tr.setAnswers(a); + +tr.run(); diff --git a/_generated/GulpV1/Tests/L0NoTestSourceFiles.ts b/_generated/GulpV1/Tests/L0NoTestSourceFiles.ts new file mode 100644 index 000000000000..cf3bc56b7add --- /dev/null +++ b/_generated/GulpV1/Tests/L0NoTestSourceFiles.ts @@ -0,0 +1,77 @@ +import ma = require("azure-pipelines-task-lib/mock-answer"); +import tmrm = require("azure-pipelines-task-lib/mock-run"); +import path = require("path"); +import os = require("os"); + +let taskPath = path.join(__dirname, "..", "gulptask.js"); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +if (os.type().match(/^Win/)) { + tr.setInput("cwd", "c:/fake/wd"); +} else { + tr.setInput("cwd", "/fake/wd"); +} + +tr.setInput("gulpFile", "gulpfile.js"); +tr.setInput("publishJUnitResults", "true"); +tr.setInput("testResultsFiles", "**/build/test-results/TEST-*.xml"); +tr.setInput("enableCodeCoverage", "true"); +tr.setInput("testFramework", "Mocha"); +tr.setInput("srcFiles", "**/build/src/*.js"); +tr.setInput("gulpjs", "node_modules/gulp/gulp.js"); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "gulp": "/usr/local/bin/gulp", + "npm": "/usr/local/bin/npm", + "node": "/usr/local/bin/node", + "istanbulWin": "/usr/local/bin/istanbul", + "istanbul": "/usr/local/bin/node_modules/istanbul/lib/cli.js", + }, + "exec": { + "/usr/local/bin/node /fake/wd/node_modules/gulp/gulp.js --gulpfile gulpfile.js": { + "code": 0, + "stdout": "gulp output here", + }, + "/usr/local/bin/node c:\\fake\\wd\\node_modules\\gulp\\gulp.js --gulpfile gulpfile.js": { + "code": 0, + "stdout": "gulp output here", + }, + "/usr/local/bin/npm install istanbul": { + "code": 0, + "stdout": "npm output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i ./**/build/src/*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 0, + "stdout": "istanbul output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i .\\**\\build\\src\\*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 0, + "stdout": "istanbul output here", + }, + }, + "checkPath": { + "/usr/local/bin/gulp": true, + "/usr/local/bin/npm": true, + "/usr/local/bin/node": true, + "/usr/local/bin/istanbul": true, + "/usr/local/bin/node_modules/istanbul/lib/cli.js": true, + "gulpfile.js": true, + "**/build/test/*.js": true, + }, + "exist": { + "/fake/wd/node_modules/gulp/gulp.js": true, + "c:\\fake\\wd\\node_modules\\gulp\\gulp.js": true, + }, + "match": { + "**/TEST-*.xml": ["/user/build/fun/test-123.xml"], + "**/*.js": ["/test/test.js"], + }, + "getVariable": { + "System.DefaultWorkingDirectory": "/user/build", + }, +}; +tr.setAnswers(a); + +tr.run(); diff --git a/_generated/GulpV1/Tests/L0NpmFails.ts b/_generated/GulpV1/Tests/L0NpmFails.ts new file mode 100644 index 000000000000..7fbef97c876c --- /dev/null +++ b/_generated/GulpV1/Tests/L0NpmFails.ts @@ -0,0 +1,73 @@ +import ma = require("azure-pipelines-task-lib/mock-answer"); +import tmrm = require("azure-pipelines-task-lib/mock-run"); +import path = require("path"); +import os = require("os"); + +let taskPath = path.join(__dirname, "..", "gulptask.js"); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +if (os.type().match(/^Win/)) { + tr.setInput("cwd", "c:/fake/wd"); +} else { + tr.setInput("cwd", "/fake/wd"); +} + +tr.setInput("gulpFile", "gulpfile.js"); +tr.setInput("publishJUnitResults", "true"); +tr.setInput("testResultsFiles", "**/build/test-results/TEST-*.xml"); +tr.setInput("enableCodeCoverage", "true"); +tr.setInput("testFramework", "Mocha"); +tr.setInput("srcFiles", "**/build/src/*.js"); +tr.setInput("testFiles", "**/build/test/*.js"); +tr.setInput("gulpjs", "node_modules/gulp/gulp.js"); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "gulp": "/usr/local/bin/gulp", + "npm": "/usr/local/bin/npm", + "node": "/usr/local/bin/node", + "istanbulWin": "/usr/local/bin/istanbul", + "istanbul": "/usr/local/bin/node_modules/istanbul/lib/cli.js", + }, + "exec": { + "/usr/local/bin/node /fake/wd/node_modules/gulp/gulp.js --gulpfile gulpfile.js": { + "code": 0, + "stdout": "gulp output here", + }, + "/usr/local/bin/node c:\\fake\\wd\\node_modules\\gulp\\gulp.js --gulpfile gulpfile.js": { + "code": 0, + "stdout": "gulp output here", + }, + "/usr/local/bin/npm install istanbul": { + "code": 1, + "stdout": "npm output here", + "stderr": "npm failed with this output", + }, + }, + "checkPath": { + "/usr/local/bin/gulp": true, + "/usr/local/bin/npm": true, + "/usr/local/bin/node": true, + "/usr/local/bin/istanbul": true, + "/usr/local/bin/node_modules/istanbul/lib/cli.js": true, + "gulpfile.js": true, + }, + "exist": { + "/fake/wd/node_modules/gulp/gulp.js": true, + "c:\\fake\\wd\\node_modules\\gulp\\gulp.js": true, + }, + "match": { + "**/TEST-*.xml": ["/user/build/fun/test-123.xml"], + "**/*.js": ["/test/test.js"], + }, + "find": { + "/user/build": ["/user/build/fun/test-123.xml"], + }, + "getVariable": { + "System.DefaultWorkingDirectory": "/user/build", + }, +}; +tr.setAnswers(a); + +tr.run(); diff --git a/_generated/GulpV1/Tests/L0PublishJUnitTestResultsFalse.ts b/_generated/GulpV1/Tests/L0PublishJUnitTestResultsFalse.ts new file mode 100644 index 000000000000..78fee63af321 --- /dev/null +++ b/_generated/GulpV1/Tests/L0PublishJUnitTestResultsFalse.ts @@ -0,0 +1,74 @@ +import ma = require("azure-pipelines-task-lib/mock-answer"); +import tmrm = require("azure-pipelines-task-lib/mock-run"); +import path = require("path"); +import os = require("os"); + +let taskPath = path.join(__dirname, "..", "gulptask.js"); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +if (os.type().match(/^Win/)) { + tr.setInput("cwd", "c:/fake/wd"); +} else { + tr.setInput("cwd", "/fake/wd"); +} + +tr.setInput("gulpFile", "gulpfile.js"); +tr.setInput("publishJUnitResults", "false"); +tr.setInput("enableCodeCoverage", "false"); +tr.setInput("gulpjs", "node_modules/gulp/gulp.js"); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "gulp": "/usr/local/bin/gulp", + "npm": "/usr/local/bin/npm", + "node": "/usr/local/bin/node", + "istanbulWin": "/usr/local/bin/istanbul", + "istanbul": "/usr/local/bin/node_modules/istanbul/lib/cli.js", + }, + "exec": { + "/usr/local/bin/node /fake/wd/node_modules/gulp/gulp.js --gulpfile gulpfile.js": { + "code": 0, + "stdout": "gulp output here", + }, + "/usr/local/bin/node c:\\fake\\wd\\node_modules\\gulp\\gulp.js --gulpfile gulpfile.js": { + "code": 0, + "stdout": "gulp output here", + }, + "/usr/local/bin/npm install istanbul": { + "code": 0, + "stdout": "npm output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i ./**/build/src/*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 0, + "stdout": "istanbul output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i .\\**\\build\\src\\*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 0, + "stdout": "istanbul output here", + }, + }, + "checkPath": { + "/usr/local/bin/gulp": true, + "/usr/local/bin/npm": true, + "/usr/local/bin/node": true, + "/usr/local/bin/istanbul": true, + "/usr/local/bin/node_modules/istanbul/lib/cli.js": true, + "gulpfile.js": true, + "**/build/test/*.js": true, + }, + "exist": { + "/fake/wd/node_modules/gulp/gulp.js": true, + "c:\\fake\\wd\\node_modules\\gulp\\gulp.js": true, + }, + "match": { + "**/TEST-*.xml": ["/user/build/fun/test-123.xml"], + "**/*.js": ["/test/test.js"], + }, + "getVariable": { + "System.DefaultWorkingDirectory": "/user/build", + }, +}; +tr.setAnswers(a); + +tr.run(); diff --git a/_generated/GulpV1/Tests/L0TestResultFilesDoesNotMatchAnyFile.ts b/_generated/GulpV1/Tests/L0TestResultFilesDoesNotMatchAnyFile.ts new file mode 100644 index 000000000000..9652a31f3870 --- /dev/null +++ b/_generated/GulpV1/Tests/L0TestResultFilesDoesNotMatchAnyFile.ts @@ -0,0 +1,75 @@ +import ma = require("azure-pipelines-task-lib/mock-answer"); +import tmrm = require("azure-pipelines-task-lib/mock-run"); +import path = require("path"); +import os = require("os"); + +let taskPath = path.join(__dirname, "..", "gulptask.js"); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +if (os.type().match(/^Win/)) { + tr.setInput("cwd", "c:/fake/wd"); +} else { + tr.setInput("cwd", "/fake/wd"); +} + +tr.setInput("gulpFile", "gulpfile.js"); +tr.setInput("publishJUnitResults", "true"); +tr.setInput("testResultsFiles", "/invalid/input"); +tr.setInput("enableCodeCoverage", "false"); +tr.setInput("gulpjs", "node_modules/gulp/gulp.js"); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "gulp": "/usr/local/bin/gulp", + "npm": "/usr/local/bin/npm", + "node": "/usr/local/bin/node", + "istanbulWin": "/usr/local/bin/istanbul", + "istanbul": "/usr/local/bin/node_modules/istanbul/lib/cli.js", + }, + "exec": { + "/usr/local/bin/node /fake/wd/node_modules/gulp/gulp.js --gulpfile gulpfile.js": { + "code": 0, + "stdout": "gulp output here", + }, + "/usr/local/bin/node c:\\fake\\wd\\node_modules\\gulp\\gulp.js --gulpfile gulpfile.js": { + "code": 0, + "stdout": "gulp output here", + }, + "/usr/local/bin/npm install istanbul": { + "code": 0, + "stdout": "npm output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i ./**/build/src/*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 0, + "stdout": "istanbul output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i .\\**\\build\\src\\*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 0, + "stdout": "istanbul output here", + }, + }, + "checkPath": { + "/usr/local/bin/gulp": true, + "/usr/local/bin/npm": true, + "/usr/local/bin/node": true, + "/usr/local/bin/istanbul": true, + "/usr/local/bin/node_modules/istanbul/lib/cli.js": true, + "gulpfile.js": true, + "**/build/test/*.js": true, + }, + "exist": { + "/fake/wd/node_modules/gulp/gulp.js": true, + "c:\\fake\\wd\\node_modules\\gulp\\gulp.js": true, + }, + "match": { + "**/TEST-*.xml": ["/user/build/fun/test-123.xml"], + "**/*.js": ["/test/test.js"], + }, + "getVariable": { + "System.DefaultWorkingDirectory": "/user/build", + }, +}; +tr.setAnswers(a); + +tr.run(); diff --git a/_generated/GulpV1/Tests/L0TestResultFilesNotSet.ts b/_generated/GulpV1/Tests/L0TestResultFilesNotSet.ts new file mode 100644 index 000000000000..fdb5d458ac4b --- /dev/null +++ b/_generated/GulpV1/Tests/L0TestResultFilesNotSet.ts @@ -0,0 +1,69 @@ +import ma = require("azure-pipelines-task-lib/mock-answer"); +import tmrm = require("azure-pipelines-task-lib/mock-run"); +import path = require("path"); +import os = require("os"); + +let taskPath = path.join(__dirname, "..", "gulptask.js"); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +if (os.type().match(/^Win/)) { + tr.setInput("cwd", "c:/fake/wd"); +} else { + tr.setInput("cwd", "/fake/wd"); +} + +tr.setInput("gulpFile", "gulpfile.js"); +tr.setInput("publishJUnitResults", "true"); +tr.setInput("enableCodeCoverage", "false"); +tr.setInput("gulpjs", "node_modules/gulp/gulp.js"); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "gulp": "/usr/local/bin/gulp", + "npm": "/usr/local/bin/npm", + "node": "/usr/local/bin/node", + "istanbulWin": "/usr/local/bin/istanbul", + "istanbul": "/usr/local/bin/node_modules/istanbul/lib/cli.js", + }, + "exec": { + "/usr/local/bin/gulp --gulpfile gulpfile.js": { + "code": 0, + "stdout": "gulp output here", + }, + "/usr/local/bin/npm install istanbul": { + "code": 0, + "stdout": "npm output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i ./**/build/src/*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 0, + "stdout": "istanbul output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i .\\**\\build\\src\\*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 0, + "stdout": "istanbul output here", + }, + }, + "checkPath": { + "/usr/local/bin/gulp": true, + "/usr/local/bin/npm": true, + "/usr/local/bin/node": true, + "/usr/local/bin/istanbul": true, + "/usr/local/bin/node_modules/istanbul/lib/cli.js": true, + "gulpfile.js": true, + "**/build/test/*.js": true, + }, + "exist": { + "/usr/local/bin/gulp": true, + }, + "match": { + "**/TEST-*.xml": ["/user/build/fun/test-123.xml"], + "**/*.js": ["/test/test.js"], + }, + "getVariable": { + "System.DefaultWorkingDirectory": "/user/build", + }, +}; +tr.setAnswers(a); + +tr.run(); diff --git a/_generated/GulpV1/Tests/package-lock.json b/_generated/GulpV1/Tests/package-lock.json new file mode 100644 index 000000000000..b4c44bb0b819 --- /dev/null +++ b/_generated/GulpV1/Tests/package-lock.json @@ -0,0 +1,14 @@ +{ + "name": "gulp-tests", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/mocha": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", + "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==", + "dev": true + } + } +} diff --git a/_generated/GulpV1/Tests/package.json b/_generated/GulpV1/Tests/package.json new file mode 100644 index 000000000000..e15110b1b699 --- /dev/null +++ b/_generated/GulpV1/Tests/package.json @@ -0,0 +1,22 @@ +{ + "name": "gulp-tests", + "version": "1.0.0", + "description": "Azure Pipelines Gulp V1 Task Tests", + "main": "L0.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/Microsoft/azure-pipelines-tasks.git" + }, + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Microsoft/azure-pipelines-tasks/issues" + }, + "homepage": "https://github.com/Microsoft/azure-pipelines-tasks#readme", + "devDependencies": { + "@types/mocha": "^5.2.7" + } +} diff --git a/_generated/GulpV1/gulptask.ts b/_generated/GulpV1/gulptask.ts new file mode 100644 index 000000000000..a8f11e49d030 --- /dev/null +++ b/_generated/GulpV1/gulptask.ts @@ -0,0 +1,120 @@ +import path = require('path'); +import tl = require('azure-pipelines-task-lib/task'); +import minimatch = require('minimatch'); + +tl.setResourcePath(path.join(__dirname, 'task.json')); + +var cwd = tl.getPathInput('cwd', true, false); +tl.mkdirP(cwd); +tl.cd(cwd); + +var gulpFile = tl.getPathInput('gulpFile', true, true); +tl.debug('check gulp file :' + gulpFile); +var isCodeCoverageEnabled = tl.getBoolInput('enableCodeCoverage'); +var publishJUnitResults = tl.getBoolInput('publishJUnitResults'); +var testResultsFiles = tl.getInput('testResultsFiles', publishJUnitResults); + +tl.debug('resolving either gulpjs or gulp'); +var gulpjs = tl.getInput('gulpjs', false); +if (gulpjs) { + tl.debug('gulpjs set'); + gulpjs = path.resolve(cwd, gulpjs); + tl.debug('check path : ' + gulpjs); + if (!tl.exist(gulpjs)) { + tl.setResult(tl.TaskResult.Failed, tl.loc('GulpNotInstalled', gulpjs)); + } + var gt = tl.tool(tl.which('node', true)); + gt.arg(gulpjs); +} +else { + tl.debug('gulpjs not set'); + var gulp = tl.which('gulp', true); + var gt = tl.tool(gulp); +} + +if (isCodeCoverageEnabled) { + var npm = tl.tool(tl.which('npm', true)); + npm.line('install istanbul'); + var testFramework = tl.getInput('testFramework', true); + var srcFiles = tl.getInput('srcFiles', false); + var testSrc = tl.getPathInput('testFiles', true, false); + var istanbul = tl.tool(tl.which('node', true)); + istanbul.arg('./node_modules/istanbul/lib/cli.js'); + istanbul.line('cover --report cobertura --report html'); + if (srcFiles) { + istanbul.line('-i .' + path.sep + path.join(srcFiles)); + } + if (testFramework.toLowerCase() == 'jasmine') { + istanbul.line('./node_modules/jasmine/bin/jasmine.js JASMINE_CONFIG_PATH=node_modules/jasmine/lib/examples/jasmine.json'); + } else { + istanbul.arg('./node_modules/mocha/bin/_mocha'); + } + istanbul.arg(testSrc); + var summaryFile = path.join(cwd, 'coverage/cobertura-coverage.xml'); + var reportDirectory = path.join(cwd, 'coverage/'); +} + +// optional - no targets will concat nothing +gt.arg(tl.getDelimitedInput('targets', ' ', false)); +gt.arg(['--gulpfile', gulpFile]); +gt.line(tl.getInput('arguments', false)); +gt.exec().then(function (code) { + publishTestResults(publishJUnitResults, testResultsFiles); + if (isCodeCoverageEnabled) { + npm.exec().then(function () { + istanbul.exec().then(function (code) { + publishCodeCoverage(summaryFile); + tl.setResult(tl.TaskResult.Succeeded, tl.loc('GulpReturnCode', code)); + }).fail(function (err) { + publishCodeCoverage(summaryFile); + tl.debug('taskRunner fail'); + tl.setResult(tl.TaskResult.Failed, tl.loc('IstanbulFailed', err.message)); + }); + }).fail(function (err) { + tl.debug('taskRunner fail'); + tl.setResult(tl.TaskResult.Failed, tl.loc('NpmFailed', err.message)); + }) + } else { + tl.setResult(tl.TaskResult.Succeeded, tl.loc('GulpReturnCode', code)); + } +}).fail(function (err) { + publishTestResults(publishJUnitResults, testResultsFiles); + tl.debug('taskRunner fail'); + tl.setResult(tl.TaskResult.Failed, tl.loc('GulpFailed', err.message)); +}) + +function publishTestResults(publishJUnitResults, testResultsFiles: string) { + if (publishJUnitResults) { + //check for pattern in testResultsFiles + if (testResultsFiles.indexOf('*') >= 0 || testResultsFiles.indexOf('?') >= 0) { + tl.debug('Pattern found in testResultsFiles parameter'); + var buildFolder = tl.getVariable('System.DefaultWorkingDirectory'); + var allFiles = tl.find(buildFolder); + var matchingTestResultsFiles = minimatch.match(allFiles, testResultsFiles, { matchBase: true }); + } + else { + tl.debug('No pattern found in testResultsFiles parameter'); + var matchingTestResultsFiles = [testResultsFiles]; + } + if (!matchingTestResultsFiles || matchingTestResultsFiles.length == 0) { + tl.warning('No test result files matching ' + testResultsFiles + ' were found, so publishing JUnit test results is being skipped.'); + return 0; + } + var tp = new tl.TestPublisher("JUnit"); + try { + tp.publish(matchingTestResultsFiles, 'true', "", "", "", 'true'); + } catch (error) { + tl.warning(error); + } + } +} + +function publishCodeCoverage(summaryFile) { + try { + var ccPublisher = new tl.CodeCoveragePublisher(); + ccPublisher.publish('cobertura', summaryFile, reportDirectory, ""); + } catch (error) { + tl.warning(error); + throw error; + } +} diff --git a/_generated/GulpV1/icon.png b/_generated/GulpV1/icon.png new file mode 100644 index 000000000000..10372dbd6051 Binary files /dev/null and b/_generated/GulpV1/icon.png differ diff --git a/_generated/GulpV1/icon.svg b/_generated/GulpV1/icon.svg new file mode 100644 index 000000000000..ab3c0435f0b3 --- /dev/null +++ b/_generated/GulpV1/icon.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/_generated/GulpV1/package-lock.json b/_generated/GulpV1/package-lock.json new file mode 100644 index 000000000000..7b0f049d85af --- /dev/null +++ b/_generated/GulpV1/package-lock.json @@ -0,0 +1,497 @@ +{ + "name": "vsts-gulp-task", + "requires": true, + "lockfileVersion": 1, + "dependencies": { + "@types/concat-stream": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz", + "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==", + "requires": { + "@types/node": "*" + } + }, + "@types/form-data": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", + "integrity": "sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==", + "requires": { + "@types/node": "*" + } + }, + "@types/mocha": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", + "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==" + }, + "@types/node": { + "version": "16.11.58", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.58.tgz", + "integrity": "sha512-uMVxJ111wpHzkx/vshZFb6Qni3BOMnlWLq7q9jrwej7Yw/KvjsEbpxCCxw+hLKxexFMc8YmpG8J9tnEe/rKsIg==" + }, + "@types/q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.1.tgz", + "integrity": "sha512-eqz8c/0kwNi/OEHQfvIuJVLTst3in0e7uTKeuY+WL/zfKn0xVujOTp42bS/vUUokhK5P2BppLd9JXMOMHcgbjA==" + }, + "@types/qs": { + "version": "6.9.8", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.8.tgz", + "integrity": "sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg==" + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "azure-pipelines-task-lib": { + "version": "5.0.0-preview.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-5.0.0-preview.0.tgz", + "integrity": "sha512-uQJEv+q3/7RD7kgphFd33uXijaPwA1ePYoNkAgZpUhbZUtc2u4JL4ujTT/JJfgXBNW/QQNAiDQ2OC7vOQG/0tg==", + "requires": { + "minimatch": "3.0.5", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "sync-request": "6.1.0", + "uuid": "^3.0.1" + }, + "dependencies": { + "minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "brace-expansion": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", + "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, + "form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + } + }, + "get-port": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", + "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==" + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "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" + }, + "dependencies": { + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==" + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "http-basic": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", + "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", + "requires": { + "caseless": "^0.12.0", + "concat-stream": "^1.6.2", + "http-response-object": "^3.0.1", + "parse-cache-control": "^1.0.1" + } + }, + "http-response-object": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", + "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", + "requires": { + "@types/node": "^10.0.3" + }, + "dependencies": { + "@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + } + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" + }, + "is-core-module": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "requires": { + "has": "^1.0.3" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, + "parse-cache-control": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", + "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "promise": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", + "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", + "requires": { + "asap": "~2.0.6" + } + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==" + }, + "qs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "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" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "requires": { + "resolve": "^1.1.6" + } + }, + "resolve": { + "version": "1.22.6", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.6.tgz", + "integrity": "sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==", + "requires": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" + }, + "shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, + "sync-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", + "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==", + "requires": { + "http-response-object": "^3.0.1", + "sync-rpc": "^1.2.1", + "then-request": "^6.0.0" + } + }, + "sync-rpc": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz", + "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==", + "requires": { + "get-port": "^3.1.0" + } + }, + "then-request": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", + "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", + "requires": { + "@types/concat-stream": "^1.6.0", + "@types/form-data": "0.0.33", + "@types/node": "^8.0.0", + "@types/qs": "^6.2.31", + "caseless": "~0.12.0", + "concat-stream": "^1.6.0", + "form-data": "^2.2.0", + "http-basic": "^8.1.1", + "http-response-object": "^3.0.1", + "promise": "^8.0.0", + "qs": "^6.4.0" + }, + "dependencies": { + "@types/node": { + "version": "8.10.66", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", + "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==" + } + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, + "typescript": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.2.tgz", + "integrity": "sha512-e4ERvRV2wb+rRZ/IQeb3jm2VxBsirQLpQhdxplZ2MEzGvDkkMmPglecnNDfSUBivMjP93vRbngYYDQqQ/78bcQ==", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + } + } +} diff --git a/_generated/GulpV1/package.json b/_generated/GulpV1/package.json new file mode 100644 index 000000000000..576e1a47019b --- /dev/null +++ b/_generated/GulpV1/package.json @@ -0,0 +1,24 @@ +{ + "name": "vsts-gulp-task", + "description": "Azure Pipelines gulp tasks", + "repository": { + "type": "git", + "url": "git+https://github.com/microsoft/vsts-tasks.git" + }, + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/microsoft/vsts-tasks/issues" + }, + "homepage": "https://github.com/microsoft/vsts-tasks#readme", + "dependencies": { + "azure-pipelines-task-lib": "^5.0.0-preview.0", + "minimatch": "^3.0.4", + "@types/node": "^16.11.39", + "@types/mocha": "^5.2.7", + "@types/q": "^1.0.7" + }, + "devDependencies": { + "typescript": "4.0.2" + } +} diff --git a/_generated/GulpV1/task.json b/_generated/GulpV1/task.json new file mode 100644 index 000000000000..c55add2d61d6 --- /dev/null +++ b/_generated/GulpV1/task.json @@ -0,0 +1,184 @@ +{ + "id": "B82CFBE4-34F9-40F5-889E-C8842CA9DD9D", + "name": "gulp", + "friendlyName": "gulp", + "description": "Run the gulp Node.js streaming task-based build system", + "helpUrl": "https://docs.microsoft.com/azure/devops/pipelines/tasks/build/gulp", + "helpMarkDown": "[Learn more about this task](https://go.microsoft.com/fwlink/?LinkID=613721)", + "category": "Build", + "visibility": [ + "Build" + ], + "runsOn": [ + "Agent", + "DeploymentGroup" + ], + "author": "Microsoft Corporation", + "preview": true, + "version": { + "Major": 1, + "Minor": 229, + "Patch": 0 + }, + "demands": [ + "node.js" + ], + "minimumAgentVersion": "1.91.0", + "groups": [ + { + "name": "advanced", + "displayName": "Advanced", + "isExpanded": false + }, + { + "name": "junitTestResults", + "displayName": "JUnit Test Results", + "isExpanded": true + }, + { + "name": "codeCoverage", + "displayName": "Code Coverage", + "isExpanded": true + } + ], + "instanceNameFormat": "gulp $(targets)", + "inputs": [ + { + "name": "gulpFile", + "type": "filePath", + "label": "gulp File Path", + "defaultValue": "gulpfile.js", + "required": false, + "helpMarkDown": "Relative path from repo root of the gulp file script file to run." + }, + { + "name": "targets", + "type": "string", + "label": "gulp Task(s)", + "defaultValue": "", + "helpMarkDown": "Optional. Space delimited list of tasks to run. If not specified, the default task will run.", + "required": false + }, + { + "name": "arguments", + "type": "string", + "label": "Arguments", + "defaultValue": "", + "helpMarkDown": "Additional arguments passed to gulp. --gulpfile is not needed since already added via gulpFile input above.", + "required": false + }, + { + "name": "cwd", + "aliases": [ + "workingDirectory" + ], + "type": "filePath", + "label": "Working Directory", + "defaultValue": "", + "required": false, + "helpMarkDown": "Current working directory when script is run. Defaults to the folder where the script is located.", + "groupName": "advanced" + }, + { + "name": "gulpjs", + "type": "string", + "label": "gulp.js location", + "defaultValue": "", + "required": false, + "helpMarkDown": "Path to an alternative gulp.js, relative to the working directory.", + "groupName": "advanced" + }, + { + "name": "publishJUnitResults", + "type": "boolean", + "label": "Publish to Azure Pipelines", + "defaultValue": "false", + "groupName": "junitTestResults", + "helpMarkDown": "Select this option to publish JUnit test results produced by the gulp build to Azure Pipelines." + }, + { + "name": "testResultsFiles", + "type": "filePath", + "label": "Test Results Files", + "defaultValue": "**/TEST-*.xml", + "required": true, + "groupName": "junitTestResults", + "helpMarkDown": "Test results files path. Wildcards can be used. For example, `**/TEST-*.xml` for all XML files whose name starts with TEST-.", + "visibleRule": "publishJUnitResults = true" + }, + { + "name": "testRunTitle", + "type": "string", + "label": "Test Run Title", + "defaultValue": "", + "required": false, + "groupName": "junitTestResults", + "helpMarkDown": "Provide a name for the test run.", + "visibleRule": "publishJUnitResults = true" + }, + { + "name": "enableCodeCoverage", + "type": "boolean", + "label": "Enable code Coverage", + "required": true, + "defaultValue": "false", + "groupName": "codeCoverage", + "helpMarkDown": "Select this option to enable Code Coverage using Istanbul." + }, + { + "name": "testFramework", + "type": "pickList", + "label": "Test Framework", + "required": false, + "groupName": "codeCoverage", + "defaultValue": "Mocha", + "helpMarkDown": "Select your test framework.", + "options": { + "Mocha": "Mocha", + "Jasmine": "Jasmine" + }, + "visibleRule": "enableCodeCoverage = true" + }, + { + "name": "srcFiles", + "type": "string", + "label": "Source Files", + "defaultValue": "", + "required": false, + "groupName": "codeCoverage", + "helpMarkDown": "Provide the path to your source files which you want to hookRequire()", + "visibleRule": "enableCodeCoverage = true" + }, + { + "name": "testFiles", + "type": "string", + "label": "Test Script Files", + "defaultValue": "test/*.js", + "required": true, + "groupName": "codeCoverage", + "helpMarkDown": "Provide the path to your test script files", + "visibleRule": "enableCodeCoverage = true" + } + ], + "execution": { + "Node10": { + "target": "gulptask.js", + "argumentFormat": "" + }, + "Node16": { + "target": "gulptask.js", + "argumentFormat": "" + } + }, + "messages": { + "GulpNotInstalled": "gulp is not installed globally (or is not in the path of the user the agent is running as) and it is not in the local working folder: %s", + "GulpReturnCode": "gulp exited with return code: %d", + "GulpFailed": "gulp failed with error: %s", + "NpmFailed": "Npm failed with error: %s", + "IstanbulFailed": "Istanbul failed with error: %s" + }, + "_buildConfigMapping": { + "Default": "1.229.0", + "Node20-225": "1.229.1" + } +} \ No newline at end of file diff --git a/_generated/GulpV1/task.loc.json b/_generated/GulpV1/task.loc.json new file mode 100644 index 000000000000..1871e2d89f4c --- /dev/null +++ b/_generated/GulpV1/task.loc.json @@ -0,0 +1,184 @@ +{ + "id": "B82CFBE4-34F9-40F5-889E-C8842CA9DD9D", + "name": "gulp", + "friendlyName": "ms-resource:loc.friendlyName", + "description": "ms-resource:loc.description", + "helpUrl": "https://docs.microsoft.com/azure/devops/pipelines/tasks/build/gulp", + "helpMarkDown": "ms-resource:loc.helpMarkDown", + "category": "Build", + "visibility": [ + "Build" + ], + "runsOn": [ + "Agent", + "DeploymentGroup" + ], + "author": "Microsoft Corporation", + "preview": true, + "version": { + "Major": 1, + "Minor": 229, + "Patch": 0 + }, + "demands": [ + "node.js" + ], + "minimumAgentVersion": "1.91.0", + "groups": [ + { + "name": "advanced", + "displayName": "ms-resource:loc.group.displayName.advanced", + "isExpanded": false + }, + { + "name": "junitTestResults", + "displayName": "ms-resource:loc.group.displayName.junitTestResults", + "isExpanded": true + }, + { + "name": "codeCoverage", + "displayName": "ms-resource:loc.group.displayName.codeCoverage", + "isExpanded": true + } + ], + "instanceNameFormat": "ms-resource:loc.instanceNameFormat", + "inputs": [ + { + "name": "gulpFile", + "type": "filePath", + "label": "ms-resource:loc.input.label.gulpFile", + "defaultValue": "gulpfile.js", + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.gulpFile" + }, + { + "name": "targets", + "type": "string", + "label": "ms-resource:loc.input.label.targets", + "defaultValue": "", + "helpMarkDown": "ms-resource:loc.input.help.targets", + "required": false + }, + { + "name": "arguments", + "type": "string", + "label": "ms-resource:loc.input.label.arguments", + "defaultValue": "", + "helpMarkDown": "ms-resource:loc.input.help.arguments", + "required": false + }, + { + "name": "cwd", + "aliases": [ + "workingDirectory" + ], + "type": "filePath", + "label": "ms-resource:loc.input.label.cwd", + "defaultValue": "", + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.cwd", + "groupName": "advanced" + }, + { + "name": "gulpjs", + "type": "string", + "label": "ms-resource:loc.input.label.gulpjs", + "defaultValue": "", + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.gulpjs", + "groupName": "advanced" + }, + { + "name": "publishJUnitResults", + "type": "boolean", + "label": "ms-resource:loc.input.label.publishJUnitResults", + "defaultValue": "false", + "groupName": "junitTestResults", + "helpMarkDown": "ms-resource:loc.input.help.publishJUnitResults" + }, + { + "name": "testResultsFiles", + "type": "filePath", + "label": "ms-resource:loc.input.label.testResultsFiles", + "defaultValue": "**/TEST-*.xml", + "required": true, + "groupName": "junitTestResults", + "helpMarkDown": "ms-resource:loc.input.help.testResultsFiles", + "visibleRule": "publishJUnitResults = true" + }, + { + "name": "testRunTitle", + "type": "string", + "label": "ms-resource:loc.input.label.testRunTitle", + "defaultValue": "", + "required": false, + "groupName": "junitTestResults", + "helpMarkDown": "ms-resource:loc.input.help.testRunTitle", + "visibleRule": "publishJUnitResults = true" + }, + { + "name": "enableCodeCoverage", + "type": "boolean", + "label": "ms-resource:loc.input.label.enableCodeCoverage", + "required": true, + "defaultValue": "false", + "groupName": "codeCoverage", + "helpMarkDown": "ms-resource:loc.input.help.enableCodeCoverage" + }, + { + "name": "testFramework", + "type": "pickList", + "label": "ms-resource:loc.input.label.testFramework", + "required": false, + "groupName": "codeCoverage", + "defaultValue": "Mocha", + "helpMarkDown": "ms-resource:loc.input.help.testFramework", + "options": { + "Mocha": "Mocha", + "Jasmine": "Jasmine" + }, + "visibleRule": "enableCodeCoverage = true" + }, + { + "name": "srcFiles", + "type": "string", + "label": "ms-resource:loc.input.label.srcFiles", + "defaultValue": "", + "required": false, + "groupName": "codeCoverage", + "helpMarkDown": "ms-resource:loc.input.help.srcFiles", + "visibleRule": "enableCodeCoverage = true" + }, + { + "name": "testFiles", + "type": "string", + "label": "ms-resource:loc.input.label.testFiles", + "defaultValue": "test/*.js", + "required": true, + "groupName": "codeCoverage", + "helpMarkDown": "ms-resource:loc.input.help.testFiles", + "visibleRule": "enableCodeCoverage = true" + } + ], + "execution": { + "Node10": { + "target": "gulptask.js", + "argumentFormat": "" + }, + "Node16": { + "target": "gulptask.js", + "argumentFormat": "" + } + }, + "messages": { + "GulpNotInstalled": "ms-resource:loc.messages.GulpNotInstalled", + "GulpReturnCode": "ms-resource:loc.messages.GulpReturnCode", + "GulpFailed": "ms-resource:loc.messages.GulpFailed", + "NpmFailed": "ms-resource:loc.messages.NpmFailed", + "IstanbulFailed": "ms-resource:loc.messages.IstanbulFailed" + }, + "_buildConfigMapping": { + "Default": "1.229.0", + "Node20-225": "1.229.1" + } +} \ No newline at end of file diff --git a/_generated/GulpV1/tsconfig.json b/_generated/GulpV1/tsconfig.json new file mode 100644 index 000000000000..0438b79f69ac --- /dev/null +++ b/_generated/GulpV1/tsconfig.json @@ -0,0 +1,6 @@ +{ + "compilerOptions": { + "target": "ES6", + "module": "commonjs" + } +} \ No newline at end of file diff --git a/_generated/GulpV1_Node20/.npmrc b/_generated/GulpV1_Node20/.npmrc new file mode 100644 index 000000000000..5fca0d518be7 --- /dev/null +++ b/_generated/GulpV1_Node20/.npmrc @@ -0,0 +1 @@ +scripts-prepend-node-path=true diff --git a/_generated/GulpV1_Node20/Strings/resources.resjson/de-DE/resources.resjson b/_generated/GulpV1_Node20/Strings/resources.resjson/de-DE/resources.resjson new file mode 100644 index 000000000000..4aac3a09615e --- /dev/null +++ b/_generated/GulpV1_Node20/Strings/resources.resjson/de-DE/resources.resjson @@ -0,0 +1,38 @@ +{ + "loc.friendlyName": "gulp", + "loc.helpMarkDown": "[Weitere Informationen zu dieser Aufgabe](https://go.microsoft.com/fwlink/?LinkID=613721)", + "loc.description": "Hiermit wird das aufgabenbasierte Node.js-Streamingbuildsystem gulp ausgeführt.", + "loc.instanceNameFormat": "gulp $(targets)", + "loc.group.displayName.advanced": "Erweitert", + "loc.group.displayName.junitTestResults": "JUnit-Testergebnisse", + "loc.group.displayName.codeCoverage": "Code Coverage", + "loc.input.label.gulpFile": "gulp-Dateipfad", + "loc.input.help.gulpFile": "Der relative Pfad vom Repositorystamm der auszuführenden gulp-Skriptdatei.", + "loc.input.label.targets": "gulp-Aufgabe(n)", + "loc.input.help.targets": "Optional. Mit Leerzeichen getrennte Liste der auszuführenden Aufgaben. Wenn nicht angegeben, wird die Standardaufgabe ausgeführt.", + "loc.input.label.arguments": "Argumente", + "loc.input.help.arguments": "Zusätzliche Argumente, die an Gulp übergeben werden. \"-gulpfile\" wurde bereits über die gulpFile-Eingabe weiter oben hinzugefügt und ist daher nicht erforderlich.", + "loc.input.label.cwd": "Arbeitsverzeichnis", + "loc.input.help.cwd": "Aktuelles Arbeitsverzeichnis bei Skriptausführung. Standardmäßig der Ordner, in dem das Skript gespeichert ist.", + "loc.input.label.gulpjs": "Speicherort von \"gulp.js\"", + "loc.input.help.gulpjs": "Pfad zu einer alternativen gulp.js-Datei, relativ zum Arbeitsverzeichnis.", + "loc.input.label.publishJUnitResults": "In Azure Pipelines veröffentlichen", + "loc.input.help.publishJUnitResults": "Wählen Sie diese Option aus, um vom gulp-Build erzeugte JUnit-Testergebnisse in Azure Pipelines zu veröffentlichen.", + "loc.input.label.testResultsFiles": "Testergebnisdateien", + "loc.input.help.testResultsFiles": "Der Pfad der Testergebnisdateien. Platzhalter können verwendet werden. Beispiel: \"**/TEST-*.xml\" für alle XML-Dateien, deren Name mit \"TEST-\" beginnt.", + "loc.input.label.testRunTitle": "Testlauftitel", + "loc.input.help.testRunTitle": "Geben Sie einen Namen für den Testlauf an.", + "loc.input.label.enableCodeCoverage": "Code Coverage aktivieren", + "loc.input.help.enableCodeCoverage": "Wählen Sie diese Option aus, um Code Coverage mithilfe von Istanbul zu aktivieren.", + "loc.input.label.testFramework": "Testframework", + "loc.input.help.testFramework": "Wählen Sie das Testframework aus.", + "loc.input.label.srcFiles": "Quelldateien", + "loc.input.help.srcFiles": "Geben Sie den Pfad zu Ihren Quelldateien an, für die hookRequire() gelten soll.", + "loc.input.label.testFiles": "Testskriptdateien", + "loc.input.help.testFiles": "Geben Sie den Pfad zu Ihren Testskriptdateien an.", + "loc.messages.GulpNotInstalled": "gulp ist nicht global installiert (oder ist nicht im Pfad des Benutzers enthalten, als der der Agent ausgeführt wird) und befindet sich nicht im lokalen Arbeitsordner: %s", + "loc.messages.GulpReturnCode": "gulp wurde mit dem folgenden Rückgabecode beendet: %d", + "loc.messages.GulpFailed": "gulp-Fehler: %s", + "loc.messages.NpmFailed": "Npm-Fehler: %s", + "loc.messages.IstanbulFailed": "Istanbul-Fehler: %s" +} \ No newline at end of file diff --git a/_generated/GulpV1_Node20/Strings/resources.resjson/en-US/resources.resjson b/_generated/GulpV1_Node20/Strings/resources.resjson/en-US/resources.resjson new file mode 100644 index 000000000000..9511bde83ccd --- /dev/null +++ b/_generated/GulpV1_Node20/Strings/resources.resjson/en-US/resources.resjson @@ -0,0 +1,38 @@ +{ + "loc.friendlyName": "gulp", + "loc.helpMarkDown": "[Learn more about this task](https://go.microsoft.com/fwlink/?LinkID=613721)", + "loc.description": "Run the gulp Node.js streaming task-based build system", + "loc.instanceNameFormat": "gulp $(targets)", + "loc.group.displayName.advanced": "Advanced", + "loc.group.displayName.junitTestResults": "JUnit Test Results", + "loc.group.displayName.codeCoverage": "Code Coverage", + "loc.input.label.gulpFile": "gulp File Path", + "loc.input.help.gulpFile": "Relative path from repo root of the gulp file script file to run.", + "loc.input.label.targets": "gulp Task(s)", + "loc.input.help.targets": "Optional. Space delimited list of tasks to run. If not specified, the default task will run.", + "loc.input.label.arguments": "Arguments", + "loc.input.help.arguments": "Additional arguments passed to gulp. --gulpfile is not needed since already added via gulpFile input above.", + "loc.input.label.cwd": "Working Directory", + "loc.input.help.cwd": "Current working directory when script is run. Defaults to the folder where the script is located.", + "loc.input.label.gulpjs": "gulp.js location", + "loc.input.help.gulpjs": "Path to an alternative gulp.js, relative to the working directory.", + "loc.input.label.publishJUnitResults": "Publish to Azure Pipelines", + "loc.input.help.publishJUnitResults": "Select this option to publish JUnit test results produced by the gulp build to Azure Pipelines.", + "loc.input.label.testResultsFiles": "Test Results Files", + "loc.input.help.testResultsFiles": "Test results files path. Wildcards can be used. For example, `**/TEST-*.xml` for all XML files whose name starts with TEST-.", + "loc.input.label.testRunTitle": "Test Run Title", + "loc.input.help.testRunTitle": "Provide a name for the test run.", + "loc.input.label.enableCodeCoverage": "Enable code Coverage", + "loc.input.help.enableCodeCoverage": "Select this option to enable Code Coverage using Istanbul.", + "loc.input.label.testFramework": "Test Framework", + "loc.input.help.testFramework": "Select your test framework.", + "loc.input.label.srcFiles": "Source Files", + "loc.input.help.srcFiles": "Provide the path to your source files which you want to hookRequire()", + "loc.input.label.testFiles": "Test Script Files", + "loc.input.help.testFiles": "Provide the path to your test script files", + "loc.messages.GulpNotInstalled": "gulp is not installed globally (or is not in the path of the user the agent is running as) and it is not in the local working folder: %s", + "loc.messages.GulpReturnCode": "gulp exited with return code: %d", + "loc.messages.GulpFailed": "gulp failed with error: %s", + "loc.messages.NpmFailed": "Npm failed with error: %s", + "loc.messages.IstanbulFailed": "Istanbul failed with error: %s" +} \ No newline at end of file diff --git a/_generated/GulpV1_Node20/Strings/resources.resjson/es-ES/resources.resjson b/_generated/GulpV1_Node20/Strings/resources.resjson/es-ES/resources.resjson new file mode 100644 index 000000000000..57e820ac89c8 --- /dev/null +++ b/_generated/GulpV1_Node20/Strings/resources.resjson/es-ES/resources.resjson @@ -0,0 +1,38 @@ +{ + "loc.friendlyName": "gulp", + "loc.helpMarkDown": "[Obtener más información acerca de esta tarea](https://go.microsoft.com/fwlink/?LinkID=613721)", + "loc.description": "Ejecute el sistema de compilación basado en tareas de streaming de Node.js con gulp.", + "loc.instanceNameFormat": "$(targets) de Gulp", + "loc.group.displayName.advanced": "Avanzado", + "loc.group.displayName.junitTestResults": "Resultados de pruebas JUnit", + "loc.group.displayName.codeCoverage": "Cobertura de código", + "loc.input.label.gulpFile": "Ruta de acceso del archivo gulp", + "loc.input.help.gulpFile": "Ruta de acceso relativa de la raíz del repositorio del archivo de script Gulp que se va a ejecutar.", + "loc.input.label.targets": "Tareas de gulp", + "loc.input.help.targets": "Opcional. Lista de tareas para ejecutar delimitada por espacios. Si no se especifica, se ejecutará la tarea predeterminada.", + "loc.input.label.arguments": "Argumentos", + "loc.input.help.arguments": "Argumentos adicionales pasados a Gulp. --gulpfile no es necesario porque ya se agregó a través de la entrada gulpFile anterior.", + "loc.input.label.cwd": "Directorio de trabajo", + "loc.input.help.cwd": "Directorio de trabajo actual cuando el script se ejecuta. Se establece de forma predeterminada en la carpeta en la que se encuentra el script.", + "loc.input.label.gulpjs": "Ubicación de gulp.js", + "loc.input.help.gulpjs": "Ruta de acceso a un archivo gulp.js alternativo, relativo al directorio de trabajo.", + "loc.input.label.publishJUnitResults": "Publicar en Azure Pipelines", + "loc.input.help.publishJUnitResults": "Seleccione esta opción para publicar los resultados de pruebas JUnit generados por la compilación de gulp en Azure Pipelines.", + "loc.input.label.testResultsFiles": "Archivos de resultados de pruebas", + "loc.input.help.testResultsFiles": "Ruta de acceso a los archivos de resultados de pruebas. Se pueden usar caracteres comodín. Por ejemplo, \"**/TEST-*.xml\" para todos los archivos XML cuyos nombres empiecen por TEST-.", + "loc.input.label.testRunTitle": "Título de la serie de pruebas", + "loc.input.help.testRunTitle": "Asigne un nombre a la serie de pruebas.", + "loc.input.label.enableCodeCoverage": "Habilitar Cobertura de código", + "loc.input.help.enableCodeCoverage": "Seleccione esta opción para habilitar Cobertura de código con Istanbul.", + "loc.input.label.testFramework": "Marco de pruebas", + "loc.input.help.testFramework": "Seleccione su marco de pruebas.", + "loc.input.label.srcFiles": "Archivos de origen", + "loc.input.help.srcFiles": "Proporcione la ruta de acceso a los archivos de origen que quiera para hookRequire().", + "loc.input.label.testFiles": "Archivos de script de prueba", + "loc.input.help.testFiles": "Proporcione la ruta de acceso a sus archivos de script de prueba.", + "loc.messages.GulpNotInstalled": "No se ha instalado gulp a nivel global (o no está en la ruta del usuario con el que se ejecuta el agente) y no está en la carpeta de trabajo local: %s", + "loc.messages.GulpReturnCode": "Se ha cerrado gulp con el código de retorno: %d", + "loc.messages.GulpFailed": "Error de gulp: %s", + "loc.messages.NpmFailed": "Error de Npm: %s", + "loc.messages.IstanbulFailed": "Error de Istanbul: %s" +} \ No newline at end of file diff --git a/_generated/GulpV1_Node20/Strings/resources.resjson/fr-FR/resources.resjson b/_generated/GulpV1_Node20/Strings/resources.resjson/fr-FR/resources.resjson new file mode 100644 index 000000000000..18e7c94697aa --- /dev/null +++ b/_generated/GulpV1_Node20/Strings/resources.resjson/fr-FR/resources.resjson @@ -0,0 +1,38 @@ +{ + "loc.friendlyName": "gulp", + "loc.helpMarkDown": "[En savoir plus sur cette tâche](https://go.microsoft.com/fwlink/?LinkID=613721)", + "loc.description": "Exécuter le système de build basé sur les tâches de streaming Node.js de gulp", + "loc.instanceNameFormat": "gulp $(targets)", + "loc.group.displayName.advanced": "Avancé", + "loc.group.displayName.junitTestResults": "Résultats du test JUnit", + "loc.group.displayName.codeCoverage": "Couverture du code", + "loc.input.label.gulpFile": "Chemin de fichier gulp", + "loc.input.help.gulpFile": "Chemin relatif de la racine de dépôt du fichier script du fichier gulp à exécuter.", + "loc.input.label.targets": "Tâche(s) gulp", + "loc.input.help.targets": "Facultatif. Liste des tâches à exécuter délimitées par des espaces. Si elle n'est pas spécifiée, la tâche par défaut est exécutée.", + "loc.input.label.arguments": "Arguments", + "loc.input.help.arguments": "Arguments supplémentaires passés à gulp. --gulpfile n'est pas nécessaire, car il est déjà ajouté via l'entrée gulpFile ci-dessus.", + "loc.input.label.cwd": "Répertoire de travail", + "loc.input.help.cwd": "Répertoire de travail actuel quand le script est exécuté. Il s'agit généralement du dossier dans lequel se trouve le script.", + "loc.input.label.gulpjs": "Emplacement de gulp.js", + "loc.input.help.gulpjs": "Chemin d'un autre fichier gulp.js relatif au répertoire de travail.", + "loc.input.label.publishJUnitResults": "Publier sur Azure Pipelines", + "loc.input.help.publishJUnitResults": "Sélectionnez cette option pour publier les résultats des tests JUnit produits par la build gulp sur Azure Pipelines.", + "loc.input.label.testResultsFiles": "Fichiers des résultats des tests", + "loc.input.help.testResultsFiles": "Chemin des fichiers de résultats des tests. Les caractères génériques sont autorisés. Par exemple, '**/TEST-*.xml' correspond à tous les fichiers XML dont le nom commence par TEST-.", + "loc.input.label.testRunTitle": "Titre de l'exécution du test", + "loc.input.help.testRunTitle": "Indiquez le nom de la série de tests.", + "loc.input.label.enableCodeCoverage": "Activer la couverture du code", + "loc.input.help.enableCodeCoverage": "Sélectionnez cette option pour activer la couverture du code à l'aide d'Istanbul.", + "loc.input.label.testFramework": "Framework de tests", + "loc.input.help.testFramework": "Sélectionnez votre framework de tests.", + "loc.input.label.srcFiles": "Fichiers sources", + "loc.input.help.srcFiles": "Indiquez le chemin des fichiers sources auxquels vous voulez appliquer hookRequire()", + "loc.input.label.testFiles": "Fichiers de script de test", + "loc.input.help.testFiles": "Indiquez le chemin de vos fichiers de script de test", + "loc.messages.GulpNotInstalled": "gulp n'est pas installé de manière globale ou ne se trouve pas dans le chemin de l'utilisateur via lequel l'agent s'exécute. De plus, il ne se trouve pas dans le dossier de travail local : %s", + "loc.messages.GulpReturnCode": "Sortie de gulp. Code de retour : %d", + "loc.messages.GulpFailed": "Échec de gulp. Erreur : %s", + "loc.messages.NpmFailed": "Échec de Npm. Erreur : %s", + "loc.messages.IstanbulFailed": "Échec d'Istanbul avec l'erreur : %s" +} \ No newline at end of file diff --git a/_generated/GulpV1_Node20/Strings/resources.resjson/it-IT/resources.resjson b/_generated/GulpV1_Node20/Strings/resources.resjson/it-IT/resources.resjson new file mode 100644 index 000000000000..0e81f46aa332 --- /dev/null +++ b/_generated/GulpV1_Node20/Strings/resources.resjson/it-IT/resources.resjson @@ -0,0 +1,38 @@ +{ + "loc.friendlyName": "gulp", + "loc.helpMarkDown": "[Altre informazioni su questa attività](https://go.microsoft.com/fwlink/?LinkID=613721)", + "loc.description": "Esegue il sistema di compilazione basato su attività di streaming Node.js di gulp", + "loc.instanceNameFormat": "gulp $(targets)", + "loc.group.displayName.advanced": "Avanzate", + "loc.group.displayName.junitTestResults": "Risultati del test JUnit", + "loc.group.displayName.codeCoverage": "Code coverage", + "loc.input.label.gulpFile": "Percorso file di gulp", + "loc.input.help.gulpFile": "Percorso relativo dalla radice del repository del file di script del file gulp da eseguire.", + "loc.input.label.targets": "Attività di gulp", + "loc.input.help.targets": "Facoltativo. Elenco di attività delimitate da spazio da eseguire. Se non è specificato, viene eseguita l'attività predefinita.", + "loc.input.label.arguments": "Argomenti", + "loc.input.help.arguments": "Argomenti aggiuntivi passati a gulp. --gulpfile non è necessario dal momento che è già stato aggiunto tramite l'input di gulpFile in precedenza.", + "loc.input.label.cwd": "Directory di lavoro", + "loc.input.help.cwd": "Directory di lavoro corrente durante l'esecuzione dello script. Per impostazione predefinita, corrisponde alla cartella in cui si trova lo script.", + "loc.input.label.gulpjs": "Percorso di gulp.js", + "loc.input.help.gulpjs": "Percorso di un file gulp.js alternativo, relativo alla directory di lavoro.", + "loc.input.label.publishJUnitResults": "Pubblica in Azure Pipelines", + "loc.input.help.publishJUnitResults": "Selezionare questa opzione per pubblicare in Azure Pipelines i risultati di test JUnit ottenuti con la compilazione gulp.", + "loc.input.label.testResultsFiles": "File dei risultati del test", + "loc.input.help.testResultsFiles": "Percorso dei file dei risultati del test. È possibile usare i caratteri jolly, ad esempio `**/TEST-*.xml` per individuare tutti i file XML il cui nome inizia con TEST-.", + "loc.input.label.testRunTitle": "Titolo esecuzione dei test", + "loc.input.help.testRunTitle": "Consente di specificare un nome per l'esecuzione dei test.", + "loc.input.label.enableCodeCoverage": "Abilita code coverage", + "loc.input.help.enableCodeCoverage": "Selezionare questa opzione per abilitare il code coverage con Istanbul.", + "loc.input.label.testFramework": "Framework di test", + "loc.input.help.testFramework": "Consente di selezionare il framework di test.", + "loc.input.label.srcFiles": "File di origine", + "loc.input.help.srcFiles": "Consente di specificare il percorso dei file di origine per hookRequire()", + "loc.input.label.testFiles": "File di script di test", + "loc.input.help.testFiles": "Consente di specificare il percorso dei file di script di test", + "loc.messages.GulpNotInstalled": "gulp non è installato globalmente oppure non è presente nel percorso dell'utente con cui viene eseguito l'agente e non è incluso nella cartella di lavoro locale %s", + "loc.messages.GulpReturnCode": "gulp terminato. Codice restituito: %d", + "loc.messages.GulpFailed": "gulp non riuscito. Errore: %s", + "loc.messages.NpmFailed": "Npm non riuscito. Errore: %s", + "loc.messages.IstanbulFailed": "Istanbul non riuscito. Errore: %s" +} \ No newline at end of file diff --git a/_generated/GulpV1_Node20/Strings/resources.resjson/ja-JP/resources.resjson b/_generated/GulpV1_Node20/Strings/resources.resjson/ja-JP/resources.resjson new file mode 100644 index 000000000000..0e84bbc9ceac --- /dev/null +++ b/_generated/GulpV1_Node20/Strings/resources.resjson/ja-JP/resources.resjson @@ -0,0 +1,38 @@ +{ + "loc.friendlyName": "gulp", + "loc.helpMarkDown": "[このタスクの詳細を表示](https://go.microsoft.com/fwlink/?LinkID=613721)", + "loc.description": "Node.js のストリーミング タスクベースのビルド システムである gulp を実行します", + "loc.instanceNameFormat": "gulp $(targets)", + "loc.group.displayName.advanced": "詳細設定", + "loc.group.displayName.junitTestResults": "JUnit のテスト結果", + "loc.group.displayName.codeCoverage": "コード カバレッジ", + "loc.input.label.gulpFile": "gulp ファイル パス", + "loc.input.help.gulpFile": "リポジトリのルートを基準として指定する、実行する gulp スクリプト ファイルの相対パス。", + "loc.input.label.targets": "gulp タスク", + "loc.input.help.targets": "(省略可能) スペース区切りの実行タスクのリスト。指定しない場合は、既定のタスクが実行されます。", + "loc.input.label.arguments": "引数", + "loc.input.help.arguments": "gulp に渡される追加の引数。上記の gulpFile 入力で既に追加されているので、--gulpfile は不要です。", + "loc.input.label.cwd": "作業ディレクトリ", + "loc.input.help.cwd": "スクリプトの実行時の現行の作業ディレクトリ。スクリプトが配置されているフォルダーを既定値に使用します。", + "loc.input.label.gulpjs": "gulp.js の場所", + "loc.input.help.gulpjs": "作業ディレクトリに対する代替の gulp.js へのパス。", + "loc.input.label.publishJUnitResults": "Azure Pipelines に公開する", + "loc.input.help.publishJUnitResults": "gulp のビルドによって生成される JUnit のテスト結果を Azure Pipelines に公開するには、このオプションを選びます。", + "loc.input.label.testResultsFiles": "テスト結果のファイル", + "loc.input.help.testResultsFiles": "テスト結果ファイルのパス。ワイルドカードを使用できます。たとえば、名前が TEST- で始まるすべての XML ファイルの場合は `**/TEST-*.xml` です。", + "loc.input.label.testRunTitle": "テスト実行のタイトル", + "loc.input.help.testRunTitle": "テストの実行の名前を指定します。", + "loc.input.label.enableCodeCoverage": "コード カバレッジを有効にする", + "loc.input.help.enableCodeCoverage": "Istanbul を使用してコード カバレッジを有効にするには、このオプションを選びます。", + "loc.input.label.testFramework": "テスト フレームワーク", + "loc.input.help.testFramework": "テスト フレームワークを選びます。", + "loc.input.label.srcFiles": "ソース ファイル", + "loc.input.help.srcFiles": "hookRequire() を実行しようとしているソース ファイルへのパスを指定します", + "loc.input.label.testFiles": "テスト スクリプト ファイル", + "loc.input.help.testFiles": "テスト スクリプト ファイルへのパスを指定します", + "loc.messages.GulpNotInstalled": "gulp はグローバルにインストールされていません (またはエージェントが実行しているユーザーのパスにありません)。またローカル作業フォルダーにありません: %s", + "loc.messages.GulpReturnCode": "gulp は、次のリターン コードで終了しました: %d", + "loc.messages.GulpFailed": "gulp が次のエラーで失敗しました: %s", + "loc.messages.NpmFailed": "Npm でエラーが発生しました: %s", + "loc.messages.IstanbulFailed": "Istanbul でエラーが発生しました: %s" +} \ No newline at end of file diff --git a/_generated/GulpV1_Node20/Strings/resources.resjson/ko-KR/resources.resjson b/_generated/GulpV1_Node20/Strings/resources.resjson/ko-KR/resources.resjson new file mode 100644 index 000000000000..9e554b63d9dd --- /dev/null +++ b/_generated/GulpV1_Node20/Strings/resources.resjson/ko-KR/resources.resjson @@ -0,0 +1,38 @@ +{ + "loc.friendlyName": "gulp", + "loc.helpMarkDown": "[이 작업에 대한 자세한 정보](https://go.microsoft.com/fwlink/?LinkID=613721)", + "loc.description": "gulp Node.js 스트리밍 작업 기반 빌드 시스템을 실행합니다.", + "loc.instanceNameFormat": "gulp $(targets)", + "loc.group.displayName.advanced": "고급", + "loc.group.displayName.junitTestResults": "JUnit 테스트 결과", + "loc.group.displayName.codeCoverage": "코드 검사", + "loc.input.label.gulpFile": "gulp 파일 경로", + "loc.input.help.gulpFile": "실행할 gulp 파일 스크립트 파일의 리포 루트로부터의 상대 경로입니다.", + "loc.input.label.targets": "gulp 작업", + "loc.input.help.targets": "선택 사항. 공백으로 구분된 실행할 작업 목록입니다. 지정하지 않을 경우 기본 작업이 실행됩니다.", + "loc.input.label.arguments": "인수", + "loc.input.help.arguments": "추가 인수를 gulp에 전달했습니다. --gulpfile은 위의 gulpFile 입력을 통해 이미 추가되었으므로 필요하지 않습니다.", + "loc.input.label.cwd": "작업 디렉터리", + "loc.input.help.cwd": "스크립트 실행 시 현재 작업 디렉터리입니다. 기본값을 스크립트가 있는 폴더로 지정합니다.", + "loc.input.label.gulpjs": "gulp.js 위치", + "loc.input.help.gulpjs": "대체 gulp의 경로로, 작업 디렉터리의 상대 경로입니다.", + "loc.input.label.publishJUnitResults": "Azure Pipelines/에 게시", + "loc.input.help.publishJUnitResults": "gulp 빌드에서 생성된 JUnit 테스트 결과를 Azure Pipelines에 게시하려면 이 옵션을 선택합니다.", + "loc.input.label.testResultsFiles": "테스트 결과 파일", + "loc.input.help.testResultsFiles": "테스트 결과 파일 경로입니다. 와일드카드를 사용할 수 있습니다. 예를 들어, 이름이 TEST-로 시작하는 모든 XML 파일을 표시하기 위해 `**/TEST-*.xml`을 사용할 수 있습니다.", + "loc.input.label.testRunTitle": "테스트 실행 제목", + "loc.input.help.testRunTitle": "테스트 실행의 이름을 지정하세요.", + "loc.input.label.enableCodeCoverage": "코드 검사 사용", + "loc.input.help.enableCodeCoverage": "Istanbul을 사용하여 코드 검사를 사용하도록 설정하려면 이 옵션을 선택하세요.", + "loc.input.label.testFramework": "테스트 프레임워크", + "loc.input.help.testFramework": "테스트 프레임워크를 선택하세요.", + "loc.input.label.srcFiles": "소스 파일", + "loc.input.help.srcFiles": "hookRequire()를 적용할 소스 파일의 경로를 지정하세요.", + "loc.input.label.testFiles": "테스트 스크립트 파일", + "loc.input.help.testFiles": "테스트 스크립트 파일의 경로를 지정하세요.", + "loc.messages.GulpNotInstalled": "gulp가 전역으로 설치되지 않았거나 에이전트를 실행 중인 사용자의 경로에 없으며 로컬 작업 폴더 %s에 없습니다.", + "loc.messages.GulpReturnCode": "gulp가 종료되었습니다(반환 코드: %d).", + "loc.messages.GulpFailed": "오류가 발생하여 gulp에 실패했습니다. %s", + "loc.messages.NpmFailed": "오류 %s(으)로 Npm 실패", + "loc.messages.IstanbulFailed": "다음 오류가 발생하여 Istanbul이 실패했습니다. %s" +} \ No newline at end of file diff --git a/_generated/GulpV1_Node20/Strings/resources.resjson/ru-RU/resources.resjson b/_generated/GulpV1_Node20/Strings/resources.resjson/ru-RU/resources.resjson new file mode 100644 index 000000000000..f5bf1bdc8fd1 --- /dev/null +++ b/_generated/GulpV1_Node20/Strings/resources.resjson/ru-RU/resources.resjson @@ -0,0 +1,38 @@ +{ + "loc.friendlyName": "gulp", + "loc.helpMarkDown": "[См. дополнительные сведения об этой задаче](https://go.microsoft.com/fwlink/?LinkID=613721)", + "loc.description": "Запуск системы сборки, основанной на задачах потоковой передачи Node.js gulp", + "loc.instanceNameFormat": "Gulp $(targets)", + "loc.group.displayName.advanced": "Дополнительно", + "loc.group.displayName.junitTestResults": "Результаты теста JUnit", + "loc.group.displayName.codeCoverage": "Объем протестированного кода", + "loc.input.label.gulpFile": "Путь к файлу gulp", + "loc.input.help.gulpFile": "Относительный путь от корня репозитория к файлу сценария Gulp, который подлежит выполнению.", + "loc.input.label.targets": "Задачи gulp", + "loc.input.help.targets": "Необязательно. Список запускаемых задач с разделителями-пробелами. Если он не указан, будет запущена задача по умолчанию.", + "loc.input.label.arguments": "Аргументы", + "loc.input.help.arguments": "Дополнительные аргументы, передаваемые в Gulp. Аргумент --gulpfile не требуется, так как он уже добавлен с помощью входного файла gulpFile выше.", + "loc.input.label.cwd": "Рабочий каталог", + "loc.input.help.cwd": "Текущий рабочий каталог при выполнении сценария. По умолчанию используется папка, в которой находится сценарий.", + "loc.input.label.gulpjs": "Расположение gulp.js", + "loc.input.help.gulpjs": "Путь к альтернативному gulp.js относительно рабочего каталога.", + "loc.input.label.publishJUnitResults": "Опубликовать в Azure Pipelines", + "loc.input.help.publishJUnitResults": "Выберите этот параметр, чтобы опубликовать результаты тестов JUnit, созданные сборкой gulp, в Azure Pipelines.", + "loc.input.label.testResultsFiles": "Файлы результатов тестов", + "loc.input.help.testResultsFiles": "Путь к файлам результатов тестов. Можно использовать подстановочные знаки. Пример: \"**/TEST-*.xml\" для всех XML-файлов, имена которых начинаются с \"TEST-\".", + "loc.input.label.testRunTitle": "Заголовок тестового запуска", + "loc.input.help.testRunTitle": "Укажите имя для тестового запуска.", + "loc.input.label.enableCodeCoverage": "Включить оценку объема протестированного кода", + "loc.input.help.enableCodeCoverage": "Выберите этот параметр, чтобы включить оценку объема протестированного кода с помощью Istanbul.", + "loc.input.label.testFramework": "Платформа тестирования", + "loc.input.help.testFramework": "Выберите платформу тестирования.", + "loc.input.label.srcFiles": "Исходные файлы", + "loc.input.help.srcFiles": "Укажите путь к исходным файлам, к которым необходимо применить метод hookRequire()", + "loc.input.label.testFiles": "Файлы скриптов тестирования", + "loc.input.help.testFiles": "Укажите путь к файлам скриптов тестирования", + "loc.messages.GulpNotInstalled": "Набор gulp не установлен глобально (или не находится в пути пользователя, от имени которого выполняется агент) и не находится в локальной рабочей папке: %s", + "loc.messages.GulpReturnCode": "Завершение работы gulp с кодом возврата: %d", + "loc.messages.GulpFailed": "Сбой gulp с ошибкой: %s", + "loc.messages.NpmFailed": "Сбой NPM с ошибкой: %s", + "loc.messages.IstanbulFailed": "Сбой Istanbul с ошибкой: %s" +} \ No newline at end of file diff --git a/_generated/GulpV1_Node20/Strings/resources.resjson/zh-CN/resources.resjson b/_generated/GulpV1_Node20/Strings/resources.resjson/zh-CN/resources.resjson new file mode 100644 index 000000000000..0e559af31329 --- /dev/null +++ b/_generated/GulpV1_Node20/Strings/resources.resjson/zh-CN/resources.resjson @@ -0,0 +1,38 @@ +{ + "loc.friendlyName": "Gulp", + "loc.helpMarkDown": "[详细了解此任务](https://go.microsoft.com/fwlink/?LinkID=613721)", + "loc.description": "运行 Gulp 基于 Node.js 流任务的生成系统", + "loc.instanceNameFormat": "Gulp $(targets)", + "loc.group.displayName.advanced": "高级", + "loc.group.displayName.junitTestResults": "JUnit 测试结果", + "loc.group.displayName.codeCoverage": "代码覆盖率", + "loc.input.label.gulpFile": "Gulp 文件路径", + "loc.input.help.gulpFile": "要运行的 Gulp 文件脚本文件的存储库根路径的相对路径。", + "loc.input.label.targets": "Gulp 任务", + "loc.input.help.targets": "可选。待运行任务的列表,以空格分隔。如未指定,则将运行默认任务。", + "loc.input.label.arguments": "参数", + "loc.input.help.arguments": "传递给 Gulp 的其他参数。无需 --gulpfile,因为已通过上面的 gulpFile 输入添加。", + "loc.input.label.cwd": "工作目录", + "loc.input.help.cwd": "脚本运行时的当前工作目录。默认为脚本所处的文件夹。", + "loc.input.label.gulpjs": "gulp.js 位置", + "loc.input.help.gulpjs": "备用 gulp.js 的路径(相对于工作目录)。", + "loc.input.label.publishJUnitResults": "发布到 Azure Pipelines", + "loc.input.help.publishJUnitResults": "选择此选项可将 Gulp 生成产生的 JUnit 测试结果发布到 Azure Pipelines。", + "loc.input.label.testResultsFiles": "测试结果文件", + "loc.input.help.testResultsFiles": "测试结果文件路径。可以使用通配符。例如,\"**/TEST-*.xml\" 表示名称以 TEST- 开头的所有 XML 文件。", + "loc.input.label.testRunTitle": "测试运行标题", + "loc.input.help.testRunTitle": "为测试运行提供一个名称。", + "loc.input.label.enableCodeCoverage": "启用代码覆盖率", + "loc.input.help.enableCodeCoverage": "选择此选项以使用 Istanbul 启用代码覆盖率。", + "loc.input.label.testFramework": "测试框架", + "loc.input.help.testFramework": "选择你的测试框架。", + "loc.input.label.srcFiles": "源文件", + "loc.input.help.srcFiles": "将你所需的源文件路径提供给 hookRequire()", + "loc.input.label.testFiles": "测试脚本文件", + "loc.input.help.testFiles": "提供测试脚本文件的路径", + "loc.messages.GulpNotInstalled": "Gulp 未在全局进行安装(或不位于代理运行身份用户的路径下),且不位于本地工作文件夹 %s 中", + "loc.messages.GulpReturnCode": "Gulp 已退出,返回代码为: %d", + "loc.messages.GulpFailed": "Gulp 失败,出现错误: %s", + "loc.messages.NpmFailed": "Npm 失败,出现错误: %s", + "loc.messages.IstanbulFailed": "Istanbul 失败,出现错误: %s" +} \ No newline at end of file diff --git a/_generated/GulpV1_Node20/Strings/resources.resjson/zh-TW/resources.resjson b/_generated/GulpV1_Node20/Strings/resources.resjson/zh-TW/resources.resjson new file mode 100644 index 000000000000..ad79d6f7b1d8 --- /dev/null +++ b/_generated/GulpV1_Node20/Strings/resources.resjson/zh-TW/resources.resjson @@ -0,0 +1,38 @@ +{ + "loc.friendlyName": "gulp", + "loc.helpMarkDown": "[深入了解此工作](https://go.microsoft.com/fwlink/?LinkID=613721)", + "loc.description": "執行 gulp Node.js 串流工作型建置系統", + "loc.instanceNameFormat": "Gulp $(targets)", + "loc.group.displayName.advanced": "進階", + "loc.group.displayName.junitTestResults": "JUnit 測試結果", + "loc.group.displayName.codeCoverage": "程式碼涵蓋範圍", + "loc.input.label.gulpFile": "gulp 檔案路徑", + "loc.input.help.gulpFile": "要執行的 gulp 檔指令檔存放庫根路徑相對路徑。", + "loc.input.label.targets": "gulp 工作", + "loc.input.help.targets": "可省略。以空格分隔要執行之工作的清單。若未指定,將會執行預設工作。", + "loc.input.label.arguments": "引數", + "loc.input.help.arguments": "傳遞至 Gulp 的額外引數。 --不需要 gulpfile 因為已透過上述 gulpFile 輸入加入。", + "loc.input.label.cwd": "工作目錄", + "loc.input.help.cwd": "執行指令碼後的目前工作目錄。預設為指令碼所在的資料夾。", + "loc.input.label.gulpjs": "gulp.js 的位置", + "loc.input.help.gulpjs": "相對於工作目錄的替代 gulp.js 路徑。", + "loc.input.label.publishJUnitResults": "發佈至 Azure Pipelines", + "loc.input.help.publishJUnitResults": "選取此選項會將 gulp 組建所產生的 JUnit 測試結果發佈至 Azure Pipelines。", + "loc.input.label.testResultsFiles": "測試結果檔案", + "loc.input.help.testResultsFiles": "測試結果檔案路徑。可使用萬用字元。例如 `**/TEST-*.xml` 即適用於所有名稱開頭為 TEST- 的 XML 檔案。", + "loc.input.label.testRunTitle": "測試回合標題", + "loc.input.help.testRunTitle": "提供測試回合的名稱。", + "loc.input.label.enableCodeCoverage": "啟用程式碼涵蓋範圍", + "loc.input.help.enableCodeCoverage": "選取這個選項,以使用 Istanbul 啟用程式碼涵蓋範圍。", + "loc.input.label.testFramework": "測試架構", + "loc.input.help.testFramework": "選取測試架構。", + "loc.input.label.srcFiles": "原始程式檔", + "loc.input.help.srcFiles": "提供要進行 hookRequire() 之原始程式檔的路徑", + "loc.input.label.testFiles": "測試指令檔", + "loc.input.help.testFiles": "提供測試指令碼檔案的路徑", + "loc.messages.GulpNotInstalled": "gulp 未全域安裝 (或不在作為代理程式執行身分的使用者路徑中) 且不在本機工作資料夾: %s", + "loc.messages.GulpReturnCode": "gulp 已結束,傳回碼: %d", + "loc.messages.GulpFailed": "gulp 失敗,錯誤: %s", + "loc.messages.NpmFailed": "Npm 失敗,錯誤為: %s", + "loc.messages.IstanbulFailed": "Istanbul 失敗,錯誤為: %s" +} \ No newline at end of file diff --git a/_generated/GulpV1_Node20/Tests/L0.ts b/_generated/GulpV1_Node20/Tests/L0.ts new file mode 100644 index 000000000000..856a811be21f --- /dev/null +++ b/_generated/GulpV1_Node20/Tests/L0.ts @@ -0,0 +1,292 @@ +import assert = require('assert'); +import path = require('path'); +import os = require('os'); +import * as ttm from 'azure-pipelines-task-lib/mock-test'; + +const isWin = os.type().match(/^Win/); + +describe('GulpV1 Suite', function () { + this.timeout(parseInt(process.env.TASK_TEST_TIMEOUT) || 20000); + + before((done: Mocha.Done) => { + process.env['SYSTEM_DEFAULTWORKINGDIRECTORY'] = '/user/build'; + done(); + }); + + it('runs a gulpfile through global gulp', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0GulpGlobalGood.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.ran('/usr/local/bin/gulp --gulpfile gulpfile.js'), 'it should have run Gulp'); + assert(tr.invokedToolCount == 1, 'should have only run gulp'); + assert(tr.stderr.length == 0, 'should not have written to stderr'); + assert(tr.succeeded, 'task should have succeeded'); + + done(); + }); + + it('runs a gulpfile through local gulp', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0GulpLocalGood.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + if (isWin) { + assert( + tr.ran('/usr/local/bin/node c:\\fake\\wd\\node_modules\\gulp\\gulp.js --gulpfile gulpfile.js'), + 'it should have run gulp' + ); + } else { + assert( + tr.ran('/usr/local/bin/node /fake/wd/node_modules/gulp/gulp.js --gulpfile gulpfile.js'), + 'it should have run gulp' + ); + } + assert(tr.invokedToolCount == 1, 'should have only run gulp'); + assert(tr.stderr.length == 0, 'should not have written to stderr'); + assert(tr.succeeded, 'task should have succeeded'); + + done(); + }); + + it('runs gulp when code coverage is enabled', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0GulpLocalGoodWithCodeCoverage.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + if (isWin) { + assert( + tr.ran('/usr/local/bin/node c:\\fake\\wd\\node_modules\\gulp\\gulp.js --gulpfile gulpfile.js'), + 'it should have run gulp' + ); + } else { + assert( + tr.ran('/usr/local/bin/node /fake/wd/node_modules/gulp/gulp.js --gulpfile gulpfile.js'), + 'it should have run gulp' + ); + } + assert(tr.invokedToolCount == 3, 'should have run npm, Gulp and istanbul'); + assert(tr.stderr.length == 0, 'should not have written to stderr'); + assert(tr.succeeded, 'task should have succeeded'); + + done(); + }); + + it('runs a gulpFile when publishJUnitTestResults is false', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0PublishJUnitTestResultsFalse.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + if (isWin) { + assert( + tr.ran('/usr/local/bin/node c:\\fake\\wd\\node_modules\\gulp\\gulp.js --gulpfile gulpfile.js'), + 'it should have run gulp' + ); + } else { + assert( + tr.ran('/usr/local/bin/node /fake/wd/node_modules/gulp/gulp.js --gulpfile gulpfile.js'), + 'it should have run gulp' + ); + } + assert(tr.invokedToolCount == 1, 'should have only run Gulp'); + assert(tr.stderr.length == 0, 'should not have written to stderr'); + assert(tr.succeeded, 'task should have succeeded'); + + done(); + }); + + it('fails if gulpFile not set', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0GulpFileNotSet.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.stdOutContained('Input required: gulpFile'), 'Should have printed: Input required: gulpFile'); + assert(tr.invokedToolCount == 0, 'should exit before running Gulp'); + assert(tr.failed, 'should have failed'); + + done(); + }); + + it('fails if cwd not set', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0CwdNotSet.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.stdOutContained('Input required: cwd'), 'Should have printed: Input required: cwd'); + assert(tr.invokedToolCount == 0, 'should exit before running Gulp'); + assert(tr.failed, 'should have failed'); + + done(); + }); + + it('runs a gulpfile through global gulp if gulpjs not set', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0GulpjsNotSet.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.stdOutContained('gulpjs not set'), 'Should have printed: gulpjs not set'); + assert(tr.invokedToolCount == 1, 'should have only run Gulp'); + assert(tr.succeeded, 'task should have succeeded'); + + done(); + }); + + it('fails if gulpFile not found', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0NoGulpFile.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.stdOutContained('Not found gulpfile.js'), 'Should have printed: Not found gulpfile.js'); + assert(tr.invokedToolCount == 0, 'should exit before running Gulp'); + assert(tr.failed, 'should have failed'); + + done(); + }); + + it('fails if gulp no exist globally and locally', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0NoGulp.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.stdOutContained('loc_mock_GulpNotInstalled'), 'Should have printed: loc_mock_GulpNotInstalled'); + assert(tr.failed, 'should have failed'); + + done(); + }); + + it('fails if npm fails', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0NpmFails.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.stdOutContained('loc_mock_NpmFailed'), 'Should have printed: loc_mock_NpmFailed'); + assert(tr.invokedToolCount == 2, 'should exit before running Gulp'); + assert(tr.failed, 'should have failed'); + + done(); + }); + + it('fails if gulp fails', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0GulpFails.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + if (isWin) { + assert( + tr.ran('/usr/local/bin/node c:\\fake\\wd\\node_modules\\gulp\\gulp.js --gulpfile gulpfile.js'), + 'it should have run gulp' + ); + } else { + assert( + tr.ran('/usr/local/bin/node /fake/wd/node_modules/gulp/gulp.js --gulpfile gulpfile.js'), + 'it should have run gulp' + ); + } + assert(tr.stdOutContained('loc_mock_GulpFailed'), 'Should have printed: loc_mock_GulpFailed'); + assert(tr.invokedToolCount == 1, 'should have run npm and gulp'); + assert(tr.failed, 'should have failed'); + + done(); + }); + + it('fails if istanbul fails', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0IstanbulFails.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + if (isWin) { + assert( + tr.ran('/usr/local/bin/node c:\\fake\\wd\\node_modules\\gulp\\gulp.js --gulpfile gulpfile.js'), + 'it should have run gulp' + ); + } else { + assert( + tr.ran('/usr/local/bin/node /fake/wd/node_modules/gulp/gulp.js --gulpfile gulpfile.js'), + 'it should have run gulp' + ); + } + assert(tr.stdOutContained('loc_mock_IstanbulFailed'), 'Should have printed: loc_mock_IstanbulFailed'); + assert(tr.invokedToolCount == 3, 'should have run npm, gulp and istanbul'); + assert(tr.failed, 'should have failed'); + + done(); + }); + + it('fails when test result files input is not provided', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0TestResultFilesNotSet.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.stdOutContained('Input required: testResultsFiles'), 'Should have printed: Input required: testResultsFiles'); + assert(tr.invokedToolCount == 0, 'should exit before running Gulp'); + assert(tr.failed, 'should have failed'); + + done(); + }); + + it('gives warning and runs when test result files input does not match any file', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0TestResultFilesDoesNotMatchAnyFile.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + if (isWin) { + assert( + tr.ran('/usr/local/bin/node c:\\fake\\wd\\node_modules\\gulp\\gulp.js --gulpfile gulpfile.js'), + 'it should have run gulp' + ); + } else { + assert( + tr.ran('/usr/local/bin/node /fake/wd/node_modules/gulp/gulp.js --gulpfile gulpfile.js'), + 'it should have run gulp' + ); + } + assert(tr.invokedToolCount == 1, 'should run completely'); + assert( + tr.stdout.search('No pattern found in testResultsFiles parameter') >= 0, + 'should give a warning for test file pattern not matched.' + ); + assert(tr.succeeded, 'task should have succeeded'); + + done(); + }); + + it('fails when test source files input is not provided for coverage', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0NoTestSourceFiles.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.stdOutContained('Input required: testFiles'), 'Should have printed: Input required: testFiles'); + assert(tr.invokedToolCount == 0, 'should exit before running Gulp'); + assert(tr.failed, 'should have failed'); + + done(); + }); + + it('fails when test source files input does not match any file', (done: Mocha.Done) => { + const tp = path.join(__dirname, 'L0InvalidTestSource.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + tr.run(); + + assert(tr.stdOutContained('loc_mock_IstanbulFaile'), 'Should have printed: loc_mock_IstanbulFaile'); + assert(tr.invokedToolCount == 3, 'should exit while running istanbul'); + assert(tr.failed, 'should have failed'); + + done(); + }); +}); diff --git a/_generated/GulpV1_Node20/Tests/L0CwdNotSet.ts b/_generated/GulpV1_Node20/Tests/L0CwdNotSet.ts new file mode 100644 index 000000000000..e804d2031ac1 --- /dev/null +++ b/_generated/GulpV1_Node20/Tests/L0CwdNotSet.ts @@ -0,0 +1,60 @@ +import ma = require("azure-pipelines-task-lib/mock-answer"); +import tmrm = require("azure-pipelines-task-lib/mock-run"); +import path = require("path"); + +let taskPath = path.join(__dirname, "..", "gulptask.js"); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput("gulpFile", "gulpfile.js"); +tr.setInput("gulpjs", "node_modules/gulp/gulp.js"); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "gulp": "/usr/local/bin/gulp", + "npm": "/usr/local/bin/npm", + "node": "/usr/local/bin/node", + "istanbulWin": "/usr/local/bin/istanbul", + "istanbul": "/usr/local/bin/node_modules/istanbul/lib/cli.js", + }, + "exec": { + "/usr/local/bin/gulp --gulpfile gulpfile.js": { + "code": 0, + "stdout": "gulp output here", + }, + "/usr/local/bin/npm install istanbul": { + "code": 0, + "stdout": "npm output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i ./**/build/src/*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 0, + "stdout": "istanbul output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i .\\**\\build\\src\\*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 0, + "stdout": "istanbul output here", + }, + }, + "checkPath": { + "/usr/local/bin/gulp": true, + "/usr/local/bin/npm": true, + "/usr/local/bin/node": true, + "/usr/local/bin/istanbul": true, + "/usr/local/bin/node_modules/istanbul/lib/cli.js": true, + "gulpfile.js": true, + "**/build/test/*.js": true, + }, + "exist": { + "/usr/local/bin/gulp": true, + }, + "match": { + "**/TEST-*.xml": ["/user/build/fun/test-123.xml"], + "**/*.js": ["/test/test.js"], + }, + "getVariable": { + "System.DefaultWorkingDirectory": "/user/build", + }, +}; +tr.setAnswers(a); + +tr.run(); diff --git a/_generated/GulpV1_Node20/Tests/L0GulpFails.ts b/_generated/GulpV1_Node20/Tests/L0GulpFails.ts new file mode 100644 index 000000000000..0b4cabaf0000 --- /dev/null +++ b/_generated/GulpV1_Node20/Tests/L0GulpFails.ts @@ -0,0 +1,67 @@ +import ma = require("azure-pipelines-task-lib/mock-answer"); +import tmrm = require("azure-pipelines-task-lib/mock-run"); +import path = require("path"); +import os = require("os"); + +let taskPath = path.join(__dirname, "..", "gulptask.js"); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +if (os.type().match(/^Win/)) { + tr.setInput("cwd", "c:/fake/wd"); +} else { + tr.setInput("cwd", "/fake/wd"); +} + +tr.setInput("gulpFile", "gulpfile.js"); +tr.setInput("publishJUnitResults", "true"); +tr.setInput("testResultsFiles", "**/build/test-results/TEST-*.xml"); +tr.setInput("enableCodeCoverage", "false"); +tr.setInput("gulpjs", "node_modules/gulp/gulp.js"); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "gulp": "/usr/local/bin/gulp", + "npm": "/usr/local/bin/npm", + "node": "/usr/local/bin/node", + "istanbulWin": "/usr/local/bin/istanbul", + "istanbul": "/usr/local/bin/node_modules/istanbul/lib/cli.js", + }, + "exec": { + "/usr/local/bin/node /fake/wd/node_modules/gulp/gulp.js --gulpfile gulpfile.js": { + "code": 1, + "stdout": "gulp output here", + "stderr": "gulp failed with this output", + }, + "/usr/local/bin/node c:\\fake\\wd\\node_modules\\gulp\\gulp.js --gulpfile gulpfile.js": { + "code": 1, + "stdout": "gulp output here", + "stderr": "gulp failed with this output", + }, + "/usr/local/bin/npm install istanbul": { + "code": 0, + "stdout": "npm output here", + }, + }, + "checkPath": { + "/usr/local/bin/gulp": true, + "/usr/local/bin/npm": true, + "/usr/local/bin/node": true, + "/usr/local/bin/istanbul": true, + "/usr/local/bin/node_modules/istanbul/lib/cli.js": true, + "gulpfile.js": true, + }, + "exist": { + "/fake/wd/node_modules/gulp/gulp.js": true, + "c:\\fake\\wd\\node_modules\\gulp\\gulp.js": true, + }, + "find": { + "/user/build": ["/user/build/fun/test-123.xml"], + }, + "match": { + "**/TEST-*.xml": ["/user/build/fun/test-123.xml"], + }, +}; +tr.setAnswers(a); + +tr.run(); diff --git a/_generated/GulpV1_Node20/Tests/L0GulpFileNotSet.ts b/_generated/GulpV1_Node20/Tests/L0GulpFileNotSet.ts new file mode 100644 index 000000000000..72b5b64c15e9 --- /dev/null +++ b/_generated/GulpV1_Node20/Tests/L0GulpFileNotSet.ts @@ -0,0 +1,66 @@ +import ma = require("azure-pipelines-task-lib/mock-answer"); +import tmrm = require("azure-pipelines-task-lib/mock-run"); +import path = require("path"); +import os = require("os"); + +let taskPath = path.join(__dirname, "..", "gulptask.js"); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +if (os.type().match(/^Win/)) { + tr.setInput("cwd", "c:/fake/wd"); +} else { + tr.setInput("cwd", "/fake/wd"); +} + +tr.setInput("gulpjs", "node_modules/gulp/gulp.js"); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "gulp": "/usr/local/bin/gulp", + "npm": "/usr/local/bin/npm", + "node": "/usr/local/bin/node", + "istanbulWin": "/usr/local/bin/istanbul", + "istanbul": "/usr/local/bin/node_modules/istanbul/lib/cli.js", + }, + "exec": { + "/usr/local/bin/gulp --gulpfile gulpfile.js": { + "code": 0, + "stdout": "gulp output here", + }, + "/usr/local/bin/npm install istanbul": { + "code": 0, + "stdout": "npm output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i ./**/build/src/*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 0, + "stdout": "istanbul output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i .\\**\\build\\src\\*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 0, + "stdout": "istanbul output here", + }, + }, + "checkPath": { + "/usr/local/bin/gulp": true, + "/usr/local/bin/npm": true, + "/usr/local/bin/node": true, + "/usr/local/bin/istanbul": true, + "/usr/local/bin/node_modules/istanbul/lib/cli.js": true, + "gulpfile.js": true, + "**/build/test/*.js": true, + }, + "exist": { + "/usr/local/bin/gulp": true, + }, + "match": { + "**/TEST-*.xml": ["/user/build/fun/test-123.xml"], + "**/*.js": ["/test/test.js"], + }, + "getVariable": { + "System.DefaultWorkingDirectory": "/user/build", + }, +}; +tr.setAnswers(a); + +tr.run(); diff --git a/_generated/GulpV1_Node20/Tests/L0GulpGlobalGood.ts b/_generated/GulpV1_Node20/Tests/L0GulpGlobalGood.ts new file mode 100644 index 000000000000..5d700ee98ee0 --- /dev/null +++ b/_generated/GulpV1_Node20/Tests/L0GulpGlobalGood.ts @@ -0,0 +1,72 @@ +import ma = require("azure-pipelines-task-lib/mock-answer"); +import tmrm = require("azure-pipelines-task-lib/mock-run"); +import path = require("path"); +import os = require("os"); + +let taskPath = path.join(__dirname, "..", "gulptask.js"); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +if (os.type().match(/^Win/)) { + tr.setInput("cwd", "c:/fake/wd"); +} else { + tr.setInput("cwd", "/fake/wd"); +} + +tr.setInput("gulpFile", "gulpfile.js"); +tr.setInput("publishJUnitResults", "true"); +tr.setInput("testResultsFiles", "**/build/test-results/TEST-*.xml"); +tr.setInput("enableCodeCoverage", "false"); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "gulp": "/usr/local/bin/gulp", + "npm": "/usr/local/bin/npm", + "node": "/usr/local/bin/node", + "istanbulWin": "/usr/local/bin/istanbul", + "istanbul": "/usr/local/bin/node_modules/istanbul/lib/cli.js", + }, + "exec": { + "/usr/local/bin/gulp --gulpfile gulpfile.js": { + "code": 0, + "stdout": "gulp output here", + }, + "/usr/local/bin/npm install istanbul": { + "code": 0, + "stdout": "npm output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i ./**/build/src/*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 0, + "stdout": "istanbul output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i .\\**\\build\\src\\*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 0, + "stdout": "istanbul output here", + }, + }, + "checkPath": { + "/usr/local/bin/gulp": true, + "/usr/local/bin/npm": true, + "/usr/local/bin/node": true, + "/usr/local/bin/istanbul": true, + "/usr/local/bin/node_modules/istanbul/lib/cli.js": true, + "gulpfile.js": true, + "**/build/test/*.js": true, + }, + "exist": { + "/usr/local/bin/gulp": true, + }, + "match": { + "**/TEST-*.xml": ["/user/build/fun/test-123.xml"], + "**/*.js": ["/test/test.js"], + }, + "getVariable": { + "System.DefaultWorkingDirectory": "/user/build", + }, + "find": { + "/user/build": ["/user/build/fun/test-123.xml"], + } +}; +tr.setAnswers(a); + +tr.run(); diff --git a/_generated/GulpV1_Node20/Tests/L0GulpLocalGood.ts b/_generated/GulpV1_Node20/Tests/L0GulpLocalGood.ts new file mode 100644 index 000000000000..78813ff8a8a4 --- /dev/null +++ b/_generated/GulpV1_Node20/Tests/L0GulpLocalGood.ts @@ -0,0 +1,59 @@ +import ma = require("azure-pipelines-task-lib/mock-answer"); +import tmrm = require("azure-pipelines-task-lib/mock-run"); +import path = require("path"); +import os = require("os"); + +let taskPath = path.join(__dirname, "..", "gulptask.js"); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +if (os.type().match(/^Win/)) { + tr.setInput("cwd", "c:/fake/wd"); +} else { + tr.setInput("cwd", "/fake/wd"); +} + +tr.setInput("gulpFile", "gulpfile.js"); +tr.setInput("publishJUnitResults", "true"); +tr.setInput("testResultsFiles", "**/build/test-results/TEST-*.xml"); +tr.setInput("enableCodeCoverage", "false"); +tr.setInput("gulpjs", "node_modules/gulp/gulp.js"); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "npm": "/usr/local/bin/npm", + "node": "/usr/local/bin/node", + "istanbulWin": "/usr/local/bin/istanbul", + "istanbul": "/usr/local/bin/node_modules/istanbul/lib/cli.js", + }, + "exec": { + "/usr/local/bin/node /fake/wd/node_modules/gulp/gulp.js --gulpfile gulpfile.js": { + "code": 0, + "stdout": "gulp output here", + }, + "/usr/local/bin/node c:\\fake\\wd\\node_modules\\gulp\\gulp.js --gulpfile gulpfile.js": { + "code": 0, + "stdout": "gulp output here", + }, + }, + "checkPath": { + "/usr/local/bin/node": true, + "/usr/local/bin/npm": true, + "/usr/local/bin/istanbul": true, + "/usr/local/bin/node_modules/istanbul/lib/cli.js": true, + "gulpfile.js": true, + }, + "exist": { + "/fake/wd/node_modules/gulp/gulp.js": true, + "c:\\fake\\wd\\node_modules\\gulp\\gulp.js": true, + }, + "match": { + "**/TEST-*.xml": ["/user/build/fun/test-123.xml"], + }, + "find": { + "/user/build": ["/user/build/fun/test-123.xml"], + } +}; +tr.setAnswers(a); + +tr.run(); diff --git a/_generated/GulpV1_Node20/Tests/L0GulpLocalGoodWithCodeCoverage.ts b/_generated/GulpV1_Node20/Tests/L0GulpLocalGoodWithCodeCoverage.ts new file mode 100644 index 000000000000..ed7df8bfcd5b --- /dev/null +++ b/_generated/GulpV1_Node20/Tests/L0GulpLocalGoodWithCodeCoverage.ts @@ -0,0 +1,80 @@ +import ma = require("azure-pipelines-task-lib/mock-answer"); +import tmrm = require("azure-pipelines-task-lib/mock-run"); +import path = require("path"); +import os = require("os"); + +let taskPath = path.join(__dirname, "..", "gulptask.js"); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +if (os.type().match(/^Win/)) { + tr.setInput("cwd", "c:/fake/wd"); +} else { + tr.setInput("cwd", "/fake/wd"); +} + +tr.setInput("gulpFile", "gulpfile.js"); +tr.setInput("publishJUnitResults", "true"); +tr.setInput("testResultsFiles", "**/build/test-results/TEST-*.xml"); +tr.setInput("enableCodeCoverage", "true"); +tr.setInput("testFramework", "Mocha"); +tr.setInput("srcFiles", "**/build/src/*.js"); +tr.setInput("testFiles", "**/build/test/*.js"); +tr.setInput("gulpjs", "node_modules/gulp/gulp.js"); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "gulp": "/usr/local/bin/gulp", + "npm": "/usr/local/bin/npm", + "node": "/usr/local/bin/node", + "istanbulWin": "/usr/local/bin/istanbul", + "istanbul": "/usr/local/bin/node_modules/istanbul/lib/cli.js", + }, + "exec": { + "/usr/local/bin/node /fake/wd/node_modules/gulp/gulp.js --gulpfile gulpfile.js": { + "code": 0, + "stdout": "gulp output here", + }, + "/usr/local/bin/node c:\\fake\\wd\\node_modules\\gulp\\gulp.js --gulpfile gulpfile.js": { + "code": 0, + "stdout": "gulp output here", + }, + "/usr/local/bin/npm install istanbul": { + "code": 0, + "stdout": "npm output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i ./**/build/src/*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 0, + "stdout": "istanbul output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i .\\**\\build\\src\\*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 0, + "stdout": "istanbul output here", + }, + }, + "checkPath": { + "/usr/local/bin/npm": true, + "/usr/local/bin/node": true, + "/usr/local/bin/istanbul": true, + "/usr/local/bin/node_modules/istanbul/lib/cli.js": true, + "gulpfile.js": true, + "**/build/test/*.js": true, + }, + "exist": { + "/fake/wd/node_modules/gulp/gulp.js": true, + "c:\\fake\\wd\\node_modules\\gulp\\gulp.js": true, + }, + "match": { + "**/TEST-*.xml": ["/user/build/fun/test-123.xml"], + "**/*.js": ["/test/test.js"], + }, + "find": { + "/user/build": ["/user/build/fun/test-123.xml"], + }, + "getVariable": { + "System.DefaultWorkingDirectory": "/user/build", + }, +}; +tr.setAnswers(a); + +tr.run(); diff --git a/_generated/GulpV1_Node20/Tests/L0GulpjsNotSet.ts b/_generated/GulpV1_Node20/Tests/L0GulpjsNotSet.ts new file mode 100644 index 000000000000..d4c39f2f02a2 --- /dev/null +++ b/_generated/GulpV1_Node20/Tests/L0GulpjsNotSet.ts @@ -0,0 +1,66 @@ +import ma = require("azure-pipelines-task-lib/mock-answer"); +import tmrm = require("azure-pipelines-task-lib/mock-run"); +import path = require("path"); +import os = require("os"); + +let taskPath = path.join(__dirname, "..", "gulptask.js"); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +if (os.type().match(/^Win/)) { + tr.setInput("cwd", "c:/fake/wd"); +} else { + tr.setInput("cwd", "/fake/wd"); +} + +tr.setInput("gulpFile", "gulpfile.js"); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "gulp": "/usr/local/bin/gulp", + "npm": "/usr/local/bin/npm", + "node": "/usr/local/bin/node", + "istanbulWin": "/usr/local/bin/istanbul", + "istanbul": "/usr/local/bin/node_modules/istanbul/lib/cli.js", + }, + "exec": { + "/usr/local/bin/gulp --gulpfile gulpfile.js": { + "code": 0, + "stdout": "gulp output here", + }, + "/usr/local/bin/npm install istanbul": { + "code": 0, + "stdout": "npm output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i ./**/build/src/*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 0, + "stdout": "istanbul output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i .\\**\\build\\src\\*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 0, + "stdout": "istanbul output here", + }, + }, + "checkPath": { + "/usr/local/bin/gulp": true, + "/usr/local/bin/npm": true, + "/usr/local/bin/node": true, + "/usr/local/bin/istanbul": true, + "/usr/local/bin/node_modules/istanbul/lib/cli.js": true, + "gulpfile.js": true, + "**/build/test/*.js": true, + }, + "exist": { + "/usr/local/bin/gulp": true, + }, + "match": { + "**/TEST-*.xml": ["/user/build/fun/test-123.xml"], + "**/*.js": ["/test/test.js"], + }, + "getVariable": { + "System.DefaultWorkingDirectory": "/user/build", + }, +}; +tr.setAnswers(a); + +tr.run(); diff --git a/_generated/GulpV1_Node20/Tests/L0InvalidTestSource.ts b/_generated/GulpV1_Node20/Tests/L0InvalidTestSource.ts new file mode 100644 index 000000000000..cfa182b78e83 --- /dev/null +++ b/_generated/GulpV1_Node20/Tests/L0InvalidTestSource.ts @@ -0,0 +1,83 @@ +import ma = require("azure-pipelines-task-lib/mock-answer"); +import tmrm = require("azure-pipelines-task-lib/mock-run"); +import path = require("path"); +import os = require("os"); + +let taskPath = path.join(__dirname, "..", "gulptask.js"); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +if (os.type().match(/^Win/)) { + tr.setInput("cwd", "c:/fake/wd"); +} else { + tr.setInput("cwd", "/fake/wd"); +} + +tr.setInput("gulpFile", "gulpfile.js"); +tr.setInput("publishJUnitResults", "true"); +tr.setInput("testResultsFiles", "**/build/test-results/TEST-*.xml"); +tr.setInput("enableCodeCoverage", "true"); +tr.setInput("testFramework", "Mocha"); +tr.setInput("srcFiles", "**/build/src/*.js"); +tr.setInput("testFiles", "/invalid/input"); +tr.setInput("gulpjs", "node_modules/gulp/gulp.js"); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "gulp": "/usr/local/bin/gulp", + "npm": "/usr/local/bin/npm", + "node": "/usr/local/bin/node", + "istanbulWin": "/usr/local/bin/istanbul", + "istanbul": "/usr/local/bin/node_modules/istanbul/lib/cli.js", + }, + "exec": { + "/usr/local/bin/node /fake/wd/node_modules/gulp/gulp.js --gulpfile gulpfile.js": { + "code": 0, + "stdout": "gulp output here", + }, + "/usr/local/bin/node c:\\fake\\wd\\node_modules\\gulp\\gulp.js --gulpfile gulpfile.js": { + "code": 0, + "stdout": "gulp output here", + }, + "/usr/local/bin/npm install istanbul": { + "code": 0, + "stdout": "npm output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i ./**/build/src/*.js ./node_modules/mocha/bin/_mocha /invalid/input": { + "code": 1, + "stdout": "istanbul output here", + "stderr": "istanbul failed with this output", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i .\\**\\build\\src\\*.js ./node_modules/mocha/bin/_mocha /invalid/input": { + "code": 1, + "stdout": "istanbul output here", + "stderr": "istanbul failed with this output", + }, + }, + "checkPath": { + "/usr/local/bin/gulp": true, + "/usr/local/bin/npm": true, + "/usr/local/bin/node": true, + "/usr/local/bin/istanbul": true, + "/usr/local/bin/node_modules/istanbul/lib/cli.js": true, + "gulpfile.js": true, + "**/build/test/*.js": true, + }, + "exist": { + "/fake/wd/node_modules/gulp/gulp.js": true, + "c:\\fake\\wd\\node_modules\\gulp\\gulp.js": true, + }, + "match": { + "**/TEST-*.xml": ["/user/build/fun/test-123.xml"], + "**/*.js": ["/test/test.js"], + }, + "find": { + "/user/build": ["/user/build/fun/test-123.xml"], + }, + "getVariable": { + "System.DefaultWorkingDirectory": "/user/build", + }, +}; +tr.setAnswers(a); + +tr.run(); diff --git a/_generated/GulpV1_Node20/Tests/L0IstanbulFails.ts b/_generated/GulpV1_Node20/Tests/L0IstanbulFails.ts new file mode 100644 index 000000000000..39553382a7ea --- /dev/null +++ b/_generated/GulpV1_Node20/Tests/L0IstanbulFails.ts @@ -0,0 +1,83 @@ +import ma = require("azure-pipelines-task-lib/mock-answer"); +import tmrm = require("azure-pipelines-task-lib/mock-run"); +import path = require("path"); +import os = require("os"); + +let taskPath = path.join(__dirname, "..", "gulptask.js"); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +if (os.type().match(/^Win/)) { + tr.setInput("cwd", "c:/fake/wd"); +} else { + tr.setInput("cwd", "/fake/wd"); +} + +tr.setInput("gulpFile", "gulpfile.js"); +tr.setInput("publishJUnitResults", "true"); +tr.setInput("testResultsFiles", "**/build/test-results/TEST-*.xml"); +tr.setInput("enableCodeCoverage", "true"); +tr.setInput("testFramework", "Mocha"); +tr.setInput("srcFiles", "**/build/src/*.js"); +tr.setInput("testFiles", "**/build/test/*.js"); +tr.setInput("gulpjs", "node_modules/gulp/gulp.js"); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "gulp": "/usr/local/bin/gulp", + "npm": "/usr/local/bin/npm", + "node": "/usr/local/bin/node", + "istanbulWin": "/usr/local/bin/istanbul", + "istanbul": "/usr/local/bin/node_modules/istanbul/lib/cli.js", + }, + "exec": { + "/usr/local/bin/node /fake/wd/node_modules/gulp/gulp.js --gulpfile gulpfile.js": { + "code": 0, + "stdout": "gulp output here", + }, + "/usr/local/bin/node c:\\fake\\wd\\node_modules\\gulp\\gulp.js --gulpfile gulpfile.js": { + "code": 0, + "stdout": "gulp output here", + }, + "/usr/local/bin/npm install istanbul": { + "code": 0, + "stdout": "npm output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i ./**/build/src/*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 1, + "stdout": "istanbul output here", + "stderr": "istanbul failed with this output", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i .\\**\\build\\src\\*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 1, + "stdout": "istanbul output here", + "stderr": "istanbul failed with this output", + }, + }, + "checkPath": { + "/usr/local/bin/gulp": true, + "/usr/local/bin/npm": true, + "/usr/local/bin/node": true, + "/usr/local/bin/istanbul": true, + "/usr/local/bin/node_modules/istanbul/lib/cli.js": true, + "gulpfile.js": true, + "**/build/test/*.js": true, + }, + "exist": { + "/fake/wd/node_modules/gulp/gulp.js": true, + "c:\\fake\\wd\\node_modules\\gulp\\gulp.js": true, + }, + "match": { + "**/TEST-*.xml": ["/user/build/fun/test-123.xml"], + "**/*.js": ["/test/test.js"], + }, + "find": { + "/user/build": ["/user/build/fun/test-123.xml"], + }, + "getVariable": { + "System.DefaultWorkingDirectory": "/user/build", + }, +}; +tr.setAnswers(a); + +tr.run(); diff --git a/_generated/GulpV1_Node20/Tests/L0NoGulp.ts b/_generated/GulpV1_Node20/Tests/L0NoGulp.ts new file mode 100644 index 000000000000..1c2e8b62b4a7 --- /dev/null +++ b/_generated/GulpV1_Node20/Tests/L0NoGulp.ts @@ -0,0 +1,42 @@ +import ma = require("azure-pipelines-task-lib/mock-answer"); +import tmrm = require("azure-pipelines-task-lib/mock-run"); +import path = require("path"); +import os = require("os"); + +let taskPath = path.join(__dirname, "..", "gulptask.js"); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +if (os.type().match(/^Win/)) { + tr.setInput("cwd", "c:/fake/wd"); +} else { + tr.setInput("cwd", "/fake/wd"); +} + +tr.setInput("gulpFile", "gulpfile.js"); +tr.setInput("publishJUnitResults", "true"); +tr.setInput("testResultsFiles", "**/build/test-results/TEST-*.xml"); +tr.setInput("enableCodeCoverage", "false"); +tr.setInput("gulpjs", "node_modules/gulp/gulp.js"); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "npm": "/usr/local/bin/npm", + "node": "/usr/local/bin/node", + "istanbulWin": "/usr/local/bin/istanbul", + "istanbul": "/usr/local/bin/node_modules/istanbul/lib/cli.js", + }, + "checkPath": { + "/usr/local/bin/npm": true, + "/usr/local/bin/node": true, + "/usr/local/bin/istanbul": true, + "/usr/local/bin/node_modules/istanbul/lib/cli.js": true, + "gulpfile.js": true, + }, + "match": { + "**/TEST-*.xml": ["/user/build/fun/test-123.xml"], + }, +}; +tr.setAnswers(a); + +tr.run(); diff --git a/_generated/GulpV1_Node20/Tests/L0NoGulpFile.ts b/_generated/GulpV1_Node20/Tests/L0NoGulpFile.ts new file mode 100644 index 000000000000..c454170f153e --- /dev/null +++ b/_generated/GulpV1_Node20/Tests/L0NoGulpFile.ts @@ -0,0 +1,26 @@ +import ma = require("azure-pipelines-task-lib/mock-answer"); +import tmrm = require("azure-pipelines-task-lib/mock-run"); +import path = require("path"); +import os = require("os"); + +let taskPath = path.join(__dirname, "..", "gulptask.js"); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +if (os.type().match(/^Win/)) { + tr.setInput("cwd", "c:/fake/wd"); +} else { + tr.setInput("cwd", "/fake/wd"); +} + +tr.setInput("gulpFile", "gulpfile.js"); +tr.setInput("gulpjs", "node_modules/gulp/gulp.js"); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "checkPath": { + "gulpfile.js": false, + }, +}; +tr.setAnswers(a); + +tr.run(); diff --git a/_generated/GulpV1_Node20/Tests/L0NoTestSourceFiles.ts b/_generated/GulpV1_Node20/Tests/L0NoTestSourceFiles.ts new file mode 100644 index 000000000000..cf3bc56b7add --- /dev/null +++ b/_generated/GulpV1_Node20/Tests/L0NoTestSourceFiles.ts @@ -0,0 +1,77 @@ +import ma = require("azure-pipelines-task-lib/mock-answer"); +import tmrm = require("azure-pipelines-task-lib/mock-run"); +import path = require("path"); +import os = require("os"); + +let taskPath = path.join(__dirname, "..", "gulptask.js"); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +if (os.type().match(/^Win/)) { + tr.setInput("cwd", "c:/fake/wd"); +} else { + tr.setInput("cwd", "/fake/wd"); +} + +tr.setInput("gulpFile", "gulpfile.js"); +tr.setInput("publishJUnitResults", "true"); +tr.setInput("testResultsFiles", "**/build/test-results/TEST-*.xml"); +tr.setInput("enableCodeCoverage", "true"); +tr.setInput("testFramework", "Mocha"); +tr.setInput("srcFiles", "**/build/src/*.js"); +tr.setInput("gulpjs", "node_modules/gulp/gulp.js"); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "gulp": "/usr/local/bin/gulp", + "npm": "/usr/local/bin/npm", + "node": "/usr/local/bin/node", + "istanbulWin": "/usr/local/bin/istanbul", + "istanbul": "/usr/local/bin/node_modules/istanbul/lib/cli.js", + }, + "exec": { + "/usr/local/bin/node /fake/wd/node_modules/gulp/gulp.js --gulpfile gulpfile.js": { + "code": 0, + "stdout": "gulp output here", + }, + "/usr/local/bin/node c:\\fake\\wd\\node_modules\\gulp\\gulp.js --gulpfile gulpfile.js": { + "code": 0, + "stdout": "gulp output here", + }, + "/usr/local/bin/npm install istanbul": { + "code": 0, + "stdout": "npm output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i ./**/build/src/*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 0, + "stdout": "istanbul output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i .\\**\\build\\src\\*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 0, + "stdout": "istanbul output here", + }, + }, + "checkPath": { + "/usr/local/bin/gulp": true, + "/usr/local/bin/npm": true, + "/usr/local/bin/node": true, + "/usr/local/bin/istanbul": true, + "/usr/local/bin/node_modules/istanbul/lib/cli.js": true, + "gulpfile.js": true, + "**/build/test/*.js": true, + }, + "exist": { + "/fake/wd/node_modules/gulp/gulp.js": true, + "c:\\fake\\wd\\node_modules\\gulp\\gulp.js": true, + }, + "match": { + "**/TEST-*.xml": ["/user/build/fun/test-123.xml"], + "**/*.js": ["/test/test.js"], + }, + "getVariable": { + "System.DefaultWorkingDirectory": "/user/build", + }, +}; +tr.setAnswers(a); + +tr.run(); diff --git a/_generated/GulpV1_Node20/Tests/L0NpmFails.ts b/_generated/GulpV1_Node20/Tests/L0NpmFails.ts new file mode 100644 index 000000000000..7fbef97c876c --- /dev/null +++ b/_generated/GulpV1_Node20/Tests/L0NpmFails.ts @@ -0,0 +1,73 @@ +import ma = require("azure-pipelines-task-lib/mock-answer"); +import tmrm = require("azure-pipelines-task-lib/mock-run"); +import path = require("path"); +import os = require("os"); + +let taskPath = path.join(__dirname, "..", "gulptask.js"); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +if (os.type().match(/^Win/)) { + tr.setInput("cwd", "c:/fake/wd"); +} else { + tr.setInput("cwd", "/fake/wd"); +} + +tr.setInput("gulpFile", "gulpfile.js"); +tr.setInput("publishJUnitResults", "true"); +tr.setInput("testResultsFiles", "**/build/test-results/TEST-*.xml"); +tr.setInput("enableCodeCoverage", "true"); +tr.setInput("testFramework", "Mocha"); +tr.setInput("srcFiles", "**/build/src/*.js"); +tr.setInput("testFiles", "**/build/test/*.js"); +tr.setInput("gulpjs", "node_modules/gulp/gulp.js"); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "gulp": "/usr/local/bin/gulp", + "npm": "/usr/local/bin/npm", + "node": "/usr/local/bin/node", + "istanbulWin": "/usr/local/bin/istanbul", + "istanbul": "/usr/local/bin/node_modules/istanbul/lib/cli.js", + }, + "exec": { + "/usr/local/bin/node /fake/wd/node_modules/gulp/gulp.js --gulpfile gulpfile.js": { + "code": 0, + "stdout": "gulp output here", + }, + "/usr/local/bin/node c:\\fake\\wd\\node_modules\\gulp\\gulp.js --gulpfile gulpfile.js": { + "code": 0, + "stdout": "gulp output here", + }, + "/usr/local/bin/npm install istanbul": { + "code": 1, + "stdout": "npm output here", + "stderr": "npm failed with this output", + }, + }, + "checkPath": { + "/usr/local/bin/gulp": true, + "/usr/local/bin/npm": true, + "/usr/local/bin/node": true, + "/usr/local/bin/istanbul": true, + "/usr/local/bin/node_modules/istanbul/lib/cli.js": true, + "gulpfile.js": true, + }, + "exist": { + "/fake/wd/node_modules/gulp/gulp.js": true, + "c:\\fake\\wd\\node_modules\\gulp\\gulp.js": true, + }, + "match": { + "**/TEST-*.xml": ["/user/build/fun/test-123.xml"], + "**/*.js": ["/test/test.js"], + }, + "find": { + "/user/build": ["/user/build/fun/test-123.xml"], + }, + "getVariable": { + "System.DefaultWorkingDirectory": "/user/build", + }, +}; +tr.setAnswers(a); + +tr.run(); diff --git a/_generated/GulpV1_Node20/Tests/L0PublishJUnitTestResultsFalse.ts b/_generated/GulpV1_Node20/Tests/L0PublishJUnitTestResultsFalse.ts new file mode 100644 index 000000000000..78fee63af321 --- /dev/null +++ b/_generated/GulpV1_Node20/Tests/L0PublishJUnitTestResultsFalse.ts @@ -0,0 +1,74 @@ +import ma = require("azure-pipelines-task-lib/mock-answer"); +import tmrm = require("azure-pipelines-task-lib/mock-run"); +import path = require("path"); +import os = require("os"); + +let taskPath = path.join(__dirname, "..", "gulptask.js"); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +if (os.type().match(/^Win/)) { + tr.setInput("cwd", "c:/fake/wd"); +} else { + tr.setInput("cwd", "/fake/wd"); +} + +tr.setInput("gulpFile", "gulpfile.js"); +tr.setInput("publishJUnitResults", "false"); +tr.setInput("enableCodeCoverage", "false"); +tr.setInput("gulpjs", "node_modules/gulp/gulp.js"); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "gulp": "/usr/local/bin/gulp", + "npm": "/usr/local/bin/npm", + "node": "/usr/local/bin/node", + "istanbulWin": "/usr/local/bin/istanbul", + "istanbul": "/usr/local/bin/node_modules/istanbul/lib/cli.js", + }, + "exec": { + "/usr/local/bin/node /fake/wd/node_modules/gulp/gulp.js --gulpfile gulpfile.js": { + "code": 0, + "stdout": "gulp output here", + }, + "/usr/local/bin/node c:\\fake\\wd\\node_modules\\gulp\\gulp.js --gulpfile gulpfile.js": { + "code": 0, + "stdout": "gulp output here", + }, + "/usr/local/bin/npm install istanbul": { + "code": 0, + "stdout": "npm output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i ./**/build/src/*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 0, + "stdout": "istanbul output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i .\\**\\build\\src\\*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 0, + "stdout": "istanbul output here", + }, + }, + "checkPath": { + "/usr/local/bin/gulp": true, + "/usr/local/bin/npm": true, + "/usr/local/bin/node": true, + "/usr/local/bin/istanbul": true, + "/usr/local/bin/node_modules/istanbul/lib/cli.js": true, + "gulpfile.js": true, + "**/build/test/*.js": true, + }, + "exist": { + "/fake/wd/node_modules/gulp/gulp.js": true, + "c:\\fake\\wd\\node_modules\\gulp\\gulp.js": true, + }, + "match": { + "**/TEST-*.xml": ["/user/build/fun/test-123.xml"], + "**/*.js": ["/test/test.js"], + }, + "getVariable": { + "System.DefaultWorkingDirectory": "/user/build", + }, +}; +tr.setAnswers(a); + +tr.run(); diff --git a/_generated/GulpV1_Node20/Tests/L0TestResultFilesDoesNotMatchAnyFile.ts b/_generated/GulpV1_Node20/Tests/L0TestResultFilesDoesNotMatchAnyFile.ts new file mode 100644 index 000000000000..9652a31f3870 --- /dev/null +++ b/_generated/GulpV1_Node20/Tests/L0TestResultFilesDoesNotMatchAnyFile.ts @@ -0,0 +1,75 @@ +import ma = require("azure-pipelines-task-lib/mock-answer"); +import tmrm = require("azure-pipelines-task-lib/mock-run"); +import path = require("path"); +import os = require("os"); + +let taskPath = path.join(__dirname, "..", "gulptask.js"); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +if (os.type().match(/^Win/)) { + tr.setInput("cwd", "c:/fake/wd"); +} else { + tr.setInput("cwd", "/fake/wd"); +} + +tr.setInput("gulpFile", "gulpfile.js"); +tr.setInput("publishJUnitResults", "true"); +tr.setInput("testResultsFiles", "/invalid/input"); +tr.setInput("enableCodeCoverage", "false"); +tr.setInput("gulpjs", "node_modules/gulp/gulp.js"); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "gulp": "/usr/local/bin/gulp", + "npm": "/usr/local/bin/npm", + "node": "/usr/local/bin/node", + "istanbulWin": "/usr/local/bin/istanbul", + "istanbul": "/usr/local/bin/node_modules/istanbul/lib/cli.js", + }, + "exec": { + "/usr/local/bin/node /fake/wd/node_modules/gulp/gulp.js --gulpfile gulpfile.js": { + "code": 0, + "stdout": "gulp output here", + }, + "/usr/local/bin/node c:\\fake\\wd\\node_modules\\gulp\\gulp.js --gulpfile gulpfile.js": { + "code": 0, + "stdout": "gulp output here", + }, + "/usr/local/bin/npm install istanbul": { + "code": 0, + "stdout": "npm output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i ./**/build/src/*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 0, + "stdout": "istanbul output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i .\\**\\build\\src\\*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 0, + "stdout": "istanbul output here", + }, + }, + "checkPath": { + "/usr/local/bin/gulp": true, + "/usr/local/bin/npm": true, + "/usr/local/bin/node": true, + "/usr/local/bin/istanbul": true, + "/usr/local/bin/node_modules/istanbul/lib/cli.js": true, + "gulpfile.js": true, + "**/build/test/*.js": true, + }, + "exist": { + "/fake/wd/node_modules/gulp/gulp.js": true, + "c:\\fake\\wd\\node_modules\\gulp\\gulp.js": true, + }, + "match": { + "**/TEST-*.xml": ["/user/build/fun/test-123.xml"], + "**/*.js": ["/test/test.js"], + }, + "getVariable": { + "System.DefaultWorkingDirectory": "/user/build", + }, +}; +tr.setAnswers(a); + +tr.run(); diff --git a/_generated/GulpV1_Node20/Tests/L0TestResultFilesNotSet.ts b/_generated/GulpV1_Node20/Tests/L0TestResultFilesNotSet.ts new file mode 100644 index 000000000000..fdb5d458ac4b --- /dev/null +++ b/_generated/GulpV1_Node20/Tests/L0TestResultFilesNotSet.ts @@ -0,0 +1,69 @@ +import ma = require("azure-pipelines-task-lib/mock-answer"); +import tmrm = require("azure-pipelines-task-lib/mock-run"); +import path = require("path"); +import os = require("os"); + +let taskPath = path.join(__dirname, "..", "gulptask.js"); +let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +if (os.type().match(/^Win/)) { + tr.setInput("cwd", "c:/fake/wd"); +} else { + tr.setInput("cwd", "/fake/wd"); +} + +tr.setInput("gulpFile", "gulpfile.js"); +tr.setInput("publishJUnitResults", "true"); +tr.setInput("enableCodeCoverage", "false"); +tr.setInput("gulpjs", "node_modules/gulp/gulp.js"); + +// provide answers for task mock +let a: ma.TaskLibAnswers = { + "which": { + "gulp": "/usr/local/bin/gulp", + "npm": "/usr/local/bin/npm", + "node": "/usr/local/bin/node", + "istanbulWin": "/usr/local/bin/istanbul", + "istanbul": "/usr/local/bin/node_modules/istanbul/lib/cli.js", + }, + "exec": { + "/usr/local/bin/gulp --gulpfile gulpfile.js": { + "code": 0, + "stdout": "gulp output here", + }, + "/usr/local/bin/npm install istanbul": { + "code": 0, + "stdout": "npm output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i ./**/build/src/*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 0, + "stdout": "istanbul output here", + }, + "/usr/local/bin/node ./node_modules/istanbul/lib/cli.js cover --report cobertura --report html -i .\\**\\build\\src\\*.js ./node_modules/mocha/bin/_mocha **/build/test/*.js": { + "code": 0, + "stdout": "istanbul output here", + }, + }, + "checkPath": { + "/usr/local/bin/gulp": true, + "/usr/local/bin/npm": true, + "/usr/local/bin/node": true, + "/usr/local/bin/istanbul": true, + "/usr/local/bin/node_modules/istanbul/lib/cli.js": true, + "gulpfile.js": true, + "**/build/test/*.js": true, + }, + "exist": { + "/usr/local/bin/gulp": true, + }, + "match": { + "**/TEST-*.xml": ["/user/build/fun/test-123.xml"], + "**/*.js": ["/test/test.js"], + }, + "getVariable": { + "System.DefaultWorkingDirectory": "/user/build", + }, +}; +tr.setAnswers(a); + +tr.run(); diff --git a/_generated/GulpV1_Node20/Tests/package-lock.json b/_generated/GulpV1_Node20/Tests/package-lock.json new file mode 100644 index 000000000000..b4c44bb0b819 --- /dev/null +++ b/_generated/GulpV1_Node20/Tests/package-lock.json @@ -0,0 +1,14 @@ +{ + "name": "gulp-tests", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/mocha": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", + "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==", + "dev": true + } + } +} diff --git a/_generated/GulpV1_Node20/Tests/package.json b/_generated/GulpV1_Node20/Tests/package.json new file mode 100644 index 000000000000..e15110b1b699 --- /dev/null +++ b/_generated/GulpV1_Node20/Tests/package.json @@ -0,0 +1,22 @@ +{ + "name": "gulp-tests", + "version": "1.0.0", + "description": "Azure Pipelines Gulp V1 Task Tests", + "main": "L0.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/Microsoft/azure-pipelines-tasks.git" + }, + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Microsoft/azure-pipelines-tasks/issues" + }, + "homepage": "https://github.com/Microsoft/azure-pipelines-tasks#readme", + "devDependencies": { + "@types/mocha": "^5.2.7" + } +} diff --git a/_generated/GulpV1_Node20/gulptask.ts b/_generated/GulpV1_Node20/gulptask.ts new file mode 100644 index 000000000000..a8f11e49d030 --- /dev/null +++ b/_generated/GulpV1_Node20/gulptask.ts @@ -0,0 +1,120 @@ +import path = require('path'); +import tl = require('azure-pipelines-task-lib/task'); +import minimatch = require('minimatch'); + +tl.setResourcePath(path.join(__dirname, 'task.json')); + +var cwd = tl.getPathInput('cwd', true, false); +tl.mkdirP(cwd); +tl.cd(cwd); + +var gulpFile = tl.getPathInput('gulpFile', true, true); +tl.debug('check gulp file :' + gulpFile); +var isCodeCoverageEnabled = tl.getBoolInput('enableCodeCoverage'); +var publishJUnitResults = tl.getBoolInput('publishJUnitResults'); +var testResultsFiles = tl.getInput('testResultsFiles', publishJUnitResults); + +tl.debug('resolving either gulpjs or gulp'); +var gulpjs = tl.getInput('gulpjs', false); +if (gulpjs) { + tl.debug('gulpjs set'); + gulpjs = path.resolve(cwd, gulpjs); + tl.debug('check path : ' + gulpjs); + if (!tl.exist(gulpjs)) { + tl.setResult(tl.TaskResult.Failed, tl.loc('GulpNotInstalled', gulpjs)); + } + var gt = tl.tool(tl.which('node', true)); + gt.arg(gulpjs); +} +else { + tl.debug('gulpjs not set'); + var gulp = tl.which('gulp', true); + var gt = tl.tool(gulp); +} + +if (isCodeCoverageEnabled) { + var npm = tl.tool(tl.which('npm', true)); + npm.line('install istanbul'); + var testFramework = tl.getInput('testFramework', true); + var srcFiles = tl.getInput('srcFiles', false); + var testSrc = tl.getPathInput('testFiles', true, false); + var istanbul = tl.tool(tl.which('node', true)); + istanbul.arg('./node_modules/istanbul/lib/cli.js'); + istanbul.line('cover --report cobertura --report html'); + if (srcFiles) { + istanbul.line('-i .' + path.sep + path.join(srcFiles)); + } + if (testFramework.toLowerCase() == 'jasmine') { + istanbul.line('./node_modules/jasmine/bin/jasmine.js JASMINE_CONFIG_PATH=node_modules/jasmine/lib/examples/jasmine.json'); + } else { + istanbul.arg('./node_modules/mocha/bin/_mocha'); + } + istanbul.arg(testSrc); + var summaryFile = path.join(cwd, 'coverage/cobertura-coverage.xml'); + var reportDirectory = path.join(cwd, 'coverage/'); +} + +// optional - no targets will concat nothing +gt.arg(tl.getDelimitedInput('targets', ' ', false)); +gt.arg(['--gulpfile', gulpFile]); +gt.line(tl.getInput('arguments', false)); +gt.exec().then(function (code) { + publishTestResults(publishJUnitResults, testResultsFiles); + if (isCodeCoverageEnabled) { + npm.exec().then(function () { + istanbul.exec().then(function (code) { + publishCodeCoverage(summaryFile); + tl.setResult(tl.TaskResult.Succeeded, tl.loc('GulpReturnCode', code)); + }).fail(function (err) { + publishCodeCoverage(summaryFile); + tl.debug('taskRunner fail'); + tl.setResult(tl.TaskResult.Failed, tl.loc('IstanbulFailed', err.message)); + }); + }).fail(function (err) { + tl.debug('taskRunner fail'); + tl.setResult(tl.TaskResult.Failed, tl.loc('NpmFailed', err.message)); + }) + } else { + tl.setResult(tl.TaskResult.Succeeded, tl.loc('GulpReturnCode', code)); + } +}).fail(function (err) { + publishTestResults(publishJUnitResults, testResultsFiles); + tl.debug('taskRunner fail'); + tl.setResult(tl.TaskResult.Failed, tl.loc('GulpFailed', err.message)); +}) + +function publishTestResults(publishJUnitResults, testResultsFiles: string) { + if (publishJUnitResults) { + //check for pattern in testResultsFiles + if (testResultsFiles.indexOf('*') >= 0 || testResultsFiles.indexOf('?') >= 0) { + tl.debug('Pattern found in testResultsFiles parameter'); + var buildFolder = tl.getVariable('System.DefaultWorkingDirectory'); + var allFiles = tl.find(buildFolder); + var matchingTestResultsFiles = minimatch.match(allFiles, testResultsFiles, { matchBase: true }); + } + else { + tl.debug('No pattern found in testResultsFiles parameter'); + var matchingTestResultsFiles = [testResultsFiles]; + } + if (!matchingTestResultsFiles || matchingTestResultsFiles.length == 0) { + tl.warning('No test result files matching ' + testResultsFiles + ' were found, so publishing JUnit test results is being skipped.'); + return 0; + } + var tp = new tl.TestPublisher("JUnit"); + try { + tp.publish(matchingTestResultsFiles, 'true', "", "", "", 'true'); + } catch (error) { + tl.warning(error); + } + } +} + +function publishCodeCoverage(summaryFile) { + try { + var ccPublisher = new tl.CodeCoveragePublisher(); + ccPublisher.publish('cobertura', summaryFile, reportDirectory, ""); + } catch (error) { + tl.warning(error); + throw error; + } +} diff --git a/_generated/GulpV1_Node20/icon.png b/_generated/GulpV1_Node20/icon.png new file mode 100644 index 000000000000..10372dbd6051 Binary files /dev/null and b/_generated/GulpV1_Node20/icon.png differ diff --git a/_generated/GulpV1_Node20/icon.svg b/_generated/GulpV1_Node20/icon.svg new file mode 100644 index 000000000000..ab3c0435f0b3 --- /dev/null +++ b/_generated/GulpV1_Node20/icon.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/_generated/GulpV1_Node20/package-lock.json b/_generated/GulpV1_Node20/package-lock.json new file mode 100644 index 000000000000..f8f9529c02e6 --- /dev/null +++ b/_generated/GulpV1_Node20/package-lock.json @@ -0,0 +1,497 @@ +{ + "name": "vsts-gulp-task", + "requires": true, + "lockfileVersion": 1, + "dependencies": { + "@types/concat-stream": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz", + "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==", + "requires": { + "@types/node": "*" + } + }, + "@types/form-data": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", + "integrity": "sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==", + "requires": { + "@types/node": "*" + } + }, + "@types/mocha": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", + "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==" + }, + "@types/node": { + "version": "20.7.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.7.0.tgz", + "integrity": "sha512-zI22/pJW2wUZOVyguFaUL1HABdmSVxpXrzIqkjsHmyUjNhPoWM1CKfvVuXfetHhIok4RY573cqS0mZ1SJEnoTg==" + }, + "@types/q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.1.tgz", + "integrity": "sha512-eqz8c/0kwNi/OEHQfvIuJVLTst3in0e7uTKeuY+WL/zfKn0xVujOTp42bS/vUUokhK5P2BppLd9JXMOMHcgbjA==" + }, + "@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "azure-pipelines-task-lib": { + "version": "4.0.0-preview", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-4.0.0-preview.tgz", + "integrity": "sha512-BK+VOo42Bec72Wic6Vsm2MaAJezNyF05OYAQS5FuZJM5Z972lZqYpujtSc4BFKUhC3HO+F/Yf4xhAV2tZCzN9Q==", + "requires": { + "minimatch": "3.0.5", + "mockery": "^1.7.0", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "sync-request": "6.1.0", + "uuid": "^3.0.1" + }, + "dependencies": { + "minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "brace-expansion": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", + "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, + "form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-intrinsic": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", + "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + } + }, + "get-port": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", + "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==" + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "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" + }, + "dependencies": { + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "http-basic": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", + "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", + "requires": { + "caseless": "^0.12.0", + "concat-stream": "^1.6.2", + "http-response-object": "^3.0.1", + "parse-cache-control": "^1.0.1" + } + }, + "http-response-object": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", + "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", + "requires": { + "@types/node": "^10.0.3" + }, + "dependencies": { + "@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + } + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" + }, + "is-core-module": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", + "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", + "requires": { + "has": "^1.0.3" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "mockery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/mockery/-/mockery-1.7.0.tgz", + "integrity": "sha512-gUQA33ayi0tuAhr/rJNZPr7Q7uvlBt4gyJPbi0CDcAfIzIrDu1YgGMFgmAu3stJqBpK57m7+RxUbcS+pt59fKQ==" + }, + "object-inspect": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, + "parse-cache-control": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", + "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "promise": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.2.0.tgz", + "integrity": "sha512-+CMAlLHqwRYwBMXKCP+o8ns7DN+xHDUiI+0nArsiJ9y+kJVPLFxEaSw6Ha9s9H0tftxg2Yzl25wqj9G7m5wLZg==", + "requires": { + "asap": "~2.0.6" + } + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==" + }, + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "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" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "requires": { + "resolve": "^1.1.6" + } + }, + "resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "requires": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, + "sync-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", + "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==", + "requires": { + "http-response-object": "^3.0.1", + "sync-rpc": "^1.2.1", + "then-request": "^6.0.0" + } + }, + "sync-rpc": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz", + "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==", + "requires": { + "get-port": "^3.1.0" + } + }, + "then-request": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", + "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", + "requires": { + "@types/concat-stream": "^1.6.0", + "@types/form-data": "0.0.33", + "@types/node": "^8.0.0", + "@types/qs": "^6.2.31", + "caseless": "~0.12.0", + "concat-stream": "^1.6.0", + "form-data": "^2.2.0", + "http-basic": "^8.1.1", + "http-response-object": "^3.0.1", + "promise": "^8.0.0", + "qs": "^6.4.0" + }, + "dependencies": { + "@types/node": { + "version": "8.10.66", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", + "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==" + } + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, + "typescript": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + } + } +} diff --git a/_generated/GulpV1_Node20/package.json b/_generated/GulpV1_Node20/package.json new file mode 100644 index 000000000000..9c688814b9f7 --- /dev/null +++ b/_generated/GulpV1_Node20/package.json @@ -0,0 +1,24 @@ +{ + "name": "vsts-gulp-task", + "description": "Azure Pipelines gulp tasks", + "repository": { + "type": "git", + "url": "git+https://github.com/microsoft/vsts-tasks.git" + }, + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/microsoft/vsts-tasks/issues" + }, + "homepage": "https://github.com/microsoft/vsts-tasks#readme", + "dependencies": { + "azure-pipelines-task-lib": "^4.0.0-preview", + "minimatch": "^3.0.4", + "@types/node": "^20.3.1", + "@types/mocha": "^5.2.7", + "@types/q": "^1.0.7" + }, + "devDependencies": { + "typescript": "5.1.6" + } +} diff --git a/_generated/GulpV1_Node20/task.json b/_generated/GulpV1_Node20/task.json new file mode 100644 index 000000000000..869ba1d3d750 --- /dev/null +++ b/_generated/GulpV1_Node20/task.json @@ -0,0 +1,188 @@ +{ + "id": "B82CFBE4-34F9-40F5-889E-C8842CA9DD9D", + "name": "gulp", + "friendlyName": "gulp", + "description": "Run the gulp Node.js streaming task-based build system", + "helpUrl": "https://docs.microsoft.com/azure/devops/pipelines/tasks/build/gulp", + "helpMarkDown": "[Learn more about this task](https://go.microsoft.com/fwlink/?LinkID=613721)", + "category": "Build", + "visibility": [ + "Build" + ], + "runsOn": [ + "Agent", + "DeploymentGroup" + ], + "author": "Microsoft Corporation", + "preview": true, + "version": { + "Major": 1, + "Minor": 229, + "Patch": 1 + }, + "demands": [ + "node.js" + ], + "minimumAgentVersion": "1.91.0", + "groups": [ + { + "name": "advanced", + "displayName": "Advanced", + "isExpanded": false + }, + { + "name": "junitTestResults", + "displayName": "JUnit Test Results", + "isExpanded": true + }, + { + "name": "codeCoverage", + "displayName": "Code Coverage", + "isExpanded": true + } + ], + "instanceNameFormat": "gulp $(targets)", + "inputs": [ + { + "name": "gulpFile", + "type": "filePath", + "label": "gulp File Path", + "defaultValue": "gulpfile.js", + "required": false, + "helpMarkDown": "Relative path from repo root of the gulp file script file to run." + }, + { + "name": "targets", + "type": "string", + "label": "gulp Task(s)", + "defaultValue": "", + "helpMarkDown": "Optional. Space delimited list of tasks to run. If not specified, the default task will run.", + "required": false + }, + { + "name": "arguments", + "type": "string", + "label": "Arguments", + "defaultValue": "", + "helpMarkDown": "Additional arguments passed to gulp. --gulpfile is not needed since already added via gulpFile input above.", + "required": false + }, + { + "name": "cwd", + "aliases": [ + "workingDirectory" + ], + "type": "filePath", + "label": "Working Directory", + "defaultValue": "", + "required": false, + "helpMarkDown": "Current working directory when script is run. Defaults to the folder where the script is located.", + "groupName": "advanced" + }, + { + "name": "gulpjs", + "type": "string", + "label": "gulp.js location", + "defaultValue": "", + "required": false, + "helpMarkDown": "Path to an alternative gulp.js, relative to the working directory.", + "groupName": "advanced" + }, + { + "name": "publishJUnitResults", + "type": "boolean", + "label": "Publish to Azure Pipelines", + "defaultValue": "false", + "groupName": "junitTestResults", + "helpMarkDown": "Select this option to publish JUnit test results produced by the gulp build to Azure Pipelines." + }, + { + "name": "testResultsFiles", + "type": "filePath", + "label": "Test Results Files", + "defaultValue": "**/TEST-*.xml", + "required": true, + "groupName": "junitTestResults", + "helpMarkDown": "Test results files path. Wildcards can be used. For example, `**/TEST-*.xml` for all XML files whose name starts with TEST-.", + "visibleRule": "publishJUnitResults = true" + }, + { + "name": "testRunTitle", + "type": "string", + "label": "Test Run Title", + "defaultValue": "", + "required": false, + "groupName": "junitTestResults", + "helpMarkDown": "Provide a name for the test run.", + "visibleRule": "publishJUnitResults = true" + }, + { + "name": "enableCodeCoverage", + "type": "boolean", + "label": "Enable code Coverage", + "required": true, + "defaultValue": "false", + "groupName": "codeCoverage", + "helpMarkDown": "Select this option to enable Code Coverage using Istanbul." + }, + { + "name": "testFramework", + "type": "pickList", + "label": "Test Framework", + "required": false, + "groupName": "codeCoverage", + "defaultValue": "Mocha", + "helpMarkDown": "Select your test framework.", + "options": { + "Mocha": "Mocha", + "Jasmine": "Jasmine" + }, + "visibleRule": "enableCodeCoverage = true" + }, + { + "name": "srcFiles", + "type": "string", + "label": "Source Files", + "defaultValue": "", + "required": false, + "groupName": "codeCoverage", + "helpMarkDown": "Provide the path to your source files which you want to hookRequire()", + "visibleRule": "enableCodeCoverage = true" + }, + { + "name": "testFiles", + "type": "string", + "label": "Test Script Files", + "defaultValue": "test/*.js", + "required": true, + "groupName": "codeCoverage", + "helpMarkDown": "Provide the path to your test script files", + "visibleRule": "enableCodeCoverage = true" + } + ], + "execution": { + "Node10": { + "target": "gulptask.js", + "argumentFormat": "" + }, + "Node16": { + "target": "gulptask.js", + "argumentFormat": "" + }, + "Node20": { + "target": "gulptask.js", + "argumentFormat": "" + } + }, + "messages": { + "GulpNotInstalled": "gulp is not installed globally (or is not in the path of the user the agent is running as) and it is not in the local working folder: %s", + "GulpReturnCode": "gulp exited with return code: %d", + "GulpFailed": "gulp failed with error: %s", + "NpmFailed": "Npm failed with error: %s", + "IstanbulFailed": "Istanbul failed with error: %s" + }, + "_buildConfigMapping": { + "Default": "1.229.0", + "Node20-225": "1.229.1" + } +} \ No newline at end of file diff --git a/_generated/GulpV1_Node20/task.loc.json b/_generated/GulpV1_Node20/task.loc.json new file mode 100644 index 000000000000..26ab3073dbee --- /dev/null +++ b/_generated/GulpV1_Node20/task.loc.json @@ -0,0 +1,188 @@ +{ + "id": "B82CFBE4-34F9-40F5-889E-C8842CA9DD9D", + "name": "gulp", + "friendlyName": "ms-resource:loc.friendlyName", + "description": "ms-resource:loc.description", + "helpUrl": "https://docs.microsoft.com/azure/devops/pipelines/tasks/build/gulp", + "helpMarkDown": "ms-resource:loc.helpMarkDown", + "category": "Build", + "visibility": [ + "Build" + ], + "runsOn": [ + "Agent", + "DeploymentGroup" + ], + "author": "Microsoft Corporation", + "preview": true, + "version": { + "Major": 1, + "Minor": 229, + "Patch": 1 + }, + "demands": [ + "node.js" + ], + "minimumAgentVersion": "1.91.0", + "groups": [ + { + "name": "advanced", + "displayName": "ms-resource:loc.group.displayName.advanced", + "isExpanded": false + }, + { + "name": "junitTestResults", + "displayName": "ms-resource:loc.group.displayName.junitTestResults", + "isExpanded": true + }, + { + "name": "codeCoverage", + "displayName": "ms-resource:loc.group.displayName.codeCoverage", + "isExpanded": true + } + ], + "instanceNameFormat": "ms-resource:loc.instanceNameFormat", + "inputs": [ + { + "name": "gulpFile", + "type": "filePath", + "label": "ms-resource:loc.input.label.gulpFile", + "defaultValue": "gulpfile.js", + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.gulpFile" + }, + { + "name": "targets", + "type": "string", + "label": "ms-resource:loc.input.label.targets", + "defaultValue": "", + "helpMarkDown": "ms-resource:loc.input.help.targets", + "required": false + }, + { + "name": "arguments", + "type": "string", + "label": "ms-resource:loc.input.label.arguments", + "defaultValue": "", + "helpMarkDown": "ms-resource:loc.input.help.arguments", + "required": false + }, + { + "name": "cwd", + "aliases": [ + "workingDirectory" + ], + "type": "filePath", + "label": "ms-resource:loc.input.label.cwd", + "defaultValue": "", + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.cwd", + "groupName": "advanced" + }, + { + "name": "gulpjs", + "type": "string", + "label": "ms-resource:loc.input.label.gulpjs", + "defaultValue": "", + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.gulpjs", + "groupName": "advanced" + }, + { + "name": "publishJUnitResults", + "type": "boolean", + "label": "ms-resource:loc.input.label.publishJUnitResults", + "defaultValue": "false", + "groupName": "junitTestResults", + "helpMarkDown": "ms-resource:loc.input.help.publishJUnitResults" + }, + { + "name": "testResultsFiles", + "type": "filePath", + "label": "ms-resource:loc.input.label.testResultsFiles", + "defaultValue": "**/TEST-*.xml", + "required": true, + "groupName": "junitTestResults", + "helpMarkDown": "ms-resource:loc.input.help.testResultsFiles", + "visibleRule": "publishJUnitResults = true" + }, + { + "name": "testRunTitle", + "type": "string", + "label": "ms-resource:loc.input.label.testRunTitle", + "defaultValue": "", + "required": false, + "groupName": "junitTestResults", + "helpMarkDown": "ms-resource:loc.input.help.testRunTitle", + "visibleRule": "publishJUnitResults = true" + }, + { + "name": "enableCodeCoverage", + "type": "boolean", + "label": "ms-resource:loc.input.label.enableCodeCoverage", + "required": true, + "defaultValue": "false", + "groupName": "codeCoverage", + "helpMarkDown": "ms-resource:loc.input.help.enableCodeCoverage" + }, + { + "name": "testFramework", + "type": "pickList", + "label": "ms-resource:loc.input.label.testFramework", + "required": false, + "groupName": "codeCoverage", + "defaultValue": "Mocha", + "helpMarkDown": "ms-resource:loc.input.help.testFramework", + "options": { + "Mocha": "Mocha", + "Jasmine": "Jasmine" + }, + "visibleRule": "enableCodeCoverage = true" + }, + { + "name": "srcFiles", + "type": "string", + "label": "ms-resource:loc.input.label.srcFiles", + "defaultValue": "", + "required": false, + "groupName": "codeCoverage", + "helpMarkDown": "ms-resource:loc.input.help.srcFiles", + "visibleRule": "enableCodeCoverage = true" + }, + { + "name": "testFiles", + "type": "string", + "label": "ms-resource:loc.input.label.testFiles", + "defaultValue": "test/*.js", + "required": true, + "groupName": "codeCoverage", + "helpMarkDown": "ms-resource:loc.input.help.testFiles", + "visibleRule": "enableCodeCoverage = true" + } + ], + "execution": { + "Node10": { + "target": "gulptask.js", + "argumentFormat": "" + }, + "Node16": { + "target": "gulptask.js", + "argumentFormat": "" + }, + "Node20": { + "target": "gulptask.js", + "argumentFormat": "" + } + }, + "messages": { + "GulpNotInstalled": "ms-resource:loc.messages.GulpNotInstalled", + "GulpReturnCode": "ms-resource:loc.messages.GulpReturnCode", + "GulpFailed": "ms-resource:loc.messages.GulpFailed", + "NpmFailed": "ms-resource:loc.messages.NpmFailed", + "IstanbulFailed": "ms-resource:loc.messages.IstanbulFailed" + }, + "_buildConfigMapping": { + "Default": "1.229.0", + "Node20-225": "1.229.1" + } +} \ No newline at end of file diff --git a/_generated/GulpV1_Node20/tsconfig.json b/_generated/GulpV1_Node20/tsconfig.json new file mode 100644 index 000000000000..0438b79f69ac --- /dev/null +++ b/_generated/GulpV1_Node20/tsconfig.json @@ -0,0 +1,6 @@ +{ + "compilerOptions": { + "target": "ES6", + "module": "commonjs" + } +} \ No newline at end of file diff --git a/_generated/NodeTaskRunnerInstallerV0.versionmap.txt b/_generated/NodeTaskRunnerInstallerV0.versionmap.txt new file mode 100644 index 000000000000..378f4c63ee24 --- /dev/null +++ b/_generated/NodeTaskRunnerInstallerV0.versionmap.txt @@ -0,0 +1,2 @@ +Default|0.229.0 +Node20-225|0.229.1 diff --git a/_generated/NodeTaskRunnerInstallerV0/.npmrc b/_generated/NodeTaskRunnerInstallerV0/.npmrc new file mode 100644 index 000000000000..b6f27f135954 --- /dev/null +++ b/_generated/NodeTaskRunnerInstallerV0/.npmrc @@ -0,0 +1 @@ +engine-strict=true diff --git a/_generated/NodeTaskRunnerInstallerV0/Strings/resources.resjson/de-DE/resources.resjson b/_generated/NodeTaskRunnerInstallerV0/Strings/resources.resjson/de-DE/resources.resjson new file mode 100644 index 000000000000..a25ca3a4b561 --- /dev/null +++ b/_generated/NodeTaskRunnerInstallerV0/Strings/resources.resjson/de-DE/resources.resjson @@ -0,0 +1,14 @@ +{ + "loc.friendlyName": "Installationsprogramm für Node.js-Aufgabenausführung", + "loc.helpMarkDown": "[Weitere Informationen zu dieser Aufgabe](https://learn.microsoft.com/azure/devops/pipelines/tasks/reference/node-task-runner-installer-v0)", + "loc.description": "Bestimmte Node.js-Version zum Ausführen von Knotenaufgaben installieren", + "loc.instanceNameFormat": "Knotenausführung $(runnerVersion) installieren", + "loc.input.label.runnerVersion": "Zu installierende Version der Ausführung", + "loc.input.help.runnerVersion": "Wählen Sie die zu installierende Knotenversion aus.", + "loc.messages.TryRosetta": "Der Knoten für die Plattform \"%s\" und die Architektur \"%s\" wurde nicht gefunden. Es wird versucht, mit Rosetta2 zu installieren.", + "loc.messages.UnexpectedOS": "Unerwartete %s des Betriebssystems. Unterstützte Varianten: %s", + "loc.messages.RunnerAlreadyInUse": "Die angegebene Knotenausführungsversion %s ist bereits installiert und wird zurzeit verwendet. Installation wird übersprungen.", + "loc.messages.NotAllowedNodeVersion": "Die Version des Zielknotens stimmt nicht mit den zulässigen Versionen überein. Mögliche Varianten: %s", + "loc.messages.AGENT_HOMEDIRECTORY_NotAvailable": "Die Variable AGENT_HOMEDIRECTORY-Umgebung kann nicht abgerufen werden.", + "loc.messages.RunnerAlreadyInstalled": "Version %s der Knotenausführung ist bereits auf dem Agent installiert. Installation wird übersprungen." +} \ No newline at end of file diff --git a/_generated/NodeTaskRunnerInstallerV0/Strings/resources.resjson/en-US/resources.resjson b/_generated/NodeTaskRunnerInstallerV0/Strings/resources.resjson/en-US/resources.resjson new file mode 100644 index 000000000000..f15e2596734f --- /dev/null +++ b/_generated/NodeTaskRunnerInstallerV0/Strings/resources.resjson/en-US/resources.resjson @@ -0,0 +1,14 @@ +{ + "loc.friendlyName": "Node.js tasks runner installer", + "loc.helpMarkDown": "[Learn more about this task](https://learn.microsoft.com/azure/devops/pipelines/tasks/reference/node-task-runner-installer-v0)", + "loc.description": "Install specific Node.js version to run node tasks", + "loc.instanceNameFormat": "Install node runner $(runnerVersion)", + "loc.input.label.runnerVersion": "Version of runner to install", + "loc.input.help.runnerVersion": "Select the node version to install.", + "loc.messages.TryRosetta": "Unable to find Node for platform %s and architecture %s. Trying to install with Rosetta2", + "loc.messages.UnexpectedOS": "Unexpected OS %s. Supported variants: %s", + "loc.messages.RunnerAlreadyInUse": "The specified Node runner ver.%s is already installed and currently in use. Skipping installation.", + "loc.messages.NotAllowedNodeVersion": "The version of the target node does not match the allowed versions. Possible variants: %s", + "loc.messages.AGENT_HOMEDIRECTORY_NotAvailable": "Can't get AGENT_HOMEDIRECTORY environment varialbe.", + "loc.messages.RunnerAlreadyInstalled": "%s version of node runner already installed on the agent. Skipping installation." +} \ No newline at end of file diff --git a/_generated/NodeTaskRunnerInstallerV0/Strings/resources.resjson/es-ES/resources.resjson b/_generated/NodeTaskRunnerInstallerV0/Strings/resources.resjson/es-ES/resources.resjson new file mode 100644 index 000000000000..e82a487829c4 --- /dev/null +++ b/_generated/NodeTaskRunnerInstallerV0/Strings/resources.resjson/es-ES/resources.resjson @@ -0,0 +1,14 @@ +{ + "loc.friendlyName": "Instalador del ejecutor de tareas de Node.js", + "loc.helpMarkDown": "[Más información sobre esta tarea](https://learn.microsoft.com/azure/devops/pipelines/tasks/reference/node-task-runner-installer-v0)", + "loc.description": "Instalar una versión de Node.js específica para ejecutar tareas de nodo", + "loc.instanceNameFormat": "Instalar $(runnerVersion) del ejecutor de nodos", + "loc.input.label.runnerVersion": "Versión del ejecutor que se va a instalar", + "loc.input.help.runnerVersion": "Seleccione la versión del nodo que se va a instalar.", + "loc.messages.TryRosetta": "No se encuentra ningún node para la plataforma %s ni la arquitectura %s. Intentando instalar con Rosetta2", + "loc.messages.UnexpectedOS": "SO %s inesperado. Variantes admitidas: %s", + "loc.messages.RunnerAlreadyInUse": "El ejecutor de nodos especificado ver.%s ya está instalado y actualmente en uso. Omitiendo la instalación.", + "loc.messages.NotAllowedNodeVersion": "La versión del nodo de destino no coincide con las versiones permitidas. Posibles variantes: %s", + "loc.messages.AGENT_HOMEDIRECTORY_NotAvailable": "No se puede obtener la variable de entorno AGENT_HOMEDIRECTORY.", + "loc.messages.RunnerAlreadyInstalled": "%s versión del ejecutor de nodos ya instalada en el agente. Omitiendo la instalación." +} \ No newline at end of file diff --git a/_generated/NodeTaskRunnerInstallerV0/Strings/resources.resjson/fr-FR/resources.resjson b/_generated/NodeTaskRunnerInstallerV0/Strings/resources.resjson/fr-FR/resources.resjson new file mode 100644 index 000000000000..382b3f844ba3 --- /dev/null +++ b/_generated/NodeTaskRunnerInstallerV0/Strings/resources.resjson/fr-FR/resources.resjson @@ -0,0 +1,14 @@ +{ + "loc.friendlyName": "Programme d’installation de l’exécuteur de tâches Node.js", + "loc.helpMarkDown": "[En savoir plus sur cette tâche](https://learn.microsoft.com/azure/devops/pipelines/tasks/reference/node-task-runner-installer-v0)", + "loc.description": "Installer une version Node.js spécifique pour exécuter des tâches de nœud", + "loc.instanceNameFormat": "Installer l’exécuteur de nœuds $(runnerVersion)", + "loc.input.label.runnerVersion": "Version de l’exécuteur à installer", + "loc.input.help.runnerVersion": "Sélectionnez la version de nœud à installer.", + "loc.messages.TryRosetta": "Nœud introuvable pour la %s de plateforme et l'%s d’architecture. Tentative d’installation avec Rosetta2", + "loc.messages.UnexpectedOS": "%s de système d’exploitation inattendue. Variantes prises en charge : %s", + "loc.messages.RunnerAlreadyInUse": "L’exécuteur node spécifié ver.%s est déjà installé et en cours d’utilisation. Installation ignorée.", + "loc.messages.NotAllowedNodeVersion": "La version du nœud cible ne correspond pas aux versions autorisées. Variantes possibles : %s", + "loc.messages.AGENT_HOMEDIRECTORY_NotAvailable": "Nous n’avons pas pu obtenir la variable d’environnement AGENT_HOMEDIRECTORY.", + "loc.messages.RunnerAlreadyInstalled": "%s version de Node Runner déjà installée sur l’agent. Installation ignorée." +} \ No newline at end of file diff --git a/_generated/NodeTaskRunnerInstallerV0/Strings/resources.resjson/it-IT/resources.resjson b/_generated/NodeTaskRunnerInstallerV0/Strings/resources.resjson/it-IT/resources.resjson new file mode 100644 index 000000000000..ce1fb481a791 --- /dev/null +++ b/_generated/NodeTaskRunnerInstallerV0/Strings/resources.resjson/it-IT/resources.resjson @@ -0,0 +1,14 @@ +{ + "loc.friendlyName": "Programma di installazione dello strumento di esecuzione attività di Node.js", + "loc.helpMarkDown": "[Altre informazioni su questa attività](https://learn.microsoft.com/azure/devops/pipelines/tasks/reference/node-task-runner-installer-v0)", + "loc.description": "Installare una versione specifica di Node.js per eseguire le attività del nodo", + "loc.instanceNameFormat": "Installare lo strumento di esecuzione del nodo $(runnerVersion)", + "loc.input.label.runnerVersion": "Versione dello strumento di esecuzione da installare", + "loc.input.help.runnerVersion": "Selezionare la versione del nodo da installare.", + "loc.messages.TryRosetta": "Non è possibile trovare il nodo per la piattaforma %s e l'architettura %s. Tentativo di installazione con Rosetta2", + "loc.messages.UnexpectedOS": "Sistema operativo %s imprevisto. Varianti supportate: %s", + "loc.messages.RunnerAlreadyInUse": "Lo strumento di esecuzione del nodo specificato ver.%s è già installato e attualmente in uso. L'installazione verrà ignorata.", + "loc.messages.NotAllowedNodeVersion": "La versione del nodo di destinazione non corrisponde alle versioni consentite. Varianti possibili: %s", + "loc.messages.AGENT_HOMEDIRECTORY_NotAvailable": "Non è possibile ottenere la variabile di ambiente AGENT_HOMEDIRECTORY.", + "loc.messages.RunnerAlreadyInstalled": "Versione %s dello strumento di esecuzione del nodo già installata nell'agente. L'installazione verrà ignorata." +} \ No newline at end of file diff --git a/_generated/NodeTaskRunnerInstallerV0/Strings/resources.resjson/ja-JP/resources.resjson b/_generated/NodeTaskRunnerInstallerV0/Strings/resources.resjson/ja-JP/resources.resjson new file mode 100644 index 000000000000..660120be1d9b --- /dev/null +++ b/_generated/NodeTaskRunnerInstallerV0/Strings/resources.resjson/ja-JP/resources.resjson @@ -0,0 +1,14 @@ +{ + "loc.friendlyName": "Node.js タスク ランナー インストーラー", + "loc.helpMarkDown": "[このタスクの詳細情報](https://learn.microsoft.com/azure/devops/pipelines/tasks/reference/node-task-runner-installer-v0)", + "loc.description": "特定の Node.js バージョンをインストールしてノード タスクを実行する", + "loc.instanceNameFormat": "ノード ランナー $(runnerVersion)のインストール", + "loc.input.label.runnerVersion": "インストールするランナーのバージョン", + "loc.input.help.runnerVersion": "インストールするノードのバージョンを選択します。", + "loc.messages.TryRosetta": "プラットフォーム %s およびアーキテクチャ %s のノードが見つかりません。Rosetta2 でインストールしようとしています", + "loc.messages.UnexpectedOS": "予期しない OS %s。サポートされているバリアント: %s", + "loc.messages.RunnerAlreadyInUse": "指定された Node ランナー バージョン %s は既にインストールされており、現在使用中です。インストールをスキップしています。", + "loc.messages.NotAllowedNodeVersion": "ターゲット ノードのバージョンが、許可されているバージョンと一致しません。考えられるバリアント: %s", + "loc.messages.AGENT_HOMEDIRECTORY_NotAvailable": "AGENT_HOMEDIRECTORY 環境変数を取得できません。", + "loc.messages.RunnerAlreadyInstalled": "%s バージョンのノード ランナーが既にエージェントにインストールされています。インストールをスキップしています。" +} \ No newline at end of file diff --git a/_generated/NodeTaskRunnerInstallerV0/Strings/resources.resjson/ko-KR/resources.resjson b/_generated/NodeTaskRunnerInstallerV0/Strings/resources.resjson/ko-KR/resources.resjson new file mode 100644 index 000000000000..269538586a4d --- /dev/null +++ b/_generated/NodeTaskRunnerInstallerV0/Strings/resources.resjson/ko-KR/resources.resjson @@ -0,0 +1,14 @@ +{ + "loc.friendlyName": "Node.js 작업 실행기 설치 관리자", + "loc.helpMarkDown": "[이 작업에 대해 자세히 알아보기](https://learn.microsoft.com/azure/devops/pipelines/tasks/reference/node-task-runner-installer-v0)", + "loc.description": "특정 Node.js 버전을 설치하여 노드 작업 실행", + "loc.instanceNameFormat": "노드 실행기 $(runnerVersion) 설치", + "loc.input.label.runnerVersion": "설치할 실행기 버전", + "loc.input.help.runnerVersion": "설치할 노드 버전을 선택합니다.", + "loc.messages.TryRosetta": "플랫폼 %s 및 아키텍처 %s에 대한 노드를 찾을 수 없습니다. Rosetta2로 설치하는 중", + "loc.messages.UnexpectedOS": "예기치 않은 OS %s입니다. 지원되는 변형: %s", + "loc.messages.RunnerAlreadyInUse": "지정한 Node Runner ver.%s이(가) 이미 설치되어 있으며 현재 사용 중입니다. 설치를 건너뛰는 중입니다.", + "loc.messages.NotAllowedNodeVersion": "대상 노드의 버전이 허용된 버전과 일치하지 않습니다. 가능한 변형: %s", + "loc.messages.AGENT_HOMEDIRECTORY_NotAvailable": "AGENT_HOMEDIRECTORY 환경 변수를 가져올 수 없습니다.", + "loc.messages.RunnerAlreadyInstalled": "에이전트에 노드 실행기의 %s 버전이 이미 설치되어 있습니다. 설치를 건너뛰는 중입니다." +} \ No newline at end of file diff --git a/_generated/NodeTaskRunnerInstallerV0/Strings/resources.resjson/ru-RU/resources.resjson b/_generated/NodeTaskRunnerInstallerV0/Strings/resources.resjson/ru-RU/resources.resjson new file mode 100644 index 000000000000..65b933f024e6 --- /dev/null +++ b/_generated/NodeTaskRunnerInstallerV0/Strings/resources.resjson/ru-RU/resources.resjson @@ -0,0 +1,14 @@ +{ + "loc.friendlyName": "Установщик запускателя задач Node.js", + "loc.helpMarkDown": "[Подробнее об этой задаче](https://learn.microsoft.com/azure/devops/pipelines/tasks/reference/node-task-runner-installer-v0)", + "loc.description": "Установить определенную версию Node.js для запуска задач узла", + "loc.instanceNameFormat": "Установить запускатель узла $(runnerVersion)", + "loc.input.label.runnerVersion": "Версия запускателя для установки", + "loc.input.help.runnerVersion": "Выберите версию узла для установки.", + "loc.messages.TryRosetta": "Не удалось найти Node для платформы %s и архитектуры %s. Попытка установки с помощью Rosetta2", + "loc.messages.UnexpectedOS": "Неожиданная ОС %s. Поддерживаемые варианты: %s", + "loc.messages.RunnerAlreadyInUse": "Указанный запускатель узла версии %s уже установлен и сейчас используется. Пропуск установки.", + "loc.messages.NotAllowedNodeVersion": "Версия целевого узла не соответствует разрешенным версиям. Возможные варианты: %s", + "loc.messages.AGENT_HOMEDIRECTORY_NotAvailable": "Не удается получить переменную среды AGENT_HOMEDIRECTORY.", + "loc.messages.RunnerAlreadyInstalled": "Версия %s запускателя узла уже установлена в агенте. Пропуск установки." +} \ No newline at end of file diff --git a/_generated/NodeTaskRunnerInstallerV0/Strings/resources.resjson/zh-CN/resources.resjson b/_generated/NodeTaskRunnerInstallerV0/Strings/resources.resjson/zh-CN/resources.resjson new file mode 100644 index 000000000000..658402328fcd --- /dev/null +++ b/_generated/NodeTaskRunnerInstallerV0/Strings/resources.resjson/zh-CN/resources.resjson @@ -0,0 +1,14 @@ +{ + "loc.friendlyName": "Node.js 任务运行程序安装程序", + "loc.helpMarkDown": "[详细了解此任务](https://learn.microsoft.com/azure/devops/pipelines/tasks/reference/node-task-runner-installer-v0)", + "loc.description": "安装特定 Node.js 版本以运行节点任务", + "loc.instanceNameFormat": "安装节点运行程序 $(runnerVersion)", + "loc.input.label.runnerVersion": "要安装的运行程序版本", + "loc.input.help.runnerVersion": "选择要安装的节点版本。", + "loc.messages.TryRosetta": "找不到平台 %s 和体系结构 %s 的节点。尝试使用 Rosetta2 进行安装", + "loc.messages.UnexpectedOS": "意外的 OS %s。支持的变量: %s", + "loc.messages.RunnerAlreadyInUse": "指定的节点运行器 ver.%s 已安装并且当前正在使用中。正在跳过安装。", + "loc.messages.NotAllowedNodeVersion": "目标节点的版本与允许的版本不匹配。可能的变量: %s", + "loc.messages.AGENT_HOMEDIRECTORY_NotAvailable": "无法获取 AGENT_HOMEDIRECTORY 环境变量。", + "loc.messages.RunnerAlreadyInstalled": "代理上已安装 %s 版本的节点运行程序。正在跳过安装。" +} \ No newline at end of file diff --git a/_generated/NodeTaskRunnerInstallerV0/Strings/resources.resjson/zh-TW/resources.resjson b/_generated/NodeTaskRunnerInstallerV0/Strings/resources.resjson/zh-TW/resources.resjson new file mode 100644 index 000000000000..459cba3fe1aa --- /dev/null +++ b/_generated/NodeTaskRunnerInstallerV0/Strings/resources.resjson/zh-TW/resources.resjson @@ -0,0 +1,14 @@ +{ + "loc.friendlyName": "Node.js 工作執行器安裝程式", + "loc.helpMarkDown": "[深入了解此工作](https://learn.microsoft.com/azure/devops/pipelines/tasks/reference/node-task-runner-installer-v0)", + "loc.description": "安裝特定 Node.js 版本以執行節點工作", + "loc.instanceNameFormat": "安裝節點執行器 $(runnerVersion)", + "loc.input.label.runnerVersion": "要安裝的執行器版本", + "loc.input.help.runnerVersion": "選取要安裝的節點版本。", + "loc.messages.TryRosetta": "找不到適用於平台 %s 與架構 %s 的 Node。正在嘗試使用 Rosetta2 安裝", + "loc.messages.UnexpectedOS": "未預期的 OS %s。支援的變體: %s", + "loc.messages.RunnerAlreadyInUse": "指定的節點執行器 ver.%s 已安裝且目前正在使用中。正在略過安裝。", + "loc.messages.NotAllowedNodeVersion": "目標節點的版本不符合允許的版本。可能的變體: %s", + "loc.messages.AGENT_HOMEDIRECTORY_NotAvailable": "無法取得 AGENT_HOMEDIRECTORY 環境變數。", + "loc.messages.RunnerAlreadyInstalled": "%s 版本的節點執行器已經安裝在代理程式上。正在略過安裝。" +} \ No newline at end of file diff --git a/_generated/NodeTaskRunnerInstallerV0/constants.ts b/_generated/NodeTaskRunnerInstallerV0/constants.ts new file mode 100644 index 000000000000..6b6741b63ee2 --- /dev/null +++ b/_generated/NodeTaskRunnerInstallerV0/constants.ts @@ -0,0 +1,13 @@ +export const BASE_NODE_DISTRIBUTION_URL = 'https://nodejs.org/dist'; + +export const BASE_NODE_VERSIONS_URL = 'https://nodejs.org/dist/index.json'; + +export enum RunnerVersion { + node6 = '6.17.1', + node10 = '10.24.1' +} + +export const NODE_INPUT_VERSIONS = { + '6': RunnerVersion.node6, + '10': RunnerVersion.node10 +} as const; diff --git a/_generated/NodeTaskRunnerInstallerV0/icon.png b/_generated/NodeTaskRunnerInstallerV0/icon.png new file mode 100644 index 000000000000..ccbddf54c6c9 Binary files /dev/null and b/_generated/NodeTaskRunnerInstallerV0/icon.png differ diff --git a/_generated/NodeTaskRunnerInstallerV0/icon.svg b/_generated/NodeTaskRunnerInstallerV0/icon.svg new file mode 100644 index 000000000000..9522fcc4bbb6 --- /dev/null +++ b/_generated/NodeTaskRunnerInstallerV0/icon.svg @@ -0,0 +1,4 @@ + + + + diff --git a/_generated/NodeTaskRunnerInstallerV0/index.ts b/_generated/NodeTaskRunnerInstallerV0/index.ts new file mode 100644 index 000000000000..f28a47da77d9 --- /dev/null +++ b/_generated/NodeTaskRunnerInstallerV0/index.ts @@ -0,0 +1,47 @@ +import * as os from 'os'; + +import * as taskLib from 'azure-pipelines-task-lib/task'; + +import { NodeOsArch, NodeOsPlatform } from './interfaces/os-types'; +import { installNodeRunner } from './modules/installNodeRunner'; +import { NODE_INPUT_VERSIONS, RunnerVersion } from './constants'; +import { mapOsArchToDistroVariant } from './utils/mapOsArchToDistroVariant'; +import { isRunnerInstalled } from './modules/cache'; + +async function runTask() { + + const runnerInputVersion: string = taskLib.getInputRequired('runnerVersion'); + + const targetRunnerVersion: RunnerVersion = NODE_INPUT_VERSIONS[runnerInputVersion]; + + if (!targetRunnerVersion) { + throw new Error(taskLib.loc('NotAllowedNodeVersion', Object.keys(NODE_INPUT_VERSIONS).join(', '))); + } + + const currentRunnerVersion = process.versions.node; + taskLib.debug('Current runner version = ' + currentRunnerVersion); + + if (currentRunnerVersion === targetRunnerVersion) { + console.log(taskLib.loc('RunnerAlreadyInUse', currentRunnerVersion)); + return; + } + + const osPlatform: NodeOsPlatform = os.platform(); + + const supportedOsList: NodeOsPlatform[] = ['linux', 'darwin', 'win32']; + + if (!supportedOsList.includes(osPlatform)) { + throw new Error(taskLib.loc('UnexpectedOS', osPlatform, supportedOsList.join(', '))); + } + + if (isRunnerInstalled(targetRunnerVersion, osPlatform)) { + console.log(taskLib.loc('RunnerAlreadyInstalled', targetRunnerVersion)); + return; + } + + const osArch = mapOsArchToDistroVariant(os.arch() as NodeOsArch); + + await installNodeRunner(targetRunnerVersion, { osArch, osPlatform }); +} + +runTask(); diff --git a/_generated/NodeTaskRunnerInstallerV0/interfaces/os-types.ts b/_generated/NodeTaskRunnerInstallerV0/interfaces/os-types.ts new file mode 100644 index 000000000000..841e943fcc23 --- /dev/null +++ b/_generated/NodeTaskRunnerInstallerV0/interfaces/os-types.ts @@ -0,0 +1,19 @@ +// TODO: Reuse in node-installer-common + +// https://nodejs.org/api/os.html#osplatform +export type NodeOsPlatform = NodeJS.Platform; + +// https://nodejs.org/api/os.html#osarch +export type NodeOsArch = 'arm' | 'arm64' | 'ia32' | 'mips' | 'mipsel' | 'ppc' | 'ppc64' | 's390' | 's390x' | 'x64'; + +/** + * Node.js distribution architectures names not everytime matches with os.arch(). + * + * Example: ia32 => x86 + */ +export type NodeDistroOsArch = Exclude | 'x86'; + +export type TargetOsInfo = { + osArch: NodeDistroOsArch, + osPlatform: NodeOsPlatform +}; diff --git a/_generated/NodeTaskRunnerInstallerV0/make.json b/_generated/NodeTaskRunnerInstallerV0/make.json new file mode 100644 index 000000000000..57db402cc2ae --- /dev/null +++ b/_generated/NodeTaskRunnerInstallerV0/make.json @@ -0,0 +1,20 @@ +{ + "externals": { + "archivePackages": [ + { + "archiveName": "7zr.zip", + "url": "https://vstsagenttools.blob.core.windows.net/tools/7zr/1805_x86/7zr.zip", + "dest": "./" + } + ] + }, + "rm": [ + { + "items": [ + "node_modules/azure-pipelines-tool-lib/node_modules/azure-pipelines-task-lib", + "node_modules/mockery" + ], + "options": "-Rf" + } + ] +} \ No newline at end of file diff --git a/_generated/NodeTaskRunnerInstallerV0/modules/cache.ts b/_generated/NodeTaskRunnerInstallerV0/modules/cache.ts new file mode 100644 index 000000000000..b9dc686ba081 --- /dev/null +++ b/_generated/NodeTaskRunnerInstallerV0/modules/cache.ts @@ -0,0 +1,22 @@ +import * as fs from 'fs'; +import * as path from 'path'; + +import * as taskLib from 'azure-pipelines-task-lib'; + +import { RunnerVersion } from '../constants'; +import { NodeOsPlatform } from '../interfaces/os-types'; +import { getAgentExternalsPath } from '../utils/getAgentExternalsPath'; + +export function isRunnerInstalled(targetRunner: RunnerVersion, osPlatform: NodeOsPlatform): boolean { + + const agentExternals = getAgentExternalsPath(); + + const nodeBinName = osPlatform === 'win32' ? 'node.exe' : 'node'; + const nodeFolder = targetRunner === RunnerVersion.node6 ? 'node' : 'node10'; + + const nodePath = path.join(agentExternals, nodeFolder, 'bin', nodeBinName); + + taskLib.debug('Checking if node runner already installed. Path = ' + nodePath); + + return fs.existsSync(nodePath); +} diff --git a/_generated/NodeTaskRunnerInstallerV0/modules/downloadNode.ts b/_generated/NodeTaskRunnerInstallerV0/modules/downloadNode.ts new file mode 100644 index 000000000000..5090c717c2ce --- /dev/null +++ b/_generated/NodeTaskRunnerInstallerV0/modules/downloadNode.ts @@ -0,0 +1,76 @@ +import * as path from 'path'; +import * as taskLib from 'azure-pipelines-task-lib/task'; +import * as toolLib from 'azure-pipelines-tool-lib/tool'; + +import { extractArchive } from '../utils/extractArchive'; +import { isDarwinArmWithRosetta } from '../utils/isDarwinArmWithRosetta'; +import { NodeDistroOsArch, TargetOsInfo } from '../interfaces/os-types'; + +/** + * Installs target node runner from online. + * + * @param version Node version to install. + * @param osInfo Target OS for runner. + * @returns Installed node runner path. + */ +export async function downloadNodeRunner(version: string, osInfo: TargetOsInfo): Promise { + + let downloadNodePath: string; + + try { + if (osInfo.osPlatform === 'win32') { + downloadNodePath = await downloadWindowsNode(version, osInfo.osArch); + } else { + // OSX, Linux + downloadNodePath = await downloadUnixNode(version, osInfo); + } + } catch (err) { + if (err.httpStatusCode) { + if (err.httpStatusCode === 404) { + throw new Error('Target node version not found. Please contact with task support. Error: ' + err); + } else { + throw new Error('Something went wrong. Error: ' + err); + } + } + + throw err; + } + + taskLib.debug('Downloaded node path: ' + downloadNodePath); + + return downloadNodePath; +} + +async function downloadUnixNode(version: string, osInfo: TargetOsInfo): Promise { + let targetOsArch = osInfo.osArch; + + if (!version && isDarwinArmWithRosetta(osInfo.osPlatform, osInfo.osArch)) { + // nodejs.org does not have an arm64 build for macOS, so we fall back to x64 + console.log(taskLib.loc('TryRosetta', osInfo.osPlatform, targetOsArch)); + targetOsArch = 'x64'; + } + + const urlFileName = `node-v${version}-${osInfo.osPlatform}-${targetOsArch}.tar.gz`; + const downloadUrl = 'https://nodejs.org/dist/v' + version + '/' + urlFileName; + + const downloadPath = await toolLib.downloadTool(downloadUrl); + const extractedPath = await extractArchive(downloadPath); + + return extractedPath; +} + +async function downloadWindowsNode(version: string, osArch: NodeDistroOsArch): Promise { + + // Create temporary folder to download in to + const tempDownloadFolder: string = 'temp_' + Math.floor(Math.random() * 2000000000); + const downloadPath: string = path.join(taskLib.getVariable('agent.tempDirectory'), tempDownloadFolder); + taskLib.mkdirP(downloadPath); + + const exeUrl = `https://nodejs.org/dist/v${version}/win-${osArch}/node.exe`; + const libUrl = `https://nodejs.org/dist/v${version}/win-${osArch}/node.lib`; + + await toolLib.downloadTool(exeUrl, path.join(downloadPath, 'node.exe')); + await toolLib.downloadTool(libUrl, path.join(downloadPath, 'node.lib')); + + return downloadPath; +} diff --git a/_generated/NodeTaskRunnerInstallerV0/modules/installNodeRunner.ts b/_generated/NodeTaskRunnerInstallerV0/modules/installNodeRunner.ts new file mode 100644 index 000000000000..d502ba6be8f2 --- /dev/null +++ b/_generated/NodeTaskRunnerInstallerV0/modules/installNodeRunner.ts @@ -0,0 +1,89 @@ +import * as taskLib from 'azure-pipelines-task-lib/task'; +import * as toolLib from 'azure-pipelines-tool-lib/tool'; +import * as path from 'path'; +import * as fs from 'fs'; + +import { downloadNodeRunner } from './downloadNode'; +import { isDarwinArmWithRosetta } from '../utils/isDarwinArmWithRosetta'; +import { getAgentExternalsPath } from '../utils/getAgentExternalsPath'; +import { getDirContent } from '../utils/getDirContent'; +import { NodeOsPlatform, TargetOsInfo } from '../interfaces/os-types'; + +export async function installNodeRunner(targetNodeVersion: string, osInfo: TargetOsInfo) { + let installedArch = osInfo.osArch; + + let targetNodePath: string; + + // check cache + targetNodePath = toolLib.findLocalTool('node', targetNodeVersion, installedArch); + + // In case if it's darwin arm and toolPath is empty trying to find x64 version + if (!targetNodePath && isDarwinArmWithRosetta(osInfo.osPlatform, installedArch)) { + targetNodePath = toolLib.findLocalTool('node', installedArch, 'x64'); + installedArch = 'x64'; + } + + if (!targetNodePath) { + const cleanVersion = toolLib.cleanVersion(targetNodeVersion); + targetNodePath = await taskLib.retry( + async () => await downloadNodeRunner(cleanVersion, { osPlatform: osInfo.osPlatform, osArch: installedArch }), + undefined, + { retryCount: 3, continueOnError: false } + ); + } + + const resultNodePath = await copyNodeToAgentExternals(targetNodePath, 'node', osInfo.osPlatform); + + taskLib.debug('resultNodePath = ' + resultNodePath); + + getDirContent(resultNodePath); +} + +async function copyNodeToAgentExternals(nodePath: string, targetNodeDir: string, osPlatform: NodeOsPlatform): Promise { + const externalsPath = getAgentExternalsPath(); + + const targetNodePath = path.join(externalsPath, targetNodeDir); + + taskLib.rmRF(targetNodePath); + taskLib.mkdirP(targetNodePath); + + if (osPlatform === 'win32') { + copyWindowsNodeToAgentExternals(nodePath, targetNodePath); + } else { + copyUnixNodeToAgentExternals(nodePath, targetNodePath); + } + + return targetNodePath; +} + +function copyWindowsNodeToAgentExternals(nodeCurrentLocation: string, targetNodeLocation: string) { + const binPath = path.join(targetNodeLocation, 'bin'); + + taskLib.mkdirP(binPath); + taskLib.debug('TARGET NODE PATH = ' + binPath); + + const nodeExePath = path.join(nodeCurrentLocation, 'node.exe'); + taskLib.cp(nodeExePath, binPath, '-rf'); + + const nodeLibPath = path.join(nodeCurrentLocation, 'node.lib'); + taskLib.cp(nodeLibPath, binPath, '-rf'); + + getDirContent(binPath); + + return path.resolve(binPath, '..'); +} + +function copyUnixNodeToAgentExternals(nodeCurrentPath: string, targetNodePath: string) { + const newstedDir = fs.readdirSync(nodeCurrentPath)[0]; + + taskLib.debug('Nested node directory = ' + newstedDir); + + const nestedDirPath = path.join(nodeCurrentPath, newstedDir); + + taskLib.cp(nestedDirPath + '/*', targetNodePath + '/', '-rf'); + // taskLib.rmRF(newstedDir); + + getDirContent(targetNodePath); + + return targetNodePath; +} diff --git a/_generated/NodeTaskRunnerInstallerV0/package-lock.json b/_generated/NodeTaskRunnerInstallerV0/package-lock.json new file mode 100644 index 000000000000..521b724ee34f --- /dev/null +++ b/_generated/NodeTaskRunnerInstallerV0/package-lock.json @@ -0,0 +1,540 @@ +{ + "requires": true, + "lockfileVersion": 1, + "dependencies": { + "@types/concat-stream": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz", + "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==", + "requires": { + "@types/node": "*" + } + }, + "@types/form-data": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", + "integrity": "sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==", + "requires": { + "@types/node": "*" + } + }, + "@types/node": { + "version": "16.18.11", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.11.tgz", + "integrity": "sha512-3oJbGBUWuS6ahSnEq1eN2XrCyf4YsWI8OyCvo7c64zQJNplk3mO84t53o8lfTk+2ji59g5ycfc6qQ3fdHliHuA==" + }, + "@types/qs": { + "version": "6.9.8", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.8.tgz", + "integrity": "sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg==" + }, + "@types/semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-41qEJgBH/TWgo5NFSvBCJ1qkoi3Q6ONSF2avrHq1LVEZfYpdHmj0y9SuTK+u9ZhG1sYQKBL1AWXKyLWP4RaUoQ==" + }, + "@types/uuid": { + "version": "3.4.10", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-3.4.10.tgz", + "integrity": "sha512-BgeaZuElf7DEYZhWYDTc/XcLZXdVgFkVSTa13BqKvbnmUrxr3TJFKofUxCtDO9UQOdhnV+HPOESdHiHKZOJV1A==" + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "azure-pipelines-task-lib": { + "version": "5.0.0-preview.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-5.0.0-preview.0.tgz", + "integrity": "sha512-uQJEv+q3/7RD7kgphFd33uXijaPwA1ePYoNkAgZpUhbZUtc2u4JL4ujTT/JJfgXBNW/QQNAiDQ2OC7vOQG/0tg==", + "requires": { + "minimatch": "3.0.5", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "sync-request": "6.1.0", + "uuid": "^3.0.1" + } + }, + "azure-pipelines-tool-lib": { + "version": "2.0.0-preview", + "resolved": "https://registry.npmjs.org/azure-pipelines-tool-lib/-/azure-pipelines-tool-lib-2.0.0-preview.tgz", + "integrity": "sha512-OeivwKLpLMsvGpZ2H+2UPxFwwqNkV8TzfKByqjYAllzGDAw4BvciAdjCMwkpGdTOnzfPbRpr33sy48kn7RqfKA==", + "requires": { + "@types/semver": "^5.3.0", + "@types/uuid": "^3.4.5", + "azure-pipelines-task-lib": "^4.0.0-preview", + "semver": "^5.7.0", + "semver-compare": "^1.0.0", + "typed-rest-client": "^1.8.6", + "uuid": "^3.3.2" + }, + "dependencies": { + "azure-pipelines-task-lib": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-4.5.0.tgz", + "integrity": "sha512-NGxrpggmho4SxWeEnVID7xEClDHC3o4RndfdBzTO5iBWhMHkQp95N1Z4oaywJyiC5Xa92wkUvqzSm6MSLKzYoQ==", + "requires": { + "minimatch": "3.0.5", + "mockery": "^2.1.0", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "sync-request": "6.1.0", + "uuid": "^3.0.1" + } + } + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, + "form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-intrinsic": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", + "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + } + }, + "get-port": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", + "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==" + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "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" + }, + "dependencies": { + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "http-basic": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", + "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", + "requires": { + "caseless": "^0.12.0", + "concat-stream": "^1.6.2", + "http-response-object": "^3.0.1", + "parse-cache-control": "^1.0.1" + } + }, + "http-response-object": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", + "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", + "requires": { + "@types/node": "^10.0.3" + }, + "dependencies": { + "@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + } + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" + }, + "is-core-module": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "requires": { + "has": "^1.0.3" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "mockery": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mockery/-/mockery-2.1.0.tgz", + "integrity": "sha512-9VkOmxKlWXoDO/h1jDZaS4lH33aWfRiJiNT/tKj+8OGzrcFDLo8d0syGdbsc3Bc4GvRXPb+NMMvojotmuGJTvA==" + }, + "object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, + "parse-cache-control": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", + "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "promise": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", + "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", + "requires": { + "asap": "~2.0.6" + } + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==" + }, + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "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" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "requires": { + "resolve": "^1.1.6" + } + }, + "resolve": { + "version": "1.22.6", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.6.tgz", + "integrity": "sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==", + "requires": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==" + }, + "shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, + "sync-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", + "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==", + "requires": { + "http-response-object": "^3.0.1", + "sync-rpc": "^1.2.1", + "then-request": "^6.0.0" + } + }, + "sync-rpc": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz", + "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==", + "requires": { + "get-port": "^3.1.0" + } + }, + "then-request": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", + "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", + "requires": { + "@types/concat-stream": "^1.6.0", + "@types/form-data": "0.0.33", + "@types/node": "^8.0.0", + "@types/qs": "^6.2.31", + "caseless": "~0.12.0", + "concat-stream": "^1.6.0", + "form-data": "^2.2.0", + "http-basic": "^8.1.1", + "http-response-object": "^3.0.1", + "promise": "^8.0.0", + "qs": "^6.4.0" + }, + "dependencies": { + "@types/node": { + "version": "8.10.66", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", + "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==" + } + } + }, + "tunnel": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", + "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==" + }, + "typed-rest-client": { + "version": "1.8.9", + "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.8.9.tgz", + "integrity": "sha512-uSmjE38B80wjL85UFX3sTYEUlvZ1JgCRhsWj/fJ4rZ0FqDUFoIuodtiVeE+cUqiVTOKPdKrp/sdftD15MDek6g==", + "requires": { + "qs": "^6.9.1", + "tunnel": "0.0.6", + "underscore": "^1.12.1" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, + "typescript": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.2.tgz", + "integrity": "sha512-e4ERvRV2wb+rRZ/IQeb3jm2VxBsirQLpQhdxplZ2MEzGvDkkMmPglecnNDfSUBivMjP93vRbngYYDQqQ/78bcQ==", + "dev": true + }, + "underscore": { + "version": "1.13.6", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz", + "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==" + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + } + } +} diff --git a/_generated/NodeTaskRunnerInstallerV0/package.json b/_generated/NodeTaskRunnerInstallerV0/package.json new file mode 100644 index 000000000000..3c9233918644 --- /dev/null +++ b/_generated/NodeTaskRunnerInstallerV0/package.json @@ -0,0 +1,18 @@ +{ + "private": "true", + "main": "index.js", + "author": "Microsoft Corporation", + "license": "MIT", + "scripts": { + "build": "node ../../make.js build --task NodeTaskRunnerInstallerV0", + "test": "node ../../make.js test --task NodeTaskRunnerInstallerV0" + }, + "dependencies": { + "@types/node": "^16.18.11", + "azure-pipelines-task-lib": "^5.0.0-preview.0", + "azure-pipelines-tool-lib": "^2.0.0-preview" + }, + "devDependencies": { + "typescript": "4.0.2" + } +} diff --git a/_generated/NodeTaskRunnerInstallerV0/task.json b/_generated/NodeTaskRunnerInstallerV0/task.json new file mode 100644 index 000000000000..bf75415e4697 --- /dev/null +++ b/_generated/NodeTaskRunnerInstallerV0/task.json @@ -0,0 +1,64 @@ +{ + "$schema": "https://raw.githubusercontent.com/Microsoft/azure-pipelines-task-lib/master/tasks.schema.json", + "id": "31C75B2B-BCDF-4706-8D7C-4DA6A1959BC2", + "name": "NodeTaskRunnerInstaller", + "friendlyName": "Node.js tasks runner installer", + "description": "Install specific Node.js version to run node tasks", + "helpUrl": "https://learn.microsoft.com/azure/devops/pipelines/tasks/reference/node-task-runner-installer-v0", + "helpMarkDown": "[Learn more about this task](https://learn.microsoft.com/azure/devops/pipelines/tasks/reference/node-task-runner-installer-v0)", + "category": "Utility", + "runsOn": [ + "Agent", + "DeploymentGroup" + ], + "author": "Microsoft Corporation", + "version": { + "Major": 0, + "Minor": 229, + "Patch": 0 + }, + "preview": true, + "demands": [], + "minimumAgentVersion": "2.144.0", + "instanceNameFormat": "Install node runner $(runnerVersion)", + "inputs": [ + { + "name": "runnerVersion", + "aliases": [ + "nodeVersion", + "installVersion" + ], + "type": "pickList", + "label": "Version of runner to install", + "required": true, + "defaultValue": "6", + "helpMarkDown": "Select the node version to install.", + "options": { + "6": "Node.js 6.17.1", + "10": "Node.js 10.24.1" + } + } + ], + "execution": { + "Node10": { + "target": "index.js", + "argumentFormat": "" + }, + "Node16": { + "target": "index.js", + "argumentFormat": "" + } + }, + "messages": { + "TryRosetta": "Unable to find Node for platform %s and architecture %s. Trying to install with Rosetta2", + "UnexpectedOS": "Unexpected OS %s. Supported variants: %s", + "RunnerAlreadyInUse": "The specified Node runner ver.%s is already installed and currently in use. Skipping installation.", + "NotAllowedNodeVersion": "The version of the target node does not match the allowed versions. Possible variants: %s", + "AGENT_HOMEDIRECTORY_NotAvailable": "Can't get AGENT_HOMEDIRECTORY environment varialbe.", + "RunnerAlreadyInstalled": "%s version of node runner already installed on the agent. Skipping installation." + }, + "_buildConfigMapping": { + "Default": "0.229.0", + "Node20-225": "0.229.1" + } +} \ No newline at end of file diff --git a/_generated/NodeTaskRunnerInstallerV0/task.loc.json b/_generated/NodeTaskRunnerInstallerV0/task.loc.json new file mode 100644 index 000000000000..3a44130190c1 --- /dev/null +++ b/_generated/NodeTaskRunnerInstallerV0/task.loc.json @@ -0,0 +1,64 @@ +{ + "$schema": "https://raw.githubusercontent.com/Microsoft/azure-pipelines-task-lib/master/tasks.schema.json", + "id": "31C75B2B-BCDF-4706-8D7C-4DA6A1959BC2", + "name": "NodeTaskRunnerInstaller", + "friendlyName": "ms-resource:loc.friendlyName", + "description": "ms-resource:loc.description", + "helpUrl": "https://learn.microsoft.com/azure/devops/pipelines/tasks/reference/node-task-runner-installer-v0", + "helpMarkDown": "ms-resource:loc.helpMarkDown", + "category": "Utility", + "runsOn": [ + "Agent", + "DeploymentGroup" + ], + "author": "Microsoft Corporation", + "version": { + "Major": 0, + "Minor": 229, + "Patch": 0 + }, + "preview": true, + "demands": [], + "minimumAgentVersion": "2.144.0", + "instanceNameFormat": "ms-resource:loc.instanceNameFormat", + "inputs": [ + { + "name": "runnerVersion", + "aliases": [ + "nodeVersion", + "installVersion" + ], + "type": "pickList", + "label": "ms-resource:loc.input.label.runnerVersion", + "required": true, + "defaultValue": "6", + "helpMarkDown": "ms-resource:loc.input.help.runnerVersion", + "options": { + "6": "Node.js 6.17.1", + "10": "Node.js 10.24.1" + } + } + ], + "execution": { + "Node10": { + "target": "index.js", + "argumentFormat": "" + }, + "Node16": { + "target": "index.js", + "argumentFormat": "" + } + }, + "messages": { + "TryRosetta": "ms-resource:loc.messages.TryRosetta", + "UnexpectedOS": "ms-resource:loc.messages.UnexpectedOS", + "RunnerAlreadyInUse": "ms-resource:loc.messages.RunnerAlreadyInUse", + "NotAllowedNodeVersion": "ms-resource:loc.messages.NotAllowedNodeVersion", + "AGENT_HOMEDIRECTORY_NotAvailable": "ms-resource:loc.messages.AGENT_HOMEDIRECTORY_NotAvailable", + "RunnerAlreadyInstalled": "ms-resource:loc.messages.RunnerAlreadyInstalled" + }, + "_buildConfigMapping": { + "Default": "0.229.0", + "Node20-225": "0.229.1" + } +} \ No newline at end of file diff --git a/_generated/NodeTaskRunnerInstallerV0/tsconfig.json b/_generated/NodeTaskRunnerInstallerV0/tsconfig.json new file mode 100644 index 000000000000..0438b79f69ac --- /dev/null +++ b/_generated/NodeTaskRunnerInstallerV0/tsconfig.json @@ -0,0 +1,6 @@ +{ + "compilerOptions": { + "target": "ES6", + "module": "commonjs" + } +} \ No newline at end of file diff --git a/_generated/NodeTaskRunnerInstallerV0/utils/extractArchive.ts b/_generated/NodeTaskRunnerInstallerV0/utils/extractArchive.ts new file mode 100644 index 000000000000..c0599228aa37 --- /dev/null +++ b/_generated/NodeTaskRunnerInstallerV0/utils/extractArchive.ts @@ -0,0 +1,21 @@ +// TODO: Reuse in node-installer-common +import * as path from 'path'; +import * as os from 'os'; + +import * as toolLib from 'azure-pipelines-tool-lib/tool'; + +/** + * Extracts archive. + * @param archivePath Path to archive. + * @returns Path to extracted archive. + */ +export async function extractArchive(archivePath: string): Promise { + + if (os.platform() === 'win32') { + const pathTo7z = path.resolve(__dirname, '..', 'externals', '7zr.exe'); + + return await toolLib.extract7z(archivePath, undefined, pathTo7z); + } + + return await toolLib.extractTar(archivePath); +} diff --git a/_generated/NodeTaskRunnerInstallerV0/utils/getAgentExternalsPath.ts b/_generated/NodeTaskRunnerInstallerV0/utils/getAgentExternalsPath.ts new file mode 100644 index 000000000000..9f5c3b9f338d --- /dev/null +++ b/_generated/NodeTaskRunnerInstallerV0/utils/getAgentExternalsPath.ts @@ -0,0 +1,13 @@ +import * as path from 'path'; +import * as taskLib from 'azure-pipelines-task-lib'; + +export function getAgentExternalsPath(): string { + + const agentRoot: string = process.env.AGENT_HOMEDIRECTORY; + + if (!agentRoot) { + throw new Error(taskLib.loc('AGENT_HOMEDIRECTORY_NotAvailable')); + } + + return path.join(agentRoot, 'externals'); +} diff --git a/_generated/NodeTaskRunnerInstallerV0/utils/getDirContent.ts b/_generated/NodeTaskRunnerInstallerV0/utils/getDirContent.ts new file mode 100644 index 000000000000..feba8566b564 --- /dev/null +++ b/_generated/NodeTaskRunnerInstallerV0/utils/getDirContent.ts @@ -0,0 +1,17 @@ +import * as taskLib from 'azure-pipelines-task-lib/task'; +import * as fs from 'fs'; + +export function getDirContent(directoryPath: string) { + try { + const files = fs.readdirSync(directoryPath); + + files.forEach((file) => { + taskLib.debug('Found file = ' + file); + }); + + return files; + + } catch (err) { + taskLib.warning(`Unable to scan directory: ${directoryPath}:\n` + err); + } +} diff --git a/_generated/NodeTaskRunnerInstallerV0/utils/isDarwinArmWithRosetta.ts b/_generated/NodeTaskRunnerInstallerV0/utils/isDarwinArmWithRosetta.ts new file mode 100644 index 000000000000..80f02b2b32fd --- /dev/null +++ b/_generated/NodeTaskRunnerInstallerV0/utils/isDarwinArmWithRosetta.ts @@ -0,0 +1,22 @@ +// TODO: Reuse in node-installer-common +import * as taskLib from 'azure-pipelines-task-lib/task'; + +import { NodeDistroOsArch, NodeOsPlatform } from '../interfaces/os-types'; + +/** + * Check is the system is darwin ARM and rosetta is installed. + * @param osPlatform OS platform. + * @param installedArch OS architecture. + * @returns `true` if it's darwin arm with rosetta installed, otherwise `false` +*/ +export function isDarwinArmWithRosetta(osPlatform: NodeOsPlatform, installedArch: NodeDistroOsArch): boolean { + if (osPlatform === 'darwin' && installedArch === 'arm64') { + + // Check that Rosetta is installed and returns some pid + const execResult = taskLib.execSync('pgrep', 'oahd'); + + return execResult.code === 0 && !!execResult.stdout; + } + + return false; +} diff --git a/_generated/NodeTaskRunnerInstallerV0/utils/mapOsArchToDistroVariant.ts b/_generated/NodeTaskRunnerInstallerV0/utils/mapOsArchToDistroVariant.ts new file mode 100644 index 000000000000..4f4e75295810 --- /dev/null +++ b/_generated/NodeTaskRunnerInstallerV0/utils/mapOsArchToDistroVariant.ts @@ -0,0 +1,10 @@ +import { NodeDistroOsArch, NodeOsArch } from '../interfaces/os-types'; + +export function mapOsArchToDistroVariant(osArch: NodeOsArch): NodeDistroOsArch { + + switch (osArch) { + case 'ia32': return 'x86'; + + default: return osArch; + } +} diff --git a/_generated/NodeTaskRunnerInstallerV0_Node20/.npmrc b/_generated/NodeTaskRunnerInstallerV0_Node20/.npmrc new file mode 100644 index 000000000000..5fca0d518be7 --- /dev/null +++ b/_generated/NodeTaskRunnerInstallerV0_Node20/.npmrc @@ -0,0 +1 @@ +scripts-prepend-node-path=true diff --git a/_generated/NodeTaskRunnerInstallerV0_Node20/Strings/resources.resjson/de-DE/resources.resjson b/_generated/NodeTaskRunnerInstallerV0_Node20/Strings/resources.resjson/de-DE/resources.resjson new file mode 100644 index 000000000000..a25ca3a4b561 --- /dev/null +++ b/_generated/NodeTaskRunnerInstallerV0_Node20/Strings/resources.resjson/de-DE/resources.resjson @@ -0,0 +1,14 @@ +{ + "loc.friendlyName": "Installationsprogramm für Node.js-Aufgabenausführung", + "loc.helpMarkDown": "[Weitere Informationen zu dieser Aufgabe](https://learn.microsoft.com/azure/devops/pipelines/tasks/reference/node-task-runner-installer-v0)", + "loc.description": "Bestimmte Node.js-Version zum Ausführen von Knotenaufgaben installieren", + "loc.instanceNameFormat": "Knotenausführung $(runnerVersion) installieren", + "loc.input.label.runnerVersion": "Zu installierende Version der Ausführung", + "loc.input.help.runnerVersion": "Wählen Sie die zu installierende Knotenversion aus.", + "loc.messages.TryRosetta": "Der Knoten für die Plattform \"%s\" und die Architektur \"%s\" wurde nicht gefunden. Es wird versucht, mit Rosetta2 zu installieren.", + "loc.messages.UnexpectedOS": "Unerwartete %s des Betriebssystems. Unterstützte Varianten: %s", + "loc.messages.RunnerAlreadyInUse": "Die angegebene Knotenausführungsversion %s ist bereits installiert und wird zurzeit verwendet. Installation wird übersprungen.", + "loc.messages.NotAllowedNodeVersion": "Die Version des Zielknotens stimmt nicht mit den zulässigen Versionen überein. Mögliche Varianten: %s", + "loc.messages.AGENT_HOMEDIRECTORY_NotAvailable": "Die Variable AGENT_HOMEDIRECTORY-Umgebung kann nicht abgerufen werden.", + "loc.messages.RunnerAlreadyInstalled": "Version %s der Knotenausführung ist bereits auf dem Agent installiert. Installation wird übersprungen." +} \ No newline at end of file diff --git a/_generated/NodeTaskRunnerInstallerV0_Node20/Strings/resources.resjson/en-US/resources.resjson b/_generated/NodeTaskRunnerInstallerV0_Node20/Strings/resources.resjson/en-US/resources.resjson new file mode 100644 index 000000000000..f15e2596734f --- /dev/null +++ b/_generated/NodeTaskRunnerInstallerV0_Node20/Strings/resources.resjson/en-US/resources.resjson @@ -0,0 +1,14 @@ +{ + "loc.friendlyName": "Node.js tasks runner installer", + "loc.helpMarkDown": "[Learn more about this task](https://learn.microsoft.com/azure/devops/pipelines/tasks/reference/node-task-runner-installer-v0)", + "loc.description": "Install specific Node.js version to run node tasks", + "loc.instanceNameFormat": "Install node runner $(runnerVersion)", + "loc.input.label.runnerVersion": "Version of runner to install", + "loc.input.help.runnerVersion": "Select the node version to install.", + "loc.messages.TryRosetta": "Unable to find Node for platform %s and architecture %s. Trying to install with Rosetta2", + "loc.messages.UnexpectedOS": "Unexpected OS %s. Supported variants: %s", + "loc.messages.RunnerAlreadyInUse": "The specified Node runner ver.%s is already installed and currently in use. Skipping installation.", + "loc.messages.NotAllowedNodeVersion": "The version of the target node does not match the allowed versions. Possible variants: %s", + "loc.messages.AGENT_HOMEDIRECTORY_NotAvailable": "Can't get AGENT_HOMEDIRECTORY environment varialbe.", + "loc.messages.RunnerAlreadyInstalled": "%s version of node runner already installed on the agent. Skipping installation." +} \ No newline at end of file diff --git a/_generated/NodeTaskRunnerInstallerV0_Node20/Strings/resources.resjson/es-ES/resources.resjson b/_generated/NodeTaskRunnerInstallerV0_Node20/Strings/resources.resjson/es-ES/resources.resjson new file mode 100644 index 000000000000..e82a487829c4 --- /dev/null +++ b/_generated/NodeTaskRunnerInstallerV0_Node20/Strings/resources.resjson/es-ES/resources.resjson @@ -0,0 +1,14 @@ +{ + "loc.friendlyName": "Instalador del ejecutor de tareas de Node.js", + "loc.helpMarkDown": "[Más información sobre esta tarea](https://learn.microsoft.com/azure/devops/pipelines/tasks/reference/node-task-runner-installer-v0)", + "loc.description": "Instalar una versión de Node.js específica para ejecutar tareas de nodo", + "loc.instanceNameFormat": "Instalar $(runnerVersion) del ejecutor de nodos", + "loc.input.label.runnerVersion": "Versión del ejecutor que se va a instalar", + "loc.input.help.runnerVersion": "Seleccione la versión del nodo que se va a instalar.", + "loc.messages.TryRosetta": "No se encuentra ningún node para la plataforma %s ni la arquitectura %s. Intentando instalar con Rosetta2", + "loc.messages.UnexpectedOS": "SO %s inesperado. Variantes admitidas: %s", + "loc.messages.RunnerAlreadyInUse": "El ejecutor de nodos especificado ver.%s ya está instalado y actualmente en uso. Omitiendo la instalación.", + "loc.messages.NotAllowedNodeVersion": "La versión del nodo de destino no coincide con las versiones permitidas. Posibles variantes: %s", + "loc.messages.AGENT_HOMEDIRECTORY_NotAvailable": "No se puede obtener la variable de entorno AGENT_HOMEDIRECTORY.", + "loc.messages.RunnerAlreadyInstalled": "%s versión del ejecutor de nodos ya instalada en el agente. Omitiendo la instalación." +} \ No newline at end of file diff --git a/_generated/NodeTaskRunnerInstallerV0_Node20/Strings/resources.resjson/fr-FR/resources.resjson b/_generated/NodeTaskRunnerInstallerV0_Node20/Strings/resources.resjson/fr-FR/resources.resjson new file mode 100644 index 000000000000..382b3f844ba3 --- /dev/null +++ b/_generated/NodeTaskRunnerInstallerV0_Node20/Strings/resources.resjson/fr-FR/resources.resjson @@ -0,0 +1,14 @@ +{ + "loc.friendlyName": "Programme d’installation de l’exécuteur de tâches Node.js", + "loc.helpMarkDown": "[En savoir plus sur cette tâche](https://learn.microsoft.com/azure/devops/pipelines/tasks/reference/node-task-runner-installer-v0)", + "loc.description": "Installer une version Node.js spécifique pour exécuter des tâches de nœud", + "loc.instanceNameFormat": "Installer l’exécuteur de nœuds $(runnerVersion)", + "loc.input.label.runnerVersion": "Version de l’exécuteur à installer", + "loc.input.help.runnerVersion": "Sélectionnez la version de nœud à installer.", + "loc.messages.TryRosetta": "Nœud introuvable pour la %s de plateforme et l'%s d’architecture. Tentative d’installation avec Rosetta2", + "loc.messages.UnexpectedOS": "%s de système d’exploitation inattendue. Variantes prises en charge : %s", + "loc.messages.RunnerAlreadyInUse": "L’exécuteur node spécifié ver.%s est déjà installé et en cours d’utilisation. Installation ignorée.", + "loc.messages.NotAllowedNodeVersion": "La version du nœud cible ne correspond pas aux versions autorisées. Variantes possibles : %s", + "loc.messages.AGENT_HOMEDIRECTORY_NotAvailable": "Nous n’avons pas pu obtenir la variable d’environnement AGENT_HOMEDIRECTORY.", + "loc.messages.RunnerAlreadyInstalled": "%s version de Node Runner déjà installée sur l’agent. Installation ignorée." +} \ No newline at end of file diff --git a/_generated/NodeTaskRunnerInstallerV0_Node20/Strings/resources.resjson/it-IT/resources.resjson b/_generated/NodeTaskRunnerInstallerV0_Node20/Strings/resources.resjson/it-IT/resources.resjson new file mode 100644 index 000000000000..ce1fb481a791 --- /dev/null +++ b/_generated/NodeTaskRunnerInstallerV0_Node20/Strings/resources.resjson/it-IT/resources.resjson @@ -0,0 +1,14 @@ +{ + "loc.friendlyName": "Programma di installazione dello strumento di esecuzione attività di Node.js", + "loc.helpMarkDown": "[Altre informazioni su questa attività](https://learn.microsoft.com/azure/devops/pipelines/tasks/reference/node-task-runner-installer-v0)", + "loc.description": "Installare una versione specifica di Node.js per eseguire le attività del nodo", + "loc.instanceNameFormat": "Installare lo strumento di esecuzione del nodo $(runnerVersion)", + "loc.input.label.runnerVersion": "Versione dello strumento di esecuzione da installare", + "loc.input.help.runnerVersion": "Selezionare la versione del nodo da installare.", + "loc.messages.TryRosetta": "Non è possibile trovare il nodo per la piattaforma %s e l'architettura %s. Tentativo di installazione con Rosetta2", + "loc.messages.UnexpectedOS": "Sistema operativo %s imprevisto. Varianti supportate: %s", + "loc.messages.RunnerAlreadyInUse": "Lo strumento di esecuzione del nodo specificato ver.%s è già installato e attualmente in uso. L'installazione verrà ignorata.", + "loc.messages.NotAllowedNodeVersion": "La versione del nodo di destinazione non corrisponde alle versioni consentite. Varianti possibili: %s", + "loc.messages.AGENT_HOMEDIRECTORY_NotAvailable": "Non è possibile ottenere la variabile di ambiente AGENT_HOMEDIRECTORY.", + "loc.messages.RunnerAlreadyInstalled": "Versione %s dello strumento di esecuzione del nodo già installata nell'agente. L'installazione verrà ignorata." +} \ No newline at end of file diff --git a/_generated/NodeTaskRunnerInstallerV0_Node20/Strings/resources.resjson/ja-JP/resources.resjson b/_generated/NodeTaskRunnerInstallerV0_Node20/Strings/resources.resjson/ja-JP/resources.resjson new file mode 100644 index 000000000000..660120be1d9b --- /dev/null +++ b/_generated/NodeTaskRunnerInstallerV0_Node20/Strings/resources.resjson/ja-JP/resources.resjson @@ -0,0 +1,14 @@ +{ + "loc.friendlyName": "Node.js タスク ランナー インストーラー", + "loc.helpMarkDown": "[このタスクの詳細情報](https://learn.microsoft.com/azure/devops/pipelines/tasks/reference/node-task-runner-installer-v0)", + "loc.description": "特定の Node.js バージョンをインストールしてノード タスクを実行する", + "loc.instanceNameFormat": "ノード ランナー $(runnerVersion)のインストール", + "loc.input.label.runnerVersion": "インストールするランナーのバージョン", + "loc.input.help.runnerVersion": "インストールするノードのバージョンを選択します。", + "loc.messages.TryRosetta": "プラットフォーム %s およびアーキテクチャ %s のノードが見つかりません。Rosetta2 でインストールしようとしています", + "loc.messages.UnexpectedOS": "予期しない OS %s。サポートされているバリアント: %s", + "loc.messages.RunnerAlreadyInUse": "指定された Node ランナー バージョン %s は既にインストールされており、現在使用中です。インストールをスキップしています。", + "loc.messages.NotAllowedNodeVersion": "ターゲット ノードのバージョンが、許可されているバージョンと一致しません。考えられるバリアント: %s", + "loc.messages.AGENT_HOMEDIRECTORY_NotAvailable": "AGENT_HOMEDIRECTORY 環境変数を取得できません。", + "loc.messages.RunnerAlreadyInstalled": "%s バージョンのノード ランナーが既にエージェントにインストールされています。インストールをスキップしています。" +} \ No newline at end of file diff --git a/_generated/NodeTaskRunnerInstallerV0_Node20/Strings/resources.resjson/ko-KR/resources.resjson b/_generated/NodeTaskRunnerInstallerV0_Node20/Strings/resources.resjson/ko-KR/resources.resjson new file mode 100644 index 000000000000..269538586a4d --- /dev/null +++ b/_generated/NodeTaskRunnerInstallerV0_Node20/Strings/resources.resjson/ko-KR/resources.resjson @@ -0,0 +1,14 @@ +{ + "loc.friendlyName": "Node.js 작업 실행기 설치 관리자", + "loc.helpMarkDown": "[이 작업에 대해 자세히 알아보기](https://learn.microsoft.com/azure/devops/pipelines/tasks/reference/node-task-runner-installer-v0)", + "loc.description": "특정 Node.js 버전을 설치하여 노드 작업 실행", + "loc.instanceNameFormat": "노드 실행기 $(runnerVersion) 설치", + "loc.input.label.runnerVersion": "설치할 실행기 버전", + "loc.input.help.runnerVersion": "설치할 노드 버전을 선택합니다.", + "loc.messages.TryRosetta": "플랫폼 %s 및 아키텍처 %s에 대한 노드를 찾을 수 없습니다. Rosetta2로 설치하는 중", + "loc.messages.UnexpectedOS": "예기치 않은 OS %s입니다. 지원되는 변형: %s", + "loc.messages.RunnerAlreadyInUse": "지정한 Node Runner ver.%s이(가) 이미 설치되어 있으며 현재 사용 중입니다. 설치를 건너뛰는 중입니다.", + "loc.messages.NotAllowedNodeVersion": "대상 노드의 버전이 허용된 버전과 일치하지 않습니다. 가능한 변형: %s", + "loc.messages.AGENT_HOMEDIRECTORY_NotAvailable": "AGENT_HOMEDIRECTORY 환경 변수를 가져올 수 없습니다.", + "loc.messages.RunnerAlreadyInstalled": "에이전트에 노드 실행기의 %s 버전이 이미 설치되어 있습니다. 설치를 건너뛰는 중입니다." +} \ No newline at end of file diff --git a/_generated/NodeTaskRunnerInstallerV0_Node20/Strings/resources.resjson/ru-RU/resources.resjson b/_generated/NodeTaskRunnerInstallerV0_Node20/Strings/resources.resjson/ru-RU/resources.resjson new file mode 100644 index 000000000000..65b933f024e6 --- /dev/null +++ b/_generated/NodeTaskRunnerInstallerV0_Node20/Strings/resources.resjson/ru-RU/resources.resjson @@ -0,0 +1,14 @@ +{ + "loc.friendlyName": "Установщик запускателя задач Node.js", + "loc.helpMarkDown": "[Подробнее об этой задаче](https://learn.microsoft.com/azure/devops/pipelines/tasks/reference/node-task-runner-installer-v0)", + "loc.description": "Установить определенную версию Node.js для запуска задач узла", + "loc.instanceNameFormat": "Установить запускатель узла $(runnerVersion)", + "loc.input.label.runnerVersion": "Версия запускателя для установки", + "loc.input.help.runnerVersion": "Выберите версию узла для установки.", + "loc.messages.TryRosetta": "Не удалось найти Node для платформы %s и архитектуры %s. Попытка установки с помощью Rosetta2", + "loc.messages.UnexpectedOS": "Неожиданная ОС %s. Поддерживаемые варианты: %s", + "loc.messages.RunnerAlreadyInUse": "Указанный запускатель узла версии %s уже установлен и сейчас используется. Пропуск установки.", + "loc.messages.NotAllowedNodeVersion": "Версия целевого узла не соответствует разрешенным версиям. Возможные варианты: %s", + "loc.messages.AGENT_HOMEDIRECTORY_NotAvailable": "Не удается получить переменную среды AGENT_HOMEDIRECTORY.", + "loc.messages.RunnerAlreadyInstalled": "Версия %s запускателя узла уже установлена в агенте. Пропуск установки." +} \ No newline at end of file diff --git a/_generated/NodeTaskRunnerInstallerV0_Node20/Strings/resources.resjson/zh-CN/resources.resjson b/_generated/NodeTaskRunnerInstallerV0_Node20/Strings/resources.resjson/zh-CN/resources.resjson new file mode 100644 index 000000000000..658402328fcd --- /dev/null +++ b/_generated/NodeTaskRunnerInstallerV0_Node20/Strings/resources.resjson/zh-CN/resources.resjson @@ -0,0 +1,14 @@ +{ + "loc.friendlyName": "Node.js 任务运行程序安装程序", + "loc.helpMarkDown": "[详细了解此任务](https://learn.microsoft.com/azure/devops/pipelines/tasks/reference/node-task-runner-installer-v0)", + "loc.description": "安装特定 Node.js 版本以运行节点任务", + "loc.instanceNameFormat": "安装节点运行程序 $(runnerVersion)", + "loc.input.label.runnerVersion": "要安装的运行程序版本", + "loc.input.help.runnerVersion": "选择要安装的节点版本。", + "loc.messages.TryRosetta": "找不到平台 %s 和体系结构 %s 的节点。尝试使用 Rosetta2 进行安装", + "loc.messages.UnexpectedOS": "意外的 OS %s。支持的变量: %s", + "loc.messages.RunnerAlreadyInUse": "指定的节点运行器 ver.%s 已安装并且当前正在使用中。正在跳过安装。", + "loc.messages.NotAllowedNodeVersion": "目标节点的版本与允许的版本不匹配。可能的变量: %s", + "loc.messages.AGENT_HOMEDIRECTORY_NotAvailable": "无法获取 AGENT_HOMEDIRECTORY 环境变量。", + "loc.messages.RunnerAlreadyInstalled": "代理上已安装 %s 版本的节点运行程序。正在跳过安装。" +} \ No newline at end of file diff --git a/_generated/NodeTaskRunnerInstallerV0_Node20/Strings/resources.resjson/zh-TW/resources.resjson b/_generated/NodeTaskRunnerInstallerV0_Node20/Strings/resources.resjson/zh-TW/resources.resjson new file mode 100644 index 000000000000..459cba3fe1aa --- /dev/null +++ b/_generated/NodeTaskRunnerInstallerV0_Node20/Strings/resources.resjson/zh-TW/resources.resjson @@ -0,0 +1,14 @@ +{ + "loc.friendlyName": "Node.js 工作執行器安裝程式", + "loc.helpMarkDown": "[深入了解此工作](https://learn.microsoft.com/azure/devops/pipelines/tasks/reference/node-task-runner-installer-v0)", + "loc.description": "安裝特定 Node.js 版本以執行節點工作", + "loc.instanceNameFormat": "安裝節點執行器 $(runnerVersion)", + "loc.input.label.runnerVersion": "要安裝的執行器版本", + "loc.input.help.runnerVersion": "選取要安裝的節點版本。", + "loc.messages.TryRosetta": "找不到適用於平台 %s 與架構 %s 的 Node。正在嘗試使用 Rosetta2 安裝", + "loc.messages.UnexpectedOS": "未預期的 OS %s。支援的變體: %s", + "loc.messages.RunnerAlreadyInUse": "指定的節點執行器 ver.%s 已安裝且目前正在使用中。正在略過安裝。", + "loc.messages.NotAllowedNodeVersion": "目標節點的版本不符合允許的版本。可能的變體: %s", + "loc.messages.AGENT_HOMEDIRECTORY_NotAvailable": "無法取得 AGENT_HOMEDIRECTORY 環境變數。", + "loc.messages.RunnerAlreadyInstalled": "%s 版本的節點執行器已經安裝在代理程式上。正在略過安裝。" +} \ No newline at end of file diff --git a/_generated/NodeTaskRunnerInstallerV0_Node20/constants.ts b/_generated/NodeTaskRunnerInstallerV0_Node20/constants.ts new file mode 100644 index 000000000000..6b6741b63ee2 --- /dev/null +++ b/_generated/NodeTaskRunnerInstallerV0_Node20/constants.ts @@ -0,0 +1,13 @@ +export const BASE_NODE_DISTRIBUTION_URL = 'https://nodejs.org/dist'; + +export const BASE_NODE_VERSIONS_URL = 'https://nodejs.org/dist/index.json'; + +export enum RunnerVersion { + node6 = '6.17.1', + node10 = '10.24.1' +} + +export const NODE_INPUT_VERSIONS = { + '6': RunnerVersion.node6, + '10': RunnerVersion.node10 +} as const; diff --git a/_generated/NodeTaskRunnerInstallerV0_Node20/icon.png b/_generated/NodeTaskRunnerInstallerV0_Node20/icon.png new file mode 100644 index 000000000000..ccbddf54c6c9 Binary files /dev/null and b/_generated/NodeTaskRunnerInstallerV0_Node20/icon.png differ diff --git a/_generated/NodeTaskRunnerInstallerV0_Node20/icon.svg b/_generated/NodeTaskRunnerInstallerV0_Node20/icon.svg new file mode 100644 index 000000000000..9522fcc4bbb6 --- /dev/null +++ b/_generated/NodeTaskRunnerInstallerV0_Node20/icon.svg @@ -0,0 +1,4 @@ + + + + diff --git a/_generated/NodeTaskRunnerInstallerV0_Node20/index.ts b/_generated/NodeTaskRunnerInstallerV0_Node20/index.ts new file mode 100644 index 000000000000..f28a47da77d9 --- /dev/null +++ b/_generated/NodeTaskRunnerInstallerV0_Node20/index.ts @@ -0,0 +1,47 @@ +import * as os from 'os'; + +import * as taskLib from 'azure-pipelines-task-lib/task'; + +import { NodeOsArch, NodeOsPlatform } from './interfaces/os-types'; +import { installNodeRunner } from './modules/installNodeRunner'; +import { NODE_INPUT_VERSIONS, RunnerVersion } from './constants'; +import { mapOsArchToDistroVariant } from './utils/mapOsArchToDistroVariant'; +import { isRunnerInstalled } from './modules/cache'; + +async function runTask() { + + const runnerInputVersion: string = taskLib.getInputRequired('runnerVersion'); + + const targetRunnerVersion: RunnerVersion = NODE_INPUT_VERSIONS[runnerInputVersion]; + + if (!targetRunnerVersion) { + throw new Error(taskLib.loc('NotAllowedNodeVersion', Object.keys(NODE_INPUT_VERSIONS).join(', '))); + } + + const currentRunnerVersion = process.versions.node; + taskLib.debug('Current runner version = ' + currentRunnerVersion); + + if (currentRunnerVersion === targetRunnerVersion) { + console.log(taskLib.loc('RunnerAlreadyInUse', currentRunnerVersion)); + return; + } + + const osPlatform: NodeOsPlatform = os.platform(); + + const supportedOsList: NodeOsPlatform[] = ['linux', 'darwin', 'win32']; + + if (!supportedOsList.includes(osPlatform)) { + throw new Error(taskLib.loc('UnexpectedOS', osPlatform, supportedOsList.join(', '))); + } + + if (isRunnerInstalled(targetRunnerVersion, osPlatform)) { + console.log(taskLib.loc('RunnerAlreadyInstalled', targetRunnerVersion)); + return; + } + + const osArch = mapOsArchToDistroVariant(os.arch() as NodeOsArch); + + await installNodeRunner(targetRunnerVersion, { osArch, osPlatform }); +} + +runTask(); diff --git a/_generated/NodeTaskRunnerInstallerV0_Node20/interfaces/os-types.ts b/_generated/NodeTaskRunnerInstallerV0_Node20/interfaces/os-types.ts new file mode 100644 index 000000000000..841e943fcc23 --- /dev/null +++ b/_generated/NodeTaskRunnerInstallerV0_Node20/interfaces/os-types.ts @@ -0,0 +1,19 @@ +// TODO: Reuse in node-installer-common + +// https://nodejs.org/api/os.html#osplatform +export type NodeOsPlatform = NodeJS.Platform; + +// https://nodejs.org/api/os.html#osarch +export type NodeOsArch = 'arm' | 'arm64' | 'ia32' | 'mips' | 'mipsel' | 'ppc' | 'ppc64' | 's390' | 's390x' | 'x64'; + +/** + * Node.js distribution architectures names not everytime matches with os.arch(). + * + * Example: ia32 => x86 + */ +export type NodeDistroOsArch = Exclude | 'x86'; + +export type TargetOsInfo = { + osArch: NodeDistroOsArch, + osPlatform: NodeOsPlatform +}; diff --git a/_generated/NodeTaskRunnerInstallerV0_Node20/make.json b/_generated/NodeTaskRunnerInstallerV0_Node20/make.json new file mode 100644 index 000000000000..57db402cc2ae --- /dev/null +++ b/_generated/NodeTaskRunnerInstallerV0_Node20/make.json @@ -0,0 +1,20 @@ +{ + "externals": { + "archivePackages": [ + { + "archiveName": "7zr.zip", + "url": "https://vstsagenttools.blob.core.windows.net/tools/7zr/1805_x86/7zr.zip", + "dest": "./" + } + ] + }, + "rm": [ + { + "items": [ + "node_modules/azure-pipelines-tool-lib/node_modules/azure-pipelines-task-lib", + "node_modules/mockery" + ], + "options": "-Rf" + } + ] +} \ No newline at end of file diff --git a/_generated/NodeTaskRunnerInstallerV0_Node20/modules/cache.ts b/_generated/NodeTaskRunnerInstallerV0_Node20/modules/cache.ts new file mode 100644 index 000000000000..b9dc686ba081 --- /dev/null +++ b/_generated/NodeTaskRunnerInstallerV0_Node20/modules/cache.ts @@ -0,0 +1,22 @@ +import * as fs from 'fs'; +import * as path from 'path'; + +import * as taskLib from 'azure-pipelines-task-lib'; + +import { RunnerVersion } from '../constants'; +import { NodeOsPlatform } from '../interfaces/os-types'; +import { getAgentExternalsPath } from '../utils/getAgentExternalsPath'; + +export function isRunnerInstalled(targetRunner: RunnerVersion, osPlatform: NodeOsPlatform): boolean { + + const agentExternals = getAgentExternalsPath(); + + const nodeBinName = osPlatform === 'win32' ? 'node.exe' : 'node'; + const nodeFolder = targetRunner === RunnerVersion.node6 ? 'node' : 'node10'; + + const nodePath = path.join(agentExternals, nodeFolder, 'bin', nodeBinName); + + taskLib.debug('Checking if node runner already installed. Path = ' + nodePath); + + return fs.existsSync(nodePath); +} diff --git a/_generated/NodeTaskRunnerInstallerV0_Node20/modules/downloadNode.ts b/_generated/NodeTaskRunnerInstallerV0_Node20/modules/downloadNode.ts new file mode 100644 index 000000000000..5090c717c2ce --- /dev/null +++ b/_generated/NodeTaskRunnerInstallerV0_Node20/modules/downloadNode.ts @@ -0,0 +1,76 @@ +import * as path from 'path'; +import * as taskLib from 'azure-pipelines-task-lib/task'; +import * as toolLib from 'azure-pipelines-tool-lib/tool'; + +import { extractArchive } from '../utils/extractArchive'; +import { isDarwinArmWithRosetta } from '../utils/isDarwinArmWithRosetta'; +import { NodeDistroOsArch, TargetOsInfo } from '../interfaces/os-types'; + +/** + * Installs target node runner from online. + * + * @param version Node version to install. + * @param osInfo Target OS for runner. + * @returns Installed node runner path. + */ +export async function downloadNodeRunner(version: string, osInfo: TargetOsInfo): Promise { + + let downloadNodePath: string; + + try { + if (osInfo.osPlatform === 'win32') { + downloadNodePath = await downloadWindowsNode(version, osInfo.osArch); + } else { + // OSX, Linux + downloadNodePath = await downloadUnixNode(version, osInfo); + } + } catch (err) { + if (err.httpStatusCode) { + if (err.httpStatusCode === 404) { + throw new Error('Target node version not found. Please contact with task support. Error: ' + err); + } else { + throw new Error('Something went wrong. Error: ' + err); + } + } + + throw err; + } + + taskLib.debug('Downloaded node path: ' + downloadNodePath); + + return downloadNodePath; +} + +async function downloadUnixNode(version: string, osInfo: TargetOsInfo): Promise { + let targetOsArch = osInfo.osArch; + + if (!version && isDarwinArmWithRosetta(osInfo.osPlatform, osInfo.osArch)) { + // nodejs.org does not have an arm64 build for macOS, so we fall back to x64 + console.log(taskLib.loc('TryRosetta', osInfo.osPlatform, targetOsArch)); + targetOsArch = 'x64'; + } + + const urlFileName = `node-v${version}-${osInfo.osPlatform}-${targetOsArch}.tar.gz`; + const downloadUrl = 'https://nodejs.org/dist/v' + version + '/' + urlFileName; + + const downloadPath = await toolLib.downloadTool(downloadUrl); + const extractedPath = await extractArchive(downloadPath); + + return extractedPath; +} + +async function downloadWindowsNode(version: string, osArch: NodeDistroOsArch): Promise { + + // Create temporary folder to download in to + const tempDownloadFolder: string = 'temp_' + Math.floor(Math.random() * 2000000000); + const downloadPath: string = path.join(taskLib.getVariable('agent.tempDirectory'), tempDownloadFolder); + taskLib.mkdirP(downloadPath); + + const exeUrl = `https://nodejs.org/dist/v${version}/win-${osArch}/node.exe`; + const libUrl = `https://nodejs.org/dist/v${version}/win-${osArch}/node.lib`; + + await toolLib.downloadTool(exeUrl, path.join(downloadPath, 'node.exe')); + await toolLib.downloadTool(libUrl, path.join(downloadPath, 'node.lib')); + + return downloadPath; +} diff --git a/_generated/NodeTaskRunnerInstallerV0_Node20/modules/installNodeRunner.ts b/_generated/NodeTaskRunnerInstallerV0_Node20/modules/installNodeRunner.ts new file mode 100644 index 000000000000..d502ba6be8f2 --- /dev/null +++ b/_generated/NodeTaskRunnerInstallerV0_Node20/modules/installNodeRunner.ts @@ -0,0 +1,89 @@ +import * as taskLib from 'azure-pipelines-task-lib/task'; +import * as toolLib from 'azure-pipelines-tool-lib/tool'; +import * as path from 'path'; +import * as fs from 'fs'; + +import { downloadNodeRunner } from './downloadNode'; +import { isDarwinArmWithRosetta } from '../utils/isDarwinArmWithRosetta'; +import { getAgentExternalsPath } from '../utils/getAgentExternalsPath'; +import { getDirContent } from '../utils/getDirContent'; +import { NodeOsPlatform, TargetOsInfo } from '../interfaces/os-types'; + +export async function installNodeRunner(targetNodeVersion: string, osInfo: TargetOsInfo) { + let installedArch = osInfo.osArch; + + let targetNodePath: string; + + // check cache + targetNodePath = toolLib.findLocalTool('node', targetNodeVersion, installedArch); + + // In case if it's darwin arm and toolPath is empty trying to find x64 version + if (!targetNodePath && isDarwinArmWithRosetta(osInfo.osPlatform, installedArch)) { + targetNodePath = toolLib.findLocalTool('node', installedArch, 'x64'); + installedArch = 'x64'; + } + + if (!targetNodePath) { + const cleanVersion = toolLib.cleanVersion(targetNodeVersion); + targetNodePath = await taskLib.retry( + async () => await downloadNodeRunner(cleanVersion, { osPlatform: osInfo.osPlatform, osArch: installedArch }), + undefined, + { retryCount: 3, continueOnError: false } + ); + } + + const resultNodePath = await copyNodeToAgentExternals(targetNodePath, 'node', osInfo.osPlatform); + + taskLib.debug('resultNodePath = ' + resultNodePath); + + getDirContent(resultNodePath); +} + +async function copyNodeToAgentExternals(nodePath: string, targetNodeDir: string, osPlatform: NodeOsPlatform): Promise { + const externalsPath = getAgentExternalsPath(); + + const targetNodePath = path.join(externalsPath, targetNodeDir); + + taskLib.rmRF(targetNodePath); + taskLib.mkdirP(targetNodePath); + + if (osPlatform === 'win32') { + copyWindowsNodeToAgentExternals(nodePath, targetNodePath); + } else { + copyUnixNodeToAgentExternals(nodePath, targetNodePath); + } + + return targetNodePath; +} + +function copyWindowsNodeToAgentExternals(nodeCurrentLocation: string, targetNodeLocation: string) { + const binPath = path.join(targetNodeLocation, 'bin'); + + taskLib.mkdirP(binPath); + taskLib.debug('TARGET NODE PATH = ' + binPath); + + const nodeExePath = path.join(nodeCurrentLocation, 'node.exe'); + taskLib.cp(nodeExePath, binPath, '-rf'); + + const nodeLibPath = path.join(nodeCurrentLocation, 'node.lib'); + taskLib.cp(nodeLibPath, binPath, '-rf'); + + getDirContent(binPath); + + return path.resolve(binPath, '..'); +} + +function copyUnixNodeToAgentExternals(nodeCurrentPath: string, targetNodePath: string) { + const newstedDir = fs.readdirSync(nodeCurrentPath)[0]; + + taskLib.debug('Nested node directory = ' + newstedDir); + + const nestedDirPath = path.join(nodeCurrentPath, newstedDir); + + taskLib.cp(nestedDirPath + '/*', targetNodePath + '/', '-rf'); + // taskLib.rmRF(newstedDir); + + getDirContent(targetNodePath); + + return targetNodePath; +} diff --git a/_generated/NodeTaskRunnerInstallerV0_Node20/package-lock.json b/_generated/NodeTaskRunnerInstallerV0_Node20/package-lock.json new file mode 100644 index 000000000000..1e9c605c61cb --- /dev/null +++ b/_generated/NodeTaskRunnerInstallerV0_Node20/package-lock.json @@ -0,0 +1,525 @@ +{ + "requires": true, + "lockfileVersion": 1, + "dependencies": { + "@types/concat-stream": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz", + "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==", + "requires": { + "@types/node": "*" + } + }, + "@types/form-data": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", + "integrity": "sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==", + "requires": { + "@types/node": "*" + } + }, + "@types/node": { + "version": "20.7.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.7.0.tgz", + "integrity": "sha512-zI22/pJW2wUZOVyguFaUL1HABdmSVxpXrzIqkjsHmyUjNhPoWM1CKfvVuXfetHhIok4RY573cqS0mZ1SJEnoTg==" + }, + "@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" + }, + "@types/semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-41qEJgBH/TWgo5NFSvBCJ1qkoi3Q6ONSF2avrHq1LVEZfYpdHmj0y9SuTK+u9ZhG1sYQKBL1AWXKyLWP4RaUoQ==" + }, + "@types/uuid": { + "version": "3.4.10", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-3.4.10.tgz", + "integrity": "sha512-BgeaZuElf7DEYZhWYDTc/XcLZXdVgFkVSTa13BqKvbnmUrxr3TJFKofUxCtDO9UQOdhnV+HPOESdHiHKZOJV1A==" + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "azure-pipelines-task-lib": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-4.2.0.tgz", + "integrity": "sha512-WUj3XxTWVKxcphLaIHB8OULXC1GT18EAHkibvF5nQ86+dhOtn/KQW44axV8D+udDSM5HAMZxOLe93CPGBqcC5w==", + "requires": { + "minimatch": "3.0.5", + "mockery": "^2.1.0", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "sync-request": "6.1.0", + "uuid": "^3.0.1" + } + }, + "azure-pipelines-tool-lib": { + "version": "2.0.0-preview", + "resolved": "https://registry.npmjs.org/azure-pipelines-tool-lib/-/azure-pipelines-tool-lib-2.0.0-preview.tgz", + "integrity": "sha512-OeivwKLpLMsvGpZ2H+2UPxFwwqNkV8TzfKByqjYAllzGDAw4BvciAdjCMwkpGdTOnzfPbRpr33sy48kn7RqfKA==", + "requires": { + "@types/semver": "^5.3.0", + "@types/uuid": "^3.4.5", + "azure-pipelines-task-lib": "^4.0.0-preview", + "semver": "^5.7.0", + "semver-compare": "^1.0.0", + "typed-rest-client": "^1.8.6", + "uuid": "^3.3.2" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, + "form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-intrinsic": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", + "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + } + }, + "get-port": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", + "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==" + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "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" + }, + "dependencies": { + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "http-basic": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", + "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", + "requires": { + "caseless": "^0.12.0", + "concat-stream": "^1.6.2", + "http-response-object": "^3.0.1", + "parse-cache-control": "^1.0.1" + } + }, + "http-response-object": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", + "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", + "requires": { + "@types/node": "^10.0.3" + }, + "dependencies": { + "@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + } + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" + }, + "is-core-module": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "requires": { + "has": "^1.0.3" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "mockery": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mockery/-/mockery-2.1.0.tgz", + "integrity": "sha512-9VkOmxKlWXoDO/h1jDZaS4lH33aWfRiJiNT/tKj+8OGzrcFDLo8d0syGdbsc3Bc4GvRXPb+NMMvojotmuGJTvA==" + }, + "object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, + "parse-cache-control": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", + "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "promise": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", + "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", + "requires": { + "asap": "~2.0.6" + } + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==" + }, + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "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" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "requires": { + "resolve": "^1.1.6" + } + }, + "resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "requires": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==" + }, + "shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, + "sync-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", + "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==", + "requires": { + "http-response-object": "^3.0.1", + "sync-rpc": "^1.2.1", + "then-request": "^6.0.0" + } + }, + "sync-rpc": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz", + "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==", + "requires": { + "get-port": "^3.1.0" + } + }, + "then-request": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", + "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", + "requires": { + "@types/concat-stream": "^1.6.0", + "@types/form-data": "0.0.33", + "@types/node": "^8.0.0", + "@types/qs": "^6.2.31", + "caseless": "~0.12.0", + "concat-stream": "^1.6.0", + "form-data": "^2.2.0", + "http-basic": "^8.1.1", + "http-response-object": "^3.0.1", + "promise": "^8.0.0", + "qs": "^6.4.0" + }, + "dependencies": { + "@types/node": { + "version": "8.10.66", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", + "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==" + } + } + }, + "tunnel": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", + "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==" + }, + "typed-rest-client": { + "version": "1.8.9", + "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.8.9.tgz", + "integrity": "sha512-uSmjE38B80wjL85UFX3sTYEUlvZ1JgCRhsWj/fJ4rZ0FqDUFoIuodtiVeE+cUqiVTOKPdKrp/sdftD15MDek6g==", + "requires": { + "qs": "^6.9.1", + "tunnel": "0.0.6", + "underscore": "^1.12.1" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, + "typescript": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "dev": true + }, + "underscore": { + "version": "1.13.6", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz", + "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==" + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + } + } +} diff --git a/_generated/NodeTaskRunnerInstallerV0_Node20/package.json b/_generated/NodeTaskRunnerInstallerV0_Node20/package.json new file mode 100644 index 000000000000..6f86f0c5fabb --- /dev/null +++ b/_generated/NodeTaskRunnerInstallerV0_Node20/package.json @@ -0,0 +1,18 @@ +{ + "private": "true", + "main": "index.js", + "author": "Microsoft Corporation", + "license": "MIT", + "scripts": { + "build": "node ../../make.js build --task NodeTaskRunnerInstallerV0", + "test": "node ../../make.js test --task NodeTaskRunnerInstallerV0" + }, + "dependencies": { + "@types/node": "^20.3.1", + "azure-pipelines-task-lib": "^4.2.0", + "azure-pipelines-tool-lib": "^2.0.0-preview" + }, + "devDependencies": { + "typescript": "5.1.6" + } +} diff --git a/_generated/NodeTaskRunnerInstallerV0_Node20/task.json b/_generated/NodeTaskRunnerInstallerV0_Node20/task.json new file mode 100644 index 000000000000..731863e76d4b --- /dev/null +++ b/_generated/NodeTaskRunnerInstallerV0_Node20/task.json @@ -0,0 +1,68 @@ +{ + "$schema": "https://raw.githubusercontent.com/Microsoft/azure-pipelines-task-lib/master/tasks.schema.json", + "id": "31C75B2B-BCDF-4706-8D7C-4DA6A1959BC2", + "name": "NodeTaskRunnerInstaller", + "friendlyName": "Node.js tasks runner installer", + "description": "Install specific Node.js version to run node tasks", + "helpUrl": "https://learn.microsoft.com/azure/devops/pipelines/tasks/reference/node-task-runner-installer-v0", + "helpMarkDown": "[Learn more about this task](https://learn.microsoft.com/azure/devops/pipelines/tasks/reference/node-task-runner-installer-v0)", + "category": "Utility", + "runsOn": [ + "Agent", + "DeploymentGroup" + ], + "author": "Microsoft Corporation", + "version": { + "Major": 0, + "Minor": 229, + "Patch": 1 + }, + "preview": true, + "demands": [], + "minimumAgentVersion": "2.144.0", + "instanceNameFormat": "Install node runner $(runnerVersion)", + "inputs": [ + { + "name": "runnerVersion", + "aliases": [ + "nodeVersion", + "installVersion" + ], + "type": "pickList", + "label": "Version of runner to install", + "required": true, + "defaultValue": "6", + "helpMarkDown": "Select the node version to install.", + "options": { + "6": "Node.js 6.17.1", + "10": "Node.js 10.24.1" + } + } + ], + "execution": { + "Node10": { + "target": "index.js", + "argumentFormat": "" + }, + "Node16": { + "target": "index.js", + "argumentFormat": "" + }, + "Node20": { + "target": "index.js", + "argumentFormat": "" + } + }, + "messages": { + "TryRosetta": "Unable to find Node for platform %s and architecture %s. Trying to install with Rosetta2", + "UnexpectedOS": "Unexpected OS %s. Supported variants: %s", + "RunnerAlreadyInUse": "The specified Node runner ver.%s is already installed and currently in use. Skipping installation.", + "NotAllowedNodeVersion": "The version of the target node does not match the allowed versions. Possible variants: %s", + "AGENT_HOMEDIRECTORY_NotAvailable": "Can't get AGENT_HOMEDIRECTORY environment varialbe.", + "RunnerAlreadyInstalled": "%s version of node runner already installed on the agent. Skipping installation." + }, + "_buildConfigMapping": { + "Default": "0.229.0", + "Node20-225": "0.229.1" + } +} \ No newline at end of file diff --git a/_generated/NodeTaskRunnerInstallerV0_Node20/task.loc.json b/_generated/NodeTaskRunnerInstallerV0_Node20/task.loc.json new file mode 100644 index 000000000000..2b3d16de21f0 --- /dev/null +++ b/_generated/NodeTaskRunnerInstallerV0_Node20/task.loc.json @@ -0,0 +1,68 @@ +{ + "$schema": "https://raw.githubusercontent.com/Microsoft/azure-pipelines-task-lib/master/tasks.schema.json", + "id": "31C75B2B-BCDF-4706-8D7C-4DA6A1959BC2", + "name": "NodeTaskRunnerInstaller", + "friendlyName": "ms-resource:loc.friendlyName", + "description": "ms-resource:loc.description", + "helpUrl": "https://learn.microsoft.com/azure/devops/pipelines/tasks/reference/node-task-runner-installer-v0", + "helpMarkDown": "ms-resource:loc.helpMarkDown", + "category": "Utility", + "runsOn": [ + "Agent", + "DeploymentGroup" + ], + "author": "Microsoft Corporation", + "version": { + "Major": 0, + "Minor": 229, + "Patch": 1 + }, + "preview": true, + "demands": [], + "minimumAgentVersion": "2.144.0", + "instanceNameFormat": "ms-resource:loc.instanceNameFormat", + "inputs": [ + { + "name": "runnerVersion", + "aliases": [ + "nodeVersion", + "installVersion" + ], + "type": "pickList", + "label": "ms-resource:loc.input.label.runnerVersion", + "required": true, + "defaultValue": "6", + "helpMarkDown": "ms-resource:loc.input.help.runnerVersion", + "options": { + "6": "Node.js 6.17.1", + "10": "Node.js 10.24.1" + } + } + ], + "execution": { + "Node10": { + "target": "index.js", + "argumentFormat": "" + }, + "Node16": { + "target": "index.js", + "argumentFormat": "" + }, + "Node20": { + "target": "index.js", + "argumentFormat": "" + } + }, + "messages": { + "TryRosetta": "ms-resource:loc.messages.TryRosetta", + "UnexpectedOS": "ms-resource:loc.messages.UnexpectedOS", + "RunnerAlreadyInUse": "ms-resource:loc.messages.RunnerAlreadyInUse", + "NotAllowedNodeVersion": "ms-resource:loc.messages.NotAllowedNodeVersion", + "AGENT_HOMEDIRECTORY_NotAvailable": "ms-resource:loc.messages.AGENT_HOMEDIRECTORY_NotAvailable", + "RunnerAlreadyInstalled": "ms-resource:loc.messages.RunnerAlreadyInstalled" + }, + "_buildConfigMapping": { + "Default": "0.229.0", + "Node20-225": "0.229.1" + } +} \ No newline at end of file diff --git a/_generated/NodeTaskRunnerInstallerV0_Node20/tsconfig.json b/_generated/NodeTaskRunnerInstallerV0_Node20/tsconfig.json new file mode 100644 index 000000000000..0438b79f69ac --- /dev/null +++ b/_generated/NodeTaskRunnerInstallerV0_Node20/tsconfig.json @@ -0,0 +1,6 @@ +{ + "compilerOptions": { + "target": "ES6", + "module": "commonjs" + } +} \ No newline at end of file diff --git a/_generated/NodeTaskRunnerInstallerV0_Node20/utils/extractArchive.ts b/_generated/NodeTaskRunnerInstallerV0_Node20/utils/extractArchive.ts new file mode 100644 index 000000000000..c0599228aa37 --- /dev/null +++ b/_generated/NodeTaskRunnerInstallerV0_Node20/utils/extractArchive.ts @@ -0,0 +1,21 @@ +// TODO: Reuse in node-installer-common +import * as path from 'path'; +import * as os from 'os'; + +import * as toolLib from 'azure-pipelines-tool-lib/tool'; + +/** + * Extracts archive. + * @param archivePath Path to archive. + * @returns Path to extracted archive. + */ +export async function extractArchive(archivePath: string): Promise { + + if (os.platform() === 'win32') { + const pathTo7z = path.resolve(__dirname, '..', 'externals', '7zr.exe'); + + return await toolLib.extract7z(archivePath, undefined, pathTo7z); + } + + return await toolLib.extractTar(archivePath); +} diff --git a/_generated/NodeTaskRunnerInstallerV0_Node20/utils/getAgentExternalsPath.ts b/_generated/NodeTaskRunnerInstallerV0_Node20/utils/getAgentExternalsPath.ts new file mode 100644 index 000000000000..9f5c3b9f338d --- /dev/null +++ b/_generated/NodeTaskRunnerInstallerV0_Node20/utils/getAgentExternalsPath.ts @@ -0,0 +1,13 @@ +import * as path from 'path'; +import * as taskLib from 'azure-pipelines-task-lib'; + +export function getAgentExternalsPath(): string { + + const agentRoot: string = process.env.AGENT_HOMEDIRECTORY; + + if (!agentRoot) { + throw new Error(taskLib.loc('AGENT_HOMEDIRECTORY_NotAvailable')); + } + + return path.join(agentRoot, 'externals'); +} diff --git a/_generated/NodeTaskRunnerInstallerV0_Node20/utils/getDirContent.ts b/_generated/NodeTaskRunnerInstallerV0_Node20/utils/getDirContent.ts new file mode 100644 index 000000000000..feba8566b564 --- /dev/null +++ b/_generated/NodeTaskRunnerInstallerV0_Node20/utils/getDirContent.ts @@ -0,0 +1,17 @@ +import * as taskLib from 'azure-pipelines-task-lib/task'; +import * as fs from 'fs'; + +export function getDirContent(directoryPath: string) { + try { + const files = fs.readdirSync(directoryPath); + + files.forEach((file) => { + taskLib.debug('Found file = ' + file); + }); + + return files; + + } catch (err) { + taskLib.warning(`Unable to scan directory: ${directoryPath}:\n` + err); + } +} diff --git a/_generated/NodeTaskRunnerInstallerV0_Node20/utils/isDarwinArmWithRosetta.ts b/_generated/NodeTaskRunnerInstallerV0_Node20/utils/isDarwinArmWithRosetta.ts new file mode 100644 index 000000000000..80f02b2b32fd --- /dev/null +++ b/_generated/NodeTaskRunnerInstallerV0_Node20/utils/isDarwinArmWithRosetta.ts @@ -0,0 +1,22 @@ +// TODO: Reuse in node-installer-common +import * as taskLib from 'azure-pipelines-task-lib/task'; + +import { NodeDistroOsArch, NodeOsPlatform } from '../interfaces/os-types'; + +/** + * Check is the system is darwin ARM and rosetta is installed. + * @param osPlatform OS platform. + * @param installedArch OS architecture. + * @returns `true` if it's darwin arm with rosetta installed, otherwise `false` +*/ +export function isDarwinArmWithRosetta(osPlatform: NodeOsPlatform, installedArch: NodeDistroOsArch): boolean { + if (osPlatform === 'darwin' && installedArch === 'arm64') { + + // Check that Rosetta is installed and returns some pid + const execResult = taskLib.execSync('pgrep', 'oahd'); + + return execResult.code === 0 && !!execResult.stdout; + } + + return false; +} diff --git a/_generated/NodeTaskRunnerInstallerV0_Node20/utils/mapOsArchToDistroVariant.ts b/_generated/NodeTaskRunnerInstallerV0_Node20/utils/mapOsArchToDistroVariant.ts new file mode 100644 index 000000000000..4f4e75295810 --- /dev/null +++ b/_generated/NodeTaskRunnerInstallerV0_Node20/utils/mapOsArchToDistroVariant.ts @@ -0,0 +1,10 @@ +import { NodeDistroOsArch, NodeOsArch } from '../interfaces/os-types'; + +export function mapOsArchToDistroVariant(osArch: NodeOsArch): NodeDistroOsArch { + + switch (osArch) { + case 'ia32': return 'x86'; + + default: return osArch; + } +} diff --git a/_generated/PublishBuildArtifactsV1.versionmap.txt b/_generated/PublishBuildArtifactsV1.versionmap.txt new file mode 100644 index 000000000000..f74febd08e1e --- /dev/null +++ b/_generated/PublishBuildArtifactsV1.versionmap.txt @@ -0,0 +1,2 @@ +Default|1.229.0 +Node20-225|1.229.1 diff --git a/_generated/PublishBuildArtifactsV1/Invoke-Robocopy.ps1 b/_generated/PublishBuildArtifactsV1/Invoke-Robocopy.ps1 new file mode 100644 index 000000000000..fe915998bf96 --- /dev/null +++ b/_generated/PublishBuildArtifactsV1/Invoke-Robocopy.ps1 @@ -0,0 +1,104 @@ +[CmdletBinding()] +param( + [Parameter(Mandatory = $true)] + [string]$Source, + + [Parameter(Mandatory = $true)] + [string]$Target, + + [Parameter(Mandatory = $true)] + [int]$ParallelCount, + + [Parameter(Mandatory = $false)] + [string]$File) + +# This script translates the output from robocopy into UTF8. Node has limited +# built-in support for encodings. +# +# Robocopy uses the system default code page. The system default code page varies +# depending on the locale configuration. On an en-US box, the system default code +# page is Windows-1252. +# +# Note, on a typical en-US box, testing with the 'ç' character is a good way to +# determine whether data is passed correctly between processes. This is because +# the 'ç' character has a different code point across each of the common encodings +# on a typical en-US box, i.e. +# 1) the default console-output code page (IBM437) +# 2) the system default code page (i.e. CP_ACP) (Windows-1252) +# 3) UTF8 + +$ErrorActionPreference = 'Stop' + +# Redefine the wrapper over STDOUT to use UTF8. Node expects UTF8 by default. +$stdout = [System.Console]::OpenStandardOutput() +$utf8 = New-Object System.Text.UTF8Encoding($false) # do not emit BOM +$writer = New-Object System.IO.StreamWriter($stdout, $utf8) +[System.Console]::SetOut($writer) + +# All subsequent output must be written using [System.Console]::WriteLine(). In +# PowerShell 4, Write-Host and Out-Default do not consider the updated stream writer. + +if (!$File) { + $File = "*"; + $CopySubFoldersOption = "/E" +} + +# Print the ##command. The /MT parameter is only supported on 2008 R2 and higher. +if ($ParallelCount -gt 1) { + [System.Console]::WriteLine("##[command]robocopy.exe $CopySubFoldersOption /COPY:DA /NP /R:3 /MT:$ParallelCount `"$Source`" `"$Target`" `"$File`"") +} +else { + [System.Console]::WriteLine("##[command]robocopy.exe $CopySubFoldersOption /COPY:DA /NP /R:3 `"$Source`" `"$Target`" `"$File`"") +} + +# The $OutputEncoding variable instructs PowerShell how to interpret the output +# from the external command. +$OutputEncoding = [System.Text.Encoding]::Default + +# Usage :: ROBOCOPY source destination [file [file]...] [options] +# source :: Source Directory (drive:\path or \\server\share\path). +# destination :: Destination Dir (drive:\path or \\server\share\path). +# file :: File(s) to copy (names/wildcards: default is "*.*"). +# /E :: copy subdirectories, including Empty ones. +# /COPY:copyflag[s] :: what to COPY for files (default is /COPY:DAT). +# (copyflags : D=Data, A=Attributes, T=Timestamps). +# (S=Security=NTFS ACLs, O=Owner info, U=aUditing info). +# /NP :: No Progress - don't display percentage copied. +# /MT[:n] :: Do multi-threaded copies with n threads (default 8). +# n must be at least 1 and not greater than 128. +# This option is incompatible with the /IPG and /EFSRAW options. +# Redirect output using /LOG option for better performance. +# /R:n :: number of Retries on failed copies: default 1 million. +# +# Note, the output from robocopy needs to be iterated over. Otherwise PowerShell.exe +# will launch the external command in such a way that it inherits the streams. +# +# Note, the /MT parameter is only supported on 2008 R2 and higher. +if ($ParallelCount -gt 1) { + & robocopy.exe $CopySubFoldersOption /COPY:DA /NP /R:3 /MT:$ParallelCount $Source $Target $File 2>&1 | + ForEach-Object { + if ($_ -is [System.Management.Automation.ErrorRecord]) { + [System.Console]::WriteLine($_.Exception.Message) + } + else { + [System.Console]::WriteLine($_) + } + } +} +else { + & robocopy.exe $CopySubFoldersOption /COPY:DA /NP /R:3 $Source $Target $File 2>&1 | + ForEach-Object { + if ($_ -is [System.Management.Automation.ErrorRecord]) { + [System.Console]::WriteLine($_.Exception.Message) + } + else { + [System.Console]::WriteLine($_) + } + } +} + +[System.Console]::WriteLine("##[debug]robocopy exit code '$LASTEXITCODE'") +[System.Console]::Out.Flush() +if ($LASTEXITCODE -ge 8) { + exit $LASTEXITCODE +} \ No newline at end of file diff --git a/_generated/PublishBuildArtifactsV1/Strings/resources.resjson/de-DE/resources.resjson b/_generated/PublishBuildArtifactsV1/Strings/resources.resjson/de-DE/resources.resjson new file mode 100644 index 000000000000..d1591f55b3ae --- /dev/null +++ b/_generated/PublishBuildArtifactsV1/Strings/resources.resjson/de-DE/resources.resjson @@ -0,0 +1,29 @@ +{ + "loc.friendlyName": "Buildartefakte veröffentlichen", + "loc.helpMarkDown": "[Weitere Informationen zu dieser Aufgabe](https://go.microsoft.com/fwlink/?LinkID=708390)", + "loc.description": "Hiermit werden Buildartefakte in Azure Pipelines oder einer Dateifreigabe veröffentlicht.", + "loc.instanceNameFormat": "Artefakt veröffentlichen: $(ArtifactName)", + "loc.group.displayName.advanced": "Erweitert", + "loc.input.label.PathtoPublish": "Pfad für Veröffentlichung", + "loc.input.help.PathtoPublish": "Der Ordner- oder Dateipfad für die Veröffentlichung. Es kann sich um einen vollqualifizierten Pfad oder um einen relativen Pfad zum Stamm des Repositorys handeln. Platzhalter werden nicht unterstützt. [Variablen](https://go.microsoft.com/fwlink/?LinkID=550988) werden unterstützt. Beispiel: $(Build.ArtifactStagingDirectory)", + "loc.input.label.ArtifactName": "Artefaktname", + "loc.input.help.ArtifactName": "Der Name des Artefakts, das am Speicherort für die Veröffentlichung erstellt werden soll.", + "loc.input.label.ArtifactType": "Veröffentlichungsort für Artefakte", + "loc.input.help.ArtifactType": "Wählen Sie aus, ob Sie das Artefakt in Azure Pipelines speichern oder in eine Dateifreigabe kopieren möchten, die vom Build-Agent aus zugänglich sein muss.", + "loc.input.label.MaxArtifactSize": "Maximale Artefaktgröße", + "loc.input.help.MaxArtifactSize": "Maximales Limit für die Größe von Artefakten, die in Bytes veröffentlicht werden sollen. Legen Sie \"0\" fest, wenn Sie kein Limit festlegen möchten.", + "loc.input.label.TargetPath": "Dateifreigabepfad", + "loc.input.help.TargetPath": "Die Dateifreigabe, in die die Artefaktdateien kopiert werden. Diese kann Variablen umfassen. Beispiel: \\\\\\my\\\\share\\\\$(Build.DefinitionName)\\\\$(Build.BuildNumber). Das Veröffentlichen von Artefakten über einen Linux- oder macOS-Agent in einer Dateifreigabe wird nicht unterstützt.", + "loc.input.label.Parallel": "Paralleles Kopieren", + "loc.input.help.Parallel": "Wählen Sie aus, ob Dateien mithilfe mehrerer Threads parallel kopiert werden sollen, um einen höheren Durchsatz zu erzielen. Wenn diese Einstellung nicht aktiviert ist, wird nur ein Thread verwendet.", + "loc.input.label.ParallelCount": "Parallele Anzahl", + "loc.input.help.ParallelCount": "Geben Sie den Parallelitätsgrad oder die Anzahl von Threads zum Durchführen des Kopiervorgangs ein. Der Wert muss mindestens 1 lauten und darf nicht größer sein als 128.", + "loc.input.label.StoreAsTar": "Artefakt vor dem Hochladen mit Tar packen", + "loc.input.help.StoreAsTar": "Fügen Sie vor dem Hochladen alle Dateien aus dem Veröffentlichungspfad zu einem Tar-Archiv hinzu. Dadurch können Sie die Berechtigungen für die UNIX-Datei beibehalten. Verwenden Sie die Option \"extractTars\" der Aufgabe \"DownloadBuildArtifacts\", um die heruntergeladenen Elemente automatisch zu extrahieren.", + "loc.messages.ErrorFileShareLinux": "Das Veröffentlichen von Artefakten von einem Linux- oder macOS-Agent in einer Dateifreigabe wird nicht unterstützt. Ändern Sie den Artefakttyp in \"Azure Pipelines\", oder verwenden Sie einen Windows-Agent.", + "loc.messages.ErrorHostTypeNotSupported": "Diese Aufgabe muss in einem Build ausgeführt werden, um Artefakte in Azure Pipelines zu veröffentlichen.", + "loc.messages.PublishBuildArtifactsFailed": "Fehler beim Veröffentlichen von Buildartefakten: %s", + "loc.messages.UnexpectedParallelCount": "Nicht unterstützte parallele Anzahl \"%s\". Geben Sie eine Zahl zwischen 1 und 128 ein.", + "loc.messages.TarExtractionNotSupportedInWindows": "Die Tar-Extraktion wird unter Windows nicht unterstützt", + "loc.messages.ArtifactSizeExceeded": "Die Größe der zu veröffentlichenden Artefakte beträgt %s Bytes und überschreitet damit den maximalen Grenzwert von %s Bytes, der für die veröffentlichte Größe von Artefakten festgelegt ist." +} \ No newline at end of file diff --git a/_generated/PublishBuildArtifactsV1/Strings/resources.resjson/en-US/resources.resjson b/_generated/PublishBuildArtifactsV1/Strings/resources.resjson/en-US/resources.resjson new file mode 100644 index 000000000000..8bc952c43d27 --- /dev/null +++ b/_generated/PublishBuildArtifactsV1/Strings/resources.resjson/en-US/resources.resjson @@ -0,0 +1,29 @@ +{ + "loc.friendlyName": "Publish build artifacts", + "loc.helpMarkDown": "[Learn more about this task](https://go.microsoft.com/fwlink/?LinkID=708390)", + "loc.description": "Publish build artifacts to Azure Pipelines or a Windows file share", + "loc.instanceNameFormat": "Publish Artifact: $(ArtifactName)", + "loc.group.displayName.advanced": "Advanced", + "loc.input.label.PathtoPublish": "Path to publish", + "loc.input.help.PathtoPublish": "The folder or file path to publish. This can be a fully-qualified path or a path relative to the root of the repository. Wildcards are not supported. [Variables](https://go.microsoft.com/fwlink/?LinkID=550988) are supported. Example: $(Build.ArtifactStagingDirectory)", + "loc.input.label.ArtifactName": "Artifact name", + "loc.input.help.ArtifactName": "The name of the artifact to create in the publish location.", + "loc.input.label.ArtifactType": "Artifact publish location", + "loc.input.help.ArtifactType": "Choose whether to store the artifact in Azure Pipelines, or to copy it to a file share that must be accessible from the build agent.", + "loc.input.label.MaxArtifactSize": "Max Artifact Size", + "loc.input.help.MaxArtifactSize": "Maximum limit on the size of artifacts to be published in bytes. Put 0 if you don't want to set any limit.", + "loc.input.label.TargetPath": "File share path", + "loc.input.help.TargetPath": "The file share to which the artifact files will be copied. This can include variables. Example: \\\\\\\\my\\\\share\\\\$(Build.DefinitionName)\\\\$(Build.BuildNumber). Publishing artifacts from a Linux or macOS agent to a file share is not supported.", + "loc.input.label.Parallel": "Parallel copy", + "loc.input.help.Parallel": "Select whether to copy files in parallel using multiple threads for greater potential throughput. If this setting is not enabled, one thread will be used.", + "loc.input.label.ParallelCount": "Parallel count", + "loc.input.help.ParallelCount": "Enter the degree of parallelism, or number of threads used, to perform the copy. The value must be at least 1 and not greater than 128.", + "loc.input.label.StoreAsTar": "Tar the artifact before uploading", + "loc.input.help.StoreAsTar": "Add all files from the publish path to a tar archive before uploading. This allows you to preserve the UNIX file permissions. Use `extractTars` option of DownloadBuildArtifacts task to extract the downloaded items automatically.", + "loc.messages.ErrorFileShareLinux": "Publishing artifacts from a Linux or macOS agent to a file share is not supported. Change the artifact type to `Azure Pipelines` or use a Windows agent.", + "loc.messages.ErrorHostTypeNotSupported": "This task must run in a build to publish artifacts to Azure Pipelines.", + "loc.messages.PublishBuildArtifactsFailed": "Publishing build artifacts failed with an error: %s", + "loc.messages.UnexpectedParallelCount": "Unsupported parallel count '%s'. Enter a number between 1 and 128.", + "loc.messages.TarExtractionNotSupportedInWindows": "Tar extraction is not supported on Windows", + "loc.messages.ArtifactSizeExceeded": "The size of artifacts being published is %s bytes which is larger than the maximum limit %s bytes set for the published size of artifacts." +} \ No newline at end of file diff --git a/_generated/PublishBuildArtifactsV1/Strings/resources.resjson/es-ES/resources.resjson b/_generated/PublishBuildArtifactsV1/Strings/resources.resjson/es-ES/resources.resjson new file mode 100644 index 000000000000..9c6aaf0378e8 --- /dev/null +++ b/_generated/PublishBuildArtifactsV1/Strings/resources.resjson/es-ES/resources.resjson @@ -0,0 +1,29 @@ +{ + "loc.friendlyName": "Publicar artefactos de compilación", + "loc.helpMarkDown": "[Obtener más información acerca de esta tarea](https://go.microsoft.com/fwlink/?LinkID=708390)", + "loc.description": "Publica los artefactos de compilación en Azure Pipelines o en un recurso compartido de archivos de Windows.", + "loc.instanceNameFormat": "Publicar artefacto: $(ArtifactName)", + "loc.group.displayName.advanced": "Avanzado", + "loc.input.label.PathtoPublish": "Ruta de acceso para publicar", + "loc.input.help.PathtoPublish": "La ruta de acceso del archivo o la carpeta para publicar. Puede ser una ruta de acceso completa o relativa a la raíz del repositorio. No se admiten caracteres comodín. Se admiten [variables](https://go.microsoft.com/fwlink/?LinkID=550988). Ejemplo: $(Build.ArtifactStagingDirectory)", + "loc.input.label.ArtifactName": "Nombre del artefacto", + "loc.input.help.ArtifactName": "El nombre del artefacto que se va a crear en la ubicación de publicación.", + "loc.input.label.ArtifactType": "Ubicación de publicación de artefactos", + "loc.input.help.ArtifactType": "Elija si el artefacto se va a almacenar en Azure Pipelines o se va a copiar en un recurso compartido de archivos al que se pueda acceder desde el agente de compilación.", + "loc.input.label.MaxArtifactSize": "Tamaño máximo del artefacto", + "loc.input.help.MaxArtifactSize": "Límite máximo del tamaño de los artefactos que se van a publicar en bytes. Escriba 0 si no desea establecer ningún límite.", + "loc.input.label.TargetPath": "Ruta de acceso del recurso compartido de archivos", + "loc.input.help.TargetPath": "El recurso compartido de archivos en el que se copiarán los archivos de artefacto. Puede incluir variables. Ejemplo: \\\\\\\\my\\\\share\\\\$(Build.DefinitionName)\\\\$(Build.BuildNumber). No se admite la publicación de artefactos de un agente de Linux o macOS en un recurso compartido de archivos.", + "loc.input.label.Parallel": "Copia en paralelo", + "loc.input.help.Parallel": "Seleccione si quiere copiar los archivos en paralelo con varios subprocesos para obtener un mayor rendimiento potencial. Si esta configuración no está habilitada, se usará un subproceso.", + "loc.input.label.ParallelCount": "Recuento de elementos en paralelo", + "loc.input.help.ParallelCount": "Especifique el grado de paralelismo o el número de subprocesos usados para realizar la copia. Debe ser un valor entre 1 y 128.", + "loc.input.label.StoreAsTar": "Agregue el artefacto a un archivo tar antes de cargarlo", + "loc.input.help.StoreAsTar": "Agregue todos los archivos de la ruta de publicación a un archivo tar antes de cargarlo. Esto permite conservar los permisos de los archivos UNIX. Utilice la opción `extractTars` de la tarea DownloadBuildArtifacts para extraer los elementos descargados automáticamente.", + "loc.messages.ErrorFileShareLinux": "No se admite la publicación de artefactos de un agente de Linux o macOS en un recurso compartido de archivos. Cambie el tipo de artefacto a \"Azure Pipelines\" o use un agente de Windows.", + "loc.messages.ErrorHostTypeNotSupported": "Esta tarea debe ejecutarse en una compilación para publicar artefactos en Azure Pipelines.", + "loc.messages.PublishBuildArtifactsFailed": "Error al publicar artefactos de compilación: %s", + "loc.messages.UnexpectedParallelCount": "Recuento de elementos \"%s\" en paralelo no admitido. Especifique un número entre 1 y 128.", + "loc.messages.TarExtractionNotSupportedInWindows": "La extracción de tar no es compatible con Windows", + "loc.messages.ArtifactSizeExceeded": "El tamaño de los artefactos que se van a publicar es de %s bytes, que supera el límite máximo de %s bytes establecido para el tamaño publicado de los artefactos." +} \ No newline at end of file diff --git a/_generated/PublishBuildArtifactsV1/Strings/resources.resjson/fr-FR/resources.resjson b/_generated/PublishBuildArtifactsV1/Strings/resources.resjson/fr-FR/resources.resjson new file mode 100644 index 000000000000..faad42cdf44d --- /dev/null +++ b/_generated/PublishBuildArtifactsV1/Strings/resources.resjson/fr-FR/resources.resjson @@ -0,0 +1,29 @@ +{ + "loc.friendlyName": "Publier des artefacts de build", + "loc.helpMarkDown": "[En savoir plus sur cette tâche](https://go.microsoft.com/fwlink/?LinkID=708390)", + "loc.description": "Publier des artefacts de build sur Azure Pipelines ou un partage de fichiers Windows", + "loc.instanceNameFormat": "Publier l'artefact : $(ArtifactName)", + "loc.group.displayName.advanced": "Avancé", + "loc.input.label.PathtoPublish": "Chemin de publication", + "loc.input.help.PathtoPublish": "Chemin de dossier ou de fichier à publier. Il peut s'agir d'un chemin complet ou d'un chemin relatif à la racine du dépôt. Les caractères génériques ne sont pas pris en charge. Les [variables](https://go.microsoft.com/fwlink/?LinkID=550988) sont prises en charge. Exemple : $(Build.ArtifactStagingDirectory)", + "loc.input.label.ArtifactName": "Nom de l'artefact", + "loc.input.help.ArtifactName": "Nom de l'artefact à créer dans l'emplacement de publication.", + "loc.input.label.ArtifactType": "Emplacement de publication des artefacts", + "loc.input.help.ArtifactType": "Choisissez entre le stockage de l'artefact dans Azure Pipelines, ou sa copie sur un partage de fichiers qui doit être accessible à l'agent de build.", + "loc.input.label.MaxArtifactSize": "Taille maximale de l’artefact", + "loc.input.help.MaxArtifactSize": "Limite maximale de la taille des artefacts à publier en octets. Mettez 0 si vous ne souhaitez pas définir de limite.", + "loc.input.label.TargetPath": "Chemin du partage de fichiers", + "loc.input.help.TargetPath": "Partage de fichiers où sont copiés les fichiers d'artefacts. Il peut inclure des variables. Exemple : \\\\\\\\mon\\\\partage\\\\$(Build.DefinitionName)\\\\$(Build.BuildNumber). La publication d'artefacts d'un agent Linux ou macOS vers un partage de fichiers n'est pas prise en charge.", + "loc.input.label.Parallel": "Copie parallèle", + "loc.input.help.Parallel": "Choisissez s'il est nécessaire de copier les fichiers en parallèle à l'aide de plusieurs threads pour un meilleur débit potentiel. Si ce paramètre n'est pas activé, un seul thread est utilisé.", + "loc.input.label.ParallelCount": "Nombre parallèle", + "loc.input.help.ParallelCount": "Entrez le degré de parallélisme ou le nombre de threads utilisés pour effectuer la copie. La valeur doit être au moins égal à 1 et inférieur à 128.", + "loc.input.label.StoreAsTar": "Envoyer l’artefacts avant de le charger", + "loc.input.help.StoreAsTar": "Ajoutez tous les fichiers du chemin de publication dans une archive archive archive avant de les charger. Cela vous permet de conserver les autorisations de fichier UNIX. Utilisez l’option « extractTars » de la tâche DownloadBuildArtifacts pour extraire automatiquement les éléments téléchargés.", + "loc.messages.ErrorFileShareLinux": "La publication d'artefacts d'un agent Linux ou macOS vers un partage de fichiers n'est pas prise en charge. Changez le type d'artefact en 'Azure Pipelines', ou utilisez un agent Windows.", + "loc.messages.ErrorHostTypeNotSupported": "Cette tâche doit s'exécuter dans une build pour permettre la publication d'artefacts sur Azure Pipelines.", + "loc.messages.PublishBuildArtifactsFailed": "Échec de la publication des artefacts de build. Erreur : %s", + "loc.messages.UnexpectedParallelCount": "Nombre parallèle '%s' non pris en charge. Entrez un nombre compris entre 1 et 128.", + "loc.messages.TarExtractionNotSupportedInWindows": "L’extraction par extraction d’extraction n’est pas prise en charge sur Windows", + "loc.messages.ArtifactSizeExceeded": "La taille des artefacts en cours de publication est de %s octets, ce qui est supérieur à la limite maximale de %s octets définie pour la taille publiée des artefacts." +} \ No newline at end of file diff --git a/_generated/PublishBuildArtifactsV1/Strings/resources.resjson/it-IT/resources.resjson b/_generated/PublishBuildArtifactsV1/Strings/resources.resjson/it-IT/resources.resjson new file mode 100644 index 000000000000..023c485f3712 --- /dev/null +++ b/_generated/PublishBuildArtifactsV1/Strings/resources.resjson/it-IT/resources.resjson @@ -0,0 +1,29 @@ +{ + "loc.friendlyName": "Pubblica artefatti della compilazione", + "loc.helpMarkDown": "[Altre informazioni su questa attività](https://go.microsoft.com/fwlink/?LinkID=708390)", + "loc.description": "Consente di pubblicare artefatti della compilazione in Azure Pipelines o in una condivisione file di Windows", + "loc.instanceNameFormat": "Pubblica artefatto: $(ArtifactName)", + "loc.group.displayName.advanced": "Avanzate", + "loc.input.label.PathtoPublish": "Percorso per la pubblicazione", + "loc.input.help.PathtoPublish": "Percorso del file o della cartella da pubblicare. Può essere un percorso completo o relativo alla radice del repository. I caratteri jolly non sono supportati. Le [variabili](https://go.microsoft.com/fwlink/?LinkID=550988) sono supportate. Esempio: $(Build.ArtifactStagingDirectory)", + "loc.input.label.ArtifactName": "Nome dell'artefatto", + "loc.input.help.ArtifactName": "Nome dell'artefatto da creare nel percorso di pubblicazione.", + "loc.input.label.ArtifactType": "Percorso di pubblicazione degli artefatti", + "loc.input.help.ArtifactType": "Consente di scegliere se archiviare l'artefatto in Azure Pipelines oppure copiarlo in una condivisione file accessibile dall'agente di compilazione.", + "loc.input.label.MaxArtifactSize": "Dimensioni massime artefatto", + "loc.input.help.MaxArtifactSize": "Limite massimo per le dimensioni degli artefatti da pubblicare in byte. Inserire 0 se non si vuole impostare alcun limite.", + "loc.input.label.TargetPath": "Percorso condivisione file", + "loc.input.help.TargetPath": "Condivisione file in cui verranno copiati i file di artefatto. Può includere variabili. Esempio: \\\\\\\\my\\\\share\\\\$(Build.DefinitionName)\\\\$(Build.BuildNumber). La pubblicazione di artefatti da un agente Linux o macOS in una condivisione file non è supportata.", + "loc.input.label.Parallel": "Copia parallela", + "loc.input.help.Parallel": "Consente di scegliere se copiare i file in parallelo usando più thread per una maggiore velocità effettiva potenziale. Se questa impostazione non è abilitata, verrà usato un solo thread.", + "loc.input.label.ParallelCount": "Conteggio parallelo", + "loc.input.help.ParallelCount": "Consente di immettere il grado di parallelismo o il numero di thread usati per eseguire la copia. Il valore deve essere almeno 1 e non superare 128.", + "loc.input.label.StoreAsTar": "Aggiungere l'artefatto a un archivio tar prima del caricamento", + "loc.input.help.StoreAsTar": "Aggiungere tutti i file dal percorso di pubblicazione a un archivio tar prima del caricamento. Ciò consente di mantenere le autorizzazioni file UNIX. Usare l'opzione 'extractTars' dell'attività DownloadBuildArtifacts per estrarre automaticamente gli elementi scaricati.", + "loc.messages.ErrorFileShareLinux": "La pubblicazione di artefatti da un agente Linux o macOS in una condivisione file non è supportata. Modificare il tipo di artefatto in `Azure Pipelines` oppure usare un agente Windows.", + "loc.messages.ErrorHostTypeNotSupported": "Per pubblicare gli artefatti in Azure Pipelines, questa attività deve essere eseguita in una compilazione.", + "loc.messages.PublishBuildArtifactsFailed": "La pubblicazione degli artefatti di compilazione non è riuscita. Errore: %s", + "loc.messages.UnexpectedParallelCount": "Conteggio parallelo '%s' non supportato. Immettere un numero compreso tra 1 e 128.", + "loc.messages.TarExtractionNotSupportedInWindows": "L'estrazione di tar non è supportata in Windows", + "loc.messages.ArtifactSizeExceeded": "Le dimensioni degli artefatti pubblicati sono %s byte, che superano il limite massimo di %s byte impostato per le dimensioni pubblicate degli artefatti." +} \ No newline at end of file diff --git a/_generated/PublishBuildArtifactsV1/Strings/resources.resjson/ja-JP/resources.resjson b/_generated/PublishBuildArtifactsV1/Strings/resources.resjson/ja-JP/resources.resjson new file mode 100644 index 000000000000..74a98b069288 --- /dev/null +++ b/_generated/PublishBuildArtifactsV1/Strings/resources.resjson/ja-JP/resources.resjson @@ -0,0 +1,29 @@ +{ + "loc.friendlyName": "ビルド成果物の公開", + "loc.helpMarkDown": "[このタスクの詳細を表示](https://go.microsoft.com/fwlink/?LinkID=708390)", + "loc.description": "ビルド成果物を Azure Pipelines または Windows ファイル共有に公開します", + "loc.instanceNameFormat": "成果物の公開: $(ArtifactName)", + "loc.group.displayName.advanced": "詳細設定", + "loc.input.label.PathtoPublish": "発行するためのパス", + "loc.input.help.PathtoPublish": "発行するフォルダーまたはファイルのパス。完全修飾パスまたはリポジトリのルートからの相対パスを指定できます。ワイルドカードはサポートされていません。[変数](https://go.microsoft.com/fwlink/?LinkID=550988) がサポートされています。例: $(Build.ArtifactStagingDirectory)", + "loc.input.label.ArtifactName": "成果物名", + "loc.input.help.ArtifactName": "公開場所に作成する成果物の名前。", + "loc.input.label.ArtifactType": "成果物の発行場所", + "loc.input.help.ArtifactType": "成果物を Azure Pipelines に保存するか、またはビルド エージェントからアクセスできるファイル共有にコピーするかを選択します。", + "loc.input.label.MaxArtifactSize": "成果物の最大サイズ", + "loc.input.help.MaxArtifactSize": "公開する成果物のサイズの上限 (バイト単位)。制限を設定しない場合は 0 を指定します。", + "loc.input.label.TargetPath": "ファイル共有パス", + "loc.input.help.TargetPath": "成果物ファイルのコピー先であるファイル共有です。これには変数を含めることができます。例: \\\\\\\\my\\\\share\\\\$(Build.DefinitionName)\\\\$(Build.BuildNumber)。Linux または macOS エージェントから成果物をファイル共有に公開することはサポートされていません。", + "loc.input.label.Parallel": "並列コピー", + "loc.input.help.Parallel": "スループット向上を期待して複数のスレッドを使って並列でファイルをコピーするかどうかを選択します。この設定が無効の場合は、1 つのスレッドが使用されます。", + "loc.input.label.ParallelCount": "並列数", + "loc.input.help.ParallelCount": "コピーを実行するための並列処理の程度、つまり使用するスレッド数を入力します。この値は 1 以上 128 以下でなければなりません。", + "loc.input.label.StoreAsTar": "アップロードする前に成果物を Tar してください", + "loc.input.help.StoreAsTar": "アップロードする前に、発行パスのすべてのファイルを tar アーカイブに追加します。これにより、UNIX ファイルのアクセス許可を保持することができます。DownloadBuildArtifacts ティファクト タスクの ' extractTars ' オプションを使用して、ダウンロードされたアイテムを自動的に抽出します。", + "loc.messages.ErrorFileShareLinux": "Linux または macOS エージェントからファイル共有への成果物の公開はサポートされていません。成果物の種類を `Azure Pipelines` に変更するか、Windows エージェントをご使用ください。", + "loc.messages.ErrorHostTypeNotSupported": "成果物を Azure Pipelines に公開するには、ビルドでこのタスクを実行する必要があります。", + "loc.messages.PublishBuildArtifactsFailed": "ビルド成果物の発行が失敗し、次のエラーが発生しました: %s", + "loc.messages.UnexpectedParallelCount": "並列数 '%s' はサポートされていません。1 以上 128 以下の数を入力してください。", + "loc.messages.TarExtractionNotSupportedInWindows": "Tar 抽出は Windows でサポートされていません", + "loc.messages.ArtifactSizeExceeded": "公開中の成果物のサイズが %s バイトです。これは、成果物の公開サイズに設定されている上限 %s バイトを超えています。" +} \ No newline at end of file diff --git a/_generated/PublishBuildArtifactsV1/Strings/resources.resjson/ko-KR/resources.resjson b/_generated/PublishBuildArtifactsV1/Strings/resources.resjson/ko-KR/resources.resjson new file mode 100644 index 000000000000..7bc429e77445 --- /dev/null +++ b/_generated/PublishBuildArtifactsV1/Strings/resources.resjson/ko-KR/resources.resjson @@ -0,0 +1,29 @@ +{ + "loc.friendlyName": "빌드 아티팩트 게시", + "loc.helpMarkDown": "[이 작업에 대한 자세한 정보](https://go.microsoft.com/fwlink/?LinkID=708390)", + "loc.description": "Azure Pipelines 또는 Windows 파일 공유에 빌드 아티팩트를 게시합니다.", + "loc.instanceNameFormat": "아티팩트 게시: $(ArtifactName)", + "loc.group.displayName.advanced": "고급", + "loc.input.label.PathtoPublish": "게시할 경로", + "loc.input.help.PathtoPublish": "게시할 폴더 또는 파일 경로입니다. 리포지토리 루트에 상대적인 경로 또는 정규화된 경로일 수 있습니다. 와일드카드는 지원되지 않지만 [변수](https://go.microsoft.com/fwlink/?LinkID=550988)는 지원됩니다. 예: $(Build.ArtifactStagingDirectory)", + "loc.input.label.ArtifactName": "아티팩트 이름", + "loc.input.help.ArtifactName": "게시 위치에 만들 아티팩트의 이름입니다.", + "loc.input.label.ArtifactType": "아티팩트 게시 위치", + "loc.input.help.ArtifactType": "아티팩트를 Azure Pipelines에 저장할지 또는 빌드 에이전트에서 액세스할 수 있어야 하는 파일 공유에 복사할지를 선택합니다.", + "loc.input.label.MaxArtifactSize": "최대 아티팩트 크기", + "loc.input.help.MaxArtifactSize": "게시할 아티팩트 크기에 대한 최대 제한(바이트)입니다. 제한을 설정하지 않으려면 0을 입력합니다.", + "loc.input.label.TargetPath": "파일 공유 경로", + "loc.input.help.TargetPath": "아티팩트 파일을 복사할 파일 공유입니다. 변수를 포함할 수 있습니다(예: \\\\\\\\my\\\\share\\\\$(Build.DefinitionName)\\\\$(Build.BuildNumber)). Linux 또는 macOS 에이전트의 아티팩트를 파일 공유에 게시할 수는 없습니다.", + "loc.input.label.Parallel": "병렬 복사", + "loc.input.help.Parallel": "잠재적인 처리량 증대를 위해 다중 스레드를 사용하여 파일을 병렬 복사할지 여부를 선택합니다. 이 설정을 사용하도록 설정하지 않으면 하나의 스레드가 사용됩니다.", + "loc.input.label.ParallelCount": "병렬 개수", + "loc.input.help.ParallelCount": "병렬 처리 수준, 즉 복사를 수행하는 데 사용되는 스레드 수를 입력합니다. 값은 1에서 128 사이여야 합니다.", + "loc.input.label.StoreAsTar": "업로드하기 전에 아티팩트를 tar로 저장", + "loc.input.help.StoreAsTar": "업로드하기 전에 게시 경로의 모든 파일을 tar 보관함에 추가합니다. 이를 통해 UNIX 파일 사용 권한을 유지할 수 있습니다. DownloadBuildArtifacts 작업의 'extractTars' 옵션을 사용하여 다운로드한 항목의 압축을 자동으로 풉니다.", + "loc.messages.ErrorFileShareLinux": "Linux 또는 macOS 에이전트의 아티팩트를 파일 공유에 게시할 수 없습니다. 아티팩트 형식을 'Azure Pipelines'로 변경하거나 Windows 에이전트를 사용하세요.", + "loc.messages.ErrorHostTypeNotSupported": "아티팩트를 Azure Pipelines에 게시하려면 빌드에서 이 작업을 실행해야 합니다.", + "loc.messages.PublishBuildArtifactsFailed": "오류가 발생하여 빌드 아티팩트를 게시하지 못함: %s", + "loc.messages.UnexpectedParallelCount": "지원되지 않는 병렬 개수 '%s'입니다. 1에서 128 사이의 숫자를 입력하세요.", + "loc.messages.TarExtractionNotSupportedInWindows": "Windows에서는 tar 압축 풀기가 지원되지 않습니다", + "loc.messages.ArtifactSizeExceeded": "게시 중인 아티팩트의 크기가 게시되는 아티팩트 크기에 대해 설정된 최대 제한 %s바이트보다 큰 %s바이트입니다." +} \ No newline at end of file diff --git a/_generated/PublishBuildArtifactsV1/Strings/resources.resjson/ru-RU/resources.resjson b/_generated/PublishBuildArtifactsV1/Strings/resources.resjson/ru-RU/resources.resjson new file mode 100644 index 000000000000..ef7ab4f8117f --- /dev/null +++ b/_generated/PublishBuildArtifactsV1/Strings/resources.resjson/ru-RU/resources.resjson @@ -0,0 +1,29 @@ +{ + "loc.friendlyName": "Публикация артефактов сборки", + "loc.helpMarkDown": "[См. дополнительные сведения об этой задаче](https://go.microsoft.com/fwlink/?LinkID=708390)", + "loc.description": "Публикация артефактов сборки в Azure Pipelines или общей папке", + "loc.instanceNameFormat": "Опубликовать артефакт: $(ArtifactName)", + "loc.group.displayName.advanced": "Дополнительно", + "loc.input.label.PathtoPublish": "Путь публикации", + "loc.input.help.PathtoPublish": "Путь файла или папки для публикации. Это может быть полный путь или путь относительно корневого каталога репозитория. Подстановочные знаки не поддерживаются. [Переменные](https://go.microsoft.com/fwlink/?LinkID=550988) поддерживаются. Например: $(Build.ArtifactStagingDirectory)", + "loc.input.label.ArtifactName": "Имя артефакта", + "loc.input.help.ArtifactName": "Имя артефакта, который будет создан в расположении публикации.", + "loc.input.label.ArtifactType": "Расположение публикации артефакта", + "loc.input.help.ArtifactType": "Выберите, нужно ли сохранить артефакт в Azure Pipelines либо скопировать его в общую папку, которая должна быть доступна из агента сборки.", + "loc.input.label.MaxArtifactSize": "Максимальный размер артефакта", + "loc.input.help.MaxArtifactSize": "Максимальный размер публикуемых артефактов в байтах. Если вы не хотите устанавливать какие-либо ограничения, укажите значение 0.", + "loc.input.label.TargetPath": "Путь к общей папке", + "loc.input.help.TargetPath": "Общая папка, в которую будут скопированы файлы артефактов. Может включать в себя переменные. Пример: \\\\\\\\my\\\\share\\\\$(Build.DefinitionName)\\\\$(Build.BuildNumber). Публикация артефактов из агента Linux или macOS в общей папке не поддерживается.", + "loc.input.label.Parallel": "Параллельное копирование", + "loc.input.help.Parallel": "Выберите, следует ли копировать файлы параллельно с использованием нескольких потоков для возможного повышения пропускной способности. Если этот параметр не установлен, используется один поток.", + "loc.input.label.ParallelCount": "Счетчик параллелизма", + "loc.input.help.ParallelCount": "Введите степень параллелизма (число потоков, используемых для копирования). Допустимые значения: от 1 до 128 включительно.", + "loc.input.label.StoreAsTar": "Поместите артефакт в TAR-архив перед отправкой", + "loc.input.help.StoreAsTar": "Добавьте все файлы из пути публикации в TAR-архив перед отправкой. Это позволяет сохранить разрешения для UNIX-файлов. Используйте параметр \"extractTars\" задачи DownloadBuildArtifacts, чтобы извлечь загруженные элементы автоматически.", + "loc.messages.ErrorFileShareLinux": "Публикация артефактов из агента Linux или macOS в общей папке не поддерживается. Измените тип артефакта на \"Azure Pipelines\" или используйте агент Windows.", + "loc.messages.ErrorHostTypeNotSupported": "Эта задача должна выполняться в сборке для публикации артефактов в Azure Pipelines.", + "loc.messages.PublishBuildArtifactsFailed": "Сбой публикации артефактов сборки с ошибкой: %s", + "loc.messages.UnexpectedParallelCount": "Неподдерживаемое значение счетчика параллелизма \"%s\". Введите число от 1 до 128.", + "loc.messages.TarExtractionNotSupportedInWindows": "Извлечение из TAR-архива не поддерживается в Windows", + "loc.messages.ArtifactSizeExceeded": "Размер публикуемых артефактов составляет %s байт, что превышает максимальное ограничение %s байт, заданное для опубликованного размера артефактов." +} \ No newline at end of file diff --git a/_generated/PublishBuildArtifactsV1/Strings/resources.resjson/zh-CN/resources.resjson b/_generated/PublishBuildArtifactsV1/Strings/resources.resjson/zh-CN/resources.resjson new file mode 100644 index 000000000000..4d2d2cc41929 --- /dev/null +++ b/_generated/PublishBuildArtifactsV1/Strings/resources.resjson/zh-CN/resources.resjson @@ -0,0 +1,29 @@ +{ + "loc.friendlyName": "发布生成工件", + "loc.helpMarkDown": "[详细了解此任务](https://go.microsoft.com/fwlink/?LinkID=708390)", + "loc.description": "将生成工件发布到 Azure Pipelines 或 Windows 文件共享", + "loc.instanceNameFormat": "发布项目: $(ArtifactName)", + "loc.group.displayName.advanced": "高级", + "loc.input.label.PathtoPublish": "要发布的路径", + "loc.input.help.PathtoPublish": "要发布的文件夹或文件路径。这可以是一个完全限定的路径或一个相对于存储库的根的路径。不支持通配符。支持 [变量](https://go.microsoft.com/fwlink/?LinkID=550988)。例如: $(Build.ArtifactStagingDirectory)", + "loc.input.label.ArtifactName": "项目名称", + "loc.input.help.ArtifactName": "要在发布位置中创建的项目的名称。", + "loc.input.label.ArtifactType": "项目发布位置", + "loc.input.help.ArtifactType": "选择是否在 Azure Pipelines 中存储项目,或者是否将其复制到必须可从生成代理访问的文件共享中。", + "loc.input.label.MaxArtifactSize": "最大项目大小", + "loc.input.help.MaxArtifactSize": "要发布的项目大小的最大限制(以字节为单位)。如果不想设置任何限制,请输入 0。", + "loc.input.label.TargetPath": "文件共享路径", + "loc.input.help.TargetPath": "项目文件将复制到的文件共享。这可包括变量。示例: \\\\\\\\my\\\\share\\\\$(Build.DefinitionName)\\\\$(Build.BuildNumber)。不支持将项目从 Linux 或 macOS 代理发布到文件共享。", + "loc.input.label.Parallel": "并行复制", + "loc.input.help.Parallel": "选择是否要使用多个线程并行复制文件以获得更大的潜在吞吐量。如果未启用此设置,将使用一个线程。", + "loc.input.label.ParallelCount": "并行计数", + "loc.input.help.ParallelCount": "输入执行复制的并行度或所使用的线程数。该值必须至少为 1 且不能大于 128。", + "loc.input.label.StoreAsTar": "上传之前存档", + "loc.input.help.StoreAsTar": "上传前将发布路径中的所有文件添加到存档。此操作将允许保留 UNIX 文件权限。使用 DownloadBuildArtifacts 任务的 `extractTars` 选项以自动提取已下载的项目。", + "loc.messages.ErrorFileShareLinux": "不支持将项目从 Linux 或 macOS 代理发布到文件共享。请将项目类型更改为 `Azure Pipelines` 或使用 Windows 代理。", + "loc.messages.ErrorHostTypeNotSupported": "此任务必须在生成中运行,以将项目发布到 Azure Pipelines。", + "loc.messages.PublishBuildArtifactsFailed": "发布生成项目失败,出现错误: %s", + "loc.messages.UnexpectedParallelCount": "并行计数“%s”不受支持。输入介于 1 到 128 之间的数字。", + "loc.messages.TarExtractionNotSupportedInWindows": "Windows 不支持存档提取", + "loc.messages.ArtifactSizeExceeded": "正在发布的项目大小为 %s 字节,大于为项目发布的大小设置的最大限制 %s 字节。" +} \ No newline at end of file diff --git a/_generated/PublishBuildArtifactsV1/Strings/resources.resjson/zh-TW/resources.resjson b/_generated/PublishBuildArtifactsV1/Strings/resources.resjson/zh-TW/resources.resjson new file mode 100644 index 000000000000..e944095004c9 --- /dev/null +++ b/_generated/PublishBuildArtifactsV1/Strings/resources.resjson/zh-TW/resources.resjson @@ -0,0 +1,29 @@ +{ + "loc.friendlyName": "發佈組建成品", + "loc.helpMarkDown": "[深入了解此工作](https://go.microsoft.com/fwlink/?LinkID=708390)", + "loc.description": "將組建成品發佈至 Azure Pipelines 或 Windows 檔案共用", + "loc.instanceNameFormat": "發行成品: $(ArtifactName)", + "loc.group.displayName.advanced": "進階", + "loc.input.label.PathtoPublish": "要發行的路徑", + "loc.input.help.PathtoPublish": "要發佈的資料夾或檔案路徑。可為完整路徑或與存放庫根路徑相關的路徑。不支援萬用字元。支援[變數](https://go.microsoft.com/fwlink/?LinkID=550988)。範例: $(Build.ArtifactStagingDirectory)", + "loc.input.label.ArtifactName": "成品名稱", + "loc.input.help.ArtifactName": "要在發佈位置建立的成品名稱。", + "loc.input.label.ArtifactType": "成品發佈位置", + "loc.input.help.ArtifactType": "選擇要在 Azure Pipelines 中儲存成品,還是將成品複製到必須可透過組建代理程式存取的檔案共用。", + "loc.input.label.MaxArtifactSize": "成品大小上限", + "loc.input.help.MaxArtifactSize": "成品的發佈大小上限,以位元組為單位。如果您不想設定任何限制,請放 0。", + "loc.input.label.TargetPath": "檔案共用路徑", + "loc.input.help.TargetPath": "成品檔案所要複製到的檔案共用。此項目可包含變數。範例: \\\\\\\\my\\\\share\\\\$(Build.DefinitionName)\\\\$(Build.BuildNumber)。不支援從 Linux 或 macOS 代理程式將成品發佈至檔案共用。", + "loc.input.label.Parallel": "平行複製", + "loc.input.help.Parallel": "選取是否要使用多重執行緒平行複製檔案,以追求更高的輸送量。若此設定未啟用,則只會使用一個執行緒。", + "loc.input.label.ParallelCount": "平行計數", + "loc.input.help.ParallelCount": "輸入平行處理的程度或使用的執行緒數量,以執行複製。該值必須至少為 1 且不大於 128。", + "loc.input.label.StoreAsTar": "在上傳前先 tar 成品", + "loc.input.help.StoreAsTar": "在上傳前,請先將發行路徑中的所有檔案新增至 tar 封存。這可讓您保留 UNIX 檔案權限。使用 DownloadBuildArtifacts 工作的 `extractTars` 選項,自動解壓縮下載的項目。", + "loc.messages.ErrorFileShareLinux": "不支援將成品從 Linux 或 macOS 代理程式發佈到檔案共用。請將成品類型變更為 `Azure Pipelines` 或使用 Windows 代理程式。", + "loc.messages.ErrorHostTypeNotSupported": "此工作必須在組建中執行才能將成品發佈至 Azure Pipelines。", + "loc.messages.PublishBuildArtifactsFailed": "發行組建成品失敗,錯誤: %s", + "loc.messages.UnexpectedParallelCount": "不支援的平行計數 '%s'。請輸入介於 1 到 128 之間的數字。", + "loc.messages.TarExtractionNotSupportedInWindows": "Windows 不支援 tar 解壓縮", + "loc.messages.ArtifactSizeExceeded": "要發佈的成品大小為 %s 位元組,這已超過成品發佈大小所設定的 %s 位元組上限。" +} \ No newline at end of file diff --git a/_generated/PublishBuildArtifactsV1/Tests/L0.ts b/_generated/PublishBuildArtifactsV1/Tests/L0.ts new file mode 100644 index 000000000000..746eb0b9ee52 --- /dev/null +++ b/_generated/PublishBuildArtifactsV1/Tests/L0.ts @@ -0,0 +1,174 @@ +import * as assert from 'assert'; +import * as path from 'path'; +import * as os from 'os'; +import { MockTestRunner } from 'azure-pipelines-task-lib/mock-test'; + +describe('PublishBuildArtifactsV1 Suite', function () { + this.timeout(10000); + + it('Publish to container', (done: Mocha.Done) => { + const testPath: string = path.join(__dirname, 'L0PublishToContainer.js'); + const testRunner = new MockTestRunner(testPath); + testRunner.run(); + + assert(testRunner.stderr.length === 0, 'should not have written to stderr. error: ' + testRunner.stderr); + assert(testRunner.succeeded, 'task should have succeeded'); + assert(testRunner.stdout.search(/##vso\[artifact.upload artifactType=container;artifactName=drop;containerfolder=drop;localpath=\/bin\/release;\]\/bin\/release/gi) >= 0, 'should publish artifact.'); + + done(); + }); + + if (os.platform() === 'win32') { + it('Publish to UNC', (done: Mocha.Done) => { + const testPath: string = path.join(__dirname, 'L0PublishToUnc.js'); + const testRunner = new MockTestRunner(testPath); + testRunner.run(); + + assert(!testRunner.stderr, 'should not have written to stderr. error: ' + testRunner.stderr); + assert(testRunner.succeeded, 'task should have succeeded'); + assert(testRunner.stdout.indexOf('test stdout from robocopy (no trailing slashes)') >= 0, 'should copy files.'); + assert(testRunner.stdout.search(/artifact.associate/gi) >= 0, 'should associate artifact.'); + done(); + }); + + it('Appends . to robocopy source with trailing slash', (done: Mocha.Done) => { + const testPath: string = path.join(__dirname, 'L0AppendDotToRobocopySource.js'); + const testRunner = new MockTestRunner(testPath); + testRunner.run(); + + assert(!testRunner.stderr, 'should not have written to stderr. error: ' + testRunner.stderr); + assert(testRunner.succeeded, 'task should have succeeded'); + assert(testRunner.stdout.indexOf('test stdout from robocopy (source with trailing slash)') >= 0, 'should copy files.'); + assert(testRunner.stdout.search(/artifact.associate/gi) >= 0, 'should associate artifact.'); + done(); + }); + + it('Appends . to robocopy target with trailing slash', (done: Mocha.Done) => { + const testPath: string = path.join(__dirname, 'L0AppendDotToRobocopyTarget.js'); + const testRunner = new MockTestRunner(testPath); + testRunner.run(); + + assert(!testRunner.stderr, 'should not have written to stderr. error: ' + testRunner.stderr); + assert(testRunner.succeeded, 'task should have succeeded'); + assert(testRunner.stdout.indexOf('test stdout from robocopy (target with trailing slash)') >= 0, 'should copy files.'); + assert(testRunner.stdout.search(/artifact.associate/gi) >= 0, 'should associate artifact.'); + done(); + }); + + it('Copy single file with robocopy', (done: Mocha.Done) => { + const testPath: string = path.join(__dirname, 'L0CopySingleFileWithRobocopy.js'); + const testRunner = new MockTestRunner(testPath); + testRunner.run(); + + assert(!testRunner.stderr, 'should not have written to stderr. error: ' + testRunner.stderr); + assert(testRunner.succeeded, 'task should have succeeded'); + assert(testRunner.stdout.indexOf('test stdout from robocopy (copy a single file)') >= 0, 'should copy files.'); + assert(testRunner.stdout.search(/artifact.associate/gi) >= 0, 'should associate artifact.'); + done(); + }); + + it('fails if robocopy fails', (done: Mocha.Done) => { + const testPath: string = path.join(__dirname, 'L0FailsIfRobocopyFails.js'); + const testRunner = new MockTestRunner(testPath); + testRunner.run(); + + assert(testRunner.failed, 'task should have failed'); + assert(testRunner.stdout.match(/test stdout from robocopy/gi).length === 1, 'should call robocopy.'); + assert(testRunner.stdout.search(/artifact.associate/gi) >= 0, 'should associate artifact.'); + done(); + }); + + it('creates filepath artifact', (done: Mocha.Done) => { + const testPath: string = path.join(__dirname, 'L0CreatesFilepathArtifact.js'); + const testRunner = new MockTestRunner(testPath); + testRunner.run(); + + assert(!testRunner.stderr, 'should not have written to stderr. error: ' + testRunner.stderr); + assert(testRunner.succeeded, 'task should have succeeded'); + assert(testRunner.stdout.indexOf('##vso[artifact.associate artifacttype=filepath;artifactname=drop;artifactlocation=\\\\UNCShare\\subdir;]\\\\UNCShare\\subdir') >= 0, 'should associate artifact.'); + done(); + }); + } else { + it('fails to create filepath artifact', (done: Mocha.Done) => { + const testPath: string = path.join(__dirname, 'L0FailsToCreateFilepathArtifact.js'); + const testRunner = new MockTestRunner(testPath); + testRunner.run(); + + assert(testRunner.stdout.match(/loc_mock_ErrorFileShareLinux/), 'should have written error message'); + assert(testRunner.failed, 'task should have succeeded'); + assert(testRunner.stdout.indexOf('##vso[artifact.associate') < 0, 'should not associate artifact.'); + done(); + }); + } + + it('fails if PathtoPublish not set', (done: Mocha.Done) => { + const testPath: string = path.join(__dirname, 'L0FailsIfPathToPublishNotSet.js'); + const testRunner = new MockTestRunner(testPath); + testRunner.run(); + + assert(testRunner.stdOutContained('Input required: PathtoPublish')); + assert(testRunner.failed, 'task should have failed'); + assert(testRunner.invokedToolCount === 0, 'should exit before running PublishBuildArtifacts'); + done(); + }); + + it('fails if ArtifactName not set', (done: Mocha.Done) => { + const testPath: string = path.join(__dirname, 'L0FailsIfArtifactNameNotSet.js'); + const testRunner = new MockTestRunner(testPath); + testRunner.run(); + + assert(testRunner.stdOutContained('Input required: ArtifactName')); + assert(testRunner.failed, 'task should have failed'); + assert(testRunner.invokedToolCount === 0, 'should exit before running PublishBuildArtifacts'); + done(); + }); + + it('fails if ArtifactType not set', (done: Mocha.Done) => { + const testPath: string = path.join(__dirname, 'L0FailsIfArtifactTypeNotSet.js'); + const testRunner = new MockTestRunner(testPath); + testRunner.run(); + + assert(testRunner.stdOutContained('Input required: ArtifactType')); + assert(testRunner.failed, 'task should have failed'); + assert(testRunner.invokedToolCount === 0, 'should exit before running PublishBuildArtifacts'); + done(); + }); + + it('fails if PathtoPublish not found', (done: Mocha.Done) => { + const testPath: string = path.join(__dirname, 'L0FailsIfPathToPublishNotFound.js'); + const testRunner = new MockTestRunner(testPath); + testRunner.run(); + + assert(testRunner.failed, 'should have failed'); + const expectedErr = 'Not found /bin/notexist'; + assert(testRunner.stdOutContained(expectedErr), 'should have said: ' + expectedErr); + assert(testRunner.invokedToolCount === 0, 'should exit before running PublishBuildArtifacts'); + done(); + }); + + it('Add a single file to tar before uploading', (done: Mocha.Done) => { + const testPath: string = path.join(__dirname, 'L0StoreFileAsTar.js'); + const testRunner = new MockTestRunner(testPath); + testRunner.run(); + + assert(testRunner.stderr.length === 0, 'should not have written to stderr. error: ' + testRunner.stderr); + assert(testRunner.succeeded, 'task should have succeeded'); + assert(testRunner.stdOutContained('test stdout from tar: added file to archive'), 'should have run tar'); + const artifactPath: string = path.join(process.cwd(), 'drop.tar'); + assert(testRunner.stdOutContained(`##vso[artifact.upload artifacttype=container;artifactname=drop;containerfolder=drop;localpath=${artifactPath};]${artifactPath}`)); + done(); + }); + + it('Add a folder to tar before uploading', (done: Mocha.Done) => { + const testPath: string = path.join(__dirname, 'L0StoreFolderAsTar.js'); + const testRunner = new MockTestRunner(testPath); + testRunner.run(); + + assert(testRunner.stderr.length === 0, 'should not have written to stderr. error: ' + testRunner.stderr); + assert(testRunner.succeeded, 'task should have succeeded'); + assert(testRunner.stdOutContained('test stdout from tar: added folder to archive'), 'should have run tar'); + const artifactPath: string = path.join(process.cwd(), 'drop.tar'); + assert(testRunner.stdOutContained(`##vso[artifact.upload artifacttype=container;artifactname=drop;containerfolder=drop;localpath=${artifactPath};]${artifactPath}`)); + done(); + }); +}); diff --git a/_generated/PublishBuildArtifactsV1/Tests/L0AppendDotToRobocopySource.ts b/_generated/PublishBuildArtifactsV1/Tests/L0AppendDotToRobocopySource.ts new file mode 100644 index 000000000000..b69e869fbefc --- /dev/null +++ b/_generated/PublishBuildArtifactsV1/Tests/L0AppendDotToRobocopySource.ts @@ -0,0 +1,20 @@ +import * as path from 'path'; + +import { TaskMockRunner } from 'azure-pipelines-task-lib/mock-run'; +import * as MockToolRunner from 'azure-pipelines-task-lib/mock-toolrunner'; + +import { goodAnswers } from './goodAnswers'; + +const taskPath: string = path.join(__dirname, '..', 'publishbuildartifacts.js'); +const taskRunner = new TaskMockRunner(taskPath); + +taskRunner.setInput('PathtoPublish', 'C:\\bin\\release\\'); +taskRunner.setInput('ArtifactName', 'drop'); +taskRunner.setInput('ArtifactType', 'FilePath'); +taskRunner.setInput('TargetPath', '\\\\UNCShare\\subdir'); + +taskRunner.setAnswers(goodAnswers); + +taskRunner.registerMock('azure-pipelines-task-lib/toolrunner', MockToolRunner); + +taskRunner.run(); diff --git a/_generated/PublishBuildArtifactsV1/Tests/L0AppendDotToRobocopyTarget.ts b/_generated/PublishBuildArtifactsV1/Tests/L0AppendDotToRobocopyTarget.ts new file mode 100644 index 000000000000..33f0f9ab7bbd --- /dev/null +++ b/_generated/PublishBuildArtifactsV1/Tests/L0AppendDotToRobocopyTarget.ts @@ -0,0 +1,20 @@ +import * as path from 'path'; + +import { TaskMockRunner } from 'azure-pipelines-task-lib/mock-run'; +import * as MockToolRunner from 'azure-pipelines-task-lib/mock-toolrunner'; + +import { goodAnswers } from './goodAnswers'; + +const taskPath: string = path.join(__dirname, '..', 'publishbuildartifacts.js'); +const taskRunner = new TaskMockRunner(taskPath); + +taskRunner.setInput('PathtoPublish', 'C:\\bin\\release'); +taskRunner.setInput('ArtifactName', 'drop'); +taskRunner.setInput('ArtifactType', 'FilePath'); +taskRunner.setInput('TargetPath', '\\\\UNCShare'); + +taskRunner.setAnswers(goodAnswers); + +taskRunner.registerMock('azure-pipelines-task-lib/toolrunner', MockToolRunner); + +taskRunner.run(); diff --git a/_generated/PublishBuildArtifactsV1/Tests/L0CopySingleFileWithRobocopy.ts b/_generated/PublishBuildArtifactsV1/Tests/L0CopySingleFileWithRobocopy.ts new file mode 100644 index 000000000000..39c835595549 --- /dev/null +++ b/_generated/PublishBuildArtifactsV1/Tests/L0CopySingleFileWithRobocopy.ts @@ -0,0 +1,20 @@ +import * as path from 'path'; + +import { TaskMockRunner } from 'azure-pipelines-task-lib/mock-run'; +import * as MockToolRunner from 'azure-pipelines-task-lib/mock-toolrunner'; + +import { goodAnswers } from './goodAnswers'; + +const taskPath: string = path.join(__dirname, '..', 'publishbuildartifacts.js'); +const taskRunner = new TaskMockRunner(taskPath); + +taskRunner.setInput('PathtoPublish', 'C:\\bin\\release\\file.exe'); +taskRunner.setInput('ArtifactName', 'drop'); +taskRunner.setInput('ArtifactType', 'FilePath'); +taskRunner.setInput('TargetPath', '\\\\UNCShare'); + +taskRunner.setAnswers(goodAnswers); + +taskRunner.registerMock('azure-pipelines-task-lib/toolrunner', MockToolRunner); + +taskRunner.run(); diff --git a/_generated/PublishBuildArtifactsV1/Tests/L0CreatesFilepathArtifact.ts b/_generated/PublishBuildArtifactsV1/Tests/L0CreatesFilepathArtifact.ts new file mode 100644 index 000000000000..b306202c1523 --- /dev/null +++ b/_generated/PublishBuildArtifactsV1/Tests/L0CreatesFilepathArtifact.ts @@ -0,0 +1,20 @@ +import * as path from 'path'; + +import { TaskMockRunner } from 'azure-pipelines-task-lib/mock-run'; +import * as MockToolRunner from 'azure-pipelines-task-lib/mock-toolrunner'; + +import { goodAnswers } from './goodAnswers'; + +const taskPath: string = path.join(__dirname, '..', 'publishbuildartifacts.js'); +const taskRunner = new TaskMockRunner(taskPath); + +taskRunner.setInput('PathtoPublish', 'C:\\bin\\release'); +taskRunner.setInput('ArtifactName', 'drop'); +taskRunner.setInput('ArtifactType', 'FilePath'); +taskRunner.setInput('TargetPath', '\\\\UNCShare\\subdir'); + +taskRunner.setAnswers(goodAnswers); + +taskRunner.registerMock('azure-pipelines-task-lib/toolrunner', MockToolRunner); + +taskRunner.run(); diff --git a/_generated/PublishBuildArtifactsV1/Tests/L0FailsIfArtifactNameNotSet.ts b/_generated/PublishBuildArtifactsV1/Tests/L0FailsIfArtifactNameNotSet.ts new file mode 100644 index 000000000000..915fff440bae --- /dev/null +++ b/_generated/PublishBuildArtifactsV1/Tests/L0FailsIfArtifactNameNotSet.ts @@ -0,0 +1,18 @@ +import * as path from 'path'; + +import { TaskMockRunner } from 'azure-pipelines-task-lib/mock-run'; +import * as MockToolRunner from 'azure-pipelines-task-lib/mock-toolrunner'; + +import { goodAnswers } from './goodAnswers'; + +const taskPath: string = path.join(__dirname, '..', 'publishbuildartifacts.js'); +const taskRunner = new TaskMockRunner(taskPath); + +taskRunner.setInput('PathtoPublish', '/bin/release'); +taskRunner.setInput('ArtifactType', 'Container'); + +taskRunner.setAnswers(goodAnswers); + +taskRunner.registerMock('azure-pipelines-task-lib/toolrunner', MockToolRunner); + +taskRunner.run(); diff --git a/_generated/PublishBuildArtifactsV1/Tests/L0FailsIfArtifactTypeNotSet.ts b/_generated/PublishBuildArtifactsV1/Tests/L0FailsIfArtifactTypeNotSet.ts new file mode 100644 index 000000000000..a286b4aaf142 --- /dev/null +++ b/_generated/PublishBuildArtifactsV1/Tests/L0FailsIfArtifactTypeNotSet.ts @@ -0,0 +1,18 @@ +import * as path from 'path'; + +import { TaskMockRunner } from 'azure-pipelines-task-lib/mock-run'; +import * as MockToolRunner from 'azure-pipelines-task-lib/mock-toolrunner'; + +import { goodAnswers } from './goodAnswers'; + +const taskPath: string = path.join(__dirname, '..', 'publishbuildartifacts.js'); +const taskRunner = new TaskMockRunner(taskPath); + +taskRunner.setInput('PathtoPublish', '/bin/release'); +taskRunner.setInput('ArtifactName', 'drop'); + +taskRunner.setAnswers(goodAnswers); + +taskRunner.registerMock('azure-pipelines-task-lib/toolrunner', MockToolRunner); + +taskRunner.run(); diff --git a/_generated/PublishBuildArtifactsV1/Tests/L0FailsIfPathToPublishNotFound.ts b/_generated/PublishBuildArtifactsV1/Tests/L0FailsIfPathToPublishNotFound.ts new file mode 100644 index 000000000000..96e43ec67d1c --- /dev/null +++ b/_generated/PublishBuildArtifactsV1/Tests/L0FailsIfPathToPublishNotFound.ts @@ -0,0 +1,19 @@ +import * as path from 'path'; + +import { TaskMockRunner } from 'azure-pipelines-task-lib/mock-run'; +import * as MockToolRunner from 'azure-pipelines-task-lib/mock-toolrunner'; + +import { goodAnswers } from './goodAnswers'; + +const taskPath: string = path.join(__dirname, '..', 'publishbuildartifacts.js'); +const taskRunner = new TaskMockRunner(taskPath); + +taskRunner.setInput('PathtoPublish', '/bin/notexist'); +taskRunner.setInput('ArtifactName', 'drop'); +taskRunner.setInput('ArtifactType', 'Container'); + +taskRunner.setAnswers(goodAnswers); + +taskRunner.registerMock('azure-pipelines-task-lib/toolrunner', MockToolRunner); + +taskRunner.run(); diff --git a/_generated/PublishBuildArtifactsV1/Tests/L0FailsIfPathToPublishNotSet.ts b/_generated/PublishBuildArtifactsV1/Tests/L0FailsIfPathToPublishNotSet.ts new file mode 100644 index 000000000000..7d6e1563d7dc --- /dev/null +++ b/_generated/PublishBuildArtifactsV1/Tests/L0FailsIfPathToPublishNotSet.ts @@ -0,0 +1,18 @@ +import * as path from 'path'; + +import { TaskMockRunner } from 'azure-pipelines-task-lib/mock-run'; +import * as MockToolRunner from 'azure-pipelines-task-lib/mock-toolrunner'; + +import { goodAnswers } from './goodAnswers'; + +const taskPath: string = path.join(__dirname, '..', 'publishbuildartifacts.js'); +const taskRunner = new TaskMockRunner(taskPath); + +taskRunner.setInput('ArtifactName', 'drop'); +taskRunner.setInput('ArtifactType', 'Container'); + +taskRunner.setAnswers(goodAnswers); + +taskRunner.registerMock('azure-pipelines-task-lib/toolrunner', MockToolRunner); + +taskRunner.run(); diff --git a/_generated/PublishBuildArtifactsV1/Tests/L0FailsIfRobocopyFails.ts b/_generated/PublishBuildArtifactsV1/Tests/L0FailsIfRobocopyFails.ts new file mode 100644 index 000000000000..5035de959283 --- /dev/null +++ b/_generated/PublishBuildArtifactsV1/Tests/L0FailsIfRobocopyFails.ts @@ -0,0 +1,20 @@ +import * as path from 'path'; + +import { TaskMockRunner } from 'azure-pipelines-task-lib/mock-run'; +import * as MockToolRunner from 'azure-pipelines-task-lib/mock-toolrunner'; + +import { badAnswers } from './badAnswers'; + +const taskPath: string = path.join(__dirname, '..', 'publishbuildartifacts.js'); +const taskRunner = new TaskMockRunner(taskPath); + +taskRunner.setInput('PathtoPublish', 'C:\\bin\\release'); +taskRunner.setInput('ArtifactName', 'drop'); +taskRunner.setInput('ArtifactType', 'FilePath'); +taskRunner.setInput('TargetPath', '\\\\UNCShare\\subdir'); + +taskRunner.setAnswers(badAnswers); + +taskRunner.registerMock('azure-pipelines-task-lib/toolrunner', MockToolRunner); + +taskRunner.run(); diff --git a/_generated/PublishBuildArtifactsV1/Tests/L0FailsToCreateFilepathArtifact.ts b/_generated/PublishBuildArtifactsV1/Tests/L0FailsToCreateFilepathArtifact.ts new file mode 100644 index 000000000000..18626759b4ec --- /dev/null +++ b/_generated/PublishBuildArtifactsV1/Tests/L0FailsToCreateFilepathArtifact.ts @@ -0,0 +1,20 @@ +import * as path from 'path'; + +import { TaskMockRunner } from 'azure-pipelines-task-lib/mock-run'; +import * as MockToolRunner from 'azure-pipelines-task-lib/mock-toolrunner'; + +import { goodAnswers } from './goodAnswers'; + +const taskPath: string = path.join(__dirname, '..', 'publishbuildartifacts.js'); +const taskRunner = new TaskMockRunner(taskPath); + +taskRunner.setInput('PathtoPublish', '/bin/release'); +taskRunner.setInput('ArtifactName', 'drop'); +taskRunner.setInput('ArtifactType', 'FilePath'); +taskRunner.setInput('TargetPath', '\\\\UNCShare\\subdir'); + +taskRunner.setAnswers(goodAnswers); + +taskRunner.registerMock('azure-pipelines-task-lib/toolrunner', MockToolRunner); + +taskRunner.run(); diff --git a/_generated/PublishBuildArtifactsV1/Tests/L0PublishToContainer.ts b/_generated/PublishBuildArtifactsV1/Tests/L0PublishToContainer.ts new file mode 100644 index 000000000000..8b0cf2005219 --- /dev/null +++ b/_generated/PublishBuildArtifactsV1/Tests/L0PublishToContainer.ts @@ -0,0 +1,16 @@ +import * as path from 'path'; + +import { TaskMockRunner } from 'azure-pipelines-task-lib/mock-run'; + +import { goodAnswers } from './goodAnswers'; + +const taskPath: string = path.join(__dirname, '..', 'publishbuildartifacts.js'); +const taskRunner = new TaskMockRunner(taskPath); + +taskRunner.setInput('PathtoPublish', '/bin/release'); +taskRunner.setInput('ArtifactName', 'drop'); +taskRunner.setInput('ArtifactType', 'Container'); + +taskRunner.setAnswers(goodAnswers); + +taskRunner.run(); diff --git a/_generated/PublishBuildArtifactsV1/Tests/L0PublishToUnc.ts b/_generated/PublishBuildArtifactsV1/Tests/L0PublishToUnc.ts new file mode 100644 index 000000000000..b306202c1523 --- /dev/null +++ b/_generated/PublishBuildArtifactsV1/Tests/L0PublishToUnc.ts @@ -0,0 +1,20 @@ +import * as path from 'path'; + +import { TaskMockRunner } from 'azure-pipelines-task-lib/mock-run'; +import * as MockToolRunner from 'azure-pipelines-task-lib/mock-toolrunner'; + +import { goodAnswers } from './goodAnswers'; + +const taskPath: string = path.join(__dirname, '..', 'publishbuildartifacts.js'); +const taskRunner = new TaskMockRunner(taskPath); + +taskRunner.setInput('PathtoPublish', 'C:\\bin\\release'); +taskRunner.setInput('ArtifactName', 'drop'); +taskRunner.setInput('ArtifactType', 'FilePath'); +taskRunner.setInput('TargetPath', '\\\\UNCShare\\subdir'); + +taskRunner.setAnswers(goodAnswers); + +taskRunner.registerMock('azure-pipelines-task-lib/toolrunner', MockToolRunner); + +taskRunner.run(); diff --git a/_generated/PublishBuildArtifactsV1/Tests/L0StoreFileAsTar.ts b/_generated/PublishBuildArtifactsV1/Tests/L0StoreFileAsTar.ts new file mode 100644 index 000000000000..66d416bddbc0 --- /dev/null +++ b/_generated/PublishBuildArtifactsV1/Tests/L0StoreFileAsTar.ts @@ -0,0 +1,48 @@ +import * as path from 'path'; + +import { TaskMockRunner } from 'azure-pipelines-task-lib/mock-run'; +import * as MockToolRunner from 'azure-pipelines-task-lib/mock-toolrunner'; + +import { goodAnswers } from './goodAnswers'; + +const taskPath: string = path.join(__dirname, '..', 'publishbuildartifacts.js'); +const taskRunner = new TaskMockRunner(taskPath); + +taskRunner.setInput('PathtoPublish', '/bin/release/file'); +taskRunner.setInput('ArtifactName', 'drop'); +taskRunner.setInput('ArtifactType', 'Container'); +taskRunner.setInput('StoreAsTar', 'true'); + +process.env['AGENT_TEMPDIRECTORY'] = process.cwd(); + +taskRunner.setAnswers(goodAnswers); + +taskRunner.registerMock('azure-pipelines-task-lib/toolrunner', MockToolRunner); + +const pathClone = Object.assign({}, path); + +pathClone.basename = function(inputPath) { + if (inputPath === '/bin/release/file') { + return 'file'; + } + + return path.basename(inputPath); +}; + +pathClone.dirname = function(inputPath) { + if (inputPath === '/bin/release/file') { + return '/bin/release'; + } + + return path.dirname(inputPath); +}; + +taskRunner.registerMock('path', pathClone); + +taskRunner.registerMock('os', { + platform() { + return 'linux'; + } +}); + +taskRunner.run(); diff --git a/_generated/PublishBuildArtifactsV1/Tests/L0StoreFolderAsTar.ts b/_generated/PublishBuildArtifactsV1/Tests/L0StoreFolderAsTar.ts new file mode 100644 index 000000000000..ee48439df857 --- /dev/null +++ b/_generated/PublishBuildArtifactsV1/Tests/L0StoreFolderAsTar.ts @@ -0,0 +1,28 @@ +import * as path from 'path'; + +import { TaskMockRunner } from 'azure-pipelines-task-lib/mock-run'; +import * as MockToolRunner from 'azure-pipelines-task-lib/mock-toolrunner'; + +import { goodAnswers } from './goodAnswers'; + +const taskPath: string = path.join(__dirname, '..', 'publishbuildartifacts.js'); +const taskRunner = new TaskMockRunner(taskPath); + +taskRunner.setInput('PathtoPublish', '/bin/release'); +taskRunner.setInput('ArtifactName', 'drop'); +taskRunner.setInput('ArtifactType', 'Container'); +taskRunner.setInput('StoreAsTar', 'true'); + +process.env['AGENT_TEMPDIRECTORY'] = process.cwd(); + +taskRunner.setAnswers(goodAnswers); + +taskRunner.registerMock('azure-pipelines-task-lib/toolrunner', MockToolRunner); + +taskRunner.registerMock('os', { + platform() { + return 'linux'; + } +}); + +taskRunner.run(); diff --git a/_generated/PublishBuildArtifactsV1/Tests/badAnswers.ts b/_generated/PublishBuildArtifactsV1/Tests/badAnswers.ts new file mode 100644 index 000000000000..f9e43b2b521c --- /dev/null +++ b/_generated/PublishBuildArtifactsV1/Tests/badAnswers.ts @@ -0,0 +1,16 @@ +import * as path from 'path'; +import { TaskLibAnswers } from 'azure-pipelines-task-lib/mock-answer'; + +export const badAnswers: TaskLibAnswers = { + 'checkPath': { + '/bin/release': true, + 'C:\\bin\\release': true + }, + 'exec': { + [`powershell.exe -NoLogo -Sta -NoProfile -NonInteractive -ExecutionPolicy Unrestricted -Command & \'${path.resolve(__dirname, '..', 'Invoke-Robocopy.ps1')}\' -Source \'C:\\bin\\release\' -Target \'\\\\UNCShare\\subdir\\drop\' -ParallelCount 1`]: { + 'stdout': 'test stdout from robocopy middle-man', + 'stderr': '', + 'code': 1 + } + } +}; diff --git a/_generated/PublishBuildArtifactsV1/Tests/goodAnswers.ts b/_generated/PublishBuildArtifactsV1/Tests/goodAnswers.ts new file mode 100644 index 000000000000..48bd55fa808d --- /dev/null +++ b/_generated/PublishBuildArtifactsV1/Tests/goodAnswers.ts @@ -0,0 +1,65 @@ +import * as path from 'path'; +import { TaskLibAnswers } from 'azure-pipelines-task-lib/mock-answer'; + +export const goodAnswers: TaskLibAnswers = { + 'which': { + 'tar': 'path/to/tar' + }, + 'checkPath': { + '/bin/release': true, + 'C:\\bin\\release\\': true, + 'C:\\bin\\release': true, + 'C:\\bin\\release\\file.exe': true, + '/bin/release/file': true, + 'path/to/tar': true + }, + 'exec': { + [`powershell.exe -NoLogo -Sta -NoProfile -NonInteractive -ExecutionPolicy Unrestricted -Command & \'${path.resolve(__dirname, '..', 'Invoke-Robocopy.ps1')}\' -Source \'C:\\bin\\release\' -Target \'\\\\UNCShare\\subdir\\drop\' -ParallelCount 1`]: { + 'stdout': 'test stdout from robocopy (no trailing slashes)', + 'stderr': '', + 'code': 0 + }, + [`powershell.exe -NoLogo -Sta -NoProfile -NonInteractive -ExecutionPolicy Unrestricted -Command & \'${path.resolve(__dirname, '..', 'Invoke-Robocopy.ps1')}\' -Source \'C:\\bin\\release\\.\' -Target \'\\\\UNCShare\\subdir\\drop\' -ParallelCount 1`]: { + 'stdout': 'test stdout from robocopy (source with trailing slash)', + 'stderr': '', + 'code': 0 + }, + [`powershell.exe -NoLogo -Sta -NoProfile -NonInteractive -ExecutionPolicy Unrestricted -Command & \'${path.resolve(__dirname, '..', 'Invoke-Robocopy.ps1')}\' -Source \'C:\\bin\\release\' -Target \'\\\\UNCShare\\drop\\.\' -ParallelCount 1`]: { + 'stdout': 'test stdout from robocopy (target with trailing slash)', + 'stderr': '', + 'code': 0 + }, + [`powershell.exe -NoLogo -Sta -NoProfile -NonInteractive -ExecutionPolicy Unrestricted -Command & \'${path.resolve(__dirname, '..', 'Invoke-Robocopy.ps1')}\' -Source \'C:\\bin\\release\' -Target \'\\\\UNCShare\\drop\\.\' -ParallelCount 1 -File \'file.exe\'`]: { + 'stdout': 'test stdout from robocopy (copy a single file)', + 'stderr': '', + 'code': 0 + }, + [`path/to/tar cf ${path.join(process.cwd(), 'drop.tar')} --directory /bin/release file`]: { + 'stdout': 'test stdout from tar: added file to archive', + 'stderr': '', + 'code': 0 + }, + [`path/to/tar cf ${path.join(process.cwd(), 'drop.tar')} --directory /bin/release .`]: { + 'stdout': 'test stdout from tar: added folder to archive', + 'stderr': '', + 'code': 0 + } + }, + 'stats': { + '/bin/release': { + 'isFile': false + }, + 'C:\\bin\\release\\': { + 'isFile': false + }, + 'C:\\bin\\release': { + 'isFile': false + }, + 'C:\\bin\\release\\file.exe': { + 'isFile': true + }, + '/bin/release/file': { + 'isFile': true + } + } +}; diff --git a/_generated/PublishBuildArtifactsV1/icon.png b/_generated/PublishBuildArtifactsV1/icon.png new file mode 100644 index 000000000000..183e816aebb9 Binary files /dev/null and b/_generated/PublishBuildArtifactsV1/icon.png differ diff --git a/_generated/PublishBuildArtifactsV1/icon.svg b/_generated/PublishBuildArtifactsV1/icon.svg new file mode 100644 index 000000000000..a28a126c7106 --- /dev/null +++ b/_generated/PublishBuildArtifactsV1/icon.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/_generated/PublishBuildArtifactsV1/package-lock.json b/_generated/PublishBuildArtifactsV1/package-lock.json new file mode 100644 index 000000000000..0ca96ae1b09d --- /dev/null +++ b/_generated/PublishBuildArtifactsV1/package-lock.json @@ -0,0 +1,483 @@ +{ + "name": "vsts-tasks-publishbuildartifacts", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/concat-stream": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz", + "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==", + "requires": { + "@types/node": "*" + } + }, + "@types/form-data": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", + "integrity": "sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==", + "requires": { + "@types/node": "*" + } + }, + "@types/mocha": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", + "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==" + }, + "@types/node": { + "version": "16.11.58", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.58.tgz", + "integrity": "sha512-uMVxJ111wpHzkx/vshZFb6Qni3BOMnlWLq7q9jrwej7Yw/KvjsEbpxCCxw+hLKxexFMc8YmpG8J9tnEe/rKsIg==" + }, + "@types/qs": { + "version": "6.9.8", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.8.tgz", + "integrity": "sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg==" + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "azure-pipelines-task-lib": { + "version": "5.0.0-preview.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-5.0.0-preview.0.tgz", + "integrity": "sha512-uQJEv+q3/7RD7kgphFd33uXijaPwA1ePYoNkAgZpUhbZUtc2u4JL4ujTT/JJfgXBNW/QQNAiDQ2OC7vOQG/0tg==", + "requires": { + "minimatch": "3.0.5", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "sync-request": "6.1.0", + "uuid": "^3.0.1" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, + "form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + } + }, + "get-port": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", + "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==" + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "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" + }, + "dependencies": { + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==" + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "http-basic": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", + "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", + "requires": { + "caseless": "^0.12.0", + "concat-stream": "^1.6.2", + "http-response-object": "^3.0.1", + "parse-cache-control": "^1.0.1" + } + }, + "http-response-object": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", + "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", + "requires": { + "@types/node": "^10.0.3" + }, + "dependencies": { + "@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + } + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" + }, + "is-core-module": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "requires": { + "has": "^1.0.3" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, + "parse-cache-control": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", + "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "promise": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", + "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", + "requires": { + "asap": "~2.0.6" + } + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==" + }, + "qs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "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" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "requires": { + "resolve": "^1.1.6" + } + }, + "resolve": { + "version": "1.22.6", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.6.tgz", + "integrity": "sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==", + "requires": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" + }, + "shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, + "sync-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", + "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==", + "requires": { + "http-response-object": "^3.0.1", + "sync-rpc": "^1.2.1", + "then-request": "^6.0.0" + } + }, + "sync-rpc": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz", + "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==", + "requires": { + "get-port": "^3.1.0" + } + }, + "then-request": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", + "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", + "requires": { + "@types/concat-stream": "^1.6.0", + "@types/form-data": "0.0.33", + "@types/node": "^8.0.0", + "@types/qs": "^6.2.31", + "caseless": "~0.12.0", + "concat-stream": "^1.6.0", + "form-data": "^2.2.0", + "http-basic": "^8.1.1", + "http-response-object": "^3.0.1", + "promise": "^8.0.0", + "qs": "^6.4.0" + }, + "dependencies": { + "@types/node": { + "version": "8.10.66", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", + "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==" + } + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, + "typescript": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.2.tgz", + "integrity": "sha512-e4ERvRV2wb+rRZ/IQeb3jm2VxBsirQLpQhdxplZ2MEzGvDkkMmPglecnNDfSUBivMjP93vRbngYYDQqQ/78bcQ==", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + } + } +} diff --git a/_generated/PublishBuildArtifactsV1/package.json b/_generated/PublishBuildArtifactsV1/package.json new file mode 100644 index 000000000000..d02cd2119e6a --- /dev/null +++ b/_generated/PublishBuildArtifactsV1/package.json @@ -0,0 +1,27 @@ +{ + "name": "vsts-tasks-publishbuildartifacts", + "version": "1.0.0", + "description": "Azure Pipelines Publish Build Artifacts Task", + "main": "publishbuildartifacts.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/Microsoft/azure-pipelines-tasks.git" + }, + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Microsoft/azure-pipelines-tasks/issues" + }, + "homepage": "https://github.com/Microsoft/azure-pipelines-tasks#readme", + "dependencies": { + "@types/node": "^16.11.39", + "@types/mocha": "^5.2.7", + "azure-pipelines-task-lib": "^5.0.0-preview.0" + }, + "devDependencies": { + "typescript": "4.0.2" + } +} diff --git a/_generated/PublishBuildArtifactsV1/publishbuildartifacts.ts b/_generated/PublishBuildArtifactsV1/publishbuildartifacts.ts new file mode 100644 index 000000000000..146a117083b2 --- /dev/null +++ b/_generated/PublishBuildArtifactsV1/publishbuildartifacts.ts @@ -0,0 +1,266 @@ +import os = require('os'); +import path = require('path'); +var process = require('process'); +import * as fs from 'fs'; +import * as tl from 'azure-pipelines-task-lib/task'; +import * as tr from 'azure-pipelines-task-lib/toolrunner'; +import { error } from 'console'; + +// used for escaping the path to the Invoke-Robocopy.ps1 script that is passed to the powershell command +let pathToScriptPSString = (filePath: string) => { + // remove double quotes + let result: string = filePath.replace(/"/g, ''); + + // double-up single quotes and enclose in single quotes. this is to create a single-quoted string in powershell. + result = result.replace(/'/g, "''"); + return `'${result}'`; +} + +// used for escaping file paths that are ultimately passed to robocopy (via the powershell command) +let pathToRobocopyPSString = (filePath: string) => { + // the path needs to be fixed-up due to a robocopy quirk handling trailing backslashes. + // + // according to http://ss64.com/nt/robocopy.html: + // If either the source or desination are a "quoted long foldername" do not include a + // trailing backslash as this will be treated as an escape character, i.e. "C:\some path\" + // will fail but "C:\some path\\" or "C:\some path\." or "C:\some path" will work. + // + // furthermore, PowerShell implicitly double-quotes arguments to external commands when the + // argument contains unquoted spaces. + // + // note, details on PowerShell quoting rules for external commands can be found in the + // source code here: + // https://github.com/PowerShell/PowerShell/blob/v0.6.0/src/System.Management.Automation/engine/NativeCommandParameterBinder.cs + + // remove double quotes + let result: string = filePath.replace(/"/g, ''); + + // append a "." if the path ends with a backslash. e.g. "C:\some path\" -> "C:\some path\." + if (result.endsWith('\\')) { + result += '.'; + } + + // double-up single quotes and enclose in single quotes. this is to create a single-quoted string in powershell. + result = result.replace(/'/g, "''"); + return `'${result}'`; +} + +/** + * Creates plain (not compressed) tar archive from files located in `filesPath`. + * `filesPath` input may contain a file or a folder with files. + * Puts created tar file to temp directory ($(Agent.TempDirectory)/`artifactName`.tar). + * + * @param filesPath path to a file or a directory of files to add to a tar archive + * @param artifactName the name of the artifact. This will be used to determine tar archive name + * @returns string + */ +function createTarArchive(filesPath: string, artifactName: string): string { + const tar: tr.ToolRunner = tl.tool(tl.which('tar', true)); + const outputFilePath: string = path.join(tl.getVariable('Agent.TempDirectory'), `${artifactName}.tar`); + + if (tl.stats(filesPath).isFile()) { + // If filesPath is a file, we only have to add a single file + tar.arg(['cf', outputFilePath, '--directory', path.dirname(filesPath), path.basename(filesPath)]); + } else { + // If filesPath is a directory, we have to add all files from that directory to the tar archive + tar.arg(['cf', outputFilePath, '--directory', filesPath, '.']); + } + + const tarExecResult: tr.IExecSyncResult = tar.execSync(); + + if (tarExecResult.error || tarExecResult.code !== 0) { + throw new Error(`Couldn't add artifact files to a tar archive: ${tarExecResult.error}`); + } + + return outputFilePath; +} + +/** + * If the `StoreAsTar` input is set to false, return path to publish unaltered; + * otherwise add all files from this path to a tar archive and return path to that archive + * + * @param pathToPublish value of `PathtoPublish` input + * @param shouldStoreAsTar value of `PathtoPublish` input + * @param artifactName value of `ArtifactName` input + * @returns string + */ +function getPathToUploadAndCreateTarIfNeeded( + pathToPublish: string, + shouldStoreAsTar: boolean, + artifactName: string +): string { + if (!shouldStoreAsTar) { + return pathToPublish; + } + + return createTarArchive(pathToPublish, artifactName); +} + +async function run() { + try { + tl.setResourcePath(path.join(__dirname, 'task.json')); + + const shouldStoreAsTar: boolean = tl.getBoolInput('StoreAsTar'); + const isWindows = os.platform() === 'win32'; + if (isWindows && shouldStoreAsTar) { + tl.setResult(tl.TaskResult.Failed, tl.loc('TarExtractionNotSupportedInWindows')); + return; + } + + // pathToPublish is a folder or a single file that may be added to a tar archive later + const pathToPublish: string = tl.getPathInput('PathtoPublish', true, true); + var artifactName: string = tl.getInput('ArtifactName', true); + + // if FF EnableBuildArtifactsPlusSignWorkaround is enabled or AZP_TASK_FF_ENABLE_BUILDARTIFACTS_PLUS_SIGN_WORKAROUND environment variable is set: + // replacing '+' symbol by its representation ' '(space) - workaround for the DownloadBuildArtifactV0 task, + // where downloading of part of artifact is not possible if there is a plus symbol + const enableBuildArtifactsPlusSignWorkaround = process.env.AZP_TASK_FF_ENABLE_BUILDARTIFACTS_PLUS_SIGN_WORKAROUND ? process.env.AZP_TASK_FF_ENABLE_BUILDARTIFACTS_PLUS_SIGN_WORKAROUND.toLowerCase() === "true" : false; + + if (enableBuildArtifactsPlusSignWorkaround) + artifactName = artifactName.replace(/\+/g, ' '); + + // pathToUpload is an actual folder or file that will get uploaded + const pathToUpload: string = getPathToUploadAndCreateTarIfNeeded(pathToPublish, shouldStoreAsTar, artifactName); + + let artifactType: string = tl.getInput('ArtifactType', true); + + + let hostType = tl.getVariable('system.hostType'); + if ((hostType && hostType.toUpperCase() != 'BUILD') && (artifactType.toUpperCase() !== "FILEPATH")) { + tl.setResult(tl.TaskResult.Failed, tl.loc('ErrorHostTypeNotSupported')); + return; + } + + + artifactType = artifactType.toLowerCase(); + let data = { + artifacttype: artifactType, + artifactname: artifactName + }; + + let maxArtifactSize: number = getMaxArtifactSize(); + if (maxArtifactSize != 0 ){ + let artifactSize : number = getArtifactSize(pathToUpload) + if (artifactSize > maxArtifactSize){ + tl.warning(tl.loc('ArtifactSizeExceeded', artifactSize, maxArtifactSize)); + } + } + + // upload or copy + if (artifactType === "container") { + data["containerfolder"] = artifactName; + + // add localpath to ##vso command's properties for back compat of old Xplat agent + data["localpath"] = pathToUpload; + tl.command("artifact.upload", data, pathToUpload); + } + else if (artifactType === "filepath") { + let targetPath: string = tl.getInput('TargetPath', true); + let artifactPath: string = path.join(targetPath, artifactName); + data['artifactlocation'] = targetPath; // artifactlocation for back compat with old xplat agent + + if (os.platform() == 'win32') { + tl.mkdirP(artifactPath); + + // create the artifact. at this point, mkdirP already succeeded so the path is good. + // the artifact should get cleaned up during retention even if the copy fails in the + // middle + tl.command("artifact.associate", data, targetPath); + + let parallel: boolean = tl.getBoolInput('Parallel', false); + let parallelCount = 1; + if (parallel) { + parallelCount = getParallelCount(); + } + + // copy the files + let script: string = path.join(__dirname, 'Invoke-Robocopy.ps1'); + let command: string = `& ${pathToScriptPSString(script)} -Source ${pathToRobocopyPSString(pathToUpload)} -Target ${pathToRobocopyPSString(artifactPath)} -ParallelCount ${parallelCount}` + if (tl.stats(pathToUpload).isFile()) { + let parentFolder = path.dirname(pathToUpload); + let file = path.basename(pathToUpload); + command = `& ${pathToScriptPSString(script)} -Source ${pathToRobocopyPSString(parentFolder)} -Target ${pathToRobocopyPSString(artifactPath)} -ParallelCount ${parallelCount} -File '${file}'` + } + + let powershell = new tr.ToolRunner('powershell.exe'); + powershell.arg('-NoLogo'); + powershell.arg('-Sta'); + powershell.arg('-NoProfile'); + powershell.arg('-NonInteractive'); + powershell.arg('-ExecutionPolicy'); + powershell.arg('Unrestricted'); + powershell.arg('-Command'); + powershell.arg(command); + powershell.on('stdout', (buffer: Buffer) => { + process.stdout.write(buffer); + }); + powershell.on('stderr', (buffer: Buffer) => { + process.stderr.write(buffer); + }); + let execOptions = { silent: true } as tr.IExecOptions; + await powershell.exec(execOptions); + } + else { + // file share artifacts are not currently supported on OSX/Linux. + tl.setResult(tl.TaskResult.Failed, tl.loc('ErrorFileShareLinux')); + return; + } + } + } + catch (err) { + tl.setResult(tl.TaskResult.Failed, tl.loc('PublishBuildArtifactsFailed', err.message)); + } + +} + +function getParallelCount(): number { + let result = 8; + let inputValue: string = tl.getInput('ParallelCount', false); + if (Number.isNaN(Number(inputValue))) { + tl.warning(tl.loc('UnexpectedParallelCount', inputValue)); + } + else { + let parsedInput = parseInt(inputValue); + if (parsedInput < 1) { + tl.warning(tl.loc('UnexpectedParallelCount', parsedInput)); + result = 1; + } + else if (parsedInput > 128) { + tl.warning(tl.loc('UnexpectedParallelCount', parsedInput)); + result = 128; + } + else { + result = parsedInput; + } + } + + return result; +} + +function getMaxArtifactSize(): number { + let result = 0; + let inputValue: string = tl.getInput('MaxArtifactSize', false); + if (!(Number.isNaN(Number(inputValue)))) { + result = parseInt(inputValue); + } + return result; +} + + +function getArtifactSize( + pathToUpload : string +): number { + let totalSize = 0; + if(tl.stats(pathToUpload).isFile()) { + totalSize = tl.stats(pathToUpload).size; + } + else if(tl.stats(pathToUpload).isDirectory()) { + const files = fs.readdirSync(pathToUpload); + files.forEach (file => { + totalSize = totalSize + getArtifactSize(path.join(pathToUpload, file)); + }) + } + return totalSize; +} + +run(); diff --git a/_generated/PublishBuildArtifactsV1/task.json b/_generated/PublishBuildArtifactsV1/task.json new file mode 100644 index 000000000000..31ada433d34b --- /dev/null +++ b/_generated/PublishBuildArtifactsV1/task.json @@ -0,0 +1,127 @@ +{ + "id": "2FF763A7-CE83-4E1F-BC89-0AE63477CEBE", + "name": "PublishBuildArtifacts", + "friendlyName": "Publish build artifacts", + "description": "Publish build artifacts to Azure Pipelines or a Windows file share", + "helpUrl": "https://docs.microsoft.com/azure/devops/pipelines/tasks/utility/publish-build-artifacts", + "helpMarkDown": "[Learn more about this task](https://go.microsoft.com/fwlink/?LinkID=708390)", + "category": "Utility", + "visibility": [ + "Build" + ], + "author": "Microsoft Corporation", + "version": { + "Major": 1, + "Minor": 229, + "Patch": 0 + }, + "demands": [], + "minimumAgentVersion": "1.91.0", + "groups": [ + { + "name": "advanced", + "displayName": "Advanced", + "isExpanded": false + } + ], + "inputs": [ + { + "name": "PathtoPublish", + "type": "filePath", + "label": "Path to publish", + "defaultValue": "$(Build.ArtifactStagingDirectory)", + "required": true, + "helpMarkDown": "The folder or file path to publish. This can be a fully-qualified path or a path relative to the root of the repository. Wildcards are not supported. [Variables](https://go.microsoft.com/fwlink/?LinkID=550988) are supported. Example: $(Build.ArtifactStagingDirectory)" + }, + { + "name": "ArtifactName", + "type": "string", + "label": "Artifact name", + "defaultValue": "drop", + "required": true, + "helpMarkDown": "The name of the artifact to create in the publish location." + }, + { + "name": "ArtifactType", + "aliases": [ + "publishLocation" + ], + "type": "pickList", + "label": "Artifact publish location", + "defaultValue": "Container", + "required": true, + "helpMarkDown": "Choose whether to store the artifact in Azure Pipelines, or to copy it to a file share that must be accessible from the build agent.", + "options": { + "Container": "Azure Pipelines", + "FilePath": "A file share" + } + }, + { + "name": "MaxArtifactSize", + "type": "int", + "label": "Max Artifact Size", + "defaultValue": 0, + "required": false, + "helpMarkDown": "Maximum limit on the size of artifacts to be published in bytes. Put 0 if you don't want to set any limit." + }, + { + "name": "TargetPath", + "type": "string", + "label": "File share path", + "defaultValue": "", + "required": true, + "helpMarkDown": "The file share to which the artifact files will be copied. This can include variables. Example: \\\\\\\\my\\\\share\\\\$(Build.DefinitionName)\\\\$(Build.BuildNumber). Publishing artifacts from a Linux or macOS agent to a file share is not supported.", + "visibleRule": "ArtifactType = FilePath" + }, + { + "name": "Parallel", + "type": "boolean", + "label": "Parallel copy", + "defaultValue": "false", + "required": false, + "helpMarkDown": "Select whether to copy files in parallel using multiple threads for greater potential throughput. If this setting is not enabled, one thread will be used.", + "visibleRule": "ArtifactType = FilePath" + }, + { + "name": "ParallelCount", + "type": "int", + "label": "Parallel count", + "defaultValue": 8, + "required": false, + "helpMarkDown": "Enter the degree of parallelism, or number of threads used, to perform the copy. The value must be at least 1 and not greater than 128.", + "visibleRule": "ArtifactType = FilePath && Parallel = true" + }, + { + "name": "StoreAsTar", + "type": "boolean", + "label": "Tar the artifact before uploading", + "defaultValue": "false", + "groupName": "advanced", + "required": false, + "helpMarkDown": "Add all files from the publish path to a tar archive before uploading. This allows you to preserve the UNIX file permissions. Use `extractTars` option of DownloadBuildArtifacts task to extract the downloaded items automatically." + } + ], + "instanceNameFormat": "Publish Artifact: $(ArtifactName)", + "execution": { + "Node10": { + "target": "publishbuildartifacts.js", + "argumentFormat": "" + }, + "Node16": { + "target": "publishbuildartifacts.js", + "argumentFormat": "" + } + }, + "messages": { + "ErrorFileShareLinux": "Publishing artifacts from a Linux or macOS agent to a file share is not supported. Change the artifact type to `Azure Pipelines` or use a Windows agent.", + "ErrorHostTypeNotSupported": "This task must run in a build to publish artifacts to Azure Pipelines.", + "PublishBuildArtifactsFailed": "Publishing build artifacts failed with an error: %s", + "UnexpectedParallelCount": "Unsupported parallel count '%s'. Enter a number between 1 and 128.", + "TarExtractionNotSupportedInWindows": "Tar extraction is not supported on Windows", + "ArtifactSizeExceeded": "The size of artifacts being published is %s bytes which is larger than the maximum limit %s bytes set for the published size of artifacts." + }, + "_buildConfigMapping": { + "Default": "1.229.0", + "Node20-225": "1.229.1" + } +} \ No newline at end of file diff --git a/_generated/PublishBuildArtifactsV1/task.loc.json b/_generated/PublishBuildArtifactsV1/task.loc.json new file mode 100644 index 000000000000..4ef9a7a2da60 --- /dev/null +++ b/_generated/PublishBuildArtifactsV1/task.loc.json @@ -0,0 +1,127 @@ +{ + "id": "2FF763A7-CE83-4E1F-BC89-0AE63477CEBE", + "name": "PublishBuildArtifacts", + "friendlyName": "ms-resource:loc.friendlyName", + "description": "ms-resource:loc.description", + "helpUrl": "https://docs.microsoft.com/azure/devops/pipelines/tasks/utility/publish-build-artifacts", + "helpMarkDown": "ms-resource:loc.helpMarkDown", + "category": "Utility", + "visibility": [ + "Build" + ], + "author": "Microsoft Corporation", + "version": { + "Major": 1, + "Minor": 229, + "Patch": 0 + }, + "demands": [], + "minimumAgentVersion": "1.91.0", + "groups": [ + { + "name": "advanced", + "displayName": "ms-resource:loc.group.displayName.advanced", + "isExpanded": false + } + ], + "inputs": [ + { + "name": "PathtoPublish", + "type": "filePath", + "label": "ms-resource:loc.input.label.PathtoPublish", + "defaultValue": "$(Build.ArtifactStagingDirectory)", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.PathtoPublish" + }, + { + "name": "ArtifactName", + "type": "string", + "label": "ms-resource:loc.input.label.ArtifactName", + "defaultValue": "drop", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.ArtifactName" + }, + { + "name": "ArtifactType", + "aliases": [ + "publishLocation" + ], + "type": "pickList", + "label": "ms-resource:loc.input.label.ArtifactType", + "defaultValue": "Container", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.ArtifactType", + "options": { + "Container": "Azure Pipelines", + "FilePath": "A file share" + } + }, + { + "name": "MaxArtifactSize", + "type": "int", + "label": "ms-resource:loc.input.label.MaxArtifactSize", + "defaultValue": 0, + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.MaxArtifactSize" + }, + { + "name": "TargetPath", + "type": "string", + "label": "ms-resource:loc.input.label.TargetPath", + "defaultValue": "", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.TargetPath", + "visibleRule": "ArtifactType = FilePath" + }, + { + "name": "Parallel", + "type": "boolean", + "label": "ms-resource:loc.input.label.Parallel", + "defaultValue": "false", + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.Parallel", + "visibleRule": "ArtifactType = FilePath" + }, + { + "name": "ParallelCount", + "type": "int", + "label": "ms-resource:loc.input.label.ParallelCount", + "defaultValue": 8, + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.ParallelCount", + "visibleRule": "ArtifactType = FilePath && Parallel = true" + }, + { + "name": "StoreAsTar", + "type": "boolean", + "label": "ms-resource:loc.input.label.StoreAsTar", + "defaultValue": "false", + "groupName": "advanced", + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.StoreAsTar" + } + ], + "instanceNameFormat": "ms-resource:loc.instanceNameFormat", + "execution": { + "Node10": { + "target": "publishbuildartifacts.js", + "argumentFormat": "" + }, + "Node16": { + "target": "publishbuildartifacts.js", + "argumentFormat": "" + } + }, + "messages": { + "ErrorFileShareLinux": "ms-resource:loc.messages.ErrorFileShareLinux", + "ErrorHostTypeNotSupported": "ms-resource:loc.messages.ErrorHostTypeNotSupported", + "PublishBuildArtifactsFailed": "ms-resource:loc.messages.PublishBuildArtifactsFailed", + "UnexpectedParallelCount": "ms-resource:loc.messages.UnexpectedParallelCount", + "TarExtractionNotSupportedInWindows": "ms-resource:loc.messages.TarExtractionNotSupportedInWindows", + "ArtifactSizeExceeded": "ms-resource:loc.messages.ArtifactSizeExceeded" + }, + "_buildConfigMapping": { + "Default": "1.229.0", + "Node20-225": "1.229.1" + } +} \ No newline at end of file diff --git a/_generated/PublishBuildArtifactsV1/tsconfig.json b/_generated/PublishBuildArtifactsV1/tsconfig.json new file mode 100644 index 000000000000..0438b79f69ac --- /dev/null +++ b/_generated/PublishBuildArtifactsV1/tsconfig.json @@ -0,0 +1,6 @@ +{ + "compilerOptions": { + "target": "ES6", + "module": "commonjs" + } +} \ No newline at end of file diff --git a/_generated/PublishBuildArtifactsV1_Node20/.npmrc b/_generated/PublishBuildArtifactsV1_Node20/.npmrc new file mode 100644 index 000000000000..5fca0d518be7 --- /dev/null +++ b/_generated/PublishBuildArtifactsV1_Node20/.npmrc @@ -0,0 +1 @@ +scripts-prepend-node-path=true diff --git a/_generated/PublishBuildArtifactsV1_Node20/Invoke-Robocopy.ps1 b/_generated/PublishBuildArtifactsV1_Node20/Invoke-Robocopy.ps1 new file mode 100644 index 000000000000..fe915998bf96 --- /dev/null +++ b/_generated/PublishBuildArtifactsV1_Node20/Invoke-Robocopy.ps1 @@ -0,0 +1,104 @@ +[CmdletBinding()] +param( + [Parameter(Mandatory = $true)] + [string]$Source, + + [Parameter(Mandatory = $true)] + [string]$Target, + + [Parameter(Mandatory = $true)] + [int]$ParallelCount, + + [Parameter(Mandatory = $false)] + [string]$File) + +# This script translates the output from robocopy into UTF8. Node has limited +# built-in support for encodings. +# +# Robocopy uses the system default code page. The system default code page varies +# depending on the locale configuration. On an en-US box, the system default code +# page is Windows-1252. +# +# Note, on a typical en-US box, testing with the 'ç' character is a good way to +# determine whether data is passed correctly between processes. This is because +# the 'ç' character has a different code point across each of the common encodings +# on a typical en-US box, i.e. +# 1) the default console-output code page (IBM437) +# 2) the system default code page (i.e. CP_ACP) (Windows-1252) +# 3) UTF8 + +$ErrorActionPreference = 'Stop' + +# Redefine the wrapper over STDOUT to use UTF8. Node expects UTF8 by default. +$stdout = [System.Console]::OpenStandardOutput() +$utf8 = New-Object System.Text.UTF8Encoding($false) # do not emit BOM +$writer = New-Object System.IO.StreamWriter($stdout, $utf8) +[System.Console]::SetOut($writer) + +# All subsequent output must be written using [System.Console]::WriteLine(). In +# PowerShell 4, Write-Host and Out-Default do not consider the updated stream writer. + +if (!$File) { + $File = "*"; + $CopySubFoldersOption = "/E" +} + +# Print the ##command. The /MT parameter is only supported on 2008 R2 and higher. +if ($ParallelCount -gt 1) { + [System.Console]::WriteLine("##[command]robocopy.exe $CopySubFoldersOption /COPY:DA /NP /R:3 /MT:$ParallelCount `"$Source`" `"$Target`" `"$File`"") +} +else { + [System.Console]::WriteLine("##[command]robocopy.exe $CopySubFoldersOption /COPY:DA /NP /R:3 `"$Source`" `"$Target`" `"$File`"") +} + +# The $OutputEncoding variable instructs PowerShell how to interpret the output +# from the external command. +$OutputEncoding = [System.Text.Encoding]::Default + +# Usage :: ROBOCOPY source destination [file [file]...] [options] +# source :: Source Directory (drive:\path or \\server\share\path). +# destination :: Destination Dir (drive:\path or \\server\share\path). +# file :: File(s) to copy (names/wildcards: default is "*.*"). +# /E :: copy subdirectories, including Empty ones. +# /COPY:copyflag[s] :: what to COPY for files (default is /COPY:DAT). +# (copyflags : D=Data, A=Attributes, T=Timestamps). +# (S=Security=NTFS ACLs, O=Owner info, U=aUditing info). +# /NP :: No Progress - don't display percentage copied. +# /MT[:n] :: Do multi-threaded copies with n threads (default 8). +# n must be at least 1 and not greater than 128. +# This option is incompatible with the /IPG and /EFSRAW options. +# Redirect output using /LOG option for better performance. +# /R:n :: number of Retries on failed copies: default 1 million. +# +# Note, the output from robocopy needs to be iterated over. Otherwise PowerShell.exe +# will launch the external command in such a way that it inherits the streams. +# +# Note, the /MT parameter is only supported on 2008 R2 and higher. +if ($ParallelCount -gt 1) { + & robocopy.exe $CopySubFoldersOption /COPY:DA /NP /R:3 /MT:$ParallelCount $Source $Target $File 2>&1 | + ForEach-Object { + if ($_ -is [System.Management.Automation.ErrorRecord]) { + [System.Console]::WriteLine($_.Exception.Message) + } + else { + [System.Console]::WriteLine($_) + } + } +} +else { + & robocopy.exe $CopySubFoldersOption /COPY:DA /NP /R:3 $Source $Target $File 2>&1 | + ForEach-Object { + if ($_ -is [System.Management.Automation.ErrorRecord]) { + [System.Console]::WriteLine($_.Exception.Message) + } + else { + [System.Console]::WriteLine($_) + } + } +} + +[System.Console]::WriteLine("##[debug]robocopy exit code '$LASTEXITCODE'") +[System.Console]::Out.Flush() +if ($LASTEXITCODE -ge 8) { + exit $LASTEXITCODE +} \ No newline at end of file diff --git a/_generated/PublishBuildArtifactsV1_Node20/Strings/resources.resjson/de-DE/resources.resjson b/_generated/PublishBuildArtifactsV1_Node20/Strings/resources.resjson/de-DE/resources.resjson new file mode 100644 index 000000000000..d1591f55b3ae --- /dev/null +++ b/_generated/PublishBuildArtifactsV1_Node20/Strings/resources.resjson/de-DE/resources.resjson @@ -0,0 +1,29 @@ +{ + "loc.friendlyName": "Buildartefakte veröffentlichen", + "loc.helpMarkDown": "[Weitere Informationen zu dieser Aufgabe](https://go.microsoft.com/fwlink/?LinkID=708390)", + "loc.description": "Hiermit werden Buildartefakte in Azure Pipelines oder einer Dateifreigabe veröffentlicht.", + "loc.instanceNameFormat": "Artefakt veröffentlichen: $(ArtifactName)", + "loc.group.displayName.advanced": "Erweitert", + "loc.input.label.PathtoPublish": "Pfad für Veröffentlichung", + "loc.input.help.PathtoPublish": "Der Ordner- oder Dateipfad für die Veröffentlichung. Es kann sich um einen vollqualifizierten Pfad oder um einen relativen Pfad zum Stamm des Repositorys handeln. Platzhalter werden nicht unterstützt. [Variablen](https://go.microsoft.com/fwlink/?LinkID=550988) werden unterstützt. Beispiel: $(Build.ArtifactStagingDirectory)", + "loc.input.label.ArtifactName": "Artefaktname", + "loc.input.help.ArtifactName": "Der Name des Artefakts, das am Speicherort für die Veröffentlichung erstellt werden soll.", + "loc.input.label.ArtifactType": "Veröffentlichungsort für Artefakte", + "loc.input.help.ArtifactType": "Wählen Sie aus, ob Sie das Artefakt in Azure Pipelines speichern oder in eine Dateifreigabe kopieren möchten, die vom Build-Agent aus zugänglich sein muss.", + "loc.input.label.MaxArtifactSize": "Maximale Artefaktgröße", + "loc.input.help.MaxArtifactSize": "Maximales Limit für die Größe von Artefakten, die in Bytes veröffentlicht werden sollen. Legen Sie \"0\" fest, wenn Sie kein Limit festlegen möchten.", + "loc.input.label.TargetPath": "Dateifreigabepfad", + "loc.input.help.TargetPath": "Die Dateifreigabe, in die die Artefaktdateien kopiert werden. Diese kann Variablen umfassen. Beispiel: \\\\\\my\\\\share\\\\$(Build.DefinitionName)\\\\$(Build.BuildNumber). Das Veröffentlichen von Artefakten über einen Linux- oder macOS-Agent in einer Dateifreigabe wird nicht unterstützt.", + "loc.input.label.Parallel": "Paralleles Kopieren", + "loc.input.help.Parallel": "Wählen Sie aus, ob Dateien mithilfe mehrerer Threads parallel kopiert werden sollen, um einen höheren Durchsatz zu erzielen. Wenn diese Einstellung nicht aktiviert ist, wird nur ein Thread verwendet.", + "loc.input.label.ParallelCount": "Parallele Anzahl", + "loc.input.help.ParallelCount": "Geben Sie den Parallelitätsgrad oder die Anzahl von Threads zum Durchführen des Kopiervorgangs ein. Der Wert muss mindestens 1 lauten und darf nicht größer sein als 128.", + "loc.input.label.StoreAsTar": "Artefakt vor dem Hochladen mit Tar packen", + "loc.input.help.StoreAsTar": "Fügen Sie vor dem Hochladen alle Dateien aus dem Veröffentlichungspfad zu einem Tar-Archiv hinzu. Dadurch können Sie die Berechtigungen für die UNIX-Datei beibehalten. Verwenden Sie die Option \"extractTars\" der Aufgabe \"DownloadBuildArtifacts\", um die heruntergeladenen Elemente automatisch zu extrahieren.", + "loc.messages.ErrorFileShareLinux": "Das Veröffentlichen von Artefakten von einem Linux- oder macOS-Agent in einer Dateifreigabe wird nicht unterstützt. Ändern Sie den Artefakttyp in \"Azure Pipelines\", oder verwenden Sie einen Windows-Agent.", + "loc.messages.ErrorHostTypeNotSupported": "Diese Aufgabe muss in einem Build ausgeführt werden, um Artefakte in Azure Pipelines zu veröffentlichen.", + "loc.messages.PublishBuildArtifactsFailed": "Fehler beim Veröffentlichen von Buildartefakten: %s", + "loc.messages.UnexpectedParallelCount": "Nicht unterstützte parallele Anzahl \"%s\". Geben Sie eine Zahl zwischen 1 und 128 ein.", + "loc.messages.TarExtractionNotSupportedInWindows": "Die Tar-Extraktion wird unter Windows nicht unterstützt", + "loc.messages.ArtifactSizeExceeded": "Die Größe der zu veröffentlichenden Artefakte beträgt %s Bytes und überschreitet damit den maximalen Grenzwert von %s Bytes, der für die veröffentlichte Größe von Artefakten festgelegt ist." +} \ No newline at end of file diff --git a/_generated/PublishBuildArtifactsV1_Node20/Strings/resources.resjson/en-US/resources.resjson b/_generated/PublishBuildArtifactsV1_Node20/Strings/resources.resjson/en-US/resources.resjson new file mode 100644 index 000000000000..8bc952c43d27 --- /dev/null +++ b/_generated/PublishBuildArtifactsV1_Node20/Strings/resources.resjson/en-US/resources.resjson @@ -0,0 +1,29 @@ +{ + "loc.friendlyName": "Publish build artifacts", + "loc.helpMarkDown": "[Learn more about this task](https://go.microsoft.com/fwlink/?LinkID=708390)", + "loc.description": "Publish build artifacts to Azure Pipelines or a Windows file share", + "loc.instanceNameFormat": "Publish Artifact: $(ArtifactName)", + "loc.group.displayName.advanced": "Advanced", + "loc.input.label.PathtoPublish": "Path to publish", + "loc.input.help.PathtoPublish": "The folder or file path to publish. This can be a fully-qualified path or a path relative to the root of the repository. Wildcards are not supported. [Variables](https://go.microsoft.com/fwlink/?LinkID=550988) are supported. Example: $(Build.ArtifactStagingDirectory)", + "loc.input.label.ArtifactName": "Artifact name", + "loc.input.help.ArtifactName": "The name of the artifact to create in the publish location.", + "loc.input.label.ArtifactType": "Artifact publish location", + "loc.input.help.ArtifactType": "Choose whether to store the artifact in Azure Pipelines, or to copy it to a file share that must be accessible from the build agent.", + "loc.input.label.MaxArtifactSize": "Max Artifact Size", + "loc.input.help.MaxArtifactSize": "Maximum limit on the size of artifacts to be published in bytes. Put 0 if you don't want to set any limit.", + "loc.input.label.TargetPath": "File share path", + "loc.input.help.TargetPath": "The file share to which the artifact files will be copied. This can include variables. Example: \\\\\\\\my\\\\share\\\\$(Build.DefinitionName)\\\\$(Build.BuildNumber). Publishing artifacts from a Linux or macOS agent to a file share is not supported.", + "loc.input.label.Parallel": "Parallel copy", + "loc.input.help.Parallel": "Select whether to copy files in parallel using multiple threads for greater potential throughput. If this setting is not enabled, one thread will be used.", + "loc.input.label.ParallelCount": "Parallel count", + "loc.input.help.ParallelCount": "Enter the degree of parallelism, or number of threads used, to perform the copy. The value must be at least 1 and not greater than 128.", + "loc.input.label.StoreAsTar": "Tar the artifact before uploading", + "loc.input.help.StoreAsTar": "Add all files from the publish path to a tar archive before uploading. This allows you to preserve the UNIX file permissions. Use `extractTars` option of DownloadBuildArtifacts task to extract the downloaded items automatically.", + "loc.messages.ErrorFileShareLinux": "Publishing artifacts from a Linux or macOS agent to a file share is not supported. Change the artifact type to `Azure Pipelines` or use a Windows agent.", + "loc.messages.ErrorHostTypeNotSupported": "This task must run in a build to publish artifacts to Azure Pipelines.", + "loc.messages.PublishBuildArtifactsFailed": "Publishing build artifacts failed with an error: %s", + "loc.messages.UnexpectedParallelCount": "Unsupported parallel count '%s'. Enter a number between 1 and 128.", + "loc.messages.TarExtractionNotSupportedInWindows": "Tar extraction is not supported on Windows", + "loc.messages.ArtifactSizeExceeded": "The size of artifacts being published is %s bytes which is larger than the maximum limit %s bytes set for the published size of artifacts." +} \ No newline at end of file diff --git a/_generated/PublishBuildArtifactsV1_Node20/Strings/resources.resjson/es-ES/resources.resjson b/_generated/PublishBuildArtifactsV1_Node20/Strings/resources.resjson/es-ES/resources.resjson new file mode 100644 index 000000000000..9c6aaf0378e8 --- /dev/null +++ b/_generated/PublishBuildArtifactsV1_Node20/Strings/resources.resjson/es-ES/resources.resjson @@ -0,0 +1,29 @@ +{ + "loc.friendlyName": "Publicar artefactos de compilación", + "loc.helpMarkDown": "[Obtener más información acerca de esta tarea](https://go.microsoft.com/fwlink/?LinkID=708390)", + "loc.description": "Publica los artefactos de compilación en Azure Pipelines o en un recurso compartido de archivos de Windows.", + "loc.instanceNameFormat": "Publicar artefacto: $(ArtifactName)", + "loc.group.displayName.advanced": "Avanzado", + "loc.input.label.PathtoPublish": "Ruta de acceso para publicar", + "loc.input.help.PathtoPublish": "La ruta de acceso del archivo o la carpeta para publicar. Puede ser una ruta de acceso completa o relativa a la raíz del repositorio. No se admiten caracteres comodín. Se admiten [variables](https://go.microsoft.com/fwlink/?LinkID=550988). Ejemplo: $(Build.ArtifactStagingDirectory)", + "loc.input.label.ArtifactName": "Nombre del artefacto", + "loc.input.help.ArtifactName": "El nombre del artefacto que se va a crear en la ubicación de publicación.", + "loc.input.label.ArtifactType": "Ubicación de publicación de artefactos", + "loc.input.help.ArtifactType": "Elija si el artefacto se va a almacenar en Azure Pipelines o se va a copiar en un recurso compartido de archivos al que se pueda acceder desde el agente de compilación.", + "loc.input.label.MaxArtifactSize": "Tamaño máximo del artefacto", + "loc.input.help.MaxArtifactSize": "Límite máximo del tamaño de los artefactos que se van a publicar en bytes. Escriba 0 si no desea establecer ningún límite.", + "loc.input.label.TargetPath": "Ruta de acceso del recurso compartido de archivos", + "loc.input.help.TargetPath": "El recurso compartido de archivos en el que se copiarán los archivos de artefacto. Puede incluir variables. Ejemplo: \\\\\\\\my\\\\share\\\\$(Build.DefinitionName)\\\\$(Build.BuildNumber). No se admite la publicación de artefactos de un agente de Linux o macOS en un recurso compartido de archivos.", + "loc.input.label.Parallel": "Copia en paralelo", + "loc.input.help.Parallel": "Seleccione si quiere copiar los archivos en paralelo con varios subprocesos para obtener un mayor rendimiento potencial. Si esta configuración no está habilitada, se usará un subproceso.", + "loc.input.label.ParallelCount": "Recuento de elementos en paralelo", + "loc.input.help.ParallelCount": "Especifique el grado de paralelismo o el número de subprocesos usados para realizar la copia. Debe ser un valor entre 1 y 128.", + "loc.input.label.StoreAsTar": "Agregue el artefacto a un archivo tar antes de cargarlo", + "loc.input.help.StoreAsTar": "Agregue todos los archivos de la ruta de publicación a un archivo tar antes de cargarlo. Esto permite conservar los permisos de los archivos UNIX. Utilice la opción `extractTars` de la tarea DownloadBuildArtifacts para extraer los elementos descargados automáticamente.", + "loc.messages.ErrorFileShareLinux": "No se admite la publicación de artefactos de un agente de Linux o macOS en un recurso compartido de archivos. Cambie el tipo de artefacto a \"Azure Pipelines\" o use un agente de Windows.", + "loc.messages.ErrorHostTypeNotSupported": "Esta tarea debe ejecutarse en una compilación para publicar artefactos en Azure Pipelines.", + "loc.messages.PublishBuildArtifactsFailed": "Error al publicar artefactos de compilación: %s", + "loc.messages.UnexpectedParallelCount": "Recuento de elementos \"%s\" en paralelo no admitido. Especifique un número entre 1 y 128.", + "loc.messages.TarExtractionNotSupportedInWindows": "La extracción de tar no es compatible con Windows", + "loc.messages.ArtifactSizeExceeded": "El tamaño de los artefactos que se van a publicar es de %s bytes, que supera el límite máximo de %s bytes establecido para el tamaño publicado de los artefactos." +} \ No newline at end of file diff --git a/_generated/PublishBuildArtifactsV1_Node20/Strings/resources.resjson/fr-FR/resources.resjson b/_generated/PublishBuildArtifactsV1_Node20/Strings/resources.resjson/fr-FR/resources.resjson new file mode 100644 index 000000000000..faad42cdf44d --- /dev/null +++ b/_generated/PublishBuildArtifactsV1_Node20/Strings/resources.resjson/fr-FR/resources.resjson @@ -0,0 +1,29 @@ +{ + "loc.friendlyName": "Publier des artefacts de build", + "loc.helpMarkDown": "[En savoir plus sur cette tâche](https://go.microsoft.com/fwlink/?LinkID=708390)", + "loc.description": "Publier des artefacts de build sur Azure Pipelines ou un partage de fichiers Windows", + "loc.instanceNameFormat": "Publier l'artefact : $(ArtifactName)", + "loc.group.displayName.advanced": "Avancé", + "loc.input.label.PathtoPublish": "Chemin de publication", + "loc.input.help.PathtoPublish": "Chemin de dossier ou de fichier à publier. Il peut s'agir d'un chemin complet ou d'un chemin relatif à la racine du dépôt. Les caractères génériques ne sont pas pris en charge. Les [variables](https://go.microsoft.com/fwlink/?LinkID=550988) sont prises en charge. Exemple : $(Build.ArtifactStagingDirectory)", + "loc.input.label.ArtifactName": "Nom de l'artefact", + "loc.input.help.ArtifactName": "Nom de l'artefact à créer dans l'emplacement de publication.", + "loc.input.label.ArtifactType": "Emplacement de publication des artefacts", + "loc.input.help.ArtifactType": "Choisissez entre le stockage de l'artefact dans Azure Pipelines, ou sa copie sur un partage de fichiers qui doit être accessible à l'agent de build.", + "loc.input.label.MaxArtifactSize": "Taille maximale de l’artefact", + "loc.input.help.MaxArtifactSize": "Limite maximale de la taille des artefacts à publier en octets. Mettez 0 si vous ne souhaitez pas définir de limite.", + "loc.input.label.TargetPath": "Chemin du partage de fichiers", + "loc.input.help.TargetPath": "Partage de fichiers où sont copiés les fichiers d'artefacts. Il peut inclure des variables. Exemple : \\\\\\\\mon\\\\partage\\\\$(Build.DefinitionName)\\\\$(Build.BuildNumber). La publication d'artefacts d'un agent Linux ou macOS vers un partage de fichiers n'est pas prise en charge.", + "loc.input.label.Parallel": "Copie parallèle", + "loc.input.help.Parallel": "Choisissez s'il est nécessaire de copier les fichiers en parallèle à l'aide de plusieurs threads pour un meilleur débit potentiel. Si ce paramètre n'est pas activé, un seul thread est utilisé.", + "loc.input.label.ParallelCount": "Nombre parallèle", + "loc.input.help.ParallelCount": "Entrez le degré de parallélisme ou le nombre de threads utilisés pour effectuer la copie. La valeur doit être au moins égal à 1 et inférieur à 128.", + "loc.input.label.StoreAsTar": "Envoyer l’artefacts avant de le charger", + "loc.input.help.StoreAsTar": "Ajoutez tous les fichiers du chemin de publication dans une archive archive archive avant de les charger. Cela vous permet de conserver les autorisations de fichier UNIX. Utilisez l’option « extractTars » de la tâche DownloadBuildArtifacts pour extraire automatiquement les éléments téléchargés.", + "loc.messages.ErrorFileShareLinux": "La publication d'artefacts d'un agent Linux ou macOS vers un partage de fichiers n'est pas prise en charge. Changez le type d'artefact en 'Azure Pipelines', ou utilisez un agent Windows.", + "loc.messages.ErrorHostTypeNotSupported": "Cette tâche doit s'exécuter dans une build pour permettre la publication d'artefacts sur Azure Pipelines.", + "loc.messages.PublishBuildArtifactsFailed": "Échec de la publication des artefacts de build. Erreur : %s", + "loc.messages.UnexpectedParallelCount": "Nombre parallèle '%s' non pris en charge. Entrez un nombre compris entre 1 et 128.", + "loc.messages.TarExtractionNotSupportedInWindows": "L’extraction par extraction d’extraction n’est pas prise en charge sur Windows", + "loc.messages.ArtifactSizeExceeded": "La taille des artefacts en cours de publication est de %s octets, ce qui est supérieur à la limite maximale de %s octets définie pour la taille publiée des artefacts." +} \ No newline at end of file diff --git a/_generated/PublishBuildArtifactsV1_Node20/Strings/resources.resjson/it-IT/resources.resjson b/_generated/PublishBuildArtifactsV1_Node20/Strings/resources.resjson/it-IT/resources.resjson new file mode 100644 index 000000000000..023c485f3712 --- /dev/null +++ b/_generated/PublishBuildArtifactsV1_Node20/Strings/resources.resjson/it-IT/resources.resjson @@ -0,0 +1,29 @@ +{ + "loc.friendlyName": "Pubblica artefatti della compilazione", + "loc.helpMarkDown": "[Altre informazioni su questa attività](https://go.microsoft.com/fwlink/?LinkID=708390)", + "loc.description": "Consente di pubblicare artefatti della compilazione in Azure Pipelines o in una condivisione file di Windows", + "loc.instanceNameFormat": "Pubblica artefatto: $(ArtifactName)", + "loc.group.displayName.advanced": "Avanzate", + "loc.input.label.PathtoPublish": "Percorso per la pubblicazione", + "loc.input.help.PathtoPublish": "Percorso del file o della cartella da pubblicare. Può essere un percorso completo o relativo alla radice del repository. I caratteri jolly non sono supportati. Le [variabili](https://go.microsoft.com/fwlink/?LinkID=550988) sono supportate. Esempio: $(Build.ArtifactStagingDirectory)", + "loc.input.label.ArtifactName": "Nome dell'artefatto", + "loc.input.help.ArtifactName": "Nome dell'artefatto da creare nel percorso di pubblicazione.", + "loc.input.label.ArtifactType": "Percorso di pubblicazione degli artefatti", + "loc.input.help.ArtifactType": "Consente di scegliere se archiviare l'artefatto in Azure Pipelines oppure copiarlo in una condivisione file accessibile dall'agente di compilazione.", + "loc.input.label.MaxArtifactSize": "Dimensioni massime artefatto", + "loc.input.help.MaxArtifactSize": "Limite massimo per le dimensioni degli artefatti da pubblicare in byte. Inserire 0 se non si vuole impostare alcun limite.", + "loc.input.label.TargetPath": "Percorso condivisione file", + "loc.input.help.TargetPath": "Condivisione file in cui verranno copiati i file di artefatto. Può includere variabili. Esempio: \\\\\\\\my\\\\share\\\\$(Build.DefinitionName)\\\\$(Build.BuildNumber). La pubblicazione di artefatti da un agente Linux o macOS in una condivisione file non è supportata.", + "loc.input.label.Parallel": "Copia parallela", + "loc.input.help.Parallel": "Consente di scegliere se copiare i file in parallelo usando più thread per una maggiore velocità effettiva potenziale. Se questa impostazione non è abilitata, verrà usato un solo thread.", + "loc.input.label.ParallelCount": "Conteggio parallelo", + "loc.input.help.ParallelCount": "Consente di immettere il grado di parallelismo o il numero di thread usati per eseguire la copia. Il valore deve essere almeno 1 e non superare 128.", + "loc.input.label.StoreAsTar": "Aggiungere l'artefatto a un archivio tar prima del caricamento", + "loc.input.help.StoreAsTar": "Aggiungere tutti i file dal percorso di pubblicazione a un archivio tar prima del caricamento. Ciò consente di mantenere le autorizzazioni file UNIX. Usare l'opzione 'extractTars' dell'attività DownloadBuildArtifacts per estrarre automaticamente gli elementi scaricati.", + "loc.messages.ErrorFileShareLinux": "La pubblicazione di artefatti da un agente Linux o macOS in una condivisione file non è supportata. Modificare il tipo di artefatto in `Azure Pipelines` oppure usare un agente Windows.", + "loc.messages.ErrorHostTypeNotSupported": "Per pubblicare gli artefatti in Azure Pipelines, questa attività deve essere eseguita in una compilazione.", + "loc.messages.PublishBuildArtifactsFailed": "La pubblicazione degli artefatti di compilazione non è riuscita. Errore: %s", + "loc.messages.UnexpectedParallelCount": "Conteggio parallelo '%s' non supportato. Immettere un numero compreso tra 1 e 128.", + "loc.messages.TarExtractionNotSupportedInWindows": "L'estrazione di tar non è supportata in Windows", + "loc.messages.ArtifactSizeExceeded": "Le dimensioni degli artefatti pubblicati sono %s byte, che superano il limite massimo di %s byte impostato per le dimensioni pubblicate degli artefatti." +} \ No newline at end of file diff --git a/_generated/PublishBuildArtifactsV1_Node20/Strings/resources.resjson/ja-JP/resources.resjson b/_generated/PublishBuildArtifactsV1_Node20/Strings/resources.resjson/ja-JP/resources.resjson new file mode 100644 index 000000000000..74a98b069288 --- /dev/null +++ b/_generated/PublishBuildArtifactsV1_Node20/Strings/resources.resjson/ja-JP/resources.resjson @@ -0,0 +1,29 @@ +{ + "loc.friendlyName": "ビルド成果物の公開", + "loc.helpMarkDown": "[このタスクの詳細を表示](https://go.microsoft.com/fwlink/?LinkID=708390)", + "loc.description": "ビルド成果物を Azure Pipelines または Windows ファイル共有に公開します", + "loc.instanceNameFormat": "成果物の公開: $(ArtifactName)", + "loc.group.displayName.advanced": "詳細設定", + "loc.input.label.PathtoPublish": "発行するためのパス", + "loc.input.help.PathtoPublish": "発行するフォルダーまたはファイルのパス。完全修飾パスまたはリポジトリのルートからの相対パスを指定できます。ワイルドカードはサポートされていません。[変数](https://go.microsoft.com/fwlink/?LinkID=550988) がサポートされています。例: $(Build.ArtifactStagingDirectory)", + "loc.input.label.ArtifactName": "成果物名", + "loc.input.help.ArtifactName": "公開場所に作成する成果物の名前。", + "loc.input.label.ArtifactType": "成果物の発行場所", + "loc.input.help.ArtifactType": "成果物を Azure Pipelines に保存するか、またはビルド エージェントからアクセスできるファイル共有にコピーするかを選択します。", + "loc.input.label.MaxArtifactSize": "成果物の最大サイズ", + "loc.input.help.MaxArtifactSize": "公開する成果物のサイズの上限 (バイト単位)。制限を設定しない場合は 0 を指定します。", + "loc.input.label.TargetPath": "ファイル共有パス", + "loc.input.help.TargetPath": "成果物ファイルのコピー先であるファイル共有です。これには変数を含めることができます。例: \\\\\\\\my\\\\share\\\\$(Build.DefinitionName)\\\\$(Build.BuildNumber)。Linux または macOS エージェントから成果物をファイル共有に公開することはサポートされていません。", + "loc.input.label.Parallel": "並列コピー", + "loc.input.help.Parallel": "スループット向上を期待して複数のスレッドを使って並列でファイルをコピーするかどうかを選択します。この設定が無効の場合は、1 つのスレッドが使用されます。", + "loc.input.label.ParallelCount": "並列数", + "loc.input.help.ParallelCount": "コピーを実行するための並列処理の程度、つまり使用するスレッド数を入力します。この値は 1 以上 128 以下でなければなりません。", + "loc.input.label.StoreAsTar": "アップロードする前に成果物を Tar してください", + "loc.input.help.StoreAsTar": "アップロードする前に、発行パスのすべてのファイルを tar アーカイブに追加します。これにより、UNIX ファイルのアクセス許可を保持することができます。DownloadBuildArtifacts ティファクト タスクの ' extractTars ' オプションを使用して、ダウンロードされたアイテムを自動的に抽出します。", + "loc.messages.ErrorFileShareLinux": "Linux または macOS エージェントからファイル共有への成果物の公開はサポートされていません。成果物の種類を `Azure Pipelines` に変更するか、Windows エージェントをご使用ください。", + "loc.messages.ErrorHostTypeNotSupported": "成果物を Azure Pipelines に公開するには、ビルドでこのタスクを実行する必要があります。", + "loc.messages.PublishBuildArtifactsFailed": "ビルド成果物の発行が失敗し、次のエラーが発生しました: %s", + "loc.messages.UnexpectedParallelCount": "並列数 '%s' はサポートされていません。1 以上 128 以下の数を入力してください。", + "loc.messages.TarExtractionNotSupportedInWindows": "Tar 抽出は Windows でサポートされていません", + "loc.messages.ArtifactSizeExceeded": "公開中の成果物のサイズが %s バイトです。これは、成果物の公開サイズに設定されている上限 %s バイトを超えています。" +} \ No newline at end of file diff --git a/_generated/PublishBuildArtifactsV1_Node20/Strings/resources.resjson/ko-KR/resources.resjson b/_generated/PublishBuildArtifactsV1_Node20/Strings/resources.resjson/ko-KR/resources.resjson new file mode 100644 index 000000000000..7bc429e77445 --- /dev/null +++ b/_generated/PublishBuildArtifactsV1_Node20/Strings/resources.resjson/ko-KR/resources.resjson @@ -0,0 +1,29 @@ +{ + "loc.friendlyName": "빌드 아티팩트 게시", + "loc.helpMarkDown": "[이 작업에 대한 자세한 정보](https://go.microsoft.com/fwlink/?LinkID=708390)", + "loc.description": "Azure Pipelines 또는 Windows 파일 공유에 빌드 아티팩트를 게시합니다.", + "loc.instanceNameFormat": "아티팩트 게시: $(ArtifactName)", + "loc.group.displayName.advanced": "고급", + "loc.input.label.PathtoPublish": "게시할 경로", + "loc.input.help.PathtoPublish": "게시할 폴더 또는 파일 경로입니다. 리포지토리 루트에 상대적인 경로 또는 정규화된 경로일 수 있습니다. 와일드카드는 지원되지 않지만 [변수](https://go.microsoft.com/fwlink/?LinkID=550988)는 지원됩니다. 예: $(Build.ArtifactStagingDirectory)", + "loc.input.label.ArtifactName": "아티팩트 이름", + "loc.input.help.ArtifactName": "게시 위치에 만들 아티팩트의 이름입니다.", + "loc.input.label.ArtifactType": "아티팩트 게시 위치", + "loc.input.help.ArtifactType": "아티팩트를 Azure Pipelines에 저장할지 또는 빌드 에이전트에서 액세스할 수 있어야 하는 파일 공유에 복사할지를 선택합니다.", + "loc.input.label.MaxArtifactSize": "최대 아티팩트 크기", + "loc.input.help.MaxArtifactSize": "게시할 아티팩트 크기에 대한 최대 제한(바이트)입니다. 제한을 설정하지 않으려면 0을 입력합니다.", + "loc.input.label.TargetPath": "파일 공유 경로", + "loc.input.help.TargetPath": "아티팩트 파일을 복사할 파일 공유입니다. 변수를 포함할 수 있습니다(예: \\\\\\\\my\\\\share\\\\$(Build.DefinitionName)\\\\$(Build.BuildNumber)). Linux 또는 macOS 에이전트의 아티팩트를 파일 공유에 게시할 수는 없습니다.", + "loc.input.label.Parallel": "병렬 복사", + "loc.input.help.Parallel": "잠재적인 처리량 증대를 위해 다중 스레드를 사용하여 파일을 병렬 복사할지 여부를 선택합니다. 이 설정을 사용하도록 설정하지 않으면 하나의 스레드가 사용됩니다.", + "loc.input.label.ParallelCount": "병렬 개수", + "loc.input.help.ParallelCount": "병렬 처리 수준, 즉 복사를 수행하는 데 사용되는 스레드 수를 입력합니다. 값은 1에서 128 사이여야 합니다.", + "loc.input.label.StoreAsTar": "업로드하기 전에 아티팩트를 tar로 저장", + "loc.input.help.StoreAsTar": "업로드하기 전에 게시 경로의 모든 파일을 tar 보관함에 추가합니다. 이를 통해 UNIX 파일 사용 권한을 유지할 수 있습니다. DownloadBuildArtifacts 작업의 'extractTars' 옵션을 사용하여 다운로드한 항목의 압축을 자동으로 풉니다.", + "loc.messages.ErrorFileShareLinux": "Linux 또는 macOS 에이전트의 아티팩트를 파일 공유에 게시할 수 없습니다. 아티팩트 형식을 'Azure Pipelines'로 변경하거나 Windows 에이전트를 사용하세요.", + "loc.messages.ErrorHostTypeNotSupported": "아티팩트를 Azure Pipelines에 게시하려면 빌드에서 이 작업을 실행해야 합니다.", + "loc.messages.PublishBuildArtifactsFailed": "오류가 발생하여 빌드 아티팩트를 게시하지 못함: %s", + "loc.messages.UnexpectedParallelCount": "지원되지 않는 병렬 개수 '%s'입니다. 1에서 128 사이의 숫자를 입력하세요.", + "loc.messages.TarExtractionNotSupportedInWindows": "Windows에서는 tar 압축 풀기가 지원되지 않습니다", + "loc.messages.ArtifactSizeExceeded": "게시 중인 아티팩트의 크기가 게시되는 아티팩트 크기에 대해 설정된 최대 제한 %s바이트보다 큰 %s바이트입니다." +} \ No newline at end of file diff --git a/_generated/PublishBuildArtifactsV1_Node20/Strings/resources.resjson/ru-RU/resources.resjson b/_generated/PublishBuildArtifactsV1_Node20/Strings/resources.resjson/ru-RU/resources.resjson new file mode 100644 index 000000000000..ef7ab4f8117f --- /dev/null +++ b/_generated/PublishBuildArtifactsV1_Node20/Strings/resources.resjson/ru-RU/resources.resjson @@ -0,0 +1,29 @@ +{ + "loc.friendlyName": "Публикация артефактов сборки", + "loc.helpMarkDown": "[См. дополнительные сведения об этой задаче](https://go.microsoft.com/fwlink/?LinkID=708390)", + "loc.description": "Публикация артефактов сборки в Azure Pipelines или общей папке", + "loc.instanceNameFormat": "Опубликовать артефакт: $(ArtifactName)", + "loc.group.displayName.advanced": "Дополнительно", + "loc.input.label.PathtoPublish": "Путь публикации", + "loc.input.help.PathtoPublish": "Путь файла или папки для публикации. Это может быть полный путь или путь относительно корневого каталога репозитория. Подстановочные знаки не поддерживаются. [Переменные](https://go.microsoft.com/fwlink/?LinkID=550988) поддерживаются. Например: $(Build.ArtifactStagingDirectory)", + "loc.input.label.ArtifactName": "Имя артефакта", + "loc.input.help.ArtifactName": "Имя артефакта, который будет создан в расположении публикации.", + "loc.input.label.ArtifactType": "Расположение публикации артефакта", + "loc.input.help.ArtifactType": "Выберите, нужно ли сохранить артефакт в Azure Pipelines либо скопировать его в общую папку, которая должна быть доступна из агента сборки.", + "loc.input.label.MaxArtifactSize": "Максимальный размер артефакта", + "loc.input.help.MaxArtifactSize": "Максимальный размер публикуемых артефактов в байтах. Если вы не хотите устанавливать какие-либо ограничения, укажите значение 0.", + "loc.input.label.TargetPath": "Путь к общей папке", + "loc.input.help.TargetPath": "Общая папка, в которую будут скопированы файлы артефактов. Может включать в себя переменные. Пример: \\\\\\\\my\\\\share\\\\$(Build.DefinitionName)\\\\$(Build.BuildNumber). Публикация артефактов из агента Linux или macOS в общей папке не поддерживается.", + "loc.input.label.Parallel": "Параллельное копирование", + "loc.input.help.Parallel": "Выберите, следует ли копировать файлы параллельно с использованием нескольких потоков для возможного повышения пропускной способности. Если этот параметр не установлен, используется один поток.", + "loc.input.label.ParallelCount": "Счетчик параллелизма", + "loc.input.help.ParallelCount": "Введите степень параллелизма (число потоков, используемых для копирования). Допустимые значения: от 1 до 128 включительно.", + "loc.input.label.StoreAsTar": "Поместите артефакт в TAR-архив перед отправкой", + "loc.input.help.StoreAsTar": "Добавьте все файлы из пути публикации в TAR-архив перед отправкой. Это позволяет сохранить разрешения для UNIX-файлов. Используйте параметр \"extractTars\" задачи DownloadBuildArtifacts, чтобы извлечь загруженные элементы автоматически.", + "loc.messages.ErrorFileShareLinux": "Публикация артефактов из агента Linux или macOS в общей папке не поддерживается. Измените тип артефакта на \"Azure Pipelines\" или используйте агент Windows.", + "loc.messages.ErrorHostTypeNotSupported": "Эта задача должна выполняться в сборке для публикации артефактов в Azure Pipelines.", + "loc.messages.PublishBuildArtifactsFailed": "Сбой публикации артефактов сборки с ошибкой: %s", + "loc.messages.UnexpectedParallelCount": "Неподдерживаемое значение счетчика параллелизма \"%s\". Введите число от 1 до 128.", + "loc.messages.TarExtractionNotSupportedInWindows": "Извлечение из TAR-архива не поддерживается в Windows", + "loc.messages.ArtifactSizeExceeded": "Размер публикуемых артефактов составляет %s байт, что превышает максимальное ограничение %s байт, заданное для опубликованного размера артефактов." +} \ No newline at end of file diff --git a/_generated/PublishBuildArtifactsV1_Node20/Strings/resources.resjson/zh-CN/resources.resjson b/_generated/PublishBuildArtifactsV1_Node20/Strings/resources.resjson/zh-CN/resources.resjson new file mode 100644 index 000000000000..4d2d2cc41929 --- /dev/null +++ b/_generated/PublishBuildArtifactsV1_Node20/Strings/resources.resjson/zh-CN/resources.resjson @@ -0,0 +1,29 @@ +{ + "loc.friendlyName": "发布生成工件", + "loc.helpMarkDown": "[详细了解此任务](https://go.microsoft.com/fwlink/?LinkID=708390)", + "loc.description": "将生成工件发布到 Azure Pipelines 或 Windows 文件共享", + "loc.instanceNameFormat": "发布项目: $(ArtifactName)", + "loc.group.displayName.advanced": "高级", + "loc.input.label.PathtoPublish": "要发布的路径", + "loc.input.help.PathtoPublish": "要发布的文件夹或文件路径。这可以是一个完全限定的路径或一个相对于存储库的根的路径。不支持通配符。支持 [变量](https://go.microsoft.com/fwlink/?LinkID=550988)。例如: $(Build.ArtifactStagingDirectory)", + "loc.input.label.ArtifactName": "项目名称", + "loc.input.help.ArtifactName": "要在发布位置中创建的项目的名称。", + "loc.input.label.ArtifactType": "项目发布位置", + "loc.input.help.ArtifactType": "选择是否在 Azure Pipelines 中存储项目,或者是否将其复制到必须可从生成代理访问的文件共享中。", + "loc.input.label.MaxArtifactSize": "最大项目大小", + "loc.input.help.MaxArtifactSize": "要发布的项目大小的最大限制(以字节为单位)。如果不想设置任何限制,请输入 0。", + "loc.input.label.TargetPath": "文件共享路径", + "loc.input.help.TargetPath": "项目文件将复制到的文件共享。这可包括变量。示例: \\\\\\\\my\\\\share\\\\$(Build.DefinitionName)\\\\$(Build.BuildNumber)。不支持将项目从 Linux 或 macOS 代理发布到文件共享。", + "loc.input.label.Parallel": "并行复制", + "loc.input.help.Parallel": "选择是否要使用多个线程并行复制文件以获得更大的潜在吞吐量。如果未启用此设置,将使用一个线程。", + "loc.input.label.ParallelCount": "并行计数", + "loc.input.help.ParallelCount": "输入执行复制的并行度或所使用的线程数。该值必须至少为 1 且不能大于 128。", + "loc.input.label.StoreAsTar": "上传之前存档", + "loc.input.help.StoreAsTar": "上传前将发布路径中的所有文件添加到存档。此操作将允许保留 UNIX 文件权限。使用 DownloadBuildArtifacts 任务的 `extractTars` 选项以自动提取已下载的项目。", + "loc.messages.ErrorFileShareLinux": "不支持将项目从 Linux 或 macOS 代理发布到文件共享。请将项目类型更改为 `Azure Pipelines` 或使用 Windows 代理。", + "loc.messages.ErrorHostTypeNotSupported": "此任务必须在生成中运行,以将项目发布到 Azure Pipelines。", + "loc.messages.PublishBuildArtifactsFailed": "发布生成项目失败,出现错误: %s", + "loc.messages.UnexpectedParallelCount": "并行计数“%s”不受支持。输入介于 1 到 128 之间的数字。", + "loc.messages.TarExtractionNotSupportedInWindows": "Windows 不支持存档提取", + "loc.messages.ArtifactSizeExceeded": "正在发布的项目大小为 %s 字节,大于为项目发布的大小设置的最大限制 %s 字节。" +} \ No newline at end of file diff --git a/_generated/PublishBuildArtifactsV1_Node20/Strings/resources.resjson/zh-TW/resources.resjson b/_generated/PublishBuildArtifactsV1_Node20/Strings/resources.resjson/zh-TW/resources.resjson new file mode 100644 index 000000000000..e944095004c9 --- /dev/null +++ b/_generated/PublishBuildArtifactsV1_Node20/Strings/resources.resjson/zh-TW/resources.resjson @@ -0,0 +1,29 @@ +{ + "loc.friendlyName": "發佈組建成品", + "loc.helpMarkDown": "[深入了解此工作](https://go.microsoft.com/fwlink/?LinkID=708390)", + "loc.description": "將組建成品發佈至 Azure Pipelines 或 Windows 檔案共用", + "loc.instanceNameFormat": "發行成品: $(ArtifactName)", + "loc.group.displayName.advanced": "進階", + "loc.input.label.PathtoPublish": "要發行的路徑", + "loc.input.help.PathtoPublish": "要發佈的資料夾或檔案路徑。可為完整路徑或與存放庫根路徑相關的路徑。不支援萬用字元。支援[變數](https://go.microsoft.com/fwlink/?LinkID=550988)。範例: $(Build.ArtifactStagingDirectory)", + "loc.input.label.ArtifactName": "成品名稱", + "loc.input.help.ArtifactName": "要在發佈位置建立的成品名稱。", + "loc.input.label.ArtifactType": "成品發佈位置", + "loc.input.help.ArtifactType": "選擇要在 Azure Pipelines 中儲存成品,還是將成品複製到必須可透過組建代理程式存取的檔案共用。", + "loc.input.label.MaxArtifactSize": "成品大小上限", + "loc.input.help.MaxArtifactSize": "成品的發佈大小上限,以位元組為單位。如果您不想設定任何限制,請放 0。", + "loc.input.label.TargetPath": "檔案共用路徑", + "loc.input.help.TargetPath": "成品檔案所要複製到的檔案共用。此項目可包含變數。範例: \\\\\\\\my\\\\share\\\\$(Build.DefinitionName)\\\\$(Build.BuildNumber)。不支援從 Linux 或 macOS 代理程式將成品發佈至檔案共用。", + "loc.input.label.Parallel": "平行複製", + "loc.input.help.Parallel": "選取是否要使用多重執行緒平行複製檔案,以追求更高的輸送量。若此設定未啟用,則只會使用一個執行緒。", + "loc.input.label.ParallelCount": "平行計數", + "loc.input.help.ParallelCount": "輸入平行處理的程度或使用的執行緒數量,以執行複製。該值必須至少為 1 且不大於 128。", + "loc.input.label.StoreAsTar": "在上傳前先 tar 成品", + "loc.input.help.StoreAsTar": "在上傳前,請先將發行路徑中的所有檔案新增至 tar 封存。這可讓您保留 UNIX 檔案權限。使用 DownloadBuildArtifacts 工作的 `extractTars` 選項,自動解壓縮下載的項目。", + "loc.messages.ErrorFileShareLinux": "不支援將成品從 Linux 或 macOS 代理程式發佈到檔案共用。請將成品類型變更為 `Azure Pipelines` 或使用 Windows 代理程式。", + "loc.messages.ErrorHostTypeNotSupported": "此工作必須在組建中執行才能將成品發佈至 Azure Pipelines。", + "loc.messages.PublishBuildArtifactsFailed": "發行組建成品失敗,錯誤: %s", + "loc.messages.UnexpectedParallelCount": "不支援的平行計數 '%s'。請輸入介於 1 到 128 之間的數字。", + "loc.messages.TarExtractionNotSupportedInWindows": "Windows 不支援 tar 解壓縮", + "loc.messages.ArtifactSizeExceeded": "要發佈的成品大小為 %s 位元組,這已超過成品發佈大小所設定的 %s 位元組上限。" +} \ No newline at end of file diff --git a/_generated/PublishBuildArtifactsV1_Node20/Tests/L0.ts b/_generated/PublishBuildArtifactsV1_Node20/Tests/L0.ts new file mode 100644 index 000000000000..746eb0b9ee52 --- /dev/null +++ b/_generated/PublishBuildArtifactsV1_Node20/Tests/L0.ts @@ -0,0 +1,174 @@ +import * as assert from 'assert'; +import * as path from 'path'; +import * as os from 'os'; +import { MockTestRunner } from 'azure-pipelines-task-lib/mock-test'; + +describe('PublishBuildArtifactsV1 Suite', function () { + this.timeout(10000); + + it('Publish to container', (done: Mocha.Done) => { + const testPath: string = path.join(__dirname, 'L0PublishToContainer.js'); + const testRunner = new MockTestRunner(testPath); + testRunner.run(); + + assert(testRunner.stderr.length === 0, 'should not have written to stderr. error: ' + testRunner.stderr); + assert(testRunner.succeeded, 'task should have succeeded'); + assert(testRunner.stdout.search(/##vso\[artifact.upload artifactType=container;artifactName=drop;containerfolder=drop;localpath=\/bin\/release;\]\/bin\/release/gi) >= 0, 'should publish artifact.'); + + done(); + }); + + if (os.platform() === 'win32') { + it('Publish to UNC', (done: Mocha.Done) => { + const testPath: string = path.join(__dirname, 'L0PublishToUnc.js'); + const testRunner = new MockTestRunner(testPath); + testRunner.run(); + + assert(!testRunner.stderr, 'should not have written to stderr. error: ' + testRunner.stderr); + assert(testRunner.succeeded, 'task should have succeeded'); + assert(testRunner.stdout.indexOf('test stdout from robocopy (no trailing slashes)') >= 0, 'should copy files.'); + assert(testRunner.stdout.search(/artifact.associate/gi) >= 0, 'should associate artifact.'); + done(); + }); + + it('Appends . to robocopy source with trailing slash', (done: Mocha.Done) => { + const testPath: string = path.join(__dirname, 'L0AppendDotToRobocopySource.js'); + const testRunner = new MockTestRunner(testPath); + testRunner.run(); + + assert(!testRunner.stderr, 'should not have written to stderr. error: ' + testRunner.stderr); + assert(testRunner.succeeded, 'task should have succeeded'); + assert(testRunner.stdout.indexOf('test stdout from robocopy (source with trailing slash)') >= 0, 'should copy files.'); + assert(testRunner.stdout.search(/artifact.associate/gi) >= 0, 'should associate artifact.'); + done(); + }); + + it('Appends . to robocopy target with trailing slash', (done: Mocha.Done) => { + const testPath: string = path.join(__dirname, 'L0AppendDotToRobocopyTarget.js'); + const testRunner = new MockTestRunner(testPath); + testRunner.run(); + + assert(!testRunner.stderr, 'should not have written to stderr. error: ' + testRunner.stderr); + assert(testRunner.succeeded, 'task should have succeeded'); + assert(testRunner.stdout.indexOf('test stdout from robocopy (target with trailing slash)') >= 0, 'should copy files.'); + assert(testRunner.stdout.search(/artifact.associate/gi) >= 0, 'should associate artifact.'); + done(); + }); + + it('Copy single file with robocopy', (done: Mocha.Done) => { + const testPath: string = path.join(__dirname, 'L0CopySingleFileWithRobocopy.js'); + const testRunner = new MockTestRunner(testPath); + testRunner.run(); + + assert(!testRunner.stderr, 'should not have written to stderr. error: ' + testRunner.stderr); + assert(testRunner.succeeded, 'task should have succeeded'); + assert(testRunner.stdout.indexOf('test stdout from robocopy (copy a single file)') >= 0, 'should copy files.'); + assert(testRunner.stdout.search(/artifact.associate/gi) >= 0, 'should associate artifact.'); + done(); + }); + + it('fails if robocopy fails', (done: Mocha.Done) => { + const testPath: string = path.join(__dirname, 'L0FailsIfRobocopyFails.js'); + const testRunner = new MockTestRunner(testPath); + testRunner.run(); + + assert(testRunner.failed, 'task should have failed'); + assert(testRunner.stdout.match(/test stdout from robocopy/gi).length === 1, 'should call robocopy.'); + assert(testRunner.stdout.search(/artifact.associate/gi) >= 0, 'should associate artifact.'); + done(); + }); + + it('creates filepath artifact', (done: Mocha.Done) => { + const testPath: string = path.join(__dirname, 'L0CreatesFilepathArtifact.js'); + const testRunner = new MockTestRunner(testPath); + testRunner.run(); + + assert(!testRunner.stderr, 'should not have written to stderr. error: ' + testRunner.stderr); + assert(testRunner.succeeded, 'task should have succeeded'); + assert(testRunner.stdout.indexOf('##vso[artifact.associate artifacttype=filepath;artifactname=drop;artifactlocation=\\\\UNCShare\\subdir;]\\\\UNCShare\\subdir') >= 0, 'should associate artifact.'); + done(); + }); + } else { + it('fails to create filepath artifact', (done: Mocha.Done) => { + const testPath: string = path.join(__dirname, 'L0FailsToCreateFilepathArtifact.js'); + const testRunner = new MockTestRunner(testPath); + testRunner.run(); + + assert(testRunner.stdout.match(/loc_mock_ErrorFileShareLinux/), 'should have written error message'); + assert(testRunner.failed, 'task should have succeeded'); + assert(testRunner.stdout.indexOf('##vso[artifact.associate') < 0, 'should not associate artifact.'); + done(); + }); + } + + it('fails if PathtoPublish not set', (done: Mocha.Done) => { + const testPath: string = path.join(__dirname, 'L0FailsIfPathToPublishNotSet.js'); + const testRunner = new MockTestRunner(testPath); + testRunner.run(); + + assert(testRunner.stdOutContained('Input required: PathtoPublish')); + assert(testRunner.failed, 'task should have failed'); + assert(testRunner.invokedToolCount === 0, 'should exit before running PublishBuildArtifacts'); + done(); + }); + + it('fails if ArtifactName not set', (done: Mocha.Done) => { + const testPath: string = path.join(__dirname, 'L0FailsIfArtifactNameNotSet.js'); + const testRunner = new MockTestRunner(testPath); + testRunner.run(); + + assert(testRunner.stdOutContained('Input required: ArtifactName')); + assert(testRunner.failed, 'task should have failed'); + assert(testRunner.invokedToolCount === 0, 'should exit before running PublishBuildArtifacts'); + done(); + }); + + it('fails if ArtifactType not set', (done: Mocha.Done) => { + const testPath: string = path.join(__dirname, 'L0FailsIfArtifactTypeNotSet.js'); + const testRunner = new MockTestRunner(testPath); + testRunner.run(); + + assert(testRunner.stdOutContained('Input required: ArtifactType')); + assert(testRunner.failed, 'task should have failed'); + assert(testRunner.invokedToolCount === 0, 'should exit before running PublishBuildArtifacts'); + done(); + }); + + it('fails if PathtoPublish not found', (done: Mocha.Done) => { + const testPath: string = path.join(__dirname, 'L0FailsIfPathToPublishNotFound.js'); + const testRunner = new MockTestRunner(testPath); + testRunner.run(); + + assert(testRunner.failed, 'should have failed'); + const expectedErr = 'Not found /bin/notexist'; + assert(testRunner.stdOutContained(expectedErr), 'should have said: ' + expectedErr); + assert(testRunner.invokedToolCount === 0, 'should exit before running PublishBuildArtifacts'); + done(); + }); + + it('Add a single file to tar before uploading', (done: Mocha.Done) => { + const testPath: string = path.join(__dirname, 'L0StoreFileAsTar.js'); + const testRunner = new MockTestRunner(testPath); + testRunner.run(); + + assert(testRunner.stderr.length === 0, 'should not have written to stderr. error: ' + testRunner.stderr); + assert(testRunner.succeeded, 'task should have succeeded'); + assert(testRunner.stdOutContained('test stdout from tar: added file to archive'), 'should have run tar'); + const artifactPath: string = path.join(process.cwd(), 'drop.tar'); + assert(testRunner.stdOutContained(`##vso[artifact.upload artifacttype=container;artifactname=drop;containerfolder=drop;localpath=${artifactPath};]${artifactPath}`)); + done(); + }); + + it('Add a folder to tar before uploading', (done: Mocha.Done) => { + const testPath: string = path.join(__dirname, 'L0StoreFolderAsTar.js'); + const testRunner = new MockTestRunner(testPath); + testRunner.run(); + + assert(testRunner.stderr.length === 0, 'should not have written to stderr. error: ' + testRunner.stderr); + assert(testRunner.succeeded, 'task should have succeeded'); + assert(testRunner.stdOutContained('test stdout from tar: added folder to archive'), 'should have run tar'); + const artifactPath: string = path.join(process.cwd(), 'drop.tar'); + assert(testRunner.stdOutContained(`##vso[artifact.upload artifacttype=container;artifactname=drop;containerfolder=drop;localpath=${artifactPath};]${artifactPath}`)); + done(); + }); +}); diff --git a/_generated/PublishBuildArtifactsV1_Node20/Tests/L0AppendDotToRobocopySource.ts b/_generated/PublishBuildArtifactsV1_Node20/Tests/L0AppendDotToRobocopySource.ts new file mode 100644 index 000000000000..b69e869fbefc --- /dev/null +++ b/_generated/PublishBuildArtifactsV1_Node20/Tests/L0AppendDotToRobocopySource.ts @@ -0,0 +1,20 @@ +import * as path from 'path'; + +import { TaskMockRunner } from 'azure-pipelines-task-lib/mock-run'; +import * as MockToolRunner from 'azure-pipelines-task-lib/mock-toolrunner'; + +import { goodAnswers } from './goodAnswers'; + +const taskPath: string = path.join(__dirname, '..', 'publishbuildartifacts.js'); +const taskRunner = new TaskMockRunner(taskPath); + +taskRunner.setInput('PathtoPublish', 'C:\\bin\\release\\'); +taskRunner.setInput('ArtifactName', 'drop'); +taskRunner.setInput('ArtifactType', 'FilePath'); +taskRunner.setInput('TargetPath', '\\\\UNCShare\\subdir'); + +taskRunner.setAnswers(goodAnswers); + +taskRunner.registerMock('azure-pipelines-task-lib/toolrunner', MockToolRunner); + +taskRunner.run(); diff --git a/_generated/PublishBuildArtifactsV1_Node20/Tests/L0AppendDotToRobocopyTarget.ts b/_generated/PublishBuildArtifactsV1_Node20/Tests/L0AppendDotToRobocopyTarget.ts new file mode 100644 index 000000000000..33f0f9ab7bbd --- /dev/null +++ b/_generated/PublishBuildArtifactsV1_Node20/Tests/L0AppendDotToRobocopyTarget.ts @@ -0,0 +1,20 @@ +import * as path from 'path'; + +import { TaskMockRunner } from 'azure-pipelines-task-lib/mock-run'; +import * as MockToolRunner from 'azure-pipelines-task-lib/mock-toolrunner'; + +import { goodAnswers } from './goodAnswers'; + +const taskPath: string = path.join(__dirname, '..', 'publishbuildartifacts.js'); +const taskRunner = new TaskMockRunner(taskPath); + +taskRunner.setInput('PathtoPublish', 'C:\\bin\\release'); +taskRunner.setInput('ArtifactName', 'drop'); +taskRunner.setInput('ArtifactType', 'FilePath'); +taskRunner.setInput('TargetPath', '\\\\UNCShare'); + +taskRunner.setAnswers(goodAnswers); + +taskRunner.registerMock('azure-pipelines-task-lib/toolrunner', MockToolRunner); + +taskRunner.run(); diff --git a/_generated/PublishBuildArtifactsV1_Node20/Tests/L0CopySingleFileWithRobocopy.ts b/_generated/PublishBuildArtifactsV1_Node20/Tests/L0CopySingleFileWithRobocopy.ts new file mode 100644 index 000000000000..39c835595549 --- /dev/null +++ b/_generated/PublishBuildArtifactsV1_Node20/Tests/L0CopySingleFileWithRobocopy.ts @@ -0,0 +1,20 @@ +import * as path from 'path'; + +import { TaskMockRunner } from 'azure-pipelines-task-lib/mock-run'; +import * as MockToolRunner from 'azure-pipelines-task-lib/mock-toolrunner'; + +import { goodAnswers } from './goodAnswers'; + +const taskPath: string = path.join(__dirname, '..', 'publishbuildartifacts.js'); +const taskRunner = new TaskMockRunner(taskPath); + +taskRunner.setInput('PathtoPublish', 'C:\\bin\\release\\file.exe'); +taskRunner.setInput('ArtifactName', 'drop'); +taskRunner.setInput('ArtifactType', 'FilePath'); +taskRunner.setInput('TargetPath', '\\\\UNCShare'); + +taskRunner.setAnswers(goodAnswers); + +taskRunner.registerMock('azure-pipelines-task-lib/toolrunner', MockToolRunner); + +taskRunner.run(); diff --git a/_generated/PublishBuildArtifactsV1_Node20/Tests/L0CreatesFilepathArtifact.ts b/_generated/PublishBuildArtifactsV1_Node20/Tests/L0CreatesFilepathArtifact.ts new file mode 100644 index 000000000000..b306202c1523 --- /dev/null +++ b/_generated/PublishBuildArtifactsV1_Node20/Tests/L0CreatesFilepathArtifact.ts @@ -0,0 +1,20 @@ +import * as path from 'path'; + +import { TaskMockRunner } from 'azure-pipelines-task-lib/mock-run'; +import * as MockToolRunner from 'azure-pipelines-task-lib/mock-toolrunner'; + +import { goodAnswers } from './goodAnswers'; + +const taskPath: string = path.join(__dirname, '..', 'publishbuildartifacts.js'); +const taskRunner = new TaskMockRunner(taskPath); + +taskRunner.setInput('PathtoPublish', 'C:\\bin\\release'); +taskRunner.setInput('ArtifactName', 'drop'); +taskRunner.setInput('ArtifactType', 'FilePath'); +taskRunner.setInput('TargetPath', '\\\\UNCShare\\subdir'); + +taskRunner.setAnswers(goodAnswers); + +taskRunner.registerMock('azure-pipelines-task-lib/toolrunner', MockToolRunner); + +taskRunner.run(); diff --git a/_generated/PublishBuildArtifactsV1_Node20/Tests/L0FailsIfArtifactNameNotSet.ts b/_generated/PublishBuildArtifactsV1_Node20/Tests/L0FailsIfArtifactNameNotSet.ts new file mode 100644 index 000000000000..915fff440bae --- /dev/null +++ b/_generated/PublishBuildArtifactsV1_Node20/Tests/L0FailsIfArtifactNameNotSet.ts @@ -0,0 +1,18 @@ +import * as path from 'path'; + +import { TaskMockRunner } from 'azure-pipelines-task-lib/mock-run'; +import * as MockToolRunner from 'azure-pipelines-task-lib/mock-toolrunner'; + +import { goodAnswers } from './goodAnswers'; + +const taskPath: string = path.join(__dirname, '..', 'publishbuildartifacts.js'); +const taskRunner = new TaskMockRunner(taskPath); + +taskRunner.setInput('PathtoPublish', '/bin/release'); +taskRunner.setInput('ArtifactType', 'Container'); + +taskRunner.setAnswers(goodAnswers); + +taskRunner.registerMock('azure-pipelines-task-lib/toolrunner', MockToolRunner); + +taskRunner.run(); diff --git a/_generated/PublishBuildArtifactsV1_Node20/Tests/L0FailsIfArtifactTypeNotSet.ts b/_generated/PublishBuildArtifactsV1_Node20/Tests/L0FailsIfArtifactTypeNotSet.ts new file mode 100644 index 000000000000..a286b4aaf142 --- /dev/null +++ b/_generated/PublishBuildArtifactsV1_Node20/Tests/L0FailsIfArtifactTypeNotSet.ts @@ -0,0 +1,18 @@ +import * as path from 'path'; + +import { TaskMockRunner } from 'azure-pipelines-task-lib/mock-run'; +import * as MockToolRunner from 'azure-pipelines-task-lib/mock-toolrunner'; + +import { goodAnswers } from './goodAnswers'; + +const taskPath: string = path.join(__dirname, '..', 'publishbuildartifacts.js'); +const taskRunner = new TaskMockRunner(taskPath); + +taskRunner.setInput('PathtoPublish', '/bin/release'); +taskRunner.setInput('ArtifactName', 'drop'); + +taskRunner.setAnswers(goodAnswers); + +taskRunner.registerMock('azure-pipelines-task-lib/toolrunner', MockToolRunner); + +taskRunner.run(); diff --git a/_generated/PublishBuildArtifactsV1_Node20/Tests/L0FailsIfPathToPublishNotFound.ts b/_generated/PublishBuildArtifactsV1_Node20/Tests/L0FailsIfPathToPublishNotFound.ts new file mode 100644 index 000000000000..96e43ec67d1c --- /dev/null +++ b/_generated/PublishBuildArtifactsV1_Node20/Tests/L0FailsIfPathToPublishNotFound.ts @@ -0,0 +1,19 @@ +import * as path from 'path'; + +import { TaskMockRunner } from 'azure-pipelines-task-lib/mock-run'; +import * as MockToolRunner from 'azure-pipelines-task-lib/mock-toolrunner'; + +import { goodAnswers } from './goodAnswers'; + +const taskPath: string = path.join(__dirname, '..', 'publishbuildartifacts.js'); +const taskRunner = new TaskMockRunner(taskPath); + +taskRunner.setInput('PathtoPublish', '/bin/notexist'); +taskRunner.setInput('ArtifactName', 'drop'); +taskRunner.setInput('ArtifactType', 'Container'); + +taskRunner.setAnswers(goodAnswers); + +taskRunner.registerMock('azure-pipelines-task-lib/toolrunner', MockToolRunner); + +taskRunner.run(); diff --git a/_generated/PublishBuildArtifactsV1_Node20/Tests/L0FailsIfPathToPublishNotSet.ts b/_generated/PublishBuildArtifactsV1_Node20/Tests/L0FailsIfPathToPublishNotSet.ts new file mode 100644 index 000000000000..7d6e1563d7dc --- /dev/null +++ b/_generated/PublishBuildArtifactsV1_Node20/Tests/L0FailsIfPathToPublishNotSet.ts @@ -0,0 +1,18 @@ +import * as path from 'path'; + +import { TaskMockRunner } from 'azure-pipelines-task-lib/mock-run'; +import * as MockToolRunner from 'azure-pipelines-task-lib/mock-toolrunner'; + +import { goodAnswers } from './goodAnswers'; + +const taskPath: string = path.join(__dirname, '..', 'publishbuildartifacts.js'); +const taskRunner = new TaskMockRunner(taskPath); + +taskRunner.setInput('ArtifactName', 'drop'); +taskRunner.setInput('ArtifactType', 'Container'); + +taskRunner.setAnswers(goodAnswers); + +taskRunner.registerMock('azure-pipelines-task-lib/toolrunner', MockToolRunner); + +taskRunner.run(); diff --git a/_generated/PublishBuildArtifactsV1_Node20/Tests/L0FailsIfRobocopyFails.ts b/_generated/PublishBuildArtifactsV1_Node20/Tests/L0FailsIfRobocopyFails.ts new file mode 100644 index 000000000000..5035de959283 --- /dev/null +++ b/_generated/PublishBuildArtifactsV1_Node20/Tests/L0FailsIfRobocopyFails.ts @@ -0,0 +1,20 @@ +import * as path from 'path'; + +import { TaskMockRunner } from 'azure-pipelines-task-lib/mock-run'; +import * as MockToolRunner from 'azure-pipelines-task-lib/mock-toolrunner'; + +import { badAnswers } from './badAnswers'; + +const taskPath: string = path.join(__dirname, '..', 'publishbuildartifacts.js'); +const taskRunner = new TaskMockRunner(taskPath); + +taskRunner.setInput('PathtoPublish', 'C:\\bin\\release'); +taskRunner.setInput('ArtifactName', 'drop'); +taskRunner.setInput('ArtifactType', 'FilePath'); +taskRunner.setInput('TargetPath', '\\\\UNCShare\\subdir'); + +taskRunner.setAnswers(badAnswers); + +taskRunner.registerMock('azure-pipelines-task-lib/toolrunner', MockToolRunner); + +taskRunner.run(); diff --git a/_generated/PublishBuildArtifactsV1_Node20/Tests/L0FailsToCreateFilepathArtifact.ts b/_generated/PublishBuildArtifactsV1_Node20/Tests/L0FailsToCreateFilepathArtifact.ts new file mode 100644 index 000000000000..18626759b4ec --- /dev/null +++ b/_generated/PublishBuildArtifactsV1_Node20/Tests/L0FailsToCreateFilepathArtifact.ts @@ -0,0 +1,20 @@ +import * as path from 'path'; + +import { TaskMockRunner } from 'azure-pipelines-task-lib/mock-run'; +import * as MockToolRunner from 'azure-pipelines-task-lib/mock-toolrunner'; + +import { goodAnswers } from './goodAnswers'; + +const taskPath: string = path.join(__dirname, '..', 'publishbuildartifacts.js'); +const taskRunner = new TaskMockRunner(taskPath); + +taskRunner.setInput('PathtoPublish', '/bin/release'); +taskRunner.setInput('ArtifactName', 'drop'); +taskRunner.setInput('ArtifactType', 'FilePath'); +taskRunner.setInput('TargetPath', '\\\\UNCShare\\subdir'); + +taskRunner.setAnswers(goodAnswers); + +taskRunner.registerMock('azure-pipelines-task-lib/toolrunner', MockToolRunner); + +taskRunner.run(); diff --git a/_generated/PublishBuildArtifactsV1_Node20/Tests/L0PublishToContainer.ts b/_generated/PublishBuildArtifactsV1_Node20/Tests/L0PublishToContainer.ts new file mode 100644 index 000000000000..8b0cf2005219 --- /dev/null +++ b/_generated/PublishBuildArtifactsV1_Node20/Tests/L0PublishToContainer.ts @@ -0,0 +1,16 @@ +import * as path from 'path'; + +import { TaskMockRunner } from 'azure-pipelines-task-lib/mock-run'; + +import { goodAnswers } from './goodAnswers'; + +const taskPath: string = path.join(__dirname, '..', 'publishbuildartifacts.js'); +const taskRunner = new TaskMockRunner(taskPath); + +taskRunner.setInput('PathtoPublish', '/bin/release'); +taskRunner.setInput('ArtifactName', 'drop'); +taskRunner.setInput('ArtifactType', 'Container'); + +taskRunner.setAnswers(goodAnswers); + +taskRunner.run(); diff --git a/_generated/PublishBuildArtifactsV1_Node20/Tests/L0PublishToUnc.ts b/_generated/PublishBuildArtifactsV1_Node20/Tests/L0PublishToUnc.ts new file mode 100644 index 000000000000..b306202c1523 --- /dev/null +++ b/_generated/PublishBuildArtifactsV1_Node20/Tests/L0PublishToUnc.ts @@ -0,0 +1,20 @@ +import * as path from 'path'; + +import { TaskMockRunner } from 'azure-pipelines-task-lib/mock-run'; +import * as MockToolRunner from 'azure-pipelines-task-lib/mock-toolrunner'; + +import { goodAnswers } from './goodAnswers'; + +const taskPath: string = path.join(__dirname, '..', 'publishbuildartifacts.js'); +const taskRunner = new TaskMockRunner(taskPath); + +taskRunner.setInput('PathtoPublish', 'C:\\bin\\release'); +taskRunner.setInput('ArtifactName', 'drop'); +taskRunner.setInput('ArtifactType', 'FilePath'); +taskRunner.setInput('TargetPath', '\\\\UNCShare\\subdir'); + +taskRunner.setAnswers(goodAnswers); + +taskRunner.registerMock('azure-pipelines-task-lib/toolrunner', MockToolRunner); + +taskRunner.run(); diff --git a/_generated/PublishBuildArtifactsV1_Node20/Tests/L0StoreFileAsTar.ts b/_generated/PublishBuildArtifactsV1_Node20/Tests/L0StoreFileAsTar.ts new file mode 100644 index 000000000000..66d416bddbc0 --- /dev/null +++ b/_generated/PublishBuildArtifactsV1_Node20/Tests/L0StoreFileAsTar.ts @@ -0,0 +1,48 @@ +import * as path from 'path'; + +import { TaskMockRunner } from 'azure-pipelines-task-lib/mock-run'; +import * as MockToolRunner from 'azure-pipelines-task-lib/mock-toolrunner'; + +import { goodAnswers } from './goodAnswers'; + +const taskPath: string = path.join(__dirname, '..', 'publishbuildartifacts.js'); +const taskRunner = new TaskMockRunner(taskPath); + +taskRunner.setInput('PathtoPublish', '/bin/release/file'); +taskRunner.setInput('ArtifactName', 'drop'); +taskRunner.setInput('ArtifactType', 'Container'); +taskRunner.setInput('StoreAsTar', 'true'); + +process.env['AGENT_TEMPDIRECTORY'] = process.cwd(); + +taskRunner.setAnswers(goodAnswers); + +taskRunner.registerMock('azure-pipelines-task-lib/toolrunner', MockToolRunner); + +const pathClone = Object.assign({}, path); + +pathClone.basename = function(inputPath) { + if (inputPath === '/bin/release/file') { + return 'file'; + } + + return path.basename(inputPath); +}; + +pathClone.dirname = function(inputPath) { + if (inputPath === '/bin/release/file') { + return '/bin/release'; + } + + return path.dirname(inputPath); +}; + +taskRunner.registerMock('path', pathClone); + +taskRunner.registerMock('os', { + platform() { + return 'linux'; + } +}); + +taskRunner.run(); diff --git a/_generated/PublishBuildArtifactsV1_Node20/Tests/L0StoreFolderAsTar.ts b/_generated/PublishBuildArtifactsV1_Node20/Tests/L0StoreFolderAsTar.ts new file mode 100644 index 000000000000..ee48439df857 --- /dev/null +++ b/_generated/PublishBuildArtifactsV1_Node20/Tests/L0StoreFolderAsTar.ts @@ -0,0 +1,28 @@ +import * as path from 'path'; + +import { TaskMockRunner } from 'azure-pipelines-task-lib/mock-run'; +import * as MockToolRunner from 'azure-pipelines-task-lib/mock-toolrunner'; + +import { goodAnswers } from './goodAnswers'; + +const taskPath: string = path.join(__dirname, '..', 'publishbuildartifacts.js'); +const taskRunner = new TaskMockRunner(taskPath); + +taskRunner.setInput('PathtoPublish', '/bin/release'); +taskRunner.setInput('ArtifactName', 'drop'); +taskRunner.setInput('ArtifactType', 'Container'); +taskRunner.setInput('StoreAsTar', 'true'); + +process.env['AGENT_TEMPDIRECTORY'] = process.cwd(); + +taskRunner.setAnswers(goodAnswers); + +taskRunner.registerMock('azure-pipelines-task-lib/toolrunner', MockToolRunner); + +taskRunner.registerMock('os', { + platform() { + return 'linux'; + } +}); + +taskRunner.run(); diff --git a/_generated/PublishBuildArtifactsV1_Node20/Tests/badAnswers.ts b/_generated/PublishBuildArtifactsV1_Node20/Tests/badAnswers.ts new file mode 100644 index 000000000000..f9e43b2b521c --- /dev/null +++ b/_generated/PublishBuildArtifactsV1_Node20/Tests/badAnswers.ts @@ -0,0 +1,16 @@ +import * as path from 'path'; +import { TaskLibAnswers } from 'azure-pipelines-task-lib/mock-answer'; + +export const badAnswers: TaskLibAnswers = { + 'checkPath': { + '/bin/release': true, + 'C:\\bin\\release': true + }, + 'exec': { + [`powershell.exe -NoLogo -Sta -NoProfile -NonInteractive -ExecutionPolicy Unrestricted -Command & \'${path.resolve(__dirname, '..', 'Invoke-Robocopy.ps1')}\' -Source \'C:\\bin\\release\' -Target \'\\\\UNCShare\\subdir\\drop\' -ParallelCount 1`]: { + 'stdout': 'test stdout from robocopy middle-man', + 'stderr': '', + 'code': 1 + } + } +}; diff --git a/_generated/PublishBuildArtifactsV1_Node20/Tests/goodAnswers.ts b/_generated/PublishBuildArtifactsV1_Node20/Tests/goodAnswers.ts new file mode 100644 index 000000000000..48bd55fa808d --- /dev/null +++ b/_generated/PublishBuildArtifactsV1_Node20/Tests/goodAnswers.ts @@ -0,0 +1,65 @@ +import * as path from 'path'; +import { TaskLibAnswers } from 'azure-pipelines-task-lib/mock-answer'; + +export const goodAnswers: TaskLibAnswers = { + 'which': { + 'tar': 'path/to/tar' + }, + 'checkPath': { + '/bin/release': true, + 'C:\\bin\\release\\': true, + 'C:\\bin\\release': true, + 'C:\\bin\\release\\file.exe': true, + '/bin/release/file': true, + 'path/to/tar': true + }, + 'exec': { + [`powershell.exe -NoLogo -Sta -NoProfile -NonInteractive -ExecutionPolicy Unrestricted -Command & \'${path.resolve(__dirname, '..', 'Invoke-Robocopy.ps1')}\' -Source \'C:\\bin\\release\' -Target \'\\\\UNCShare\\subdir\\drop\' -ParallelCount 1`]: { + 'stdout': 'test stdout from robocopy (no trailing slashes)', + 'stderr': '', + 'code': 0 + }, + [`powershell.exe -NoLogo -Sta -NoProfile -NonInteractive -ExecutionPolicy Unrestricted -Command & \'${path.resolve(__dirname, '..', 'Invoke-Robocopy.ps1')}\' -Source \'C:\\bin\\release\\.\' -Target \'\\\\UNCShare\\subdir\\drop\' -ParallelCount 1`]: { + 'stdout': 'test stdout from robocopy (source with trailing slash)', + 'stderr': '', + 'code': 0 + }, + [`powershell.exe -NoLogo -Sta -NoProfile -NonInteractive -ExecutionPolicy Unrestricted -Command & \'${path.resolve(__dirname, '..', 'Invoke-Robocopy.ps1')}\' -Source \'C:\\bin\\release\' -Target \'\\\\UNCShare\\drop\\.\' -ParallelCount 1`]: { + 'stdout': 'test stdout from robocopy (target with trailing slash)', + 'stderr': '', + 'code': 0 + }, + [`powershell.exe -NoLogo -Sta -NoProfile -NonInteractive -ExecutionPolicy Unrestricted -Command & \'${path.resolve(__dirname, '..', 'Invoke-Robocopy.ps1')}\' -Source \'C:\\bin\\release\' -Target \'\\\\UNCShare\\drop\\.\' -ParallelCount 1 -File \'file.exe\'`]: { + 'stdout': 'test stdout from robocopy (copy a single file)', + 'stderr': '', + 'code': 0 + }, + [`path/to/tar cf ${path.join(process.cwd(), 'drop.tar')} --directory /bin/release file`]: { + 'stdout': 'test stdout from tar: added file to archive', + 'stderr': '', + 'code': 0 + }, + [`path/to/tar cf ${path.join(process.cwd(), 'drop.tar')} --directory /bin/release .`]: { + 'stdout': 'test stdout from tar: added folder to archive', + 'stderr': '', + 'code': 0 + } + }, + 'stats': { + '/bin/release': { + 'isFile': false + }, + 'C:\\bin\\release\\': { + 'isFile': false + }, + 'C:\\bin\\release': { + 'isFile': false + }, + 'C:\\bin\\release\\file.exe': { + 'isFile': true + }, + '/bin/release/file': { + 'isFile': true + } + } +}; diff --git a/_generated/PublishBuildArtifactsV1_Node20/icon.png b/_generated/PublishBuildArtifactsV1_Node20/icon.png new file mode 100644 index 000000000000..183e816aebb9 Binary files /dev/null and b/_generated/PublishBuildArtifactsV1_Node20/icon.png differ diff --git a/_generated/PublishBuildArtifactsV1_Node20/icon.svg b/_generated/PublishBuildArtifactsV1_Node20/icon.svg new file mode 100644 index 000000000000..a28a126c7106 --- /dev/null +++ b/_generated/PublishBuildArtifactsV1_Node20/icon.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/_generated/PublishBuildArtifactsV1_Node20/package-lock.json b/_generated/PublishBuildArtifactsV1_Node20/package-lock.json new file mode 100644 index 000000000000..6d5c04ce12fa --- /dev/null +++ b/_generated/PublishBuildArtifactsV1_Node20/package-lock.json @@ -0,0 +1,483 @@ +{ + "name": "vsts-tasks-publishbuildartifacts", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/concat-stream": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz", + "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==", + "requires": { + "@types/node": "*" + } + }, + "@types/form-data": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", + "integrity": "sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==", + "requires": { + "@types/node": "*" + } + }, + "@types/mocha": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", + "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==" + }, + "@types/node": { + "version": "20.7.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.7.0.tgz", + "integrity": "sha512-zI22/pJW2wUZOVyguFaUL1HABdmSVxpXrzIqkjsHmyUjNhPoWM1CKfvVuXfetHhIok4RY573cqS0mZ1SJEnoTg==" + }, + "@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "azure-pipelines-task-lib": { + "version": "4.0.0-preview", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-4.0.0-preview.tgz", + "integrity": "sha512-BK+VOo42Bec72Wic6Vsm2MaAJezNyF05OYAQS5FuZJM5Z972lZqYpujtSc4BFKUhC3HO+F/Yf4xhAV2tZCzN9Q==", + "requires": { + "minimatch": "3.0.5", + "mockery": "^1.7.0", + "q": "^1.5.1", + "semver": "^5.1.0", + "shelljs": "^0.8.5", + "sync-request": "6.1.0", + "uuid": "^3.0.1" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, + "form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-intrinsic": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", + "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + } + }, + "get-port": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", + "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==" + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "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" + }, + "dependencies": { + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "http-basic": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", + "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", + "requires": { + "caseless": "^0.12.0", + "concat-stream": "^1.6.2", + "http-response-object": "^3.0.1", + "parse-cache-control": "^1.0.1" + } + }, + "http-response-object": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", + "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", + "requires": { + "@types/node": "^10.0.3" + }, + "dependencies": { + "@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + } + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" + }, + "is-core-module": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", + "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", + "requires": { + "has": "^1.0.3" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "mockery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/mockery/-/mockery-1.7.0.tgz", + "integrity": "sha512-gUQA33ayi0tuAhr/rJNZPr7Q7uvlBt4gyJPbi0CDcAfIzIrDu1YgGMFgmAu3stJqBpK57m7+RxUbcS+pt59fKQ==" + }, + "object-inspect": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, + "parse-cache-control": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", + "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "promise": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.2.0.tgz", + "integrity": "sha512-+CMAlLHqwRYwBMXKCP+o8ns7DN+xHDUiI+0nArsiJ9y+kJVPLFxEaSw6Ha9s9H0tftxg2Yzl25wqj9G7m5wLZg==", + "requires": { + "asap": "~2.0.6" + } + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==" + }, + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "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" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "requires": { + "resolve": "^1.1.6" + } + }, + "resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "requires": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, + "sync-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", + "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==", + "requires": { + "http-response-object": "^3.0.1", + "sync-rpc": "^1.2.1", + "then-request": "^6.0.0" + } + }, + "sync-rpc": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz", + "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==", + "requires": { + "get-port": "^3.1.0" + } + }, + "then-request": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", + "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", + "requires": { + "@types/concat-stream": "^1.6.0", + "@types/form-data": "0.0.33", + "@types/node": "^8.0.0", + "@types/qs": "^6.2.31", + "caseless": "~0.12.0", + "concat-stream": "^1.6.0", + "form-data": "^2.2.0", + "http-basic": "^8.1.1", + "http-response-object": "^3.0.1", + "promise": "^8.0.0", + "qs": "^6.4.0" + }, + "dependencies": { + "@types/node": { + "version": "8.10.66", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", + "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==" + } + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, + "typescript": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + } + } +} diff --git a/_generated/PublishBuildArtifactsV1_Node20/package.json b/_generated/PublishBuildArtifactsV1_Node20/package.json new file mode 100644 index 000000000000..b4e4ac326a05 --- /dev/null +++ b/_generated/PublishBuildArtifactsV1_Node20/package.json @@ -0,0 +1,27 @@ +{ + "name": "vsts-tasks-publishbuildartifacts", + "version": "1.0.0", + "description": "Azure Pipelines Publish Build Artifacts Task", + "main": "publishbuildartifacts.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/Microsoft/azure-pipelines-tasks.git" + }, + "author": "Microsoft Corporation", + "license": "MIT", + "bugs": { + "url": "https://github.com/Microsoft/azure-pipelines-tasks/issues" + }, + "homepage": "https://github.com/Microsoft/azure-pipelines-tasks#readme", + "dependencies": { + "@types/node": "^20.3.1", + "@types/mocha": "^5.2.7", + "azure-pipelines-task-lib": "^4.0.0-preview" + }, + "devDependencies": { + "typescript": "5.1.6" + } +} diff --git a/_generated/PublishBuildArtifactsV1_Node20/publishbuildartifacts.ts b/_generated/PublishBuildArtifactsV1_Node20/publishbuildartifacts.ts new file mode 100644 index 000000000000..146a117083b2 --- /dev/null +++ b/_generated/PublishBuildArtifactsV1_Node20/publishbuildartifacts.ts @@ -0,0 +1,266 @@ +import os = require('os'); +import path = require('path'); +var process = require('process'); +import * as fs from 'fs'; +import * as tl from 'azure-pipelines-task-lib/task'; +import * as tr from 'azure-pipelines-task-lib/toolrunner'; +import { error } from 'console'; + +// used for escaping the path to the Invoke-Robocopy.ps1 script that is passed to the powershell command +let pathToScriptPSString = (filePath: string) => { + // remove double quotes + let result: string = filePath.replace(/"/g, ''); + + // double-up single quotes and enclose in single quotes. this is to create a single-quoted string in powershell. + result = result.replace(/'/g, "''"); + return `'${result}'`; +} + +// used for escaping file paths that are ultimately passed to robocopy (via the powershell command) +let pathToRobocopyPSString = (filePath: string) => { + // the path needs to be fixed-up due to a robocopy quirk handling trailing backslashes. + // + // according to http://ss64.com/nt/robocopy.html: + // If either the source or desination are a "quoted long foldername" do not include a + // trailing backslash as this will be treated as an escape character, i.e. "C:\some path\" + // will fail but "C:\some path\\" or "C:\some path\." or "C:\some path" will work. + // + // furthermore, PowerShell implicitly double-quotes arguments to external commands when the + // argument contains unquoted spaces. + // + // note, details on PowerShell quoting rules for external commands can be found in the + // source code here: + // https://github.com/PowerShell/PowerShell/blob/v0.6.0/src/System.Management.Automation/engine/NativeCommandParameterBinder.cs + + // remove double quotes + let result: string = filePath.replace(/"/g, ''); + + // append a "." if the path ends with a backslash. e.g. "C:\some path\" -> "C:\some path\." + if (result.endsWith('\\')) { + result += '.'; + } + + // double-up single quotes and enclose in single quotes. this is to create a single-quoted string in powershell. + result = result.replace(/'/g, "''"); + return `'${result}'`; +} + +/** + * Creates plain (not compressed) tar archive from files located in `filesPath`. + * `filesPath` input may contain a file or a folder with files. + * Puts created tar file to temp directory ($(Agent.TempDirectory)/`artifactName`.tar). + * + * @param filesPath path to a file or a directory of files to add to a tar archive + * @param artifactName the name of the artifact. This will be used to determine tar archive name + * @returns string + */ +function createTarArchive(filesPath: string, artifactName: string): string { + const tar: tr.ToolRunner = tl.tool(tl.which('tar', true)); + const outputFilePath: string = path.join(tl.getVariable('Agent.TempDirectory'), `${artifactName}.tar`); + + if (tl.stats(filesPath).isFile()) { + // If filesPath is a file, we only have to add a single file + tar.arg(['cf', outputFilePath, '--directory', path.dirname(filesPath), path.basename(filesPath)]); + } else { + // If filesPath is a directory, we have to add all files from that directory to the tar archive + tar.arg(['cf', outputFilePath, '--directory', filesPath, '.']); + } + + const tarExecResult: tr.IExecSyncResult = tar.execSync(); + + if (tarExecResult.error || tarExecResult.code !== 0) { + throw new Error(`Couldn't add artifact files to a tar archive: ${tarExecResult.error}`); + } + + return outputFilePath; +} + +/** + * If the `StoreAsTar` input is set to false, return path to publish unaltered; + * otherwise add all files from this path to a tar archive and return path to that archive + * + * @param pathToPublish value of `PathtoPublish` input + * @param shouldStoreAsTar value of `PathtoPublish` input + * @param artifactName value of `ArtifactName` input + * @returns string + */ +function getPathToUploadAndCreateTarIfNeeded( + pathToPublish: string, + shouldStoreAsTar: boolean, + artifactName: string +): string { + if (!shouldStoreAsTar) { + return pathToPublish; + } + + return createTarArchive(pathToPublish, artifactName); +} + +async function run() { + try { + tl.setResourcePath(path.join(__dirname, 'task.json')); + + const shouldStoreAsTar: boolean = tl.getBoolInput('StoreAsTar'); + const isWindows = os.platform() === 'win32'; + if (isWindows && shouldStoreAsTar) { + tl.setResult(tl.TaskResult.Failed, tl.loc('TarExtractionNotSupportedInWindows')); + return; + } + + // pathToPublish is a folder or a single file that may be added to a tar archive later + const pathToPublish: string = tl.getPathInput('PathtoPublish', true, true); + var artifactName: string = tl.getInput('ArtifactName', true); + + // if FF EnableBuildArtifactsPlusSignWorkaround is enabled or AZP_TASK_FF_ENABLE_BUILDARTIFACTS_PLUS_SIGN_WORKAROUND environment variable is set: + // replacing '+' symbol by its representation ' '(space) - workaround for the DownloadBuildArtifactV0 task, + // where downloading of part of artifact is not possible if there is a plus symbol + const enableBuildArtifactsPlusSignWorkaround = process.env.AZP_TASK_FF_ENABLE_BUILDARTIFACTS_PLUS_SIGN_WORKAROUND ? process.env.AZP_TASK_FF_ENABLE_BUILDARTIFACTS_PLUS_SIGN_WORKAROUND.toLowerCase() === "true" : false; + + if (enableBuildArtifactsPlusSignWorkaround) + artifactName = artifactName.replace(/\+/g, ' '); + + // pathToUpload is an actual folder or file that will get uploaded + const pathToUpload: string = getPathToUploadAndCreateTarIfNeeded(pathToPublish, shouldStoreAsTar, artifactName); + + let artifactType: string = tl.getInput('ArtifactType', true); + + + let hostType = tl.getVariable('system.hostType'); + if ((hostType && hostType.toUpperCase() != 'BUILD') && (artifactType.toUpperCase() !== "FILEPATH")) { + tl.setResult(tl.TaskResult.Failed, tl.loc('ErrorHostTypeNotSupported')); + return; + } + + + artifactType = artifactType.toLowerCase(); + let data = { + artifacttype: artifactType, + artifactname: artifactName + }; + + let maxArtifactSize: number = getMaxArtifactSize(); + if (maxArtifactSize != 0 ){ + let artifactSize : number = getArtifactSize(pathToUpload) + if (artifactSize > maxArtifactSize){ + tl.warning(tl.loc('ArtifactSizeExceeded', artifactSize, maxArtifactSize)); + } + } + + // upload or copy + if (artifactType === "container") { + data["containerfolder"] = artifactName; + + // add localpath to ##vso command's properties for back compat of old Xplat agent + data["localpath"] = pathToUpload; + tl.command("artifact.upload", data, pathToUpload); + } + else if (artifactType === "filepath") { + let targetPath: string = tl.getInput('TargetPath', true); + let artifactPath: string = path.join(targetPath, artifactName); + data['artifactlocation'] = targetPath; // artifactlocation for back compat with old xplat agent + + if (os.platform() == 'win32') { + tl.mkdirP(artifactPath); + + // create the artifact. at this point, mkdirP already succeeded so the path is good. + // the artifact should get cleaned up during retention even if the copy fails in the + // middle + tl.command("artifact.associate", data, targetPath); + + let parallel: boolean = tl.getBoolInput('Parallel', false); + let parallelCount = 1; + if (parallel) { + parallelCount = getParallelCount(); + } + + // copy the files + let script: string = path.join(__dirname, 'Invoke-Robocopy.ps1'); + let command: string = `& ${pathToScriptPSString(script)} -Source ${pathToRobocopyPSString(pathToUpload)} -Target ${pathToRobocopyPSString(artifactPath)} -ParallelCount ${parallelCount}` + if (tl.stats(pathToUpload).isFile()) { + let parentFolder = path.dirname(pathToUpload); + let file = path.basename(pathToUpload); + command = `& ${pathToScriptPSString(script)} -Source ${pathToRobocopyPSString(parentFolder)} -Target ${pathToRobocopyPSString(artifactPath)} -ParallelCount ${parallelCount} -File '${file}'` + } + + let powershell = new tr.ToolRunner('powershell.exe'); + powershell.arg('-NoLogo'); + powershell.arg('-Sta'); + powershell.arg('-NoProfile'); + powershell.arg('-NonInteractive'); + powershell.arg('-ExecutionPolicy'); + powershell.arg('Unrestricted'); + powershell.arg('-Command'); + powershell.arg(command); + powershell.on('stdout', (buffer: Buffer) => { + process.stdout.write(buffer); + }); + powershell.on('stderr', (buffer: Buffer) => { + process.stderr.write(buffer); + }); + let execOptions = { silent: true } as tr.IExecOptions; + await powershell.exec(execOptions); + } + else { + // file share artifacts are not currently supported on OSX/Linux. + tl.setResult(tl.TaskResult.Failed, tl.loc('ErrorFileShareLinux')); + return; + } + } + } + catch (err) { + tl.setResult(tl.TaskResult.Failed, tl.loc('PublishBuildArtifactsFailed', err.message)); + } + +} + +function getParallelCount(): number { + let result = 8; + let inputValue: string = tl.getInput('ParallelCount', false); + if (Number.isNaN(Number(inputValue))) { + tl.warning(tl.loc('UnexpectedParallelCount', inputValue)); + } + else { + let parsedInput = parseInt(inputValue); + if (parsedInput < 1) { + tl.warning(tl.loc('UnexpectedParallelCount', parsedInput)); + result = 1; + } + else if (parsedInput > 128) { + tl.warning(tl.loc('UnexpectedParallelCount', parsedInput)); + result = 128; + } + else { + result = parsedInput; + } + } + + return result; +} + +function getMaxArtifactSize(): number { + let result = 0; + let inputValue: string = tl.getInput('MaxArtifactSize', false); + if (!(Number.isNaN(Number(inputValue)))) { + result = parseInt(inputValue); + } + return result; +} + + +function getArtifactSize( + pathToUpload : string +): number { + let totalSize = 0; + if(tl.stats(pathToUpload).isFile()) { + totalSize = tl.stats(pathToUpload).size; + } + else if(tl.stats(pathToUpload).isDirectory()) { + const files = fs.readdirSync(pathToUpload); + files.forEach (file => { + totalSize = totalSize + getArtifactSize(path.join(pathToUpload, file)); + }) + } + return totalSize; +} + +run(); diff --git a/_generated/PublishBuildArtifactsV1_Node20/task.json b/_generated/PublishBuildArtifactsV1_Node20/task.json new file mode 100644 index 000000000000..300a1f9d34b9 --- /dev/null +++ b/_generated/PublishBuildArtifactsV1_Node20/task.json @@ -0,0 +1,131 @@ +{ + "id": "2FF763A7-CE83-4E1F-BC89-0AE63477CEBE", + "name": "PublishBuildArtifacts", + "friendlyName": "Publish build artifacts", + "description": "Publish build artifacts to Azure Pipelines or a Windows file share", + "helpUrl": "https://docs.microsoft.com/azure/devops/pipelines/tasks/utility/publish-build-artifacts", + "helpMarkDown": "[Learn more about this task](https://go.microsoft.com/fwlink/?LinkID=708390)", + "category": "Utility", + "visibility": [ + "Build" + ], + "author": "Microsoft Corporation", + "version": { + "Major": 1, + "Minor": 229, + "Patch": 1 + }, + "demands": [], + "minimumAgentVersion": "1.91.0", + "groups": [ + { + "name": "advanced", + "displayName": "Advanced", + "isExpanded": false + } + ], + "inputs": [ + { + "name": "PathtoPublish", + "type": "filePath", + "label": "Path to publish", + "defaultValue": "$(Build.ArtifactStagingDirectory)", + "required": true, + "helpMarkDown": "The folder or file path to publish. This can be a fully-qualified path or a path relative to the root of the repository. Wildcards are not supported. [Variables](https://go.microsoft.com/fwlink/?LinkID=550988) are supported. Example: $(Build.ArtifactStagingDirectory)" + }, + { + "name": "ArtifactName", + "type": "string", + "label": "Artifact name", + "defaultValue": "drop", + "required": true, + "helpMarkDown": "The name of the artifact to create in the publish location." + }, + { + "name": "ArtifactType", + "aliases": [ + "publishLocation" + ], + "type": "pickList", + "label": "Artifact publish location", + "defaultValue": "Container", + "required": true, + "helpMarkDown": "Choose whether to store the artifact in Azure Pipelines, or to copy it to a file share that must be accessible from the build agent.", + "options": { + "Container": "Azure Pipelines", + "FilePath": "A file share" + } + }, + { + "name": "MaxArtifactSize", + "type": "int", + "label": "Max Artifact Size", + "defaultValue": 0, + "required": false, + "helpMarkDown": "Maximum limit on the size of artifacts to be published in bytes. Put 0 if you don't want to set any limit." + }, + { + "name": "TargetPath", + "type": "string", + "label": "File share path", + "defaultValue": "", + "required": true, + "helpMarkDown": "The file share to which the artifact files will be copied. This can include variables. Example: \\\\\\\\my\\\\share\\\\$(Build.DefinitionName)\\\\$(Build.BuildNumber). Publishing artifacts from a Linux or macOS agent to a file share is not supported.", + "visibleRule": "ArtifactType = FilePath" + }, + { + "name": "Parallel", + "type": "boolean", + "label": "Parallel copy", + "defaultValue": "false", + "required": false, + "helpMarkDown": "Select whether to copy files in parallel using multiple threads for greater potential throughput. If this setting is not enabled, one thread will be used.", + "visibleRule": "ArtifactType = FilePath" + }, + { + "name": "ParallelCount", + "type": "int", + "label": "Parallel count", + "defaultValue": 8, + "required": false, + "helpMarkDown": "Enter the degree of parallelism, or number of threads used, to perform the copy. The value must be at least 1 and not greater than 128.", + "visibleRule": "ArtifactType = FilePath && Parallel = true" + }, + { + "name": "StoreAsTar", + "type": "boolean", + "label": "Tar the artifact before uploading", + "defaultValue": "false", + "groupName": "advanced", + "required": false, + "helpMarkDown": "Add all files from the publish path to a tar archive before uploading. This allows you to preserve the UNIX file permissions. Use `extractTars` option of DownloadBuildArtifacts task to extract the downloaded items automatically." + } + ], + "instanceNameFormat": "Publish Artifact: $(ArtifactName)", + "execution": { + "Node10": { + "target": "publishbuildartifacts.js", + "argumentFormat": "" + }, + "Node16": { + "target": "publishbuildartifacts.js", + "argumentFormat": "" + }, + "Node20": { + "target": "publishbuildartifacts.js", + "argumentFormat": "" + } + }, + "messages": { + "ErrorFileShareLinux": "Publishing artifacts from a Linux or macOS agent to a file share is not supported. Change the artifact type to `Azure Pipelines` or use a Windows agent.", + "ErrorHostTypeNotSupported": "This task must run in a build to publish artifacts to Azure Pipelines.", + "PublishBuildArtifactsFailed": "Publishing build artifacts failed with an error: %s", + "UnexpectedParallelCount": "Unsupported parallel count '%s'. Enter a number between 1 and 128.", + "TarExtractionNotSupportedInWindows": "Tar extraction is not supported on Windows", + "ArtifactSizeExceeded": "The size of artifacts being published is %s bytes which is larger than the maximum limit %s bytes set for the published size of artifacts." + }, + "_buildConfigMapping": { + "Default": "1.229.0", + "Node20-225": "1.229.1" + } +} \ No newline at end of file diff --git a/_generated/PublishBuildArtifactsV1_Node20/task.loc.json b/_generated/PublishBuildArtifactsV1_Node20/task.loc.json new file mode 100644 index 000000000000..f3bedeea92b5 --- /dev/null +++ b/_generated/PublishBuildArtifactsV1_Node20/task.loc.json @@ -0,0 +1,131 @@ +{ + "id": "2FF763A7-CE83-4E1F-BC89-0AE63477CEBE", + "name": "PublishBuildArtifacts", + "friendlyName": "ms-resource:loc.friendlyName", + "description": "ms-resource:loc.description", + "helpUrl": "https://docs.microsoft.com/azure/devops/pipelines/tasks/utility/publish-build-artifacts", + "helpMarkDown": "ms-resource:loc.helpMarkDown", + "category": "Utility", + "visibility": [ + "Build" + ], + "author": "Microsoft Corporation", + "version": { + "Major": 1, + "Minor": 229, + "Patch": 1 + }, + "demands": [], + "minimumAgentVersion": "1.91.0", + "groups": [ + { + "name": "advanced", + "displayName": "ms-resource:loc.group.displayName.advanced", + "isExpanded": false + } + ], + "inputs": [ + { + "name": "PathtoPublish", + "type": "filePath", + "label": "ms-resource:loc.input.label.PathtoPublish", + "defaultValue": "$(Build.ArtifactStagingDirectory)", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.PathtoPublish" + }, + { + "name": "ArtifactName", + "type": "string", + "label": "ms-resource:loc.input.label.ArtifactName", + "defaultValue": "drop", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.ArtifactName" + }, + { + "name": "ArtifactType", + "aliases": [ + "publishLocation" + ], + "type": "pickList", + "label": "ms-resource:loc.input.label.ArtifactType", + "defaultValue": "Container", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.ArtifactType", + "options": { + "Container": "Azure Pipelines", + "FilePath": "A file share" + } + }, + { + "name": "MaxArtifactSize", + "type": "int", + "label": "ms-resource:loc.input.label.MaxArtifactSize", + "defaultValue": 0, + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.MaxArtifactSize" + }, + { + "name": "TargetPath", + "type": "string", + "label": "ms-resource:loc.input.label.TargetPath", + "defaultValue": "", + "required": true, + "helpMarkDown": "ms-resource:loc.input.help.TargetPath", + "visibleRule": "ArtifactType = FilePath" + }, + { + "name": "Parallel", + "type": "boolean", + "label": "ms-resource:loc.input.label.Parallel", + "defaultValue": "false", + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.Parallel", + "visibleRule": "ArtifactType = FilePath" + }, + { + "name": "ParallelCount", + "type": "int", + "label": "ms-resource:loc.input.label.ParallelCount", + "defaultValue": 8, + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.ParallelCount", + "visibleRule": "ArtifactType = FilePath && Parallel = true" + }, + { + "name": "StoreAsTar", + "type": "boolean", + "label": "ms-resource:loc.input.label.StoreAsTar", + "defaultValue": "false", + "groupName": "advanced", + "required": false, + "helpMarkDown": "ms-resource:loc.input.help.StoreAsTar" + } + ], + "instanceNameFormat": "ms-resource:loc.instanceNameFormat", + "execution": { + "Node10": { + "target": "publishbuildartifacts.js", + "argumentFormat": "" + }, + "Node16": { + "target": "publishbuildartifacts.js", + "argumentFormat": "" + }, + "Node20": { + "target": "publishbuildartifacts.js", + "argumentFormat": "" + } + }, + "messages": { + "ErrorFileShareLinux": "ms-resource:loc.messages.ErrorFileShareLinux", + "ErrorHostTypeNotSupported": "ms-resource:loc.messages.ErrorHostTypeNotSupported", + "PublishBuildArtifactsFailed": "ms-resource:loc.messages.PublishBuildArtifactsFailed", + "UnexpectedParallelCount": "ms-resource:loc.messages.UnexpectedParallelCount", + "TarExtractionNotSupportedInWindows": "ms-resource:loc.messages.TarExtractionNotSupportedInWindows", + "ArtifactSizeExceeded": "ms-resource:loc.messages.ArtifactSizeExceeded" + }, + "_buildConfigMapping": { + "Default": "1.229.0", + "Node20-225": "1.229.1" + } +} \ No newline at end of file diff --git a/_generated/PublishBuildArtifactsV1_Node20/tsconfig.json b/_generated/PublishBuildArtifactsV1_Node20/tsconfig.json new file mode 100644 index 000000000000..0438b79f69ac --- /dev/null +++ b/_generated/PublishBuildArtifactsV1_Node20/tsconfig.json @@ -0,0 +1,6 @@ +{ + "compilerOptions": { + "target": "ES6", + "module": "commonjs" + } +} \ No newline at end of file diff --git a/ci/build-all-steps.yml b/ci/build-all-steps.yml index 7d2f3854d9db..0f711670c3e2 100644 --- a/ci/build-all-steps.yml +++ b/ci/build-all-steps.yml @@ -59,7 +59,7 @@ steps: displayName: Check that tasks has no duplicated libs condition: and(succeeded(), eq(variables['build.reason'], 'PullRequest'), ne(variables['numTasks'], 0)) -- script: node ./ci/check-downgrading.js --task "$(task_pattern)" --sprint $(currentSprint) --week $(currentSprintWeek) +- script: node ./ci/check-downgrading.js --task "$(task_pattern_fordowngradingcheck)" --sprint $(currentSprint) --week $(currentSprintWeek) displayName: Check for downgrading tasks condition: | and( diff --git a/ci/filter-tasks.js b/ci/filter-tasks.js index e323087b8e2e..12bacf6e11a9 100644 --- a/ci/filter-tasks.js +++ b/ci/filter-tasks.js @@ -115,7 +115,7 @@ async function getPullRequestBranches (pullRequestId) { return { source: data.head.ref, target: data.base.ref }; } -async function getTasksToBuildForPR (prId) { +async function getTasksToBuildForPR (prId, forDowngradingCheck) { // Takes in a git source branch, diffs it with master, and returns a list of tasks that could have been affected by the changes. let sourceBranch, targetBranch; @@ -150,8 +150,21 @@ async function getTasksToBuildForPR (prId) { console.log('##vso[task.logissue type=warning;sourcepath=ci/filter-task.js;linenumber=125;]Unable to reach github, building all tasks', err); return makeOptions.tasks; } + var baseCommit = run('git merge-base ' + sourceBranch + ' origin/' + targetBranch); - run('git --no-pager diff --name-only ' + baseCommit + ' ' + sourceBranch).split('\n').forEach(filePath => { + + var diffExtra = ""; + + if(forDowngradingCheck) + { + if (os.platform() == 'win32') { + diffExtra = " -- . :^^**/_buildConfigs/**"; + } else { + diffExtra = " -- . :^**/_buildConfigs/**"; + } + } + + run('git --no-pager diff --name-only ' + baseCommit + ' ' + sourceBranch + diffExtra).split('\n').forEach(filePath => { if (filePath.slice(0, 5) == 'Tasks') { var taskPath = filePath.slice(6); if(taskPath.slice(0, 6) == 'Common') { @@ -197,9 +210,11 @@ async function getTasksToBuildForPR (prId) { return toBeBuilt; } -var setTaskVariables = function(tasks) { +var setTaskVariables = function(tasks, tasksForDowngradingCheck) { console.log('tasks: ' + JSON.stringify(tasks)); + console.log('tasksForDowngradingCheck: ' + JSON.stringify(tasksForDowngradingCheck)); console.log('##vso[task.setVariable variable=task_pattern]@(' + tasks.join('|') + ')'); + console.log('##vso[task.setVariable variable=task_pattern_fordowngradingcheck]@(' + tasksForDowngradingCheck.join('|') + ')'); console.log('##vso[task.setVariable variable=numTasks]' + tasks.length); } @@ -211,7 +226,7 @@ async function filterTasks () { if (buildReason == 'individualci' || buildReason == 'batchedci' || buildReason == 'schedule' || forceCourtesyPush) { // If CI, we will compare any tasks that have updated versions. const tasks = await getTasksToBuildForCI(); - setTaskVariables(tasks); + setTaskVariables(tasks, tasks); } else { const buildSourceBranch = process.env['BUILD_SOURCEBRANCH']; // If CI for PR, the `Build.SourceBranch` pipeline variable == `refs/pull/${prId}/merge` @@ -220,16 +235,18 @@ async function filterTasks () { if (buildReason == 'pullrequest') { // If PR, we will compare any tasks that could have been affected based on the diff. - const tasks = await getTasksToBuildForPR(); - setTaskVariables(tasks); + const tasks = await getTasksToBuildForPR(null, false); + const tasksForDowngradingCheck = await getTasksToBuildForPR(null, true); + setTaskVariables(tasks, tasksForDowngradingCheck); } else if (buildReason == 'manual' && prIdMatch) { // Manual rerun for PR. const prId = prIdMatch[1]; - const tasks = await getTasksToBuildForPR(prId); - setTaskVariables(tasks); + const tasks = await getTasksToBuildForPR(prId, false); + const tasksForDowngradingCheck = await getTasksToBuildForPR(prId, true); + setTaskVariables(tasks, tasksForDowngradingCheck); } else { // If other, build everything. - setTaskVariables(makeOptions.tasks); + setTaskVariables(makeOptions.tasks, makeOptions.tasks); } } } catch (error) { diff --git a/make-options.json b/make-options.json index 822c5085a53c..ab435c0131a9 100644 --- a/make-options.json +++ b/make-options.json @@ -233,6 +233,26 @@ "AzureRmWebAppDeploymentV3" ], "Node20": [ - "MavenV2" + "AndroidSigningV2", + "AndroidSigningV3", + "ANTV1", + "ArchiveFilesV2", + "BashV3", + "CMakeV1", + "CmdLineV2", + "CocoaPodsV0", + "CopyFilesV2", + "CopyFilesOverSSHV0", + "CUrlUploaderV2", + "DecryptFileV1", + "DeleteFilesV1", + "DownloadSecureFileV1", + "ExtractFilesV1", + "FtpUploadV1", + "GruntV0", + "GulpV0", + "GulpV1", + "NodeTaskRunnerInstallerV0", + "PublishBuildArtifactsV1" ] } \ No newline at end of file diff --git a/make-util.js b/make-util.js index 76036df43ad4..b8c37d6b1d03 100644 --- a/make-util.js +++ b/make-util.js @@ -1924,7 +1924,7 @@ function syncGeneratedFilesWrapper(originalFunction, basicGenTaskPath, callGenTa // ignore everything except package.json, package-lock.json, npm-shrinkwrap.json if (!runtimeChangedFiles.some((pattern) => item.indexOf(pattern) !== -1)) return false; - return path.normalize(item) != root; + return true; }); @@ -1936,10 +1936,6 @@ function syncGeneratedFilesWrapper(originalFunction, basicGenTaskPath, callGenTa dest = path.join(__dirname, 'Tasks', baseTaskName, '_buildConfigs', config, relativePath); } - // if the destination path doesn't exist in Task/_buildConfigs, - // we assume that the file was added by the generator from the source and will be handles while we build default task version - if (!fs.existsSync(dest) && config) return - const folderPath = path.dirname(dest); if (!fs.existsSync(folderPath)) { console.log(`Creating folder ${folderPath}`); diff --git a/make.js b/make.js index 35dae645fa34..0e20d29864d9 100644 --- a/make.js +++ b/make.js @@ -206,7 +206,7 @@ CLI.serverBuild = function(/** @type {{ task: string }} */ argv) { util.processGeneratedTasks(baseConfigToolPath, taskList, makeOptions, callGenTaskDuringBuild); - // Ensure we wrap build function after generator's changes to store only files that changes after the build + // Wrap build function to store files that changes after the build const buildTaskWrapped = util.syncGeneratedFilesWrapper(buildTask, genTaskPath, callGenTaskDuringBuild); const allTasksNode20 = allTasks.filter((taskName) => { return getNodeVersion(taskName) == 20; @@ -240,14 +240,14 @@ function getNodeVersion (taskName) { // We prefer tasks in _generated folder because they might contain node20 version // while the tasks in Tasks/ folder still could use only node16 handler if (fs.existsSync(packageJsonPath)) { - console.log(`Found package.json for ${taskName} in _generated folder`); + console.log(`Found package.json for ${taskName} in _generated folder ${packageJsonPath}`); } else { packageJsonPath = path.join(tasksPath, taskName, "package.json"); if (!fs.existsSync(packageJsonPath)) { console.error(`Unable to find package.json file for ${taskName} in _generated folder or Tasks folder, using default node 10.`); return 10; } - console.log(`Found package.json for ${taskName} in Tasks folder`) + console.log(`Found package.json for ${taskName} in Tasks folder ${packageJsonPath}`) } var packageJsonContents = fs.readFileSync(packageJsonPath, { encoding: 'utf-8' }); @@ -255,6 +255,7 @@ function getNodeVersion (taskName) { if (packageJson.dependencies && packageJson.dependencies["@types/node"]) { // Extracting major version from the node version const nodeVersion = packageJson.dependencies["@types/node"].replace('^', ''); + console.log(`Node verion from @types/node in package.json is ${nodeVersion} returning ${nodeVersion.split('.')[0]}`); return nodeVersion.split('.')[0]; } else { console.log("Node version not found in dependencies, using default node 10.");