From 37ad7e849a2acefd2372444f3847e9f5274b567b Mon Sep 17 00:00:00 2001 From: "Dmitrii Bobreshev (Akvelon INC)" Date: Tue, 31 Oct 2023 14:25:31 +0100 Subject: [PATCH 1/2] [AzureSpringCloudV0] - Migrate task to Node20 -- Migrated task using build config generator --- .../Node20/Tests/package-lock.json | 908 +++++++++ .../_buildConfigs/Node20/Tests/package.json | 23 + .../_buildConfigs/Node20/package-lock.json | 1767 +++++++++++++++++ .../_buildConfigs/Node20/package.json | 44 + Tasks/AzureSpringCloudV0/task.json | 4 +- Tasks/AzureSpringCloudV0/task.loc.json | 4 +- _generated/AzureSpringCloudV0.versionmap.txt | 4 +- .../resources.resjson/de-DE/resources.resjson | 73 + .../resources.resjson/en-US/resources.resjson | 73 + .../resources.resjson/es-ES/resources.resjson | 73 + .../resources.resjson/fr-FR/resources.resjson | 73 + .../resources.resjson/it-IT/resources.resjson | 73 + .../resources.resjson/ja-JP/resources.resjson | 73 + .../resources.resjson/ko-KR/resources.resjson | 73 + .../resources.resjson/ru-RU/resources.resjson | 73 + .../resources.resjson/zh-CN/resources.resjson | 73 + .../resources.resjson/zh-TW/resources.resjson | 73 + ...reSpringAppsDeploymentProviderUnitTests.ts | 25 + .../Tests/AzureSpringAppsUnitTests.ts | 115 ++ ...ymentFailsDeploymentDoesNotAlreadyExist.ts | 46 + ...entFailsDeploymentDoesNotAlreadyExistL0.ts | 79 + ...dDeploymentFailsWhenTwoDeploymentsExist.ts | 46 + ...eploymentFailsWhenTwoDeploymentsExistL0.ts | 117 ++ ...eDeploymentFailsWhenNoStagingDeployment.ts | 40 + ...eploymentFailsWhenNoStagingDeploymentL0.ts | 93 + .../Tests/DeleteStagingDeploymentTest.ts | 40 + .../Tests/DeleteStagingDeploymentTestL0.ts | 126 ++ .../DeploymentCustomImageToStagingSucceeds.ts | 48 + ...eploymentCustomImageToStagingSucceedsL0.ts | 169 ++ .../DeploymentFailsWhenBuilderNotExist.ts | 46 + .../DeploymentFailsWhenBuilderNotExistL0.ts | 185 ++ ...loymentFailsWithInsufficientDeployments.ts | 44 + ...ymentFailsWithInsufficientDeploymentsL0.ts | 82 + .../Tests/DeploymentToStagingSucceeds.ts | 45 + .../Tests/DeploymentToStagingSucceedsL0.ts | 206 ++ ...oymentToStagingSucceedsWithBuildService.ts | 45 + ...mentToStagingSucceedsWithBuildServiceL0.ts | 225 +++ _generated/AzureSpringCloudV0/Tests/L0.ts | 53 + ...ploymentFailsWhenDeploymentDoesNotExist.ts | 61 + ...oymentFailsWhenDeploymentDoesNotExistL0.ts | 112 ++ .../SetProductionNamedDeploymentSucceeds.ts | 39 + .../SetProductionNamedDeploymentSucceedsL0.ts | 135 ++ ...tProductionUseStagingFailsWithNoStaging.ts | 41 + ...roductionUseStagingFailsWithNoStagingL0.ts | 81 + .../Tests/SetProductionUseStagingSucceeds.ts | 40 + .../SetProductionUseStagingSucceedsL0.ts | 135 ++ .../AzureSpringCloudV0/Tests/mock_utils.ts | 123 ++ .../Tests/package-lock.json | 908 +++++++++ .../AzureSpringCloudV0/Tests/package.json | 23 + .../azurespringappsdeployment.ts | 36 + .../AzureSpringAppsDeploymentProvider.ts | 229 +++ .../azure-arm-spring-apps.ts | 746 +++++++ .../deploymentProvider/azure-storage.ts | 18 + _generated/AzureSpringCloudV0/icon.png | Bin 0 -> 1907 bytes _generated/AzureSpringCloudV0/icon.svg | 74 + _generated/AzureSpringCloudV0/make.json | 21 + .../operations/AzureResourceFilterUtility.ts | 23 + .../operations/taskparameters.ts | 110 + .../AzureSpringCloudV0/package-lock.json | 1759 ++++++++++++++++ _generated/AzureSpringCloudV0/package.json | 44 + _generated/AzureSpringCloudV0/task.json | 343 ++++ _generated/AzureSpringCloudV0/task.loc.json | 343 ++++ _generated/AzureSpringCloudV0/tsconfig.json | 9 + _generated/AzureSpringCloudV0_Node20/.npmrc | 1 + .../resources.resjson/de-DE/resources.resjson | 73 + .../resources.resjson/en-US/resources.resjson | 73 + .../resources.resjson/es-ES/resources.resjson | 73 + .../resources.resjson/fr-FR/resources.resjson | 73 + .../resources.resjson/it-IT/resources.resjson | 73 + .../resources.resjson/ja-JP/resources.resjson | 73 + .../resources.resjson/ko-KR/resources.resjson | 73 + .../resources.resjson/ru-RU/resources.resjson | 73 + .../resources.resjson/zh-CN/resources.resjson | 73 + .../resources.resjson/zh-TW/resources.resjson | 73 + ...reSpringAppsDeploymentProviderUnitTests.ts | 25 + .../Tests/AzureSpringAppsUnitTests.ts | 115 ++ ...ymentFailsDeploymentDoesNotAlreadyExist.ts | 46 + ...entFailsDeploymentDoesNotAlreadyExistL0.ts | 79 + ...dDeploymentFailsWhenTwoDeploymentsExist.ts | 46 + ...eploymentFailsWhenTwoDeploymentsExistL0.ts | 117 ++ ...eDeploymentFailsWhenNoStagingDeployment.ts | 40 + ...eploymentFailsWhenNoStagingDeploymentL0.ts | 93 + .../Tests/DeleteStagingDeploymentTest.ts | 40 + .../Tests/DeleteStagingDeploymentTestL0.ts | 126 ++ .../DeploymentCustomImageToStagingSucceeds.ts | 48 + ...eploymentCustomImageToStagingSucceedsL0.ts | 169 ++ .../DeploymentFailsWhenBuilderNotExist.ts | 46 + .../DeploymentFailsWhenBuilderNotExistL0.ts | 185 ++ ...loymentFailsWithInsufficientDeployments.ts | 44 + ...ymentFailsWithInsufficientDeploymentsL0.ts | 82 + .../Tests/DeploymentToStagingSucceeds.ts | 45 + .../Tests/DeploymentToStagingSucceedsL0.ts | 206 ++ ...oymentToStagingSucceedsWithBuildService.ts | 45 + ...mentToStagingSucceedsWithBuildServiceL0.ts | 225 +++ .../AzureSpringCloudV0_Node20/Tests/L0.ts | 53 + ...ploymentFailsWhenDeploymentDoesNotExist.ts | 61 + ...oymentFailsWhenDeploymentDoesNotExistL0.ts | 112 ++ .../SetProductionNamedDeploymentSucceeds.ts | 39 + .../SetProductionNamedDeploymentSucceedsL0.ts | 135 ++ ...tProductionUseStagingFailsWithNoStaging.ts | 41 + ...roductionUseStagingFailsWithNoStagingL0.ts | 81 + .../Tests/SetProductionUseStagingSucceeds.ts | 40 + .../SetProductionUseStagingSucceedsL0.ts | 135 ++ .../Tests/mock_utils.ts | 123 ++ .../Tests/package-lock.json | 908 +++++++++ .../Tests/package.json | 23 + .../azurespringappsdeployment.ts | 36 + .../AzureSpringAppsDeploymentProvider.ts | 229 +++ .../azure-arm-spring-apps.ts | 746 +++++++ .../deploymentProvider/azure-storage.ts | 18 + _generated/AzureSpringCloudV0_Node20/icon.png | Bin 0 -> 1907 bytes _generated/AzureSpringCloudV0_Node20/icon.svg | 74 + .../AzureSpringCloudV0_Node20/make.json | 21 + .../operations/AzureResourceFilterUtility.ts | 23 + .../operations/taskparameters.ts | 110 + .../package-lock.json | 1767 +++++++++++++++++ .../AzureSpringCloudV0_Node20/package.json | 44 + .../AzureSpringCloudV0_Node20/task.json | 347 ++++ .../AzureSpringCloudV0_Node20/task.loc.json | 347 ++++ .../AzureSpringCloudV0_Node20/tsconfig.json | 9 + make-options.json | 4 +- 121 files changed, 18884 insertions(+), 7 deletions(-) create mode 100644 Tasks/AzureSpringCloudV0/_buildConfigs/Node20/Tests/package-lock.json create mode 100644 Tasks/AzureSpringCloudV0/_buildConfigs/Node20/Tests/package.json create mode 100644 Tasks/AzureSpringCloudV0/_buildConfigs/Node20/package-lock.json create mode 100644 Tasks/AzureSpringCloudV0/_buildConfigs/Node20/package.json create mode 100644 _generated/AzureSpringCloudV0/Strings/resources.resjson/de-DE/resources.resjson create mode 100644 _generated/AzureSpringCloudV0/Strings/resources.resjson/en-US/resources.resjson create mode 100644 _generated/AzureSpringCloudV0/Strings/resources.resjson/es-ES/resources.resjson create mode 100644 _generated/AzureSpringCloudV0/Strings/resources.resjson/fr-FR/resources.resjson create mode 100644 _generated/AzureSpringCloudV0/Strings/resources.resjson/it-IT/resources.resjson create mode 100644 _generated/AzureSpringCloudV0/Strings/resources.resjson/ja-JP/resources.resjson create mode 100644 _generated/AzureSpringCloudV0/Strings/resources.resjson/ko-KR/resources.resjson create mode 100644 _generated/AzureSpringCloudV0/Strings/resources.resjson/ru-RU/resources.resjson create mode 100644 _generated/AzureSpringCloudV0/Strings/resources.resjson/zh-CN/resources.resjson create mode 100644 _generated/AzureSpringCloudV0/Strings/resources.resjson/zh-TW/resources.resjson create mode 100644 _generated/AzureSpringCloudV0/Tests/AzureSpringAppsDeploymentProviderUnitTests.ts create mode 100644 _generated/AzureSpringCloudV0/Tests/AzureSpringAppsUnitTests.ts create mode 100644 _generated/AzureSpringCloudV0/Tests/CreateNamedDeploymentFailsDeploymentDoesNotAlreadyExist.ts create mode 100644 _generated/AzureSpringCloudV0/Tests/CreateNamedDeploymentFailsDeploymentDoesNotAlreadyExistL0.ts create mode 100644 _generated/AzureSpringCloudV0/Tests/CreateNamedDeploymentFailsWhenTwoDeploymentsExist.ts create mode 100644 _generated/AzureSpringCloudV0/Tests/CreateNamedDeploymentFailsWhenTwoDeploymentsExistL0.ts create mode 100644 _generated/AzureSpringCloudV0/Tests/DeleteDeploymentFailsWhenNoStagingDeployment.ts create mode 100644 _generated/AzureSpringCloudV0/Tests/DeleteDeploymentFailsWhenNoStagingDeploymentL0.ts create mode 100644 _generated/AzureSpringCloudV0/Tests/DeleteStagingDeploymentTest.ts create mode 100644 _generated/AzureSpringCloudV0/Tests/DeleteStagingDeploymentTestL0.ts create mode 100644 _generated/AzureSpringCloudV0/Tests/DeploymentCustomImageToStagingSucceeds.ts create mode 100644 _generated/AzureSpringCloudV0/Tests/DeploymentCustomImageToStagingSucceedsL0.ts create mode 100644 _generated/AzureSpringCloudV0/Tests/DeploymentFailsWhenBuilderNotExist.ts create mode 100644 _generated/AzureSpringCloudV0/Tests/DeploymentFailsWhenBuilderNotExistL0.ts create mode 100644 _generated/AzureSpringCloudV0/Tests/DeploymentFailsWithInsufficientDeployments.ts create mode 100644 _generated/AzureSpringCloudV0/Tests/DeploymentFailsWithInsufficientDeploymentsL0.ts create mode 100644 _generated/AzureSpringCloudV0/Tests/DeploymentToStagingSucceeds.ts create mode 100644 _generated/AzureSpringCloudV0/Tests/DeploymentToStagingSucceedsL0.ts create mode 100644 _generated/AzureSpringCloudV0/Tests/DeploymentToStagingSucceedsWithBuildService.ts create mode 100644 _generated/AzureSpringCloudV0/Tests/DeploymentToStagingSucceedsWithBuildServiceL0.ts create mode 100644 _generated/AzureSpringCloudV0/Tests/L0.ts create mode 100644 _generated/AzureSpringCloudV0/Tests/SetNamedDeploymentFailsWhenDeploymentDoesNotExist.ts create mode 100644 _generated/AzureSpringCloudV0/Tests/SetNamedDeploymentFailsWhenDeploymentDoesNotExistL0.ts create mode 100644 _generated/AzureSpringCloudV0/Tests/SetProductionNamedDeploymentSucceeds.ts create mode 100644 _generated/AzureSpringCloudV0/Tests/SetProductionNamedDeploymentSucceedsL0.ts create mode 100644 _generated/AzureSpringCloudV0/Tests/SetProductionUseStagingFailsWithNoStaging.ts create mode 100644 _generated/AzureSpringCloudV0/Tests/SetProductionUseStagingFailsWithNoStagingL0.ts create mode 100644 _generated/AzureSpringCloudV0/Tests/SetProductionUseStagingSucceeds.ts create mode 100644 _generated/AzureSpringCloudV0/Tests/SetProductionUseStagingSucceedsL0.ts create mode 100644 _generated/AzureSpringCloudV0/Tests/mock_utils.ts create mode 100644 _generated/AzureSpringCloudV0/Tests/package-lock.json create mode 100644 _generated/AzureSpringCloudV0/Tests/package.json create mode 100644 _generated/AzureSpringCloudV0/azurespringappsdeployment.ts create mode 100644 _generated/AzureSpringCloudV0/deploymentProvider/AzureSpringAppsDeploymentProvider.ts create mode 100644 _generated/AzureSpringCloudV0/deploymentProvider/azure-arm-spring-apps.ts create mode 100644 _generated/AzureSpringCloudV0/deploymentProvider/azure-storage.ts create mode 100644 _generated/AzureSpringCloudV0/icon.png create mode 100644 _generated/AzureSpringCloudV0/icon.svg create mode 100644 _generated/AzureSpringCloudV0/make.json create mode 100644 _generated/AzureSpringCloudV0/operations/AzureResourceFilterUtility.ts create mode 100644 _generated/AzureSpringCloudV0/operations/taskparameters.ts create mode 100644 _generated/AzureSpringCloudV0/package-lock.json create mode 100644 _generated/AzureSpringCloudV0/package.json create mode 100644 _generated/AzureSpringCloudV0/task.json create mode 100644 _generated/AzureSpringCloudV0/task.loc.json create mode 100644 _generated/AzureSpringCloudV0/tsconfig.json create mode 100644 _generated/AzureSpringCloudV0_Node20/.npmrc create mode 100644 _generated/AzureSpringCloudV0_Node20/Strings/resources.resjson/de-DE/resources.resjson create mode 100644 _generated/AzureSpringCloudV0_Node20/Strings/resources.resjson/en-US/resources.resjson create mode 100644 _generated/AzureSpringCloudV0_Node20/Strings/resources.resjson/es-ES/resources.resjson create mode 100644 _generated/AzureSpringCloudV0_Node20/Strings/resources.resjson/fr-FR/resources.resjson create mode 100644 _generated/AzureSpringCloudV0_Node20/Strings/resources.resjson/it-IT/resources.resjson create mode 100644 _generated/AzureSpringCloudV0_Node20/Strings/resources.resjson/ja-JP/resources.resjson create mode 100644 _generated/AzureSpringCloudV0_Node20/Strings/resources.resjson/ko-KR/resources.resjson create mode 100644 _generated/AzureSpringCloudV0_Node20/Strings/resources.resjson/ru-RU/resources.resjson create mode 100644 _generated/AzureSpringCloudV0_Node20/Strings/resources.resjson/zh-CN/resources.resjson create mode 100644 _generated/AzureSpringCloudV0_Node20/Strings/resources.resjson/zh-TW/resources.resjson create mode 100644 _generated/AzureSpringCloudV0_Node20/Tests/AzureSpringAppsDeploymentProviderUnitTests.ts create mode 100644 _generated/AzureSpringCloudV0_Node20/Tests/AzureSpringAppsUnitTests.ts create mode 100644 _generated/AzureSpringCloudV0_Node20/Tests/CreateNamedDeploymentFailsDeploymentDoesNotAlreadyExist.ts create mode 100644 _generated/AzureSpringCloudV0_Node20/Tests/CreateNamedDeploymentFailsDeploymentDoesNotAlreadyExistL0.ts create mode 100644 _generated/AzureSpringCloudV0_Node20/Tests/CreateNamedDeploymentFailsWhenTwoDeploymentsExist.ts create mode 100644 _generated/AzureSpringCloudV0_Node20/Tests/CreateNamedDeploymentFailsWhenTwoDeploymentsExistL0.ts create mode 100644 _generated/AzureSpringCloudV0_Node20/Tests/DeleteDeploymentFailsWhenNoStagingDeployment.ts create mode 100644 _generated/AzureSpringCloudV0_Node20/Tests/DeleteDeploymentFailsWhenNoStagingDeploymentL0.ts create mode 100644 _generated/AzureSpringCloudV0_Node20/Tests/DeleteStagingDeploymentTest.ts create mode 100644 _generated/AzureSpringCloudV0_Node20/Tests/DeleteStagingDeploymentTestL0.ts create mode 100644 _generated/AzureSpringCloudV0_Node20/Tests/DeploymentCustomImageToStagingSucceeds.ts create mode 100644 _generated/AzureSpringCloudV0_Node20/Tests/DeploymentCustomImageToStagingSucceedsL0.ts create mode 100644 _generated/AzureSpringCloudV0_Node20/Tests/DeploymentFailsWhenBuilderNotExist.ts create mode 100644 _generated/AzureSpringCloudV0_Node20/Tests/DeploymentFailsWhenBuilderNotExistL0.ts create mode 100644 _generated/AzureSpringCloudV0_Node20/Tests/DeploymentFailsWithInsufficientDeployments.ts create mode 100644 _generated/AzureSpringCloudV0_Node20/Tests/DeploymentFailsWithInsufficientDeploymentsL0.ts create mode 100644 _generated/AzureSpringCloudV0_Node20/Tests/DeploymentToStagingSucceeds.ts create mode 100644 _generated/AzureSpringCloudV0_Node20/Tests/DeploymentToStagingSucceedsL0.ts create mode 100644 _generated/AzureSpringCloudV0_Node20/Tests/DeploymentToStagingSucceedsWithBuildService.ts create mode 100644 _generated/AzureSpringCloudV0_Node20/Tests/DeploymentToStagingSucceedsWithBuildServiceL0.ts create mode 100644 _generated/AzureSpringCloudV0_Node20/Tests/L0.ts create mode 100644 _generated/AzureSpringCloudV0_Node20/Tests/SetNamedDeploymentFailsWhenDeploymentDoesNotExist.ts create mode 100644 _generated/AzureSpringCloudV0_Node20/Tests/SetNamedDeploymentFailsWhenDeploymentDoesNotExistL0.ts create mode 100644 _generated/AzureSpringCloudV0_Node20/Tests/SetProductionNamedDeploymentSucceeds.ts create mode 100644 _generated/AzureSpringCloudV0_Node20/Tests/SetProductionNamedDeploymentSucceedsL0.ts create mode 100644 _generated/AzureSpringCloudV0_Node20/Tests/SetProductionUseStagingFailsWithNoStaging.ts create mode 100644 _generated/AzureSpringCloudV0_Node20/Tests/SetProductionUseStagingFailsWithNoStagingL0.ts create mode 100644 _generated/AzureSpringCloudV0_Node20/Tests/SetProductionUseStagingSucceeds.ts create mode 100644 _generated/AzureSpringCloudV0_Node20/Tests/SetProductionUseStagingSucceedsL0.ts create mode 100644 _generated/AzureSpringCloudV0_Node20/Tests/mock_utils.ts create mode 100644 _generated/AzureSpringCloudV0_Node20/Tests/package-lock.json create mode 100644 _generated/AzureSpringCloudV0_Node20/Tests/package.json create mode 100644 _generated/AzureSpringCloudV0_Node20/azurespringappsdeployment.ts create mode 100644 _generated/AzureSpringCloudV0_Node20/deploymentProvider/AzureSpringAppsDeploymentProvider.ts create mode 100644 _generated/AzureSpringCloudV0_Node20/deploymentProvider/azure-arm-spring-apps.ts create mode 100644 _generated/AzureSpringCloudV0_Node20/deploymentProvider/azure-storage.ts create mode 100644 _generated/AzureSpringCloudV0_Node20/icon.png create mode 100644 _generated/AzureSpringCloudV0_Node20/icon.svg create mode 100644 _generated/AzureSpringCloudV0_Node20/make.json create mode 100644 _generated/AzureSpringCloudV0_Node20/operations/AzureResourceFilterUtility.ts create mode 100644 _generated/AzureSpringCloudV0_Node20/operations/taskparameters.ts create mode 100644 _generated/AzureSpringCloudV0_Node20/package-lock.json create mode 100644 _generated/AzureSpringCloudV0_Node20/package.json create mode 100644 _generated/AzureSpringCloudV0_Node20/task.json create mode 100644 _generated/AzureSpringCloudV0_Node20/task.loc.json create mode 100644 _generated/AzureSpringCloudV0_Node20/tsconfig.json diff --git a/Tasks/AzureSpringCloudV0/_buildConfigs/Node20/Tests/package-lock.json b/Tasks/AzureSpringCloudV0/_buildConfigs/Node20/Tests/package-lock.json new file mode 100644 index 000000000000..cce7afb41c3e --- /dev/null +++ b/Tasks/AzureSpringCloudV0/_buildConfigs/Node20/Tests/package-lock.json @@ -0,0 +1,908 @@ +{ + "name": "azure-spring-cloud-deployment-tests", + "version": "1.0.2", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@ungap/promise-all-settled": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", + "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==" + }, + "ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==" + }, + "ansi-regex": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==" + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" + }, + "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" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "requires": { + "fill-range": "^7.0.1" + } + }, + "browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==" + }, + "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" + } + }, + "camelcase": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==" + }, + "chai": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-3.5.0.tgz", + "integrity": "sha1-TQJjewZ/6Vi9v906QOxW/vc3Mkc=", + "requires": { + "assertion-error": "^1.0.1", + "deep-eql": "^0.1.3", + "type-detect": "^1.0.0" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "chokidar": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", + "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.3.1", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.5.0" + } + }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "string-width": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "requires": { + "ansi-regex": "^5.0.0" + } + } + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "requires": { + "ms": "2.1.2" + }, + "dependencies": { + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==" + }, + "deep-eql": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-0.1.3.tgz", + "integrity": "sha1-71WKyrjeJSBs1xOQbXTlaTDrafI=", + "requires": { + "type-detect": "0.1.1" + }, + "dependencies": { + "type-detect": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-0.1.1.tgz", + "integrity": "sha1-C6XsKohWQORw6k6FBZcZANrFiCI=" + } + } + }, + "deep-equal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", + "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", + "requires": { + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.2.0" + } + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "requires": { + "object-keys": "^1.0.12" + } + }, + "diff": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==" + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==" + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" + }, + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, + "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" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "requires": { + "is-glob": "^4.0.1" + } + }, + "growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==" + }, + "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-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==" + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" + }, + "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==" + }, + "is-arguments": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.0.tgz", + "integrity": "sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==", + "requires": { + "call-bind": "^1.0.0" + } + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-date-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==" + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + }, + "is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==" + }, + "is-regex": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.2.tgz", + "integrity": "sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg==", + "requires": { + "call-bind": "^1.0.2", + "has-symbols": "^1.0.1" + } + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "js-yaml": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.0.0.tgz", + "integrity": "sha512-pqon0s+4ScYUvX30wxQi3PogGFAlUyH0awepWvwkj4jD4v+ova3RiYw8bmA6x2rDrEaj8i/oWKoRxpVNW+Re8Q==", + "requires": { + "argparse": "^2.0.1" + } + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "requires": { + "p-locate": "^5.0.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "log-symbols": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", + "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==", + "requires": { + "chalk": "^4.0.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" + } + }, + "minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "requires": { + "minimist": "^1.2.5" + } + }, + "mocha": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.3.2.tgz", + "integrity": "sha512-UdmISwr/5w+uXLPKspgoV7/RXZwKRTiTjJ2/AC5ZiEztIoOYdfKb19+9jNmEInzx5pBsCyJQzarAxqIGBNYJhg==", + "requires": { + "@ungap/promise-all-settled": "1.1.2", + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.5.1", + "debug": "4.3.1", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.1.6", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "4.0.0", + "log-symbols": "4.0.0", + "minimatch": "3.0.4", + "ms": "2.1.3", + "nanoid": "3.1.20", + "serialize-javascript": "5.0.1", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "which": "2.0.2", + "wide-align": "1.1.3", + "workerpool": "6.1.0", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" + }, + "dependencies": { + "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" + } + } + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "nanoid": { + "version": "3.1.20", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.20.tgz", + "integrity": "sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw==" + }, + "nock": { + "version": "9.0.11", + "resolved": "https://registry.npmjs.org/nock/-/nock-9.0.11.tgz", + "integrity": "sha1-EPIC5MwnYQLWDibjGfl9aNoJvpw=", + "requires": { + "chai": ">=1.9.2 <4.0.0", + "debug": "^2.2.0", + "deep-equal": "^1.0.0", + "json-stringify-safe": "^5.0.1", + "lodash": "~4.17.2", + "mkdirp": "^0.5.0", + "propagate": "0.4.0", + "qs": "^6.0.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + }, + "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==" + }, + "object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "requires": { + "p-limit": "^3.0.2" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" + }, + "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=" + }, + "picomatch": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==" + }, + "propagate": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/propagate/-/propagate-0.4.0.tgz", + "integrity": "sha1-8/zKCm/gZzanulcpZgaWF8EwtIE=" + }, + "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" + } + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "readdirp": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", + "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", + "requires": { + "picomatch": "^2.2.1" + } + }, + "regexp.prototype.flags": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz", + "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "serialize-javascript": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", + "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", + "requires": { + "randombytes": "^2.1.0" + } + }, + "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-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "^3.0.0" + } + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==" + }, + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "requires": { + "has-flag": "^4.0.0" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "requires": { + "is-number": "^7.0.0" + } + }, + "type-detect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-1.0.0.tgz", + "integrity": "sha1-diIXzAbbJY7EiQihKY6LlRIejqI=" + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "requires": { + "isexe": "^2.0.0" + } + }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "workerpool": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.1.0.tgz", + "integrity": "sha512-toV7q9rWNYha963Pl/qyeZ6wG+3nnsyvolaNUS8+R5Wtw6qJPTxIlOP1ZSvcGhEJw+l3HMMmtiNo9Gl61G4GVg==" + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "string-width": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "requires": { + "ansi-regex": "^5.0.0" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "y18n": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.5.tgz", + "integrity": "sha512-hsRUr4FFrvhhRH12wOdfs38Gy7k2FFzB9qgN9v3aLykRq0dRcdcpz5C9FxdS2NuhOrI/628b/KSTJ3rwHysYSg==" + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "string-width": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "requires": { + "ansi-regex": "^5.0.0" + } + } + } + }, + "yargs-parser": { + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==" + }, + "yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "requires": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + } + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==" + } + } +} diff --git a/Tasks/AzureSpringCloudV0/_buildConfigs/Node20/Tests/package.json b/Tasks/AzureSpringCloudV0/_buildConfigs/Node20/Tests/package.json new file mode 100644 index 000000000000..f427a8c433d9 --- /dev/null +++ b/Tasks/AzureSpringCloudV0/_buildConfigs/Node20/Tests/package.json @@ -0,0 +1,23 @@ +{ + "name": "azure-spring-cloud-deployment-tests", + "version": "1.0.2", + "description": "Azure Pipelines Azure Spring Cloud Deployment 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": { + "nock": "9.0.11", + "mocha": "8.3.2" + } +} diff --git a/Tasks/AzureSpringCloudV0/_buildConfigs/Node20/package-lock.json b/Tasks/AzureSpringCloudV0/_buildConfigs/Node20/package-lock.json new file mode 100644 index 000000000000..46b86eadb146 --- /dev/null +++ b/Tasks/AzureSpringCloudV0/_buildConfigs/Node20/package-lock.json @@ -0,0 +1,1767 @@ +{ + "name": "vsts-tasks-azurespringclouddeployment", + "version": "2.210.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@azure/abort-controller": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-1.1.0.tgz", + "integrity": "sha512-TrRLIoSQVzfAJX9H1JeFjzAoDGcoK1IYX1UImfceTZpsyYfWr09Ss1aHW1y5TrrR3iq6RZLBwJ3E24uwPhwahw==", + "requires": { + "tslib": "^2.2.0" + } + }, + "@azure/core-asynciterator-polyfill": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@azure/core-asynciterator-polyfill/-/core-asynciterator-polyfill-1.0.2.tgz", + "integrity": "sha512-3rkP4LnnlWawl0LZptJOdXNrT/fHp2eQMadoasa6afspXdpGrtPZuAQc2PD0cpgyuoXtUWyC3tv7xfntjGS5Dw==" + }, + "@azure/core-auth": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@azure/core-auth/-/core-auth-1.4.0.tgz", + "integrity": "sha512-HFrcTgmuSuukRf/EdPmqBrc5l6Q5Uu+2TbuhaKbgaCpP2TfAeiNaQPAadxO+CYBRHGUzIDteMAjFspFLDLnKVQ==", + "requires": { + "@azure/abort-controller": "^1.0.0", + "tslib": "^2.2.0" + } + }, + "@azure/core-http": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@azure/core-http/-/core-http-1.2.1.tgz", + "integrity": "sha512-vPHIQXjLVs4iin2BUaj7/sqIAfGq3MW1TLEc3yYKFNpi/sBQn2KI0g+Ow0EQYvAkkHhTHGArA7JKhcjsnJMGLw==", + "requires": { + "@azure/abort-controller": "^1.0.0", + "@azure/core-auth": "^1.1.3", + "@azure/core-tracing": "1.0.0-preview.9", + "@azure/logger": "^1.0.0", + "@opentelemetry/api": "^0.10.2", + "@types/node-fetch": "^2.5.0", + "@types/tunnel": "^0.0.1", + "form-data": "^3.0.0", + "node-fetch": "^2.6.0", + "process": "^0.11.10", + "tough-cookie": "^4.0.0", + "tslib": "^2.0.0", + "tunnel": "^0.0.6", + "uuid": "^8.3.0", + "xml2js": "^0.4.19" + }, + "dependencies": { + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" + }, + "xml2js": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", + "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", + "requires": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + } + } + } + }, + "@azure/core-lro": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/@azure/core-lro/-/core-lro-2.5.3.tgz", + "integrity": "sha512-ubkOf2YCnVtq7KqEJQqAI8dDD5rH1M6OP5kW0KO/JQyTaxLA0N0pjFWvvaysCj9eHMNBcuuoZXhhl0ypjod2DA==", + "requires": { + "@azure/abort-controller": "^1.0.0", + "@azure/core-util": "^1.2.0", + "@azure/logger": "^1.0.0", + "tslib": "^2.2.0" + } + }, + "@azure/core-paging": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@azure/core-paging/-/core-paging-1.1.3.tgz", + "integrity": "sha512-his7Ah40ThEYORSpIAwuh6B8wkGwO/zG7gqVtmSE4WAJ46e36zUDXTKReUCLBDc6HmjjApQQxxcRFy5FruG79A==", + "requires": { + "@azure/core-asynciterator-polyfill": "^1.0.0" + } + }, + "@azure/core-tracing": { + "version": "1.0.0-preview.9", + "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.0.0-preview.9.tgz", + "integrity": "sha512-zczolCLJ5QG42AEPQ+Qg9SRYNUyB+yZ5dzof4YEc+dyWczO9G2sBqbAjLB7IqrsdHN2apkiB2oXeDKCsq48jug==", + "requires": { + "@opencensus/web-types": "0.0.7", + "@opentelemetry/api": "^0.10.2", + "tslib": "^2.0.0" + } + }, + "@azure/core-util": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.3.2.tgz", + "integrity": "sha512-2bECOUh88RvL1pMZTcc6OzfobBeWDBf5oBbhjIhT1MV9otMVWCzpOJkkiKtrnO88y5GGBelgY8At73KGAdbkeQ==", + "requires": { + "@azure/abort-controller": "^1.0.0", + "tslib": "^2.2.0" + } + }, + "@azure/logger": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@azure/logger/-/logger-1.0.0.tgz", + "integrity": "sha512-g2qLDgvmhyIxR3JVS8N67CyIOeFRKQlX/llxYJQr1OSGQqM3HTpVP8MjmjcEKbL/OIt2N9C9UFaNQuKOw1laOA==", + "requires": { + "tslib": "^1.9.3" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, + "@azure/msal-common": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-9.1.1.tgz", + "integrity": "sha512-we9xR8lvu47fF0h+J8KyXoRy9+G/fPzm3QEa2TrdR3jaVS3LKAyE2qyMuUkNdbVkvzl8Zr9f7l+IUSP22HeqXw==" + }, + "@azure/msal-node": { + "version": "1.14.5", + "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-1.14.5.tgz", + "integrity": "sha512-NcVdMfn8Z3ogN+9RjOSF7uwf2Gki5DEJl0BdDSL83KUAgVAobtkZi5W8EqxbJLrTO/ET0jv5DregrcR5qg2pEA==", + "requires": { + "@azure/msal-common": "^9.0.1", + "jsonwebtoken": "^8.5.1", + "uuid": "^8.3.0" + }, + "dependencies": { + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" + } + } + }, + "@azure/storage-blob": { + "version": "12.14.0", + "resolved": "https://registry.npmjs.org/@azure/storage-blob/-/storage-blob-12.14.0.tgz", + "integrity": "sha512-g8GNUDpMisGXzBeD+sKphhH5yLwesB4JkHr1U6be/X3F+cAMcyGLPD1P89g2M7wbEtUJWoikry1rlr83nNRBzg==", + "requires": { + "@azure/abort-controller": "^1.0.0", + "@azure/core-http": "^3.0.0", + "@azure/core-lro": "^2.2.0", + "@azure/core-paging": "^1.1.1", + "@azure/core-tracing": "1.0.0-preview.13", + "@azure/logger": "^1.0.0", + "events": "^3.0.0", + "tslib": "^2.2.0" + }, + "dependencies": { + "@azure/core-http": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@azure/core-http/-/core-http-3.0.1.tgz", + "integrity": "sha512-A3x+um3cAPgQe42Lu7Iv/x8/fNjhL/nIoEfqFxfn30EyxK6zC13n+OUxzZBRC0IzQqssqIbt4INf5YG7lYYFtw==", + "requires": { + "@azure/abort-controller": "^1.0.0", + "@azure/core-auth": "^1.3.0", + "@azure/core-tracing": "1.0.0-preview.13", + "@azure/core-util": "^1.1.1", + "@azure/logger": "^1.0.0", + "@types/node-fetch": "^2.5.0", + "@types/tunnel": "^0.0.3", + "form-data": "^4.0.0", + "node-fetch": "^2.6.7", + "process": "^0.11.10", + "tslib": "^2.2.0", + "tunnel": "^0.0.6", + "uuid": "^8.3.0", + "xml2js": "^0.5.0" + } + }, + "@azure/core-tracing": { + "version": "1.0.0-preview.13", + "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.0.0-preview.13.tgz", + "integrity": "sha512-KxDlhXyMlh2Jhj2ykX6vNEU0Vou4nHr025KoSEiz7cS3BNiHNaZcdECk/DmLkEB0as5T7b/TpRcehJ5yV6NeXQ==", + "requires": { + "@opentelemetry/api": "^1.0.1", + "tslib": "^2.2.0" + } + }, + "@opentelemetry/api": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.4.1.tgz", + "integrity": "sha512-O2yRJce1GOc6PAy3QxFM4NzFiWzvScDC1/5ihYBL6BUEVdq0XMWN01sppE+H6bBXbaFYipjwFLEWLg5PaSOThA==" + }, + "@types/tunnel": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@types/tunnel/-/tunnel-0.0.3.tgz", + "integrity": "sha512-sOUTGn6h1SfQ+gbgqC364jLFBw2lnFqkgF3q0WovEHRLMrVD1sd5aufqi/aJObLekJO+Aq5z646U4Oxy6shXMA==", + "requires": { + "@types/node": "*" + } + }, + "form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" + } + } + }, + "@azure/storage-file-share": { + "version": "12.3.0", + "resolved": "https://registry.npmjs.org/@azure/storage-file-share/-/storage-file-share-12.3.0.tgz", + "integrity": "sha512-AlQ1J0qCvPAwPvcA/cjVONSfF8F8X3ZVlfuWN/kit+4lQ4e7g6rYJCEk6txAOom/fF9WEU4FsQoXjA5/W+VAIg==", + "requires": { + "@azure/abort-controller": "^1.0.0", + "@azure/core-http": "^1.2.0", + "@azure/core-paging": "^1.1.1", + "@azure/core-tracing": "1.0.0-preview.9", + "@azure/logger": "^1.0.0", + "@opentelemetry/api": "^0.10.2", + "events": "^3.0.0", + "tslib": "^2.0.0" + } + }, + "@opencensus/web-types": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/@opencensus/web-types/-/web-types-0.0.7.tgz", + "integrity": "sha512-xB+w7ZDAu3YBzqH44rCmG9/RlrOmFuDPt/bpf17eJr8eZSrLt7nc7LnWdxM9Mmoj/YKMHpxRg28txu3TcpiL+g==" + }, + "@opentelemetry/api": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-0.10.2.tgz", + "integrity": "sha512-GtpMGd6vkzDMYcpu2t9LlhEgMy/SzBwRnz48EejlRArYqZzqSzAsKmegUK7zHgl+EOIaK9mKHhnRaQu3qw20cA==", + "requires": { + "@opentelemetry/context-base": "^0.10.2" + } + }, + "@opentelemetry/context-base": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/context-base/-/context-base-0.10.2.tgz", + "integrity": "sha512-hZNKjKOYsckoOEgBziGMnBcX0M7EtstnCmwz5jZUOUYwlZ+/xxX6z3jPu1XVO2Jivk0eLfuP9GP+vFD49CMetw==" + }, + "@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/jsonwebtoken": { + "version": "8.5.9", + "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-8.5.9.tgz", + "integrity": "sha512-272FMnFGzAVMGtu9tkr29hRL6bZj4Zs1KZNeHLnKqAvp06tAIcarTMwOh8/8bz4FmKRcMxZhZNeUAQsNLoiPhg==", + "requires": { + "@types/node": "*" + } + }, + "@types/mocha": { + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-8.2.1.tgz", + "integrity": "sha512-NysN+bNqj6E0Hv4CTGWSlPzMW6vTKjDpOteycDkV4IWBsO+PU48JonrPzV9ODjiI2XrjmA05KInLgF5ivZ/YGQ==" + }, + "@types/node": { + "version": "20.8.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.10.tgz", + "integrity": "sha512-TlgT8JntpcbmKUFzjhsyhGfP2fsiz1Mv56im6enJ905xG1DAYesxJaeSbGqQmAw8OWPdhyJGhGSQGKRNJ45u9w==", + "requires": { + "undici-types": "~5.26.4" + } + }, + "@types/node-fetch": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.2.tgz", + "integrity": "sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A==", + "requires": { + "@types/node": "*", + "form-data": "^3.0.0" + } + }, + "@types/q": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.0.7.tgz", + "integrity": "sha512-0WS7XU7sXzQ7J1nbnMKKYdjrrFoO3YtZYgUzeV8JFXffPnHfvSJQleR70I8BOAsOm14i4dyaAZ3YzqIl1YhkXQ==" + }, + "@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/tunnel": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/@types/tunnel/-/tunnel-0.0.1.tgz", + "integrity": "sha512-AOqu6bQu5MSWwYvehMXLukFHnupHrpZ8nvgae5Ggie9UwzDR1CCwoXgSSWNZJuyOlCdfdsWMA5F2LlmvyoTv8A==", + "requires": { + "@types/node": "*" + } + }, + "@xmldom/xmldom": { + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.7.tgz", + "integrity": "sha512-sI1Ly2cODlWStkINzqGrZ8K6n+MTSbAeQnAipGyL+KZCXuHaRlj2gyyy8B/9MvsFFqN7XHryQnB2QwhzvJXovg==" + }, + "JSONPath": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/JSONPath/-/JSONPath-0.11.2.tgz", + "integrity": "sha1-P70gM6lXn3/1bBGCW11913ZBWD0=" + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "requires": { + "debug": "4" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "archiver": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-1.2.0.tgz", + "integrity": "sha1-+1xq9UQ7P6akJjRHU7rSp7REqt0=", + "requires": { + "archiver-utils": "^1.3.0", + "async": "^2.0.0", + "buffer-crc32": "^0.2.1", + "glob": "^7.0.0", + "lodash": "^4.8.0", + "readable-stream": "^2.0.0", + "tar-stream": "^1.5.0", + "zip-stream": "^1.1.0" + } + }, + "archiver-utils": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-1.3.0.tgz", + "integrity": "sha1-5QtMCccL89aA4y/xt5lOn52JUXQ=", + "requires": { + "glob": "^7.0.0", + "graceful-fs": "^4.1.0", + "lazystream": "^1.0.0", + "lodash": "^4.8.0", + "normalize-path": "^2.0.0", + "readable-stream": "^2.0.0" + } + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + }, + "assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==" + }, + "async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "requires": { + "lodash": "^4.17.14" + } + }, + "async-mutex": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/async-mutex/-/async-mutex-0.4.0.tgz", + "integrity": "sha512-eJFZ1YhRR8UN8eBLoNzcDPcy/jqjsg6I1AP+KvWQX80BqOSW1oJPJXDylPUEeMr2ZQvHgnQ//Lp6f3RQ1zI7HA==", + "requires": { + "tslib": "^2.4.0" + } + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "azure-devops-node-api": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/azure-devops-node-api/-/azure-devops-node-api-12.1.0.tgz", + "integrity": "sha512-VY+G45eNKVJfMIO0uyZfbi4PzUR8JHEfsHQjEUAXUGRkYhhBbhGHjy8cpiyYFxLXc3a4PL5cqgqqV/YD1SaCXg==", + "requires": { + "tunnel": "0.0.6", + "typed-rest-client": "^1.8.4" + } + }, + "azure-pipelines-task-lib": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-4.4.0.tgz", + "integrity": "sha512-JgtxfjxjRA+KWY0Q5UC1fo48nkbVxFHgKEuasKdJMSNxHydOyNlB5MNw4UTiTXp9b0nnqKeOQOBn5RN3go3aPg==", + "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" + }, + "dependencies": { + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==" + } + } + }, + "azure-pipelines-tasks-azure-arm-rest": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-tasks-azure-arm-rest/-/azure-pipelines-tasks-azure-arm-rest-3.226.0.tgz", + "integrity": "sha512-yHibJejhY8GL+sN/zvrjLkcGzHE6QT9FX6LXNZkBd1dcn0MEBKdgGEM5I841Yaj7RxY+EhSfUJSpBCaJrlfkSQ==", + "requires": { + "@azure/msal-node": "1.14.5", + "@types/jsonwebtoken": "^8.5.8", + "@types/mocha": "^5.2.7", + "@types/node": "^10.17.0", + "@types/q": "1.5.4", + "async-mutex": "^0.4.0", + "azure-devops-node-api": "^12.0.0", + "azure-pipelines-task-lib": "^3.4.0", + "https-proxy-agent": "^4.0.0", + "jsonwebtoken": "^8.5.1", + "node-fetch": "^2.6.7", + "q": "1.5.1", + "typed-rest-client": "1.8.4", + "xml2js": "0.6.2" + }, + "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.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + }, + "@types/q": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.4.tgz", + "integrity": "sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug==" + }, + "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" + } + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==" + }, + "xml2js": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.2.tgz", + "integrity": "sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==", + "requires": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + } + } + } + }, + "azure-pipelines-tasks-webdeployment-common": { + "version": "4.222.0", + "resolved": "https://registry.npmjs.org/azure-pipelines-tasks-webdeployment-common/-/azure-pipelines-tasks-webdeployment-common-4.222.0.tgz", + "integrity": "sha512-skdgj1qHnVF/aAbcfa09oGHLJTbgX6ocb8rdoZvRnMjggUlAnJV8socuZLPrWrq77jDnCigErSRwSLTphsReGA==", + "requires": { + "@types/mocha": "^5.2.7", + "@types/node": "^10.17.0", + "@xmldom/xmldom": "git+https://github.com/xmldom/xmldom.git#0.8.6", + "archiver": "1.2.0", + "azure-pipelines-task-lib": "^4.2.0", + "decompress-zip": "^0.3.3", + "ltx": "2.8.0", + "q": "1.4.1", + "winreg": "1.2.2", + "xml2js": "0.4.13" + }, + "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.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + }, + "@xmldom/xmldom": { + "version": "git+https://github.com/xmldom/xmldom.git#238b1ea8431fae8817812c68d55b4933248af07e", + "from": "git+https://github.com/xmldom/xmldom.git#0.8.6" + }, + "azure-pipelines-task-lib": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/azure-pipelines-task-lib/-/azure-pipelines-task-lib-4.3.1.tgz", + "integrity": "sha512-AEwz0+Sofv80UviCYsS6fzyX5zzsLapmNCMNUoaRePZQVN+oQBStix1DGg4fdZf9zJ6acNd9xEBZQWbWuZu5Zg==", + "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" + }, + "dependencies": { + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==" + } + } + }, + "xml2js": { + "version": "0.4.13", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.13.tgz", + "integrity": "sha512-BoxD65qWA2p4znzbaati/Td19uFEc0X6ydj0bFphJO62RrNaGqOyW6ljLWPo3GKDbvW/6dnxAoRX01BsgEWsMA==", + "requires": { + "sax": ">=0.6.0", + "xmlbuilder": ">=2.4.6" + } + } + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + }, + "binary": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", + "integrity": "sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk=", + "requires": { + "buffers": "~0.1.1", + "chainsaw": "~0.1.0" + } + }, + "bl": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.3.tgz", + "integrity": "sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==", + "requires": { + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" + } + }, + "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": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "buffer-alloc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", + "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", + "requires": { + "buffer-alloc-unsafe": "^1.1.0", + "buffer-fill": "^1.0.0" + } + }, + "buffer-alloc-unsafe": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==" + }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=" + }, + "buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" + }, + "buffer-fill": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=" + }, + "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==" + }, + "buffers": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", + "integrity": "sha1-skV5w77U1tOWru5tmorn9Ugqt7s=" + }, + "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==" + }, + "chai": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-3.5.0.tgz", + "integrity": "sha1-TQJjewZ/6Vi9v906QOxW/vc3Mkc=", + "requires": { + "assertion-error": "^1.0.1", + "deep-eql": "^0.1.3", + "type-detect": "^1.0.0" + } + }, + "chainsaw": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", + "integrity": "sha1-XqtQsor+WAdNDVgpE4iCi15fvJg=", + "requires": { + "traverse": ">=0.3.0 <0.4" + } + }, + "chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" + }, + "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" + } + }, + "compress-commons": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-1.2.2.tgz", + "integrity": "sha1-UkqfEJA/OoEzibAiXSfEi7dRiQ8=", + "requires": { + "buffer-crc32": "^0.2.1", + "crc32-stream": "^2.0.0", + "normalize-path": "^2.0.0", + "readable-stream": "^2.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==" + }, + "crc": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/crc/-/crc-3.8.0.tgz", + "integrity": "sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==", + "requires": { + "buffer": "^5.1.0" + } + }, + "crc32-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-2.0.0.tgz", + "integrity": "sha1-483TtN8xaN10494/u8t7KX/pCPQ=", + "requires": { + "crc": "^3.4.4", + "readable-stream": "^2.0.0" + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "decompress-zip": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/decompress-zip/-/decompress-zip-0.3.3.tgz", + "integrity": "sha512-/fy1L4s+4jujqj3kNptWjilFw3E6De8U6XUFvqmh4npN3Vsypm3oT2V0bXcmbBWS+5j5tr4okYaFrOmyZkszEg==", + "requires": { + "binary": "^0.3.0", + "graceful-fs": "^4.1.3", + "mkpath": "^0.1.0", + "nopt": "^3.0.1", + "q": "^1.1.2", + "readable-stream": "^1.1.8", + "touch": "0.0.3" + }, + "dependencies": { + "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==" + }, + "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" + } + }, + "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==" + } + } + }, + "deep-eql": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-0.1.3.tgz", + "integrity": "sha1-71WKyrjeJSBs1xOQbXTlaTDrafI=", + "requires": { + "type-detect": "0.1.1" + }, + "dependencies": { + "type-detect": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-0.1.1.tgz", + "integrity": "sha1-C6XsKohWQORw6k6FBZcZANrFiCI=" + } + } + }, + "deep-equal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", + "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", + "requires": { + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.2.0" + } + }, + "define-properties": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", + "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "requires": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "requires": { + "once": "^1.4.0" + } + }, + "events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==" + }, + "form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + }, + "fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "requires": { + "minipass": "^3.0.0" + } + }, + "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==" + }, + "functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==" + }, + "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" + } + } + } + }, + "graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "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-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "requires": { + "get-intrinsic": "^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==" + }, + "has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "requires": { + "has-symbols": "^1.0.2" + } + }, + "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==" + } + } + }, + "https-proxy-agent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-4.0.0.tgz", + "integrity": "sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg==", + "requires": { + "agent-base": "5", + "debug": "4" + }, + "dependencies": { + "agent-base": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-5.1.1.tgz", + "integrity": "sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g==" + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" + }, + "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-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "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" + } + }, + "is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + }, + "jsonwebtoken": { + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz", + "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==", + "requires": { + "jws": "^3.2.2", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^5.6.0" + } + }, + "jwa": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "requires": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "requires": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, + "lazystream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", + "requires": { + "readable-stream": "^2.0.5" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==" + }, + "lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==" + }, + "lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==" + }, + "lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==" + }, + "lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" + }, + "lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==" + }, + "lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=" + }, + "ltx": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/ltx/-/ltx-2.8.0.tgz", + "integrity": "sha512-SJJUrmDgXP0gkUzgErfkaeD+pugM8GYxerTALQa1gTUb5W1wrC4k07GZU+QNZd7MpFqJSYWXTQSUy8Ps03hx5Q==", + "requires": { + "inherits": "^2.0.1" + } + }, + "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" + } + }, + "minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" + }, + "minipass": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.4.tgz", + "integrity": "sha512-I9WPbWHCGu8W+6k1ZiGpPu0GkoKBeorkfKNuAFBNS1HNFJvke82sxvI5bzcCNpWPorkOO5QQ+zomzzwRxejXiw==", + "requires": { + "yallist": "^4.0.0" + } + }, + "minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "requires": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + } + }, + "mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "requires": { + "minimist": "^1.2.6" + } + }, + "mkpath": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/mkpath/-/mkpath-0.1.0.tgz", + "integrity": "sha1-dVSm+Nhxg0zJe1RisSLEwSTW3pE=" + }, + "mockery": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mockery/-/mockery-2.1.0.tgz", + "integrity": "sha512-9VkOmxKlWXoDO/h1jDZaS4lH33aWfRiJiNT/tKj+8OGzrcFDLo8d0syGdbsc3Bc4GvRXPb+NMMvojotmuGJTvA==" + }, + "moment": { + "version": "2.29.4", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", + "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==" + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "nock": { + "version": "9.0.11", + "resolved": "https://registry.npmjs.org/nock/-/nock-9.0.11.tgz", + "integrity": "sha1-EPIC5MwnYQLWDibjGfl9aNoJvpw=", + "requires": { + "chai": ">=1.9.2 <4.0.0", + "debug": "^2.2.0", + "deep-equal": "^1.0.0", + "json-stringify-safe": "^5.0.1", + "lodash": "~4.17.2", + "mkdirp": "^0.5.0", + "propagate": "0.4.0", + "qs": "^6.0.2" + } + }, + "node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "requires": { + "whatwg-url": "^5.0.0" + } + }, + "nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "requires": { + "abbrev": "1" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "requires": { + "remove-trailing-separator": "^1.0.1" + } + }, + "object-inspect": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==" + }, + "object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "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": "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": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" + }, + "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.1.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.1.0.tgz", + "integrity": "sha512-W04AqnILOL/sPRXziNicCjSNRruLAuIHEOVBazepu0545DDNGYHz7ar9ZgZ1fMU8/MA4mVxp5rkBWRi6OXIy3Q==", + "requires": { + "asap": "~2.0.6" + } + }, + "propagate": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/propagate/-/propagate-0.4.0.tgz", + "integrity": "sha1-8/zKCm/gZzanulcpZgaWF8EwtIE=" + }, + "psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + }, + "q": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz", + "integrity": "sha1-VXBbzZPF82c1MMLCy8DCs63cKG4=" + }, + "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" + } + }, + "querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" + }, + "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" + }, + "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==" + } + } + }, + "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" + } + }, + "regexp.prototype.flags": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", + "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "functions-have-names": "^1.2.2" + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" + }, + "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.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "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" + }, + "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" + } + }, + "tar": { + "version": "6.1.11", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", + "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", + "requires": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "dependencies": { + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + } + } + }, + "tar-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", + "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", + "requires": { + "bl": "^1.0.0", + "buffer-alloc": "^1.2.0", + "end-of-stream": "^1.0.0", + "fs-constants": "^1.0.0", + "readable-stream": "^2.3.0", + "to-buffer": "^1.1.1", + "xtend": "^4.0.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==" + }, + "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" + } + } + } + }, + "to-buffer": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", + "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==" + }, + "touch": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/touch/-/touch-0.0.3.tgz", + "integrity": "sha1-Ua7z1ElXHU8oel2Hyci0kYGg2x0=", + "requires": { + "nopt": "~1.0.10" + }, + "dependencies": { + "nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", + "requires": { + "abbrev": "1" + } + } + } + }, + "tough-cookie": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.2.tgz", + "integrity": "sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ==", + "requires": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + } + }, + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "traverse": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", + "integrity": "sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk=" + }, + "tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + }, + "tunnel": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", + "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==" + }, + "type-detect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-1.0.0.tgz", + "integrity": "sha1-diIXzAbbJY7EiQihKY6LlRIejqI=" + }, + "typed-rest-client": { + "version": "1.8.4", + "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.8.4.tgz", + "integrity": "sha512-MyfKKYzk3I6/QQp6e1T50py4qg+c+9BzOEl2rBmQIpStwNUoqQ73An+Tkfy9YuV7O+o2mpVVJpe+fH//POZkbg==", + "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==" + }, + "undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + }, + "universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==" + }, + "url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "requires": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "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.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", + "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==" + }, + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "winreg": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/winreg/-/winreg-1.2.2.tgz", + "integrity": "sha1-hQmvo7ccW70RCm18YkfsZ3NsWY8=" + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "xml2js": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz", + "integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==", + "requires": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + } + }, + "xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==" + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "zip-stream": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-1.2.0.tgz", + "integrity": "sha1-qLxF9MG0lpnGuQGYuqyqzbzUugQ=", + "requires": { + "archiver-utils": "^1.3.0", + "compress-commons": "^1.2.0", + "lodash": "^4.8.0", + "readable-stream": "^2.0.0" + } + } + } +} diff --git a/Tasks/AzureSpringCloudV0/_buildConfigs/Node20/package.json b/Tasks/AzureSpringCloudV0/_buildConfigs/Node20/package.json new file mode 100644 index 000000000000..37717cfacf8c --- /dev/null +++ b/Tasks/AzureSpringCloudV0/_buildConfigs/Node20/package.json @@ -0,0 +1,44 @@ +{ + "name": "vsts-tasks-azurespringclouddeployment", + "version": "2.210.0", + "description": "Azure Pipelines Azure Spring Cloud App Deployment", + "main": "azurespringclouddeployment.ts", + "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": { + "@azure/core-http": "1.2.1", + "@azure/core-paging": "1.1.3", + "@azure/logger": "1.0.0", + "@azure/storage-blob": "^12.14.0", + "@azure/storage-file-share": "12.3.0", + "@types/mocha": "8.2.1", + "@types/node": "^20.3.1", + "@types/q": "1.0.7", + "@xmldom/xmldom": "^0.8.7", + "JSONPath": "^0.11.2", + "azure-pipelines-tasks-azure-arm-rest": "^3.226.0", + "azure-pipelines-tasks-webdeployment-common": "^4.222.0", + "azure-pipelines-task-lib": "4.4.0", + "moment": "^2.29.4", + "nock": "9.0.11", + "q": "1.4.1", + "tar": "^6.1.11", + "uuid": "3.1.0", + "xml2js": "^0.5.0", + "agent-base": "6.0.2" + }, + "devDependencies": { + "typescript": "5.1.6" + } +} diff --git a/Tasks/AzureSpringCloudV0/task.json b/Tasks/AzureSpringCloudV0/task.json index aaa642f9a4cf..0d8eed08cb0a 100644 --- a/Tasks/AzureSpringCloudV0/task.json +++ b/Tasks/AzureSpringCloudV0/task.json @@ -18,8 +18,8 @@ "preview": false, "version": { "Major": 0, - "Minor": 230, - "Patch": 2 + "Minor": 231, + "Patch": 0 }, "minimumAgentVersion": "2.104.1", "groups": [ diff --git a/Tasks/AzureSpringCloudV0/task.loc.json b/Tasks/AzureSpringCloudV0/task.loc.json index ad4ace2d7a25..696ba12f83b2 100644 --- a/Tasks/AzureSpringCloudV0/task.loc.json +++ b/Tasks/AzureSpringCloudV0/task.loc.json @@ -18,8 +18,8 @@ "preview": false, "version": { "Major": 0, - "Minor": 230, - "Patch": 2 + "Minor": 231, + "Patch": 0 }, "minimumAgentVersion": "2.104.1", "groups": [ diff --git a/_generated/AzureSpringCloudV0.versionmap.txt b/_generated/AzureSpringCloudV0.versionmap.txt index 17e1fbff8cec..cd54b986dc0e 100644 --- a/_generated/AzureSpringCloudV0.versionmap.txt +++ b/_generated/AzureSpringCloudV0.versionmap.txt @@ -1,2 +1,2 @@ -Default|0.228.1 -Node16-225|0.228.0 +Default|0.231.0 +Node20_229_2|0.231.1 diff --git a/_generated/AzureSpringCloudV0/Strings/resources.resjson/de-DE/resources.resjson b/_generated/AzureSpringCloudV0/Strings/resources.resjson/de-DE/resources.resjson new file mode 100644 index 000000000000..c0a033baf2c0 --- /dev/null +++ b/_generated/AzureSpringCloudV0/Strings/resources.resjson/de-DE/resources.resjson @@ -0,0 +1,73 @@ +{ + "loc.friendlyName": "Azure Spring Apps", + "loc.helpMarkDown": "[Weitere Informationen zu dieser Aufgabe](https://aka.ms/azurespringapps)", + "loc.description": "Stellen Sie Anwendungen in Azure Spring Apps bereit, und verwalten Sie Bereitstellungen.", + "loc.instanceNameFormat": "Azure Spring Apps $(Aktion): $(AppName)", + "loc.group.displayName.ApplicationAndConfigurationSettings": "Anwendungs- und Konfigurationseinstellungen", + "loc.input.label.ConnectedServiceName": "Azure-Abonnement", + "loc.input.help.ConnectedServiceName": "Wählen Sie das Azure Resource Manager-Abonnement für die Bereitstellung aus.", + "loc.input.label.Action": "Aktion", + "loc.input.help.Action": "Aktion, die für Azure Spring Apps ausgeführt werden soll.", + "loc.input.label.AzureSpringCloud": "Azure Spring Apps-Name", + "loc.input.help.AzureSpringCloud": "Wählen Sie den Azure Spring Apps-Dienst aus, für den die Bereitstellung erfolgen soll.", + "loc.input.label.AppName": "App", + "loc.input.help.AppName": "Wählen Sie die bereitzustellende Azure Spring Apps-App aus.", + "loc.input.label.DeploymentType": "Bereitstellungstyp", + "loc.input.help.DeploymentType": "Wählen Sie \"Artefakte\" aus, um eine Bereitstellung mit Quellcode oder Java-Paket auszuführen. Wählen Sie \"Benutzerdefinierter Container\" aus, um die Bereitstellung mit einem Containerimage durchzuführen.", + "loc.input.label.UseStagingDeployment": "Stagingbereitstellung verwenden", + "loc.input.help.UseStagingDeployment": "Wählen Sie automatisch die Bereitstellung aus, die zum Zeitpunkt der Taskausführung als Staging festgelegt ist.", + "loc.input.label.CreateNewDeployment": "Erstellen Sie eine neue Stagingbereitstellung, wenn keine vorhanden ist.", + "loc.input.help.CreateNewDeployment": "Gibt an, ob die Bereitstellung als Ziel festgelegt wird, die zum Zeitpunkt der Ausführung als Staging festgelegt ist. Wenn diese Option deaktiviert ist, muss die Einstellung \"Bereitstellungsname\" festgelegt werden.", + "loc.input.label.DeploymentName": "Bereitstellung", + "loc.input.help.DeploymentName": "Die Bereitstellung, auf die diese Aufgabe angewendet wird. Nur Kleinbuchstaben und Zahlen; muss mit einem Buchstaben beginnen.", + "loc.input.label.Package": "Paket oder Ordner", + "loc.input.help.Package": "Dateipfad zu einem Paket oder einem Ordner, der den Inhalt der Spring Apps-App enthält.
Variablen ( [Build](https://docs.microsoft.com/vsts/pipelines/build/variables) | [Release](https://docs.microsoft.com/vsts/pipelines/release/variables#default-variables)) und Platzhalter werden unterstützt.
Beispiel: $(System.DefaultWorkingDirectory)/\\*\\*/\\*.jar.", + "loc.input.label.Builder": "Ersteller", + "loc.input.help.Builder": "Wählen Sie einen Ersteller des VMware Tanzu® Build Service™ aus. Dies kann in der Enterprise-Ebene verwendet werden.
Eine ausführliche Beschreibung finden Sie unter [Tanzu Build Service verwenden](https://docs.microsoft.com/en-us/azure/spring-apps/how-to-enterprise-build-service?tabs=azure-portal).", + "loc.input.label.RegistryServer": "Registrierungsserver", + "loc.input.help.RegistryServer": "Die Registrierung des Containerimages. Standard: docker.io.", + "loc.input.label.RegistryUsername": "Benutzername für Registrierung", + "loc.input.help.RegistryUsername": "Der Benutzername der Containerregistrierung.", + "loc.input.label.RegistryPassword": "Registrierungskennwort", + "loc.input.help.RegistryPassword": "Das Kennwort der Containerregistrierung.", + "loc.input.label.ImageName": "Imagename und Tag", + "loc.input.help.ImageName": "Das Containerimagetag.", + "loc.input.label.ImageCommand": "Image-Befehl", + "loc.input.help.ImageCommand": "Der Befehl des Containerimages.", + "loc.input.label.ImageArgs": "Argumente des Images", + "loc.input.help.ImageArgs": "Die Argumente des Containerimages.", + "loc.input.label.ImageLanguageFramework": "Sprachframework", + "loc.input.label.EnvironmentVariables": "Umgebungsvariablen", + "loc.input.help.EnvironmentVariables": "Bearbeiten Sie die Umgebungsvariablen der App.", + "loc.input.label.JvmOptions": "JVM-Optionen", + "loc.input.help.JvmOptions": "Bearbeiten Sie die JVM-Optionen der App. Eine Zeichenfolge, die JVM-Optionen enthält. Beispiel: \"-Xms1024m -Xmx2048m\"", + "loc.input.label.RuntimeVersion": "Laufzeitversion", + "loc.input.help.RuntimeVersion": "Die Runtime, unter der die App ausgeführt wird.", + "loc.input.label.DotNetCoreMainEntryPath": "Haupteintragspfad", + "loc.input.help.DotNetCoreMainEntryPath": "Der Pfad zur ausführbaren .NET-Datei relativ zum ZIP-Stamm.", + "loc.input.label.Version": "Version", + "loc.messages.CompressingSourceDirectory": "Das Quellverzeichnis \"%s\" wird auf \"%s\" komprimiert.", + "loc.messages.DeploymentLog": "Bereitstellungsprotokoll", + "loc.messages.StatusCode": "Statuscode", + "loc.messages.StartingUploadOf": "Upload von %s wird gestartet.", + "loc.messages.CompletedUploadOf": "Upload von %s abgeschlossen.", + "loc.messages.ResourceDoesntExist": "Die Ressource \"%s\" ist nicht vorhanden. Die Ressource muss vor der Bereitstellung vorhanden sein.", + "loc.messages.UnableToGetDeploymentUrl": "Die Bereitstellungs-URL für Azure Spring Apps \"%s\" kann nicht abgerufen werden. Fehler: \"%s\"", + "loc.messages.DeploymentDoesntExist": "Die Bereitstellung mit dem Namen \"%s\" ist nicht vorhanden. Der Vorgang kann nicht fortgesetzt werden.", + "loc.messages.StagingDeploymentWithNameDoesntExist": "Die Stagingbereitstellung mit dem Namen \"%s\" ist nicht vorhanden. Der Vorgang kann nicht fortgesetzt werden.", + "loc.messages.NoStagingDeploymentFound": "Keine Stagingbereitstellung gefunden.", + "loc.messages.TwoDeploymentsAlreadyExistCannotCreate": "Die Bereitstellung mit dem Namen \"%s\" ist nicht vorhanden und kann nicht erstellt werden, da bereits zwei Bereitstellungen vorhanden sind.", + "loc.messages.UnsupportedSourceType": "Nicht unterstützter Quelltyp für \"%s\"", + "loc.messages.UnknownOrUnsupportedAction": "Unbekannte oder nicht unterstützte Aktion: \"%s\"", + "loc.messages.OperationTimedOut": "Timeout bei Vorgang.", + "loc.messages.OperationFailed": "Fehler beim Vorgang: %s %s", + "loc.messages.UnableToDeleteDeployment": "Bereitstellung kann nicht gelöscht werden.", + "loc.messages.PrivateTestEndpointNotEnabled": "Der private Testendpunkt ist nicht aktiviert.", + "loc.messages.UnableToRetrieveTestEndpointKeys": "Testendpunktschlüssel können nicht abgerufen werden.", + "loc.messages.NoDeploymentsExist": "Keine Bereitstellungen vorhanden.", + "loc.messages.UnableToGetDeploymentInformation": "Bereitstellungsinformationen können nicht abrufen werden.", + "loc.messages.DuplicateAzureSpringAppsName": "Unzulässiger Status: mehrere Azure Spring Apps-Instanzen mit demselben Namen.", + "loc.messages.InvalidAzureSpringAppsResourceId": "Ungültiger Azure Spring Apps-Ressourcenbezeichner: %s", + "loc.messages.Nopackagefoundwithspecifiedpattern": "Es wurde kein Paket mit dem angegebenen Muster gefunden: %s. Überprüfen, ob das in der Aufgabe erwähnte Paket als Artefakt im Build oder in einer vorherigen Stage veröffentlicht und im aktuellen Auftrag heruntergeladen wurde.", + "loc.messages.MorethanonepackagematchedwithspecifiedpatternPleaserestrainthesearchpattern": "Mindestens zwei Pakete stimmten mit dem angegebenen Suchmuster überein: %s. Schränken Sie das Suchmuster ein." +} \ No newline at end of file diff --git a/_generated/AzureSpringCloudV0/Strings/resources.resjson/en-US/resources.resjson b/_generated/AzureSpringCloudV0/Strings/resources.resjson/en-US/resources.resjson new file mode 100644 index 000000000000..2ef1f5cd6a66 --- /dev/null +++ b/_generated/AzureSpringCloudV0/Strings/resources.resjson/en-US/resources.resjson @@ -0,0 +1,73 @@ +{ + "loc.friendlyName": "Azure Spring Apps", + "loc.helpMarkDown": "[Learn more about this task](https://learn.microsoft.com/en-gb/azure/devops/pipelines/tasks/reference/azure-spring-cloud-v0?view=azure-pipelines)", + "loc.description": "Deploy applications to Azure Spring Apps and manage deployments.", + "loc.instanceNameFormat": "Azure Spring Apps $(Action): $(AppName)", + "loc.group.displayName.ApplicationAndConfigurationSettings": "Application and Configuration Settings", + "loc.input.label.ConnectedServiceName": "Azure subscription", + "loc.input.help.ConnectedServiceName": "Select the Azure Resource Manager subscription for the deployment.", + "loc.input.label.Action": "Action", + "loc.input.help.Action": "Action to be performed on Azure Spring Apps.", + "loc.input.label.AzureSpringCloud": "Azure Spring Apps Name", + "loc.input.help.AzureSpringCloud": "Select the Azure Spring Apps service to which to deploy.", + "loc.input.label.AppName": "App", + "loc.input.help.AppName": "Select the Azure Spring Apps app to deploy.", + "loc.input.label.DeploymentType": "Deployment Type", + "loc.input.help.DeploymentType": "To deploy with source code or Java package, choose \"Artifacts\"; To deploy with container image, choose \"Custom Container\"", + "loc.input.label.UseStagingDeployment": "Use Staging Deployment", + "loc.input.help.UseStagingDeployment": "Automatically select the deployment that's set as Staging at the time the task runs.", + "loc.input.label.CreateNewDeployment": "Create a new staging deployment if one does not exist.", + "loc.input.help.CreateNewDeployment": "Whether to target the deployment that's set as Staging at the time of execution. If unchecked, the 'Deployment Name' setting must be set.", + "loc.input.label.DeploymentName": "Deployment", + "loc.input.help.DeploymentName": "The deployment to which this task will apply. Lowercase letters and numbers only; must start with a letter.", + "loc.input.label.Package": "Package or folder", + "loc.input.help.Package": "File path to the package or a folder containing the Spring Apps app contents.
Variables ( [Build](https://docs.microsoft.com/vsts/pipelines/build/variables) | [Release](https://docs.microsoft.com/vsts/pipelines/release/variables#default-variables)), wildcards are supported.
For example, $(System.DefaultWorkingDirectory)/\\*\\*/\\*.jar.", + "loc.input.label.Builder": "Builder", + "loc.input.help.Builder": "Select a builder of VMware Tanzu® Build Service™, this can be used in enterprise tier.
For detailed description, please check [Use Tanzu Build Service](https://docs.microsoft.com/en-us/azure/spring-apps/how-to-enterprise-build-service?tabs=azure-portal).", + "loc.input.label.RegistryServer": "Registry Server", + "loc.input.help.RegistryServer": "The registry of the container image. Default: docker.io.", + "loc.input.label.RegistryUsername": "Registry Username", + "loc.input.help.RegistryUsername": "The username of the container registry.", + "loc.input.label.RegistryPassword": "Registry Password", + "loc.input.help.RegistryPassword": "The password of the container registry.", + "loc.input.label.ImageName": "Image Name and Tag", + "loc.input.help.ImageName": "The container image tag.", + "loc.input.label.ImageCommand": "Image Command", + "loc.input.help.ImageCommand": "The command of the container image.", + "loc.input.label.ImageArgs": "Image Arguments", + "loc.input.help.ImageArgs": "The arguments of the container image.", + "loc.input.label.ImageLanguageFramework": "Language Framework", + "loc.input.label.EnvironmentVariables": "Environment Variables", + "loc.input.help.EnvironmentVariables": "Edit the app's environment variables.", + "loc.input.label.JvmOptions": "JVM Options", + "loc.input.help.JvmOptions": "Edit the app's JVM options. A String containing JVM Options. Example: `-Xms1024m -Xmx2048m`", + "loc.input.label.RuntimeVersion": "Runtime Version", + "loc.input.help.RuntimeVersion": "The runtime on which the app will run.", + "loc.input.label.DotNetCoreMainEntryPath": "Main Entry Path", + "loc.input.help.DotNetCoreMainEntryPath": "The path to the .NET executable relative to zip root.", + "loc.input.label.Version": "Version", + "loc.messages.CompressingSourceDirectory": "Compressing source directory %s to %s", + "loc.messages.DeploymentLog": "Deployment Log", + "loc.messages.StatusCode": "Status Code", + "loc.messages.StartingUploadOf": "Starting upload of %s", + "loc.messages.CompletedUploadOf": "Upload of %s completed.", + "loc.messages.ResourceDoesntExist": "Resource '%s' doesn't exist. Resource should exist before deployment.", + "loc.messages.UnableToGetDeploymentUrl": "Unable to get deployment URL for Azure Spring Apps '%s', Error: '%s'", + "loc.messages.DeploymentDoesntExist": "Deployment with name '%s' does not exist. Unable to proceed.", + "loc.messages.StagingDeploymentWithNameDoesntExist": "Staging deployment with name %s does not exist. Unable to proceed.", + "loc.messages.NoStagingDeploymentFound": "No staging deployment found.", + "loc.messages.TwoDeploymentsAlreadyExistCannotCreate": "Deployment with name '%s' does not exist and cannot be created, as two deployments already exist.", + "loc.messages.UnsupportedSourceType": "Unsupported source type for %s", + "loc.messages.UnknownOrUnsupportedAction": "Unknown or unsupported action: %s", + "loc.messages.OperationTimedOut": "Operation timed out.", + "loc.messages.OperationFailed": "Operation failed: %s %s", + "loc.messages.UnableToDeleteDeployment": "Unable to delete deployment.", + "loc.messages.PrivateTestEndpointNotEnabled": "Private test endpoint is not enabled.", + "loc.messages.UnableToRetrieveTestEndpointKeys": "Unable to retrieve test endpoint keys", + "loc.messages.NoDeploymentsExist": "No deployments exist.", + "loc.messages.UnableToGetDeploymentInformation": "Unable to get deployment information.", + "loc.messages.DuplicateAzureSpringAppsName": "Illegal state: multiple Azure Spring Apps instances with same name.", + "loc.messages.InvalidAzureSpringAppsResourceId": "Invalid Azure Spring Apps resource identifier: %s", + "loc.messages.Nopackagefoundwithspecifiedpattern": "No package found with specified pattern: %s. Check if the package mentioned in the task is published as an artifact in the build or a previous stage and downloaded in the current job.", + "loc.messages.MorethanonepackagematchedwithspecifiedpatternPleaserestrainthesearchpattern": "More than one package matched with specified pattern: %s. Please restrain the search pattern." +} \ No newline at end of file diff --git a/_generated/AzureSpringCloudV0/Strings/resources.resjson/es-ES/resources.resjson b/_generated/AzureSpringCloudV0/Strings/resources.resjson/es-ES/resources.resjson new file mode 100644 index 000000000000..9c716911f668 --- /dev/null +++ b/_generated/AzureSpringCloudV0/Strings/resources.resjson/es-ES/resources.resjson @@ -0,0 +1,73 @@ +{ + "loc.friendlyName": "Azure Spring Apps", + "loc.helpMarkDown": "[Obtener más información acerca de esta tarea](https://aka.ms/azurespringapps)", + "loc.description": "Implemente aplicaciones para Azure Spring Cloud y administre implementaciones.", + "loc.instanceNameFormat": "Azure Spring Apps $(Action): $(AppName)", + "loc.group.displayName.ApplicationAndConfigurationSettings": "Configuración y opciones de la aplicación", + "loc.input.label.ConnectedServiceName": "Suscripción a Azure", + "loc.input.help.ConnectedServiceName": "Seleccione la suscripción de Azure Resource Manager para la implementación.", + "loc.input.label.Action": "Acción", + "loc.input.help.Action": "Acción que se va a realizar en Azure Spring Apps.", + "loc.input.label.AzureSpringCloud": "Nombre de Azure Spring Apps", + "loc.input.help.AzureSpringCloud": "Seleccione el servicio de Azure Spring Apps en el que se va a implementar.", + "loc.input.label.AppName": "Aplicación", + "loc.input.help.AppName": "Seleccione la aplicación de Azure Spring Apps que se va a implementar.", + "loc.input.label.DeploymentType": "Tipo de implementación", + "loc.input.help.DeploymentType": "Para realizar la implementación con código fuente o paquete java, elija \"Artifacts\". Para realizar la implementación con la imagen del contenedor, elija \"Custom Container\"", + "loc.input.label.UseStagingDeployment": "Uso de la implementación de ensayo", + "loc.input.help.UseStagingDeployment": "Selecciona automáticamente la implementación que se establece como almacenamiento provisional en el momento en que se ejecuta la tarea.", + "loc.input.label.CreateNewDeployment": "Cree una nueva implementación de ensayo si no existe una.", + "loc.input.help.CreateNewDeployment": "Si el destino es la implementación que se establece como almacenamiento provisional en el momento de la ejecución. Si está desactivada, se debe establecer la configuración \"Nombre de implementación\".", + "loc.input.label.DeploymentName": "Implementación", + "loc.input.help.DeploymentName": "Implementación a la que se aplicará esta tarea. Solo letras minúsculas y números; debe comenzar con una letra.", + "loc.input.label.Package": "Paquete o carpeta", + "loc.input.help.Package": "Ruta de acceso del archivo al paquete o a una carpeta que contiene el contenido de la aplicación Spring Cloud.
Variables ( [Compilación](https://docs.microsoft.com/vsts/pipelines/build/variables) | [Versión](https://docs.microsoft.com/vsts/pipelines/release/variables#default-variables)), se admiten caracteres comodín.
Por ejemplo, $(System.DefaultWorkingDirectory)/\\*\\*/\\*.jar.", + "loc.input.label.Builder": "Compilador", + "loc.input.help.Builder": "Seleccione un generador de VMware Tanzu® Build Service™, que se puede usar en el nivel empresarial.
Para obtener una descripción detallada, consulte [Use Tanzu Build Service](https://docs.microsoft.com/en-us/azure/spring-apps/how-to-enterprise-build-service?tabs=azure-portal).", + "loc.input.label.RegistryServer": "Servidor de registro", + "loc.input.help.RegistryServer": "Registro de la imagen de contenedor. Valor predeterminado: docker.io.", + "loc.input.label.RegistryUsername": "Nombre de usuario del registro", + "loc.input.help.RegistryUsername": "Nombre de usuario del registro de contenedor.", + "loc.input.label.RegistryPassword": "Contraseña del Registro", + "loc.input.help.RegistryPassword": "Contraseña del registro de contenedor.", + "loc.input.label.ImageName": "Nombre de imagen y etiqueta", + "loc.input.help.ImageName": "Etiqueta de imagen de contenedor.", + "loc.input.label.ImageCommand": "Comando de imagen", + "loc.input.help.ImageCommand": "Comando de la imagen del contenedor.", + "loc.input.label.ImageArgs": "Argumentos de imagen", + "loc.input.help.ImageArgs": "Argumentos de la imagen del contenedor.", + "loc.input.label.ImageLanguageFramework": "Marco de trabajo del lenguaje", + "loc.input.label.EnvironmentVariables": "Variables de entorno", + "loc.input.help.EnvironmentVariables": "Edite las variables de entorno de la aplicación.", + "loc.input.label.JvmOptions": "Opciones de JVM", + "loc.input.help.JvmOptions": "Edite las opciones de JVM de la aplicación. Cadena que contiene opciones de JVM. Ejemplo: '-Xms1024m -Xmx2048m'", + "loc.input.label.RuntimeVersion": "Versión de runtime", + "loc.input.help.RuntimeVersion": "Tiempo de ejecución en el que se ejecutará la aplicación.", + "loc.input.label.DotNetCoreMainEntryPath": "Ruta de entrada principal", + "loc.input.help.DotNetCoreMainEntryPath": "Ruta de acceso al ejecutable .NET relativa a la raíz zip.", + "loc.input.label.Version": "Versión", + "loc.messages.CompressingSourceDirectory": "Comprimiendo el directorio de origen %s en %s", + "loc.messages.DeploymentLog": "Registro de implementación", + "loc.messages.StatusCode": "Código de estado", + "loc.messages.StartingUploadOf": "Iniciando carga de %s", + "loc.messages.CompletedUploadOf": "Carga de %s completada.", + "loc.messages.ResourceDoesntExist": "El recurso \"%s\" no existe. Este debe existir antes de la implementación.", + "loc.messages.UnableToGetDeploymentUrl": "No se puede obtener la dirección URL de implementación para Azure Spring Apps '%s'. Error: '%s'", + "loc.messages.DeploymentDoesntExist": "La implementación con el nombre %s no existe. No se puede continuar.", + "loc.messages.StagingDeploymentWithNameDoesntExist": "La implementación de almacenamiento provisional con el nombre %s no existe. No se puede continuar.", + "loc.messages.NoStagingDeploymentFound": "No se encontró ninguna implementación de ensayo.", + "loc.messages.TwoDeploymentsAlreadyExistCannotCreate": "La implementación con el nombre '%s' no existe y no se puede crear porque ya existen dos implementaciones.", + "loc.messages.UnsupportedSourceType": "Tipo de origen no admitido por %s", + "loc.messages.UnknownOrUnsupportedAction": "Acción desconocida o no admitida: %s", + "loc.messages.OperationTimedOut": "El tiempo de espera de la operación se ha agotado.", + "loc.messages.OperationFailed": "Error en la operación: %s %s", + "loc.messages.UnableToDeleteDeployment": "No se pueden eliminar la implementación.", + "loc.messages.PrivateTestEndpointNotEnabled": "El punto de conexión de prueba privado no está habilitado.", + "loc.messages.UnableToRetrieveTestEndpointKeys": "No se pueden recuperar las claves de punto de conexión de prueba", + "loc.messages.NoDeploymentsExist": "No existen implementaciones.", + "loc.messages.UnableToGetDeploymentInformation": "No se puede obtener la información de implementación.", + "loc.messages.DuplicateAzureSpringAppsName": "Estado no válido: varias instancias de Azure Spring Apps con el mismo nombre.", + "loc.messages.InvalidAzureSpringAppsResourceId": "Identificador de recurso de Azure Spring Apps no válido: %s", + "loc.messages.Nopackagefoundwithspecifiedpattern": "No se encontró ningún paquete con el patrón especificado: %s. Compruebe si el paquete mencionado en la tarea se publica como artefacto en la compilación o en una fase anterior y se descarga en el trabajo actual.", + "loc.messages.MorethanonepackagematchedwithspecifiedpatternPleaserestrainthesearchpattern": "Más de un paquete coincidió con el patrón especificado: %s. Restrinja el patrón de búsqueda." +} \ No newline at end of file diff --git a/_generated/AzureSpringCloudV0/Strings/resources.resjson/fr-FR/resources.resjson b/_generated/AzureSpringCloudV0/Strings/resources.resjson/fr-FR/resources.resjson new file mode 100644 index 000000000000..c1318daf1f43 --- /dev/null +++ b/_generated/AzureSpringCloudV0/Strings/resources.resjson/fr-FR/resources.resjson @@ -0,0 +1,73 @@ +{ + "loc.friendlyName": "Azure Spring Apps", + "loc.helpMarkDown": "[En savoir plus sur cette tâche](https://aka.ms/azurespringapps)", + "loc.description": "Déployez des applications sur Azure Spring Apps et gérez les déploiements.", + "loc.instanceNameFormat": "Azure Spring Apps $(Action) : $(AppName)", + "loc.group.displayName.ApplicationAndConfigurationSettings": "Paramètres d'application et de configuration", + "loc.input.label.ConnectedServiceName": "Abonnement Azure", + "loc.input.help.ConnectedServiceName": "Sélectionnez l'abonnement Azure Resource Manager pour le déploiement.", + "loc.input.label.Action": "Action", + "loc.input.help.Action": "Action à effectuer sur Azure Spring Apps.", + "loc.input.label.AzureSpringCloud": "Nom d’Azure Spring Apps", + "loc.input.help.AzureSpringCloud": "Sélectionnez le service Azure Spring Apps sur lequel effectuer le déploiement.", + "loc.input.label.AppName": "Application", + "loc.input.help.AppName": "Sélectionnez l’application Azure Spring Apps à déployer.", + "loc.input.label.DeploymentType": "Type de déploiement", + "loc.input.help.DeploymentType": "Pour effectuer le déploiement avec du code source ou un package Java, choisissez « Artifacts » ; Pour effectuer le déploiement avec une image conteneur, choisissez « Conteneur personnalisé »", + "loc.input.label.UseStagingDeployment": "Utiliser le déploiement intermédiaire", + "loc.input.help.UseStagingDeployment": "Sélectionnez automatiquement le déploiement défini comme intermédiaire au moment de l’exécution de la tâche.", + "loc.input.label.CreateNewDeployment": "Créez un déploiement intermédiaire s’il n’existe pas.", + "loc.input.help.CreateNewDeployment": "Indique s’il faut cibler le déploiement défini comme intermédiaire au moment de l’exécution. Si cette option est désactivée, le paramètre « Nom du déploiement » doit être défini.", + "loc.input.label.DeploymentName": "Déploiement", + "loc.input.help.DeploymentName": "Déploiement auquel cette tâche s’appliquera. Lettres minuscules et chiffres uniquement ; doit commencer par une lettre.", + "loc.input.label.Package": "Package ou dossier", + "loc.input.help.Package": "Chemin d’accès au package ou à un dossier contenant le contenu de l’application Spring Apps.
Les variables ([Build](https://docs.microsoft.com/vsts/pipelines/build/variables) | [Mise en production](https://docs.microsoft.com/vsts/pipelines/release/variables#default-variables)) et les caractères génériques sont pris en charge.
Exemple : $(System.DefaultWorkingDirectory)/\\*\\*/\\*.jar.", + "loc.input.label.Builder": "Générateur", + "loc.input.help.Builder": "Sélectionnez un générateur de VMware Tanzu® Build Service™, qui peut être utilisé dans le niveau Entreprise.
Pour obtenir une description détaillée, consultez [Utiliser tanzu Build Service](https://docs.microsoft.com/en-us/azure/spring-apps/how-to-enterprise-build-service?tabs=azure-portal).", + "loc.input.label.RegistryServer": "Serveur de registre", + "loc.input.help.RegistryServer": "Registre de l’image conteneur. Valeur par défaut : docker.io.", + "loc.input.label.RegistryUsername": "Nom d'utilisateur du Registre", + "loc.input.help.RegistryUsername": "Nom d’utilisateur du registre de conteneurs.", + "loc.input.label.RegistryPassword": "Mot de passe du registre", + "loc.input.help.RegistryPassword": "Mot de passe du registre de conteneurs.", + "loc.input.label.ImageName": "Nom et étiquette de l'image", + "loc.input.help.ImageName": "Balise d’image conteneur.", + "loc.input.label.ImageCommand": "Commande d'image", + "loc.input.help.ImageCommand": "Commande de l’image conteneur.", + "loc.input.label.ImageArgs": "Arguments de l’image", + "loc.input.help.ImageArgs": "Arguments de l’image conteneur.", + "loc.input.label.ImageLanguageFramework": "Infrastructure linguistique", + "loc.input.label.EnvironmentVariables": "Variables d'environnement", + "loc.input.help.EnvironmentVariables": "Modifiez les variables d’environnement de l’application.", + "loc.input.label.JvmOptions": "Options JVM", + "loc.input.help.JvmOptions": "Modifiez les options JVM de l’application. Chaîne contenant les options JVM. Exemple : '-Xms1024m -Xmx2048m'", + "loc.input.label.RuntimeVersion": "Version du runtime", + "loc.input.help.RuntimeVersion": "Runtime sur lequel l’application s’exécutera.", + "loc.input.label.DotNetCoreMainEntryPath": "Chemin d’accès de l’entrée principale", + "loc.input.help.DotNetCoreMainEntryPath": "Chemin de l’exécutable .NET par rapport à la racine zip.", + "loc.input.label.Version": "Version", + "loc.messages.CompressingSourceDirectory": "Compression du répertoire source %s à %s", + "loc.messages.DeploymentLog": "Journal de déploiement", + "loc.messages.StatusCode": "Code d'état", + "loc.messages.StartingUploadOf": "Démarrage du chargement de %s", + "loc.messages.CompletedUploadOf": "Chargement de %s terminé.", + "loc.messages.ResourceDoesntExist": "La ressource « %s » n'existe pas. La ressource doit exister avant le déploiement.", + "loc.messages.UnableToGetDeploymentUrl": "Impossible d’obtenir l’URL de déploiement pour Azure Spring Apps « %s ». Erreur : « %s »", + "loc.messages.DeploymentDoesntExist": "Le déploiement portant le nom « %s » n’existe pas. Impossible de continuer.", + "loc.messages.StagingDeploymentWithNameDoesntExist": "Le déploiement intermédiaire portant le nom %s n’existe pas. Impossible de continuer.", + "loc.messages.NoStagingDeploymentFound": "Aucun déploiement intermédiaire n'a été trouvé.", + "loc.messages.TwoDeploymentsAlreadyExistCannotCreate": "Le déploiement portant le nom « %s » n’existe pas et ne peut pas être créé, car deux déploiements existent déjà.", + "loc.messages.UnsupportedSourceType": "Type de source non pris en charge pour %s", + "loc.messages.UnknownOrUnsupportedAction": "Action inconnue ou non pris en charge : %s", + "loc.messages.OperationTimedOut": "L'opération a expiré.", + "loc.messages.OperationFailed": "Échec de l’opération : %s %s", + "loc.messages.UnableToDeleteDeployment": "Impossible de supprimer les déploiements.", + "loc.messages.PrivateTestEndpointNotEnabled": "Le point de terminaison de test privé n’est pas activé.", + "loc.messages.UnableToRetrieveTestEndpointKeys": "Impossible de récupérer les clés de point de terminaison de test", + "loc.messages.NoDeploymentsExist": "Aucun déploiement n’existe.", + "loc.messages.UnableToGetDeploymentInformation": "Impossible d’obtenir les informations de déploiement.", + "loc.messages.DuplicateAzureSpringAppsName": "État non conforme : plusieurs instances Azure Spring Apps portant le même nom.", + "loc.messages.InvalidAzureSpringAppsResourceId": "Identificateur de ressource Azure Spring Apps non valide : %s", + "loc.messages.Nopackagefoundwithspecifiedpattern": "Package introuvable avec le modèle spécifié : %s. Vérifiez si le package mentionné dans la tâche est publié en tant qu'artefact dans la build ou à une étape précédente, et s'il est téléchargé dans le travail actuel.", + "loc.messages.MorethanonepackagematchedwithspecifiedpatternPleaserestrainthesearchpattern": "Plusieurs packages correspondent au modèle spécifié : %s. Affinez le modèle de recherche." +} \ No newline at end of file diff --git a/_generated/AzureSpringCloudV0/Strings/resources.resjson/it-IT/resources.resjson b/_generated/AzureSpringCloudV0/Strings/resources.resjson/it-IT/resources.resjson new file mode 100644 index 000000000000..06f76a30a6b9 --- /dev/null +++ b/_generated/AzureSpringCloudV0/Strings/resources.resjson/it-IT/resources.resjson @@ -0,0 +1,73 @@ +{ + "loc.friendlyName": "Azure Spring Apps", + "loc.helpMarkDown": "[Altre informazioni su questa attività](https://aka.ms/azurespringapps)", + "loc.description": "Consente di distribuire applicazioni per Azure Spring Apps e gestire le distribuzioni.", + "loc.instanceNameFormat": "Azure Spring Apps $(Action): $(AppName)", + "loc.group.displayName.ApplicationAndConfigurationSettings": "Impostazioni applicazione e configurazione", + "loc.input.label.ConnectedServiceName": "Sottoscrizione di Azure", + "loc.input.help.ConnectedServiceName": "Consente di selezionare la sottoscrizione di Azure Resource Manager per la distribuzione.", + "loc.input.label.Action": "Azione", + "loc.input.help.Action": "Azione da eseguire su Azure Spring Apps.", + "loc.input.label.AzureSpringCloud": "Nome di Azure Spring Apps", + "loc.input.help.AzureSpringCloud": "Selezionare il servizio Azure Spring Apps in cui eseguire la distribuzione.", + "loc.input.label.AppName": "App", + "loc.input.help.AppName": "Selezionare l'app Azure Spring Apps da distribuire.", + "loc.input.label.DeploymentType": "Tipo di distribuzione", + "loc.input.help.DeploymentType": "Per eseguire la distribuzione con codice sorgente o pacchetto Java, scegliere \"Artefatti\"; Per eseguire la distribuzione con l'immagine del contenitore, scegliere \"Contenitore personalizzato\"", + "loc.input.label.UseStagingDeployment": "Usa la distribuzione di gestione temporanea", + "loc.input.help.UseStagingDeployment": "Selezionare automaticamente la distribuzione impostata come Gestione temporanea al momento dell'esecuzione dell'attività.", + "loc.input.label.CreateNewDeployment": "Se non ne esiste una, creare una nuova distribuzione di gestione temporanea.", + "loc.input.help.CreateNewDeployment": "Indica se impostare come destinazione la distribuzione impostata come Gestione temporanea al momento dell'esecuzione. Se questa opzione è deselezionata, è necessario impostare l'impostazione 'Nome distribuzione'.", + "loc.input.label.DeploymentName": "Distribuzione", + "loc.input.help.DeploymentName": "Distribuzione a cui verrà applicata questa attività. Solo lettere minuscole e numeri. Deve iniziare con una lettera.", + "loc.input.label.Package": "Pacchetto o cartella", + "loc.input.help.Package": "Percorso file del pacchetto o di una cartella contenente i contenuti dell'app Spring Apps.
Variabili ( [Build](https://docs.microsoft.com/vsts/pipelines/build/variables) | [Versione](https://docs.microsoft.com/vsts/pipelines/release/variables#default-variables)). I caratteri jolly sono supportati.
Ad esempio, $(System.DefaultWorkingDirectory)/\\*\\*/\\*.jar.", + "loc.input.label.Builder": "Generatore", + "loc.input.help.Builder": "Selezionare un generatore di VMware Tanzu® Build Service™, che può essere usato nel livello Enterprise.
Per una descrizione dettagliata, vedere [Usare Tanzu Build Service](https://docs.microsoft.com/it-it/azure/spring-apps/how-to-enterprise-build-service?tabs=azure-portal).", + "loc.input.label.RegistryServer": "Server del registro", + "loc.input.help.RegistryServer": "Registro dell'immagine del contenitore. Impostazione predefinita: docker.io.", + "loc.input.label.RegistryUsername": "Nome utente del registro", + "loc.input.help.RegistryUsername": "Nome utente del registro contenitori.", + "loc.input.label.RegistryPassword": "Password registro", + "loc.input.help.RegistryPassword": "Password per il registro contenitori.", + "loc.input.label.ImageName": "Tag e nome immagine", + "loc.input.help.ImageName": "Tag dell'immagine del contenitore.", + "loc.input.label.ImageCommand": "Comando Immagine", + "loc.input.help.ImageCommand": "Comando dell'immagine del contenitore.", + "loc.input.label.ImageArgs": "Argomenti dell'immagine", + "loc.input.help.ImageArgs": "Argomenti dell'immagine del contenitore.", + "loc.input.label.ImageLanguageFramework": "Framework del linguaggio", + "loc.input.label.EnvironmentVariables": "Variabili di ambiente", + "loc.input.help.EnvironmentVariables": "Modificare le variabili di ambiente dell'app.", + "loc.input.label.JvmOptions": "Opzioni JVM", + "loc.input.help.JvmOptions": "Modificare le opzioni JVM dell'app. Stringa contenente opzioni JVM. Esempio: '-Xms1024m -Xmx2048m'", + "loc.input.label.RuntimeVersion": "Versione runtime", + "loc.input.help.RuntimeVersion": "Runtime in cui verrà eseguita l'app.", + "loc.input.label.DotNetCoreMainEntryPath": "Percorso di accesso principale", + "loc.input.help.DotNetCoreMainEntryPath": "Percorso del file eseguibile .NET relativo alla radice ZIP.", + "loc.input.label.Version": "Versione", + "loc.messages.CompressingSourceDirectory": "Compressione della directory di origine %s in %s", + "loc.messages.DeploymentLog": "Registro di distribuzione", + "loc.messages.StatusCode": "Codice di stato", + "loc.messages.StartingUploadOf": "Avvio del caricamento di %s", + "loc.messages.CompletedUploadOf": "Il caricamento di %s è stato completato.", + "loc.messages.ResourceDoesntExist": "La risorsa '%s' non esiste. La risorsa deve esistere prima della distribuzione.", + "loc.messages.UnableToGetDeploymentUrl": "Non è possibile ottenere l'URL di distribuzione per Azure Spring Apps '%s', Errore: '%s'", + "loc.messages.DeploymentDoesntExist": "La distribuzione con nome %s non esiste. Non è possibile continuare.", + "loc.messages.StagingDeploymentWithNameDoesntExist": "La distribuzione di gestione temporanea con nome %s non esiste. Non è possibile continuare.", + "loc.messages.NoStagingDeploymentFound": "Non è stata trovata alcuna distribuzione di gestione temporanea.", + "loc.messages.TwoDeploymentsAlreadyExistCannotCreate": "La distribuzione con nome '%s' non esiste e non può essere creata perché esistono già due distribuzioni.", + "loc.messages.UnsupportedSourceType": "Il tipo di origine non è supportato per %s", + "loc.messages.UnknownOrUnsupportedAction": "Azione sconosciuta o non supportata: %s", + "loc.messages.OperationTimedOut": "Timeout dell'operazione.", + "loc.messages.OperationFailed": "Operazione non riuscita: %s %s", + "loc.messages.UnableToDeleteDeployment": "Non è possibile eliminare la distribuzione.", + "loc.messages.PrivateTestEndpointNotEnabled": "L'endpoint di test privato non è abilitato.", + "loc.messages.UnableToRetrieveTestEndpointKeys": "Non è possibile recuperare le chiavi dell'endpoint di test", + "loc.messages.NoDeploymentsExist": "Non esistono distribuzioni.", + "loc.messages.UnableToGetDeploymentInformation": "Non è possibile recuperare le informazioni sulla distribuzione.", + "loc.messages.DuplicateAzureSpringAppsName": "Stato non valido: più istanze di Azure Spring Apps con lo stesso nome.", + "loc.messages.InvalidAzureSpringAppsResourceId": "Identificatore della risorsa di Azure Spring Apps non valido: %s", + "loc.messages.Nopackagefoundwithspecifiedpattern": "Non è stato trovato alcun pacchetto con il criterio specificato: %s. Verificare se il pacchetto menzionato nell'attività viene pubblicato come artefatto nella compilazione o in una fase precedente e quindi scaricato nel processo corrente.", + "loc.messages.MorethanonepackagematchedwithspecifiedpatternPleaserestrainthesearchpattern": "Più pacchetti corrispondono al criterio specificato %s. Restringere i criteri di ricerca." +} \ No newline at end of file diff --git a/_generated/AzureSpringCloudV0/Strings/resources.resjson/ja-JP/resources.resjson b/_generated/AzureSpringCloudV0/Strings/resources.resjson/ja-JP/resources.resjson new file mode 100644 index 000000000000..c930b3614ad3 --- /dev/null +++ b/_generated/AzureSpringCloudV0/Strings/resources.resjson/ja-JP/resources.resjson @@ -0,0 +1,73 @@ +{ + "loc.friendlyName": "Azure Spring Apps", + "loc.helpMarkDown": "[このタスクの詳細情報](https://aka.ms/azurespringapps)", + "loc.description": "アプリケーションを Azure Spring Apps にデプロイして、デプロイを管理します。", + "loc.instanceNameFormat": "Azure Spring Apps $(Action): $(AppName)", + "loc.group.displayName.ApplicationAndConfigurationSettings": "アプリケーションと構成の設定", + "loc.input.label.ConnectedServiceName": "Azure サブスクリプション", + "loc.input.help.ConnectedServiceName": "配置用の Azure Resource Manager サブスクリプションを選択します。", + "loc.input.label.Action": "アクション", + "loc.input.help.Action": "Azure Spring Apps に対して実行されるアクション。", + "loc.input.label.AzureSpringCloud": "Azure Spring Apps 名", + "loc.input.help.AzureSpringCloud": "デプロイ先の Azure Spring Apps サービスを選択します。", + "loc.input.label.AppName": "アプリ", + "loc.input.help.AppName": "デプロイする Azure Spring Apps アプリを選択します。", + "loc.input.label.DeploymentType": "展開の種類", + "loc.input.help.DeploymentType": "ソース コードまたは Java パッケージを使用してデプロイするには、[成果物] を選択します。コンテナー イメージを使用してデプロイするには、[CustomContainer] を選択します", + "loc.input.label.UseStagingDeployment": "ステージング デプロイの使用", + "loc.input.help.UseStagingDeployment": "タスクの実行時にステージングとして設定されているデプロイを自動的に選択します。", + "loc.input.label.CreateNewDeployment": "ステージング デプロイが存在しない場合は、新しいステージング デプロイを作成します。", + "loc.input.help.CreateNewDeployment": "実行時にステージングとして設定されているデプロイをターゲットにするかどうか。オフにした場合は、[展開名] 設定を設定する必要があります。", + "loc.input.label.DeploymentName": "デプロイ", + "loc.input.help.DeploymentName": "このタスクが適用されるデプロイです。小文字と数字のみ; 文字で始まる必要があります。", + "loc.input.label.Package": "パッケージまたはフォルダー", + "loc.input.help.Package": "Spring Apps アプリ コンテンツのあるパッケージまたはフォルダーへのファイル パスです。
変数 ( [ビルド](https://docs.microsoft.com/vsts/pipelines/build/variables) | [リリース](https://docs.microsoft.com/vsts/pipelines/release/variables#default-variables))、ワイルドカードがサポートされています。
例えば、$(System.DefaultWorkingDirectory)/\\*\\*/\\*.jar。", + "loc.input.label.Builder": "ビルダー", + "loc.input.help.Builder": "VMware Tanzu® Build Service™ のビルダーを選択します。これはエンタープライズ レベルで使用できます。
詳細説明は、[Tanzu Build Service を使用する](https://docs.microsoft.com/ja-jp/azure/spring-cloud/how-to-enterprise-build-service?tabs=azure-portal) を確認してください。", + "loc.input.label.RegistryServer": "レジストリ サーバー", + "loc.input.help.RegistryServer": "コンテナー イメージのレジストリ。 既定値: docker.io。", + "loc.input.label.RegistryUsername": "レジストリのユーザー名", + "loc.input.help.RegistryUsername": "コンテナー レジストリのユーザー名。", + "loc.input.label.RegistryPassword": "レジストリのパスワード", + "loc.input.help.RegistryPassword": "コンテナー レジストリのパスワード。", + "loc.input.label.ImageName": "イメージ名とタグ", + "loc.input.help.ImageName": "コンテナー イメージ タグ", + "loc.input.label.ImageCommand": "イメージ コマンド", + "loc.input.help.ImageCommand": "コンテナー イメージのコマンド。", + "loc.input.label.ImageArgs": "イメージ引数", + "loc.input.help.ImageArgs": "コンテナー イメージの引数。", + "loc.input.label.ImageLanguageFramework": "言語フレームワーク", + "loc.input.label.EnvironmentVariables": "環境変数", + "loc.input.help.EnvironmentVariables": "アプリの環境変数を編集します。", + "loc.input.label.JvmOptions": "JVM オプション", + "loc.input.help.JvmOptions": "アプリの JVM オプションを編集します。JVM オプションを含む文字列です。例: '-Xms1024m -Xmx2048m'", + "loc.input.label.RuntimeVersion": "ランタイム バージョン", + "loc.input.help.RuntimeVersion": "アプリが実行されるランタイム。", + "loc.input.label.DotNetCoreMainEntryPath": "メイン エントリ パス", + "loc.input.help.DotNetCoreMainEntryPath": "zip ルートを基準とした .NET 実行可能ファイルへのパス。", + "loc.input.label.Version": "バージョン", + "loc.messages.CompressingSourceDirectory": "ソース ディレクトリ %s を %s に圧縮しています", + "loc.messages.DeploymentLog": "デプロイ ログ", + "loc.messages.StatusCode": "状態コード", + "loc.messages.StartingUploadOf": "%s のアップロードを開始しています", + "loc.messages.CompletedUploadOf": "%s のアップロードが完了しました。", + "loc.messages.ResourceDoesntExist": "リソース '%s' がありません。リソースはデプロイ前に存在している必要があります。", + "loc.messages.UnableToGetDeploymentUrl": "Azure Spring Apps '%s' のデプロイ URL を取得できません。エラー: '%s'", + "loc.messages.DeploymentDoesntExist": "%s という名前のデプロイは存在しません。続行できません。", + "loc.messages.StagingDeploymentWithNameDoesntExist": "%s という名前のステージング環境のデプロイは存在しません。続行できません。", + "loc.messages.NoStagingDeploymentFound": "ステージング環境のデプロイが見つかりません。", + "loc.messages.TwoDeploymentsAlreadyExistCannotCreate": "'%s'という名前のデプロイは存在しないため、作成できません。2 つのデプロイが既に存在します。", + "loc.messages.UnsupportedSourceType": "サポートされていないソースの型: %s", + "loc.messages.UnknownOrUnsupportedAction": "不明な型、またはサポートされていない型です: %s", + "loc.messages.OperationTimedOut": "操作がタイムアウトになりました。", + "loc.messages.OperationFailed": "操作に失敗しました: %s %s", + "loc.messages.UnableToDeleteDeployment": "デプロイを削除できません。", + "loc.messages.PrivateTestEndpointNotEnabled": "プライベート テスト エンドポイントが有効になっていません。", + "loc.messages.UnableToRetrieveTestEndpointKeys": "テスト エンドポイント キーを取得できません", + "loc.messages.NoDeploymentsExist": "デプロイが存在しません。", + "loc.messages.UnableToGetDeploymentInformation": "デプロイ情報を取得できません。", + "loc.messages.DuplicateAzureSpringAppsName": "無効な状態: 同じ名前の複数の Azure Spring Apps インスタンス。", + "loc.messages.InvalidAzureSpringAppsResourceId": "無効な Azure Spring Apps リソース識別子: %s", + "loc.messages.Nopackagefoundwithspecifiedpattern": "指定されたパターン %s のパッケージが見つかりませんでしたタスクに指定されているパッケージがビルドまたは前のステージで成果物として発行されており、現在のジョブにダウンロードされているかどうかをご確認ください。", + "loc.messages.MorethanonepackagematchedwithspecifiedpatternPleaserestrainthesearchpattern": "指定したパターンと一致するパッケージが複数あります: %s。検索パターンを絞り込んでください。" +} \ No newline at end of file diff --git a/_generated/AzureSpringCloudV0/Strings/resources.resjson/ko-KR/resources.resjson b/_generated/AzureSpringCloudV0/Strings/resources.resjson/ko-KR/resources.resjson new file mode 100644 index 000000000000..975ca6771341 --- /dev/null +++ b/_generated/AzureSpringCloudV0/Strings/resources.resjson/ko-KR/resources.resjson @@ -0,0 +1,73 @@ +{ + "loc.friendlyName": "Azure Spring Apps", + "loc.helpMarkDown": "[이 작업에 관한 자세한 정보](https://aka.ms/azurespringapps)", + "loc.description": "애플리케이션을 Azure Spring Apps로 배포하고 배포를 관리합니다.", + "loc.instanceNameFormat": "Azure Spring Apps $(Action): $(AppName)", + "loc.group.displayName.ApplicationAndConfigurationSettings": "애플리케이션 및 구성 설정", + "loc.input.label.ConnectedServiceName": "Azure 구독", + "loc.input.help.ConnectedServiceName": "배포에 대한 Azure Resource Manager 구독을 선택합니다.", + "loc.input.label.Action": "작업", + "loc.input.help.Action": "Azure Spring Apps에서 수행할 작업입니다.", + "loc.input.label.AzureSpringCloud": "Azure Spring Apps 이름", + "loc.input.help.AzureSpringCloud": "배포할 Azure Spring Apps 서비스를 선택합니다.", + "loc.input.label.AppName": "앱", + "loc.input.help.AppName": "배포할 Azure Spring Apps 앱을 선택합니다.", + "loc.input.label.DeploymentType": "배포 유형", + "loc.input.help.DeploymentType": "소스 코드 또는 Java 패키지와 함께 배포하려면 \"아티팩트\"를 선택하고, 컨테이너 이미지와 함께 배포하려면 \"고객 컨테이너\"를 선택하세요.", + "loc.input.label.UseStagingDeployment": "새 스테이징 배포", + "loc.input.help.UseStagingDeployment": "작업을 실행할 때 스테이징으로 설정된 배포를 자동으로 선택합니다.", + "loc.input.label.CreateNewDeployment": "새 스테이징 배포가 없는 경우 새로 만듭니다.", + "loc.input.help.CreateNewDeployment": "실행 시 스테이징으로 설정된 배포를 대상으로 지정할지 여부입니다. 선택하지 않을 시 '배포 이름' 설정을 설정해야 합니다.", + "loc.input.label.DeploymentName": "배포", + "loc.input.help.DeploymentName": "이 작업을 적용할 배포입니다. 소문자 및 숫자만 사용할 수 있으며, 문자로 시작해야 합니다.", + "loc.input.label.Package": "패키지 또는 폴더", + "loc.input.help.Package": "Spring Apps 앱 콘텐츠가 포함된 패키지 또는 폴더의 파일 경로입니다.
변수([빌드](https://docs.microsoft.com/vsts/pipelines/build/variables) | [릴리스](https://docs.microsoft.com/vsts/pipelines/release/variables#default-variables)), 와일드카드가 지원됩니다.
예: $(System.DefaultWorkingDirectory)/\\*\\*/\\*.jar.", + "loc.input.label.Builder": "작성기", + "loc.input.help.Builder": "엔터프라이즈 계층에서 사용할 수 있는 VMware Tanzu® Build Service™의 작성기를 선택합니다.
자세한 내용은 [Tanzu Build Service 사용](https://docs.microsoft.com/en-us/azure/spring-apps/how-to-enterprise-build-service?tabs=azure-portal)을 참조하세요.", + "loc.input.label.RegistryServer": "레지스트리 서버", + "loc.input.help.RegistryServer": "컨테이너 이미지의 레지스트리입니다. 기본값: docker.io.", + "loc.input.label.RegistryUsername": "레지스트리 사용자 이름", + "loc.input.help.RegistryUsername": "컨테이너 레지스트리의 사용자 이름입니다.", + "loc.input.label.RegistryPassword": "레지스트리 암호", + "loc.input.help.RegistryPassword": "컨테이너 레지스트리의 암호입니다.", + "loc.input.label.ImageName": "이미지 이름 및 태그", + "loc.input.help.ImageName": "컨테이너 이미지 태그입니다.", + "loc.input.label.ImageCommand": "이미지 명령", + "loc.input.help.ImageCommand": "컨테이너 이미지의 명령입니다.", + "loc.input.label.ImageArgs": "이미지 인수", + "loc.input.help.ImageArgs": "컨테이너 이미지의 인수입니다.", + "loc.input.label.ImageLanguageFramework": "언어 프레임워크", + "loc.input.label.EnvironmentVariables": "환경 변수", + "loc.input.help.EnvironmentVariables": "앱의 환경 변수를 편집합니다.", + "loc.input.label.JvmOptions": "JVM 옵션", + "loc.input.help.JvmOptions": "앱의 JVM 옵션을 편집합니다. JVM 옵션을 포함하는 문자열입니다. 예: '-Xms1024m -Xmx2048m'", + "loc.input.label.RuntimeVersion": "런타임 버전", + "loc.input.help.RuntimeVersion": "앱을 실행할 런타임입니다.", + "loc.input.label.DotNetCoreMainEntryPath": "주 항목 경로", + "loc.input.help.DotNetCoreMainEntryPath": "zip 루트를 기준으로 하는 .NET 실행 파일의 경로입니다.", + "loc.input.label.Version": "버전", + "loc.messages.CompressingSourceDirectory": "%s 원본 디렉터리를 %s(으)로 압축하는 중", + "loc.messages.DeploymentLog": "배포 로그", + "loc.messages.StatusCode": "상태 코드", + "loc.messages.StartingUploadOf": "%s 업로드를 시작하는 중", + "loc.messages.CompletedUploadOf": "%s 업로드를 완료했습니다.", + "loc.messages.ResourceDoesntExist": "'%s' 리소스가 없습니다. 배포 전에 리소스가 있어야 합니다.", + "loc.messages.UnableToGetDeploymentUrl": "Azure Spring Apps '%s'에 대한 배포 URL을 가져올 수 없습니다. 오류: '%s'", + "loc.messages.DeploymentDoesntExist": "이름이 %s인 배포가 없습니다. 계속할 수 없습니다.", + "loc.messages.StagingDeploymentWithNameDoesntExist": "이름이 %s인 스테이징 배포가 없습니다. 계속할 수 없습니다.", + "loc.messages.NoStagingDeploymentFound": "스테이징 배포를 찾을 수 없습니다.", + "loc.messages.TwoDeploymentsAlreadyExistCannotCreate": "이름이 '%s'인 배포가 없으며 배포가 이미 두 개 있으므로 만들 수 없습니다.", + "loc.messages.UnsupportedSourceType": "%s에 대해 지원되지 않는 소스 형식", + "loc.messages.UnknownOrUnsupportedAction": "알 수 없거나 지원되지 않는 작업: %s", + "loc.messages.OperationTimedOut": "작업 시간이 초과되었습니다.", + "loc.messages.OperationFailed": "작업 실패: %s %s", + "loc.messages.UnableToDeleteDeployment": "배포를 삭제할 수 없습니다.", + "loc.messages.PrivateTestEndpointNotEnabled": "프라이빗 테스트 엔드포인트를 사용할 수 없습니다.", + "loc.messages.UnableToRetrieveTestEndpointKeys": "테스트 엔드포인트 키를 찾아올 수 없습니다.", + "loc.messages.NoDeploymentsExist": "배포가 없습니다.", + "loc.messages.UnableToGetDeploymentInformation": "배포 정보를 가져올 수 없습니다.", + "loc.messages.DuplicateAzureSpringAppsName": "잘못된 상태: 이름이 같은 Azure Spring Apps 인스턴스가 여러 개입니다.", + "loc.messages.InvalidAzureSpringAppsResourceId": "잘못된 Azure Spring Apps 리소스 식별자: %s", + "loc.messages.Nopackagefoundwithspecifiedpattern": "지정한 %s 패턴의 패키지를 찾을 수 없습니다. 작업에 언급된 패키지를 빌드 또는 이전 스테이지에서 아티팩트로 게시하고, 현재 작업에 다운로드했는지 확인합니다.", + "loc.messages.MorethanonepackagematchedwithspecifiedpatternPleaserestrainthesearchpattern": "지정한 %s 패턴과 일치하는 패키지가 두 개 이상 있습니다. 검색 패턴을 제한하세요." +} \ No newline at end of file diff --git a/_generated/AzureSpringCloudV0/Strings/resources.resjson/ru-RU/resources.resjson b/_generated/AzureSpringCloudV0/Strings/resources.resjson/ru-RU/resources.resjson new file mode 100644 index 000000000000..f0ffd836904a --- /dev/null +++ b/_generated/AzureSpringCloudV0/Strings/resources.resjson/ru-RU/resources.resjson @@ -0,0 +1,73 @@ +{ + "loc.friendlyName": "Приложения Azure Spring", + "loc.helpMarkDown": "[Подробнее об этой задаче](https://aka.ms/azurespringapps)", + "loc.description": "Развертывание приложений в Приложениях Azure Spring и управление развертываниями.", + "loc.instanceNameFormat": "Приложения Azure Spring $(Action): $(AppName)", + "loc.group.displayName.ApplicationAndConfigurationSettings": "Параметры приложения и конфигурации", + "loc.input.label.ConnectedServiceName": "Подписка Azure", + "loc.input.help.ConnectedServiceName": "Выберите подписку Azure Resource Manager для развертывания.", + "loc.input.label.Action": "Действие", + "loc.input.help.Action": "Действие, выполняемое в Приложениях Azure Spring.", + "loc.input.label.AzureSpringCloud": "Имя Приложений Azure Spring", + "loc.input.help.AzureSpringCloud": "Выберите службу Приложений Azure Spring для развертывания.", + "loc.input.label.AppName": "Приложение", + "loc.input.help.AppName": "Выберите приложение \"Приложения Azure Spring\" для развертывания.", + "loc.input.label.DeploymentType": "Тип развертывания", + "loc.input.help.DeploymentType": "Для развертывания с исходным кодом или пакетом Java выберите \"Artifacts\"; Чтобы развернуть образ контейнера, выберите \"Custom Container\".", + "loc.input.label.UseStagingDeployment": "Использование промежуточного развертывания", + "loc.input.help.UseStagingDeployment": "Автоматически выбирать развертывание, установленное как промежуточное, во время выполнения задачи.", + "loc.input.label.CreateNewDeployment": "Создайте промежуточное развертывание, если оно не существует.", + "loc.input.help.CreateNewDeployment": "Следует ли нацеливать развертывание, установленное как промежуточное во время выполнения. Если флажок не установлен, необходимо установить параметр имени развертывания.", + "loc.input.label.DeploymentName": "Развертывание", + "loc.input.help.DeploymentName": "Развертывание, к которому будет применяться эта задача. Только строчные буквы и цифры. Должно начинаться с буквы.", + "loc.input.label.Package": "Пакет или папка", + "loc.input.help.Package": "Путь файла к пакету или папке, содержащей контент приложения \"Приложения Spring\".
Переменные ( [Сборка](https://docs.microsoft.com/vsts/pipelines/build/variables) | [Выпуск](https://docs.microsoft.com/vsts/pipelines/release/variables#default-variables)), подстановочные знаки поддерживаются.
Например, $(System.DefaultWorkingDirectory)/\\*\\*/\\*.jar.", + "loc.input.label.Builder": "Построитель", + "loc.input.help.Builder": "Выберите построитель VMware Tanzu® Build Service™, который можно использовать на корпоративном уровне.
Подробное описание см. в разделе [Использование Tanzu Build Service](https://docs.microsoft.com/en-us/azure/spring-apps/how-to-enterprise-build-service?tabs=azure-portal).", + "loc.input.label.RegistryServer": "Сервер реестра", + "loc.input.help.RegistryServer": "Реестр образа контейнера. По умолчанию: docker.io.", + "loc.input.label.RegistryUsername": "Имя пользователя в реестре", + "loc.input.help.RegistryUsername": "Имя пользователя реестра контейнеров.", + "loc.input.label.RegistryPassword": "Пароль реестра", + "loc.input.help.RegistryPassword": "Пароль реестра контейнеров.", + "loc.input.label.ImageName": "Имя и тег образа", + "loc.input.help.ImageName": "Тег образа контейнера.", + "loc.input.label.ImageCommand": "Команда образа", + "loc.input.help.ImageCommand": "Команда образа контейнера.", + "loc.input.label.ImageArgs": "Аргументы образа", + "loc.input.help.ImageArgs": "Аргументы образа контейнера.", + "loc.input.label.ImageLanguageFramework": "Языковая платформа", + "loc.input.label.EnvironmentVariables": "Переменные среды", + "loc.input.help.EnvironmentVariables": "Изменение переменных среды приложения.", + "loc.input.label.JvmOptions": "Параметры JVM", + "loc.input.help.JvmOptions": "Изменение параметров JVM приложения. Строка, содержащая параметры JVM. Пример: `-Xms1024m -Xmx2048m`", + "loc.input.label.RuntimeVersion": "Версия среды выполнения", + "loc.input.help.RuntimeVersion": "Среда выполнения, в которой будет работать приложение.", + "loc.input.label.DotNetCoreMainEntryPath": "Путь к основной записи", + "loc.input.help.DotNetCoreMainEntryPath": "Путь к исполняемому файлу .NET относительно корня ZIP.", + "loc.input.label.Version": "Версия", + "loc.messages.CompressingSourceDirectory": "Сжатие исходного каталога %s до %s", + "loc.messages.DeploymentLog": "Журнал развертывания", + "loc.messages.StatusCode": "Код состояния", + "loc.messages.StartingUploadOf": "Начало отправки %s", + "loc.messages.CompletedUploadOf": "Отправка %s завершена.", + "loc.messages.ResourceDoesntExist": "Ресурс \"%s\" не существует. Он должен существовать перед началом развертывания.", + "loc.messages.UnableToGetDeploymentUrl": "Не удалось получить URL-адрес развертывания для Приложений Azure Spring \"%s\". Ошибка: \"%s\"", + "loc.messages.DeploymentDoesntExist": "Развертывание с именем \"%s\" не существует. Не удалось продолжить.", + "loc.messages.StagingDeploymentWithNameDoesntExist": "Промежуточное развертывание с именем %s не существует. Не удалось продолжить.", + "loc.messages.NoStagingDeploymentFound": "Промежуточное развертывание не найдено.", + "loc.messages.TwoDeploymentsAlreadyExistCannotCreate": "Развертывание с \"%s\" не существует и не может быть создано, так как уже существуют два развертывания.", + "loc.messages.UnsupportedSourceType": "Неподдерживаемый тип источника для %s", + "loc.messages.UnknownOrUnsupportedAction": "Неизвестное или неподдерживаемое действие: %s", + "loc.messages.OperationTimedOut": "Истекло время ожидания операции.", + "loc.messages.OperationFailed": "Сбой операции: %s %s", + "loc.messages.UnableToDeleteDeployment": "Не удается удалить развертывание.", + "loc.messages.PrivateTestEndpointNotEnabled": "Частная тестовая конечная точка не включена.", + "loc.messages.UnableToRetrieveTestEndpointKeys": "Не удалось получить ключи тестовой конечной точки", + "loc.messages.NoDeploymentsExist": "Нет развертываний.", + "loc.messages.UnableToGetDeploymentInformation": "Не удалось получить данные о развертывании", + "loc.messages.DuplicateAzureSpringAppsName": "Недопустимое состояние: несколько экземпляров Приложений Azure Spring с одинаковыми именами.", + "loc.messages.InvalidAzureSpringAppsResourceId": "Недопустимый идентификатор ресурса Приложений Azure Spring: %s", + "loc.messages.Nopackagefoundwithspecifiedpattern": "Пакет с указанным шаблоном не найден: %s. Проверьте, опубликован ли пакет, упомянутый в задаче, как артефакт в сборке или на предыдущем этапе и скачан ли он в текущем задании.", + "loc.messages.MorethanonepackagematchedwithspecifiedpatternPleaserestrainthesearchpattern": "Указанному шаблону соответствует несколько пакетов: %s. Ограничьте шаблон поиска." +} \ No newline at end of file diff --git a/_generated/AzureSpringCloudV0/Strings/resources.resjson/zh-CN/resources.resjson b/_generated/AzureSpringCloudV0/Strings/resources.resjson/zh-CN/resources.resjson new file mode 100644 index 000000000000..eb264668a235 --- /dev/null +++ b/_generated/AzureSpringCloudV0/Strings/resources.resjson/zh-CN/resources.resjson @@ -0,0 +1,73 @@ +{ + "loc.friendlyName": "Azure Spring Apps", + "loc.helpMarkDown": "[了解有关此任务的详细信息](https://aka.ms/azurespringapps)", + "loc.description": "部署应用程序到 Azure Spring Apps 并管理部署。", + "loc.instanceNameFormat": "Azure Spring Apps $(Action): $(AppName)", + "loc.group.displayName.ApplicationAndConfigurationSettings": "应用程序和配置设置", + "loc.input.label.ConnectedServiceName": "Azure 订阅", + "loc.input.help.ConnectedServiceName": "为部署选择 Azure 资源管理器订阅。", + "loc.input.label.Action": "操作", + "loc.input.help.Action": "要对 Azure Spring Apps 执行的操作。", + "loc.input.label.AzureSpringCloud": "Azure Spring Apps 名称", + "loc.input.help.AzureSpringCloud": "选择要部署到的 Azure Spring Apps 服务。", + "loc.input.label.AppName": "应用", + "loc.input.help.AppName": "选择要部署的 Azure Spring Apps 应用。", + "loc.input.label.DeploymentType": "部署类型", + "loc.input.help.DeploymentType": "要使用源代码或 Java 包进行部署,请选择“项目”;要使用容器映像进行部署,请选择 “Custom Container”", + "loc.input.label.UseStagingDeployment": "使用暂存部署", + "loc.input.help.UseStagingDeployment": "在任务运行时自动选择设置为“暂存”的部署。", + "loc.input.label.CreateNewDeployment": "创建新的暂存部署(如果不存在)。", + "loc.input.help.CreateNewDeployment": "是否以执行时设置为“暂存”的部署为目标。如果未选中,则必须设置“部署名称”设置。", + "loc.input.label.DeploymentName": "部署", + "loc.input.help.DeploymentName": "此任务将应用到的部署。仅小写字母和数字; 必须以字母开头。", + "loc.input.label.Package": "包或文件夹", + "loc.input.help.Package": "包含 Spring Apps 应用内容的包或文件夹的文件路径。
支持变量([Build](https://docs.microsoft.com/vsts/pipelines/build/variables) | [Release](https://docs.microsoft.com/vsts/pipelines/release/variables#default-variables))、通配符。
例如,$(System.DefaultWorkingDirectory)/\\*\\*/\\*.jar。", + "loc.input.label.Builder": "生成器", + "loc.input.help.Builder": "选择 VMware Tanzu® 生成服务™ 的生成器,这可用于企业层。
有关详细说明,请查看 [使用 Tanzu Build Service](https://docs.microsoft.com/en-us/azure/spring-apps/how-to-enterprise-build-service?tabs=azure-portal)。", + "loc.input.label.RegistryServer": "注册表服务器", + "loc.input.help.RegistryServer": "容器映像的注册表。默认值: docker.io。", + "loc.input.label.RegistryUsername": "注册表用户名", + "loc.input.help.RegistryUsername": "容器注册表的用户名。", + "loc.input.label.RegistryPassword": "注册表密码", + "loc.input.help.RegistryPassword": "容器注册表的密码。", + "loc.input.label.ImageName": "映像名称和标记", + "loc.input.help.ImageName": "容器映像标记。", + "loc.input.label.ImageCommand": "图像命令", + "loc.input.help.ImageCommand": "容器映像的命令。", + "loc.input.label.ImageArgs": "图像参数", + "loc.input.help.ImageArgs": "容器映像的参数。", + "loc.input.label.ImageLanguageFramework": "语言框架", + "loc.input.label.EnvironmentVariables": "环境变量", + "loc.input.help.EnvironmentVariables": "编辑应用的环境变量。", + "loc.input.label.JvmOptions": "JVM 选项", + "loc.input.help.JvmOptions": "编辑应用的 JVM 选项。包含 JVM 选项的字符串。示例: \"-Xms1024m -Xmx2048m\"", + "loc.input.label.RuntimeVersion": "运行时版本", + "loc.input.help.RuntimeVersion": "应用将在其上运行的运行时。", + "loc.input.label.DotNetCoreMainEntryPath": "主条目路径", + "loc.input.help.DotNetCoreMainEntryPath": "相对于 zip 根的 .NET 可执行文件的路径。", + "loc.input.label.Version": "版本", + "loc.messages.CompressingSourceDirectory": "正在将源目录 %s 压缩到 %s", + "loc.messages.DeploymentLog": "部署日志", + "loc.messages.StatusCode": "状态代码", + "loc.messages.StartingUploadOf": "正在开始上传 %s", + "loc.messages.CompletedUploadOf": "上传 %s 已完成。", + "loc.messages.ResourceDoesntExist": "资源“%s”不存在。资源应在部署前就已存在。", + "loc.messages.UnableToGetDeploymentUrl": "无法获取 Azure Spring Apps“%s”的部署 URL,错误:“%s”", + "loc.messages.DeploymentDoesntExist": "不存在名为“%s”的部署。无法继续。", + "loc.messages.StagingDeploymentWithNameDoesntExist": "名为 %s 的暂存部署不存在。无法继续。", + "loc.messages.NoStagingDeploymentFound": "找不到暂存部署。", + "loc.messages.TwoDeploymentsAlreadyExistCannotCreate": "名为“%s”的部署不存在,无法创建,因为已存在两个部署。", + "loc.messages.UnsupportedSourceType": "%s 的源类型不受支持", + "loc.messages.UnknownOrUnsupportedAction": "未知或不受支持的操作: %s", + "loc.messages.OperationTimedOut": "操作超时。", + "loc.messages.OperationFailed": "操作失败: %s %s", + "loc.messages.UnableToDeleteDeployment": "无法删除部署。", + "loc.messages.PrivateTestEndpointNotEnabled": "未启用专用测试终结点。", + "loc.messages.UnableToRetrieveTestEndpointKeys": "无法检索测试终结点密钥", + "loc.messages.NoDeploymentsExist": "不存在部署。", + "loc.messages.UnableToGetDeploymentInformation": "无法获取部署信息。", + "loc.messages.DuplicateAzureSpringAppsName": "非法状态: 有多个 Azure Spring Apps 同名实例。", + "loc.messages.InvalidAzureSpringAppsResourceId": "Azure Spring Apps 资源标识符无效: %s", + "loc.messages.Nopackagefoundwithspecifiedpattern": "未找到具有指定模式的包: %s。请检查任务中提及的包是否在版本或上一阶段中作为项目发布,以及是否已在当前作业中下载。", + "loc.messages.MorethanonepackagematchedwithspecifiedpatternPleaserestrainthesearchpattern": "指定的模式 %s 有多个匹配的包。请限制搜索模式。" +} \ No newline at end of file diff --git a/_generated/AzureSpringCloudV0/Strings/resources.resjson/zh-TW/resources.resjson b/_generated/AzureSpringCloudV0/Strings/resources.resjson/zh-TW/resources.resjson new file mode 100644 index 000000000000..52ebfdba581a --- /dev/null +++ b/_generated/AzureSpringCloudV0/Strings/resources.resjson/zh-TW/resources.resjson @@ -0,0 +1,73 @@ +{ + "loc.friendlyName": "Azure Spring 應用程式", + "loc.helpMarkDown": "[深入了解此工作](https://aka.ms/azurespringapps)", + "loc.description": "將應用程式部署到 Azure Spring 應用程式並管理部署。", + "loc.instanceNameFormat": "Azure Spring 應用程式 $(Action): $(AppName)", + "loc.group.displayName.ApplicationAndConfigurationSettings": "應用程式和組態設定", + "loc.input.label.ConnectedServiceName": "Azure 訂用帳戶", + "loc.input.help.ConnectedServiceName": "選取部署的 Azure Resource Manager 訂用帳戶。", + "loc.input.label.Action": "動作", + "loc.input.help.Action": "要在 Azure Spring 應用程式上執行的動作。", + "loc.input.label.AzureSpringCloud": "Azure Spring 應用程式名稱", + "loc.input.help.AzureSpringCloud": "選取目的地 Azure Spring 應用程式服務,以進行部署。", + "loc.input.label.AppName": "應用程式", + "loc.input.help.AppName": "選取要部署的 Azure Spring 應用程式。", + "loc.input.label.DeploymentType": "部署類型", + "loc.input.help.DeploymentType": "若要使用原始程式碼碼或 JAVA 套件部署,請選擇 [成品]; 若要使用容器映像部署,請選擇 [自訂容器]", + "loc.input.label.UseStagingDeployment": "使用暫存部署", + "loc.input.help.UseStagingDeployment": "自動選取工作執行時設定為 [暫存] 的部署。", + "loc.input.label.CreateNewDeployment": "如果暫存部署不存在,請建立新的新的暫存部署。", + "loc.input.help.CreateNewDeployment": "是否要將執行時設為暫存的部署設為目標。如果取消核取,則必須設定 [部署名稱] 設定。", + "loc.input.label.DeploymentName": "部署", + "loc.input.help.DeploymentName": "此工作將套用到的部署。僅限小寫字母和數位;開頭必須是字母。", + "loc.input.label.Package": "套件或資料夾", + "loc.input.help.Package": "套件或包含 Spring Apps 應用程式內容的資料夾檔案路徑。
變數 ([建置](https://docs.microsoft.com/vsts/pipelines/build/variables) | [發行](https://docs.microsoft.com/vsts/pipelines/release/variables#default-variables)),支援萬用字元。
例如 $(System.DefaultWorkingDirectory)/\\*\\*/\\*.jar。", + "loc.input.label.Builder": "建置者", + "loc.input.help.Builder": "選取 VMware Tanzu® Build Service™ 的產生器,其可用於企業階層。
如需詳細說明,請查看 [使用 Tanzu Build Service](https://docs.microsoft.com/zh-tw/azure/spring-apps/how-to-enterprise-build-service?tabs=azure-portal)。", + "loc.input.label.RegistryServer": "登錄伺服器", + "loc.input.help.RegistryServer": "容器映像的登錄。預設值: docker.io。", + "loc.input.label.RegistryUsername": "登錄使用者名稱", + "loc.input.help.RegistryUsername": "容器登錄的使用者名稱。", + "loc.input.label.RegistryPassword": "登錄密碼", + "loc.input.help.RegistryPassword": "容器登錄的密碼。", + "loc.input.label.ImageName": "映像名稱及標籤", + "loc.input.help.ImageName": "容器映像標籤。", + "loc.input.label.ImageCommand": "映像命令", + "loc.input.help.ImageCommand": "容器映射的命令。", + "loc.input.label.ImageArgs": "映像引數", + "loc.input.help.ImageArgs": "容器映像的引數。", + "loc.input.label.ImageLanguageFramework": "語言架構", + "loc.input.label.EnvironmentVariables": "環境變數", + "loc.input.help.EnvironmentVariables": "編輯應用程式的環境變數。", + "loc.input.label.JvmOptions": "JVM 選項", + "loc.input.help.JvmOptions": "編輯應用程式的 JVM 選項。包含 JVM 選項的字串。範例: `-Xms1024m -Xmx2048m`", + "loc.input.label.RuntimeVersion": "執行階段版本", + "loc.input.help.RuntimeVersion": "應用程式將執行的執行時間。", + "loc.input.label.DotNetCoreMainEntryPath": "主要輸入路徑", + "loc.input.help.DotNetCoreMainEntryPath": "相對於 zip 根目錄的 .NET 可執行檔路徑。", + "loc.input.label.Version": "版本", + "loc.messages.CompressingSourceDirectory": "正在將來源目錄 %s 壓縮為 %s", + "loc.messages.DeploymentLog": "部署記錄檔", + "loc.messages.StatusCode": "狀態碼", + "loc.messages.StartingUploadOf": "正在開始上傳 %s", + "loc.messages.CompletedUploadOf": "已完成上傳 %s。", + "loc.messages.ResourceDoesntExist": "資源 '%s' 不存在。應具備資源才可部署。", + "loc.messages.UnableToGetDeploymentUrl": "無法取得 Azure Spring 應用程式 '%s' 的部署 URL,錯誤: '%s'", + "loc.messages.DeploymentDoesntExist": "名稱為 '%s' 的部署不存在。無法繼續。", + "loc.messages.StagingDeploymentWithNameDoesntExist": "名稱為 %s 的暫存部署不存在。無法繼續。", + "loc.messages.NoStagingDeploymentFound": "找不到暫存部署。", + "loc.messages.TwoDeploymentsAlreadyExistCannotCreate": "名稱為 '%s' 的部署不存在且無法建立,因為已經有兩個部署存在。", + "loc.messages.UnsupportedSourceType": "不支援 %s 的來源類型", + "loc.messages.UnknownOrUnsupportedAction": "未知或不支援的動作: %s", + "loc.messages.OperationTimedOut": "作業逾時。", + "loc.messages.OperationFailed": "作業失敗: %s %s", + "loc.messages.UnableToDeleteDeployment": "無法刪除部署。", + "loc.messages.PrivateTestEndpointNotEnabled": "未啟用私人測試端點。", + "loc.messages.UnableToRetrieveTestEndpointKeys": "無法擷取測試端點金鑰", + "loc.messages.NoDeploymentsExist": "沒有部署存在。", + "loc.messages.UnableToGetDeploymentInformation": "無法取得部署資訊。", + "loc.messages.DuplicateAzureSpringAppsName": "不合法的狀態: 多個具有相同名稱的 Azure Spring 應用程式執行個體。", + "loc.messages.InvalidAzureSpringAppsResourceId": "Azure Spring 應用程式資源識別碼無效: %s", + "loc.messages.Nopackagefoundwithspecifiedpattern": "找不到具有指定模式的套件: %s。請確認工作中所提及的套件已在組建或上一個階段中發行為成品,並已在目前的作業中下載。", + "loc.messages.MorethanonepackagematchedwithspecifiedpatternPleaserestrainthesearchpattern": "有多個套件與指定模式相符: %s。請縮小搜尋模式範圍。" +} \ No newline at end of file diff --git a/_generated/AzureSpringCloudV0/Tests/AzureSpringAppsDeploymentProviderUnitTests.ts b/_generated/AzureSpringCloudV0/Tests/AzureSpringAppsDeploymentProviderUnitTests.ts new file mode 100644 index 000000000000..f45d91a662f8 --- /dev/null +++ b/_generated/AzureSpringCloudV0/Tests/AzureSpringAppsDeploymentProviderUnitTests.ts @@ -0,0 +1,25 @@ +import assert = require('assert'); +import { AzureSpringAppsDeploymentProvider } from "../deploymentProvider/AzureSpringAppsDeploymentProvider" +import { TaskParameters } from "../operations/taskparameters" + + +export class AzureSpringAppsUnitTests { + + public static pathTraversalAttackTest = (done: Mocha.Done) => { + const resourceIdWithPathAttack = '/subscriptions/mocksubid/resourceGroups/mockresouorcegroup/providers/Microsoft.AppPlatform/Spring/authorized-name/../unauthorized-name'; + const taskParameters: TaskParameters = { + AzureSpringApps: resourceIdWithPathAttack, + AppName: 'appName', + UseStagingDeployment: false, + Action: 'Deploy' + }; + + const provider = new AzureSpringAppsDeploymentProvider(taskParameters); + provider.PreDeploymentStep().then(() => { + done(assert.fail('Attempted path traversal attack should have failed')); + }).catch(error => { + assert.strictEqual(error.message, `loc_mock_InvalidAzureSpringAppsResourceId ${resourceIdWithPathAttack}`); + done(); + }); + } +} \ No newline at end of file diff --git a/_generated/AzureSpringCloudV0/Tests/AzureSpringAppsUnitTests.ts b/_generated/AzureSpringCloudV0/Tests/AzureSpringAppsUnitTests.ts new file mode 100644 index 000000000000..9d3ab47830c5 --- /dev/null +++ b/_generated/AzureSpringCloudV0/Tests/AzureSpringAppsUnitTests.ts @@ -0,0 +1,115 @@ + +import { AzureEndpoint } from "azure-pipelines-tasks-azure-arm-rest/azureModels"; +import { getMockEndpoint, nock } from 'azure-pipelines-tasks-azure-arm-rest/Tests/mock_utils'; +import { MOCK_RESOURCE_GROUP_NAME, API_VERSION } from "./mock_utils"; +import assert = require('assert'); + +export class AzureSpringAppsUnitTests { + + static readonly AZURE_ENDPOINT: AzureEndpoint = getMockEndpoint(); + + /** + * Tests that deployment names are parsed correctly from API output. + */ + public static testDeploymentNameRetrieval = (done: Mocha.Done) => { + let azureSpringAppsName = 'testDeploymentNameRetrieval'; + let appName = 'testapp'; + let azureSpringApps = AzureSpringAppsUnitTests.newAzureSpringApps(azureSpringAppsName); + AzureSpringAppsUnitTests.mockDeploymentListApiWithTwoDeployments(azureSpringAppsName, appName); + let expectedDeploymentNames = ['default', 'theOtherOne']; + azureSpringApps.getAllDeploymentNames(appName) + .then(foundDeploymentNames => { + assert.deepStrictEqual(foundDeploymentNames, expectedDeploymentNames); + done(); + }) + .catch(error => done(error)); + } + + /** Prepares an instance of the AzureSpringAppsWrapper with a mock endpoint */ + private static newAzureSpringApps(name: string) { + let asa = require('../deploymentProvider/azure-arm-spring-apps'); + let azureSpringApps = new asa.AzureSpringApps(this.AZURE_ENDPOINT, `/subscriptions/${this.AZURE_ENDPOINT.subscriptionID}/resourceGroups/${MOCK_RESOURCE_GROUP_NAME}/providers/Microsoft.AppPlatform/Spring/${name}`) + return azureSpringApps; + } + + private static mockDeploymentListApiWithTwoDeployments(azureSpringAppsName: string, appName: string) { + console.log('mockDeploymentListApiWithTwoDeployments'); + + nock('https://management.azure.com').get(`/subscriptions/${this.AZURE_ENDPOINT.subscriptionID}/resourceGroups/${encodeURIComponent(MOCK_RESOURCE_GROUP_NAME)}/providers/Microsoft.AppPlatform/Spring/${azureSpringAppsName}/apps/${appName}/deployments?api-version=${API_VERSION}`) + .reply(200, { + "value": [ + { + "id": `/subscriptions/${this.AZURE_ENDPOINT.subscriptionID}/resourceGroups/${encodeURIComponent(MOCK_RESOURCE_GROUP_NAME)}/providers/Microsoft.AppPlatform/Spring/${azureSpringAppsName}/apps/${appName}/deployments/default`, + "name": "default", + "properties": { + "active": true, + "appName": appName, + "deploymentSettings": { + "cpu": 1, + "environmentVariables": null, + "memoryInGB": 1, + "runtimeVersion": "Java_8" + }, + "instances": [ + { + "discoveryStatus": "UP", + "name": `${appName}-default-7-7b77f5b6f5-fff9t`, + "startTime": "2021-03-13T01:39:20Z", + "status": "Running" + } + ], + "provisioningState": "Succeeded", + "source": { + "relativePath": "", + "type": "Jar" + }, + "status": "Running" + }, + "resourceGroup": MOCK_RESOURCE_GROUP_NAME, + "sku": { + "capacity": 1, + "name": "S0", + "tier": "Standard" + }, + "type": `providers/Microsoft.AppPlatform/Spring/apps/deployments` + }, + { + "id": `/subscriptions/${this.AZURE_ENDPOINT.subscriptionID}/resourceGroups/${encodeURIComponent(MOCK_RESOURCE_GROUP_NAME)}/providers/Microsoft.AppPlatform/Spring/${azureSpringAppsName}/apps/${appName}/deployments/theOtherOne`, + "name": "theOtherOne", + "properties": { + "active": true, + "appName": appName, + "deploymentSettings": { + "cpu": 1, + "environmentVariables": null, + "memoryInGB": 1, + "runtimeVersion": "Java_8" + }, + "instances": [ + { + "discoveryStatus": "UP", + "name": `${appName}-theOtherOne-7-7b77f5b6f5-90210`, + "startTime": "2021-03-13T01:39:20Z", + "status": "Running" + } + ], + "provisioningState": "Succeeded", + "source": { + "relativePath": "", + "type": "Jar" + }, + "status": "Running" + }, + "resourceGroup": MOCK_RESOURCE_GROUP_NAME, + "sku": { + "capacity": 1, + "name": "S0", + "tier": "Standard" + }, + "type": 'Microsoft.AppPlatform/Spring/apps/deployments' + } + ] + + }).persist(); + } +} \ No newline at end of file diff --git a/_generated/AzureSpringCloudV0/Tests/CreateNamedDeploymentFailsDeploymentDoesNotAlreadyExist.ts b/_generated/AzureSpringCloudV0/Tests/CreateNamedDeploymentFailsDeploymentDoesNotAlreadyExist.ts new file mode 100644 index 000000000000..39c87a5fdf7b --- /dev/null +++ b/_generated/AzureSpringCloudV0/Tests/CreateNamedDeploymentFailsDeploymentDoesNotAlreadyExist.ts @@ -0,0 +1,46 @@ +import * as path from 'path'; +import assert = require('assert'); +import mocha = require('mocha'); +import * as ttm from 'azure-pipelines-task-lib/mock-test'; +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import { printTaskInputs } from './mock_utils'; + +export class CreateNamedDeploymentFailsDeploymentDoesNotAlreadyExist { + + private static mockTaskInputParameters() { + //Just use this to set the environment variables before any of the pipeline SDK code runs. + //The actual TaskMockRunner instance is irrelevant as inputs are set as environment variables, + //visible to the whole process. If we do this in the L0 file, it doesn't work. + //Otherwise, it doesn't work. + let tr = new tmrm.TaskMockRunner('dummypath'); + tr.setInput('ConnectedServiceName', "AzureRM"); + tr.setInput('Action', 'Deploy'); + tr.setInput('AppName', 'testapp'); + tr.setInput('AzureSpringCloud', 'CreateNamedDeploymentFailsWhenTwoDeploymentsExistL0'); + tr.setInput('UseStagingDeployment', "false"); + tr.setInput('Package', 'dummy.jar'); + tr.setInput('RuntimeVersion', 'Java_11'); + tr.setInput('CreateNewDeployment', "false"); + tr.setInput('DeploymentName', 'nonexistentDeployment'); + printTaskInputs(); + } + + public static mochaTest = (done: mocha.Done) => { + + let taskPath = path.join(__dirname, 'CreateNamedDeploymentFailsDeploymentDoesNotAlreadyExistL0.js'); + let mockTestRunner: ttm.MockTestRunner = new ttm.MockTestRunner(taskPath); + CreateNamedDeploymentFailsDeploymentDoesNotAlreadyExist.mockTaskInputParameters(); + try { + mockTestRunner.run(); + assert(mockTestRunner.failed); + let expectedError = 'loc_mock_DeploymentDoesntExist nonexistentDeployment'; + assert(mockTestRunner.errorIssues.length > 0 || mockTestRunner.stderr.length > 0, 'should have written to stderr'); + assert(mockTestRunner.stdErrContained(expectedError) || mockTestRunner.createdErrorIssue(expectedError), 'E should have said: ' + expectedError); + done(); + } + catch (error) { + done(error); + } + }; + +} \ No newline at end of file diff --git a/_generated/AzureSpringCloudV0/Tests/CreateNamedDeploymentFailsDeploymentDoesNotAlreadyExistL0.ts b/_generated/AzureSpringCloudV0/Tests/CreateNamedDeploymentFailsDeploymentDoesNotAlreadyExistL0.ts new file mode 100644 index 000000000000..05ecdc3c4c1f --- /dev/null +++ b/_generated/AzureSpringCloudV0/Tests/CreateNamedDeploymentFailsDeploymentDoesNotAlreadyExistL0.ts @@ -0,0 +1,79 @@ +import * as path from 'path'; +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import { setEndpointData, setAgentsData, mockTaskArgument, mockCommonAzureAPIs, nock, mockAzureSpringAppsExists, API_VERSION } from './mock_utils'; +import { ASC_RESOURCE_TYPE, MOCK_RESOURCE_GROUP_NAME, MOCK_SUBSCRIPTION_ID } from './mock_utils' + +const TEST_APP_NAME = 'testapp'; + +export class CreateNamedDeploymentFailsDeploymentDoesNotAlreadyExistL0 { + + private static readonly TEST_NAME = 'CreateNamedDeploymentFailsWhenTwoDeploymentsExistL0'; + + public static startTest() { + console.log(`running ${this.TEST_NAME}`); + let taskPath = path.join(__dirname, '..', 'azurespringappsdeployment.js'); + let taskMockRunner: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + setEndpointData(); + setAgentsData(); + mockCommonAzureAPIs(); + mockAzureSpringAppsExists(this.TEST_NAME); + this.mockDeploymentListApiWithTwoDeployments(); + taskMockRunner.setAnswers(mockTaskArgument()); + taskMockRunner.run(); + } + + /** + * Simulate a deployment list API that returns a single Production deployment. + */ + private static mockDeploymentListApiWithTwoDeployments() { + console.log('mockDeploymentListApiWithTwoDeployments'); + console.log('defining endpoint ' + `/subscriptions/${MOCK_SUBSCRIPTION_ID}/resourceGroups/${encodeURIComponent(MOCK_RESOURCE_GROUP_NAME)}/providers/${ASC_RESOURCE_TYPE}/${this.TEST_NAME}/apps/${TEST_APP_NAME}/deployments?api-version=${API_VERSION}`); + nock('https://management.azure.com', { + reqheaders: { + "authorization": "Bearer DUMMY_ACCESS_TOKEN", + "content-type": "application/json; charset=utf-8", + "user-agent": "TFS_useragent" + } + }).get(`/subscriptions/${MOCK_SUBSCRIPTION_ID}/resourceGroups/${encodeURIComponent(MOCK_RESOURCE_GROUP_NAME)}/providers/${ASC_RESOURCE_TYPE}/${this.TEST_NAME}/apps/${TEST_APP_NAME}/deployments?api-version=${API_VERSION}`) + .reply(200, { + "value": [ + { + "id": `/subscriptions/${MOCK_SUBSCRIPTION_ID}/resourceGroups/${encodeURIComponent(MOCK_RESOURCE_GROUP_NAME)}/providers/${ASC_RESOURCE_TYPE}/${this.TEST_NAME}/apps/${TEST_APP_NAME}/deployments/default`, + "name": "default", + "properties": { + "active": true, + "appName": TEST_APP_NAME, + "deploymentSettings": { + "cpu": 1, + "environmentVariables": null, + "memoryInGB": 1, + "runtimeVersion": "Java_8" + }, + "instances": [ + { + "discoveryStatus": "UP", + "name": `${TEST_APP_NAME}-default-7-7b77f5b6f5-fff9t`, + "startTime": "2021-03-13T01:39:20Z", + "status": "Running" + } + ], + "provisioningState": "Succeeded", + "source": { + "relativePath": "", + "type": "Jar" + }, + "status": "Running" + }, + "resourceGroup": MOCK_RESOURCE_GROUP_NAME, + "sku": { + "capacity": 1, + "name": "S0", + "tier": "Standard" + }, + "type": `${ASC_RESOURCE_TYPE}/apps/deployments` + }] + }).persist(); + } +} + +CreateNamedDeploymentFailsDeploymentDoesNotAlreadyExistL0.startTest(); \ No newline at end of file diff --git a/_generated/AzureSpringCloudV0/Tests/CreateNamedDeploymentFailsWhenTwoDeploymentsExist.ts b/_generated/AzureSpringCloudV0/Tests/CreateNamedDeploymentFailsWhenTwoDeploymentsExist.ts new file mode 100644 index 000000000000..e40df895b29f --- /dev/null +++ b/_generated/AzureSpringCloudV0/Tests/CreateNamedDeploymentFailsWhenTwoDeploymentsExist.ts @@ -0,0 +1,46 @@ +import * as path from 'path'; +import assert = require('assert'); +import mocha = require('mocha'); +import * as ttm from 'azure-pipelines-task-lib/mock-test'; +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import { printTaskInputs } from './mock_utils'; + +export class CreateNamedDeploymentFailsWhenTwoDeploymentsExist { + + private static mockTaskInputParameters() { + //Just use this to set the environment variables before any of the pipeline SDK code runs. + //The actual TaskMockRunner instance is irrelevant as inputs are set as environment variables, + //visible to the whole process. If we do this in the L0 file, it doesn't work. + //Otherwise, it doesn't work. + let tr = new tmrm.TaskMockRunner('dummypath'); + tr.setInput('ConnectedServiceName', "AzureRM"); + tr.setInput('Action', 'Deploy'); + tr.setInput('AppName', 'testapp'); + tr.setInput('AzureSpringCloud', 'CreateNamedDeploymentFailsWhenTwoDeploymentsExistL0'); + tr.setInput('UseStagingDeployment', "false"); + tr.setInput('Package', 'dummy.jar'); + tr.setInput( 'RuntimeVersion', 'Java_11'); + tr.setInput('CreateNewDeployment', "true"); + tr.setInput('DeploymentName', 'shouldntBeAbleToCreateThis'); + printTaskInputs(); + } + + public static mochaTest = (done: mocha.Done) => { + + let taskPath = path.join(__dirname, 'CreateNamedDeploymentFailsWhenTwoDeploymentsExistL0.js'); + let mockTestRunner: ttm.MockTestRunner = new ttm.MockTestRunner(taskPath); + CreateNamedDeploymentFailsWhenTwoDeploymentsExist.mockTaskInputParameters(); + try { + mockTestRunner.run(); + assert(mockTestRunner.failed); + let expectedError = 'loc_mock_TwoDeploymentsAlreadyExistCannotCreate shouldntBeAbleToCreateThis'; + assert(mockTestRunner.errorIssues.length > 0 || mockTestRunner.stderr.length > 0, 'should have written to stderr'); + assert(mockTestRunner.stdErrContained(expectedError) || mockTestRunner.createdErrorIssue(expectedError), 'E should have said: ' + expectedError); + done(); + } + catch (error) { + done(error); + } + }; + +} \ No newline at end of file diff --git a/_generated/AzureSpringCloudV0/Tests/CreateNamedDeploymentFailsWhenTwoDeploymentsExistL0.ts b/_generated/AzureSpringCloudV0/Tests/CreateNamedDeploymentFailsWhenTwoDeploymentsExistL0.ts new file mode 100644 index 000000000000..bcfd0e113e10 --- /dev/null +++ b/_generated/AzureSpringCloudV0/Tests/CreateNamedDeploymentFailsWhenTwoDeploymentsExistL0.ts @@ -0,0 +1,117 @@ +import * as path from 'path'; +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import { setEndpointData, setAgentsData, mockTaskArgument, mockCommonAzureAPIs, nock, mockAzureSpringAppsExists, printTaskInputs, API_VERSION } from './mock_utils'; +import { ASC_RESOURCE_TYPE, MOCK_RESOURCE_GROUP_NAME, MOCK_SUBSCRIPTION_ID } from './mock_utils' + +const TEST_APP_NAME = 'testapp'; + +export class CreateNamedDeploymentFailsWhenTwoDeploymentsExistL0 { + + private static readonly TEST_NAME = 'CreateNamedDeploymentFailsWhenTwoDeploymentsExistL0'; + + public static startTest() { + console.log(`running ${this.TEST_NAME}`); + let taskPath = path.join(__dirname, '..', 'azurespringappsdeployment.js'); + let taskMockRunner: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + setEndpointData(); + setAgentsData(); + mockCommonAzureAPIs(); + mockAzureSpringAppsExists(this.TEST_NAME); + this.mockDeploymentListApiWithTwoDeployments(); + taskMockRunner.setAnswers(mockTaskArgument()); + taskMockRunner.run(); + } + + + /** + * Simulate a deployment list API that returns a single Production deployment. + */ + private static mockDeploymentListApiWithTwoDeployments() { + console.log('mockDeploymentListApiWithTwoDeployments'); + console.log('defining endpoint ' + `/subscriptions/${MOCK_SUBSCRIPTION_ID}/resourceGroups/${encodeURIComponent(MOCK_RESOURCE_GROUP_NAME)}/providers/${ASC_RESOURCE_TYPE}/${this.TEST_NAME}/apps/${TEST_APP_NAME}/deployments?api-version=${API_VERSION}`); + nock('https://management.azure.com', { + reqheaders: { + "authorization": "Bearer DUMMY_ACCESS_TOKEN", + "content-type": "application/json; charset=utf-8", + "user-agent": "TFS_useragent" + } + }).get(`/subscriptions/${MOCK_SUBSCRIPTION_ID}/resourceGroups/${encodeURIComponent(MOCK_RESOURCE_GROUP_NAME)}/providers/${ASC_RESOURCE_TYPE}/${this.TEST_NAME}/apps/${TEST_APP_NAME}/deployments?api-version=${API_VERSION}`) + .reply(200, { + "value": [ + { + "id": `/subscriptions/${MOCK_SUBSCRIPTION_ID}/resourceGroups/${encodeURIComponent(MOCK_RESOURCE_GROUP_NAME)}/providers/${ASC_RESOURCE_TYPE}/${this.TEST_NAME}/apps/${TEST_APP_NAME}/deployments/default`, + "name": "default", + "properties": { + "active": true, + "appName": TEST_APP_NAME, + "deploymentSettings": { + "cpu": 1, + "environmentVariables": null, + "memoryInGB": 1, + "runtimeVersion": "Java_8" + }, + "instances": [ + { + "discoveryStatus": "UP", + "name": `${TEST_APP_NAME}-default-7-7b77f5b6f5-fff9t`, + "startTime": "2021-03-13T01:39:20Z", + "status": "Running" + } + ], + "provisioningState": "Succeeded", + "source": { + "relativePath": "", + "type": "Jar" + }, + "status": "Running" + }, + "resourceGroup": MOCK_RESOURCE_GROUP_NAME, + "sku": { + "capacity": 1, + "name": "S0", + "tier": "Standard" + }, + "type": `${ASC_RESOURCE_TYPE}/apps/deployments` + }, + { + "id": `/subscriptions/${MOCK_SUBSCRIPTION_ID}/resourceGroups/${encodeURIComponent(MOCK_RESOURCE_GROUP_NAME)}/providers/${ASC_RESOURCE_TYPE}/${this.TEST_NAME}/apps/${TEST_APP_NAME}/deployments/theOtherOne`, + "name": "theOtherOne", + "properties": { + "active": false, + "appName": TEST_APP_NAME, + "deploymentSettings": { + "cpu": 1, + "environmentVariables": null, + "memoryInGB": 1, + "runtimeVersion": "Java_8" + }, + "instances": [ + { + "discoveryStatus": "UP", + "name": `${TEST_APP_NAME}-theOtherOne-7-7b77f5b6f5-90210`, + "startTime": "2021-03-13T01:39:20Z", + "status": "Running" + } + ], + "provisioningState": "Succeeded", + "source": { + "relativePath": "", + "type": "Jar" + }, + "status": "Running" + }, + "resourceGroup": MOCK_RESOURCE_GROUP_NAME, + "sku": { + "capacity": 1, + "name": "S0", + "tier": "Standard" + }, + "type": `${ASC_RESOURCE_TYPE}/apps/deployments` + } + ] + + }).persist(); + } +} + +CreateNamedDeploymentFailsWhenTwoDeploymentsExistL0.startTest(); \ No newline at end of file diff --git a/_generated/AzureSpringCloudV0/Tests/DeleteDeploymentFailsWhenNoStagingDeployment.ts b/_generated/AzureSpringCloudV0/Tests/DeleteDeploymentFailsWhenNoStagingDeployment.ts new file mode 100644 index 000000000000..c28e5d919e63 --- /dev/null +++ b/_generated/AzureSpringCloudV0/Tests/DeleteDeploymentFailsWhenNoStagingDeployment.ts @@ -0,0 +1,40 @@ +import * as path from 'path'; +import assert = require('assert'); +import * as ttm from 'azure-pipelines-task-lib/mock-test'; +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import { printTaskInputs } from './mock_utils'; + +export class DeleteStagingDeploymentTest { + + private static mockTaskInputParameters() { + //Just use this to set the environment variables before any of the pipeline SDK code runs. + //The actual TaskMockRunner instance is irrelevant as inputs are set as environment variables, + //visible to the whole process. If we do this in the L0 file, it doesn't work. + //Otherwise, it doesn't work. + let tr : tmrm.TaskMockRunner = new tmrm.TaskMockRunner('dummypath'); + console.log('Setting mock inputs for SetProductionNamedDeploymentSuceeds'); + tr.setInput('ConnectedServiceName', "AzureRM"); + tr.setInput('Action', 'Delete Staging Deployment'); + tr.setInput('AzureSpringCloud', 'DeleteStagingDeploymentTestL0'); + tr.setInput('AppName', 'testapp'); + printTaskInputs(); + } + + public static mochaTest = (done: Mocha.Done) => { + + DeleteStagingDeploymentTest.mockTaskInputParameters(); + let testPath = path.join(__dirname, 'DeleteStagingDeploymentTestL0.js'); + let mockTestRunner: ttm.MockTestRunner = new ttm.MockTestRunner(testPath); + try { + mockTestRunner.run(); + assert(mockTestRunner.failed); + let expectedError = 'No staging deployment found.'; + assert(mockTestRunner.errorIssues.length > 0 || mockTestRunner.stderr.length > 0, 'should have written to stderr'); + assert(mockTestRunner.stdErrContained(expectedError) || mockTestRunner.createdErrorIssue(expectedError), 'E should have said: ' + expectedError); + done(); + } + catch (error) { + done(error); + } + }; +} \ No newline at end of file diff --git a/_generated/AzureSpringCloudV0/Tests/DeleteDeploymentFailsWhenNoStagingDeploymentL0.ts b/_generated/AzureSpringCloudV0/Tests/DeleteDeploymentFailsWhenNoStagingDeploymentL0.ts new file mode 100644 index 000000000000..3f36362ab99d --- /dev/null +++ b/_generated/AzureSpringCloudV0/Tests/DeleteDeploymentFailsWhenNoStagingDeploymentL0.ts @@ -0,0 +1,93 @@ +import * as path from 'path'; +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import { setEndpointData, setAgentsData, mockTaskArgument, nock, MOCK_SUBSCRIPTION_ID, mockAzureSpringAppsExists, mockCommonAzureAPIs } from './mock_utils'; +import { ASC_RESOURCE_TYPE, MOCK_RESOURCE_GROUP_NAME } from './mock_utils' +import assert = require('assert'); + +export class DeleteStagingDeploymentTestL0 { + + static readonly TEST_NAME = 'DeleteStagingDeploymentTestL0'; + static readonly MOCK_APP_NAME = 'testapp'; + + + public static startTest() { + console.log(`running ${this.TEST_NAME}`); + let taskPath = path.join(__dirname, '..', 'azurespringappsdeployment.js'); + let taskMockRunner: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + setEndpointData(); + setAgentsData(); + mockCommonAzureAPIs(); + mockAzureSpringAppsExists(this.TEST_NAME); + this.mockSingleDeployment(); + this.mockDeploymentDeleteStagingDeployment(); + taskMockRunner.setAnswers(mockTaskArgument()); + taskMockRunner.run(); + } + + + /** + * Simulate a deployment list API that returns a production deployment and a staging deployment. + */ + private static mockSingleDeployment() { + nock('https://management.azure.com', { + reqheaders: { + "authorization": "Bearer DUMMY_ACCESS_TOKEN", + "content-type": "application/json; charset=utf-8", + "user-agent": "TFS_useragent" + } + }).get(`/subscriptions/${MOCK_SUBSCRIPTION_ID}/resourceGroups/${encodeURIComponent(MOCK_RESOURCE_GROUP_NAME)}/providers/${ASC_RESOURCE_TYPE}/${this.TEST_NAME}/apps/${this.MOCK_APP_NAME}/deployments?api-version=2020-07-01`) + .reply(200, { + "value": [ + { + "id": `/subscriptions/${MOCK_SUBSCRIPTION_ID}/resourceGroups/${encodeURIComponent(MOCK_RESOURCE_GROUP_NAME)}/providers/${ASC_RESOURCE_TYPE}/${this.TEST_NAME}/apps/${this.MOCK_APP_NAME}/deployments/default`, + "name": "default", + "properties": { + "active": true, + "appName": this.MOCK_APP_NAME, + "deploymentSettings": { + "cpu": 1, + "environmentVariables": null, + "memoryInGB": 1, + "runtimeVersion": "Java_8" + }, + "instances": [ + { + "discoveryStatus": "UP", + "name": `${this.MOCK_APP_NAME}-default-7-7b77f5b6f5-fff9t`, + "startTime": "2021-03-13T01:39:20Z", + "status": "Running" + } + ], + "provisioningState": "Succeeded", + "source": { + "relativePath": "", + "type": "Jar" + }, + "status": "Running" + }, + "resourceGroup": MOCK_RESOURCE_GROUP_NAME, + "sku": { + "capacity": 1, + "name": "S0", + "tier": "Standard" + }, + "type": `${ASC_RESOURCE_TYPE}/apps/deployments` + }] + + }).persist(); + } + + private static mockDeploymentDeleteStagingDeployment() { + nock('https://management.azure.com', { + reqheaders: { + "authorization": "Bearer DUMMY_ACCESS_TOKEN", + "content-type": "application/json; charset=utf-8", + "user-agent": "TFS_useragent" + } + }).delete(`/subscriptions/${MOCK_SUBSCRIPTION_ID}/resourceGroups/${encodeURIComponent(MOCK_RESOURCE_GROUP_NAME)}/providers/${ASC_RESOURCE_TYPE}/${this.TEST_NAME}/apps/${this.MOCK_APP_NAME}/deployments/theOtherOne?api-version=2020-07-01`) + .once() + .reply(200); + } +} + +DeleteStagingDeploymentTestL0.startTest(); \ No newline at end of file diff --git a/_generated/AzureSpringCloudV0/Tests/DeleteStagingDeploymentTest.ts b/_generated/AzureSpringCloudV0/Tests/DeleteStagingDeploymentTest.ts new file mode 100644 index 000000000000..3832de1da6b4 --- /dev/null +++ b/_generated/AzureSpringCloudV0/Tests/DeleteStagingDeploymentTest.ts @@ -0,0 +1,40 @@ +import * as path from 'path'; +import assert = require('assert'); +import * as ttm from 'azure-pipelines-task-lib/mock-test'; +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import { printTaskInputs } from './mock_utils'; + +export class DeleteStagingDeploymentTest { + + private static mockTaskInputParameters() { + //Just use this to set the environment variables before any of the pipeline SDK code runs. + //The actual TaskMockRunner instance is irrelevant as inputs are set as environment variables, + //visible to the whole process. If we do this in the L0 file, it doesn't work. + //Otherwise, it doesn't work. + let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner('dummypath'); + console.log('Setting mock inputs for SetProductionNamedDeploymentSuceeds'); + tr.setInput('ConnectedServiceName', "AzureRM"); + tr.setInput('Action', 'Delete Staging Deployment'); + tr.setInput('AzureSpringCloud', 'DeleteStagingDeploymentTestL0'); + tr.setInput('AppName', 'testapp'); + tr.setInput('UseStagingDeployment', "false"); + tr.setInput('DeploymentName', 'theOtherOne'); + printTaskInputs(); + } + + public static mochaTest = (done: Mocha.Done) => { + + DeleteStagingDeploymentTest.mockTaskInputParameters(); + let testPath = path.join(__dirname, 'DeleteStagingDeploymentTestL0.js'); + let mockTestRunner: ttm.MockTestRunner = new ttm.MockTestRunner(testPath); + try { + mockTestRunner.run(); + assert(mockTestRunner.succeeded); + assert(mockTestRunner.errorIssues.length == 0); + done(); + } + catch (error) { + done(error); + } + }; +} diff --git a/_generated/AzureSpringCloudV0/Tests/DeleteStagingDeploymentTestL0.ts b/_generated/AzureSpringCloudV0/Tests/DeleteStagingDeploymentTestL0.ts new file mode 100644 index 000000000000..9cfbee7005ec --- /dev/null +++ b/_generated/AzureSpringCloudV0/Tests/DeleteStagingDeploymentTestL0.ts @@ -0,0 +1,126 @@ +import * as path from 'path'; +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import { setEndpointData, setAgentsData, mockTaskArgument, nock, MOCK_SUBSCRIPTION_ID, mockAzureSpringAppsExists, mockCommonAzureAPIs, API_VERSION } from './mock_utils'; +import { ASC_RESOURCE_TYPE, MOCK_RESOURCE_GROUP_NAME } from './mock_utils' +import assert = require('assert'); + +export class DeleteStagingDeploymentTestL0 { + + static readonly TEST_NAME = 'DeleteStagingDeploymentTestL0'; + static readonly MOCK_APP_NAME = 'testapp'; + + public static startTest() { + console.log(`running ${this.TEST_NAME}`); + let taskPath = path.join(__dirname, '..', 'azurespringappsdeployment.js'); + let taskMockRunner: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + setEndpointData(); + setAgentsData(); + mockCommonAzureAPIs(); + mockAzureSpringAppsExists(this.TEST_NAME); + this.mockTwoDeployments(); + this.mockDeploymentDeleteStagingDeployment(); + taskMockRunner.setAnswers(mockTaskArgument()); + taskMockRunner.run(); + } + + /** + * Simulate a deployment list API that returns a production deployment and a staging deployment. + */ + private static mockTwoDeployments() { + nock('https://management.azure.com', { + reqheaders: { + "authorization": "Bearer DUMMY_ACCESS_TOKEN", + "content-type": "application/json; charset=utf-8", + "user-agent": "TFS_useragent" + } + }).get(`/subscriptions/${MOCK_SUBSCRIPTION_ID}/resourceGroups/${encodeURIComponent(MOCK_RESOURCE_GROUP_NAME)}/providers/${ASC_RESOURCE_TYPE}/${this.TEST_NAME}/apps/${this.MOCK_APP_NAME}/deployments?api-version=${API_VERSION}`) + .reply(200, { + "value": [ + { + "id": `/subscriptions/${MOCK_SUBSCRIPTION_ID}/resourceGroups/${encodeURIComponent(MOCK_RESOURCE_GROUP_NAME)}/providers/${ASC_RESOURCE_TYPE}/${this.TEST_NAME}/apps/${this.MOCK_APP_NAME}/deployments/default`, + "name": "default", + "properties": { + "active": true, + "appName": this.MOCK_APP_NAME, + "deploymentSettings": { + "cpu": 1, + "environmentVariables": null, + "memoryInGB": 1, + "runtimeVersion": "Java_8" + }, + "instances": [ + { + "discoveryStatus": "UP", + "name": `${this.MOCK_APP_NAME}-default-7-7b77f5b6f5-fff9t`, + "startTime": "2021-03-13T01:39:20Z", + "status": "Running" + } + ], + "provisioningState": "Succeeded", + "source": { + "relativePath": "", + "type": "Jar" + }, + "status": "Running" + }, + "resourceGroup": MOCK_RESOURCE_GROUP_NAME, + "sku": { + "capacity": 1, + "name": "S0", + "tier": "Standard" + }, + "type": `${ASC_RESOURCE_TYPE}/apps/deployments` + }, + { + "id": `/subscriptions/${MOCK_SUBSCRIPTION_ID}/resourceGroups/${encodeURIComponent(MOCK_RESOURCE_GROUP_NAME)}/providers/${ASC_RESOURCE_TYPE}/${this.TEST_NAME}/apps/${this.MOCK_APP_NAME}/deployments/theOtherOne`, + "name": "theOtherOne", + "properties": { + "active": false, + "appName": this.MOCK_APP_NAME, + "deploymentSettings": { + "cpu": 1, + "environmentVariables": null, + "memoryInGB": 1, + "runtimeVersion": "Java_8" + }, + "instances": [ + { + "discoveryStatus": "UP", + "name": `${this.MOCK_APP_NAME}-theOtherOne-7-7b77f5b6f5-90210`, + "startTime": "2021-03-13T01:39:20Z", + "status": "Running" + } + ], + "provisioningState": "Succeeded", + "source": { + "relativePath": "", + "type": "Jar" + }, + "status": "Running" + }, + "resourceGroup": MOCK_RESOURCE_GROUP_NAME, + "sku": { + "capacity": 1, + "name": "S0", + "tier": "Standard" + }, + "type": `${ASC_RESOURCE_TYPE}/apps/deployments` + }] + + }).persist(); + } + + private static mockDeploymentDeleteStagingDeployment() { + nock('https://management.azure.com', { + reqheaders: { + "authorization": "Bearer DUMMY_ACCESS_TOKEN", + "content-type": "application/json; charset=utf-8", + "user-agent": "TFS_useragent" + } + }).delete(`/subscriptions/${MOCK_SUBSCRIPTION_ID}/resourceGroups/${encodeURIComponent(MOCK_RESOURCE_GROUP_NAME)}/providers/${ASC_RESOURCE_TYPE}/${this.TEST_NAME}/apps/${this.MOCK_APP_NAME}/deployments/theOtherOne?api-version=${API_VERSION}`) + .once() + .reply(200); + } +} + +DeleteStagingDeploymentTestL0.startTest(); diff --git a/_generated/AzureSpringCloudV0/Tests/DeploymentCustomImageToStagingSucceeds.ts b/_generated/AzureSpringCloudV0/Tests/DeploymentCustomImageToStagingSucceeds.ts new file mode 100644 index 000000000000..6d363f805286 --- /dev/null +++ b/_generated/AzureSpringCloudV0/Tests/DeploymentCustomImageToStagingSucceeds.ts @@ -0,0 +1,48 @@ +import * as path from 'path'; +import assert = require('assert'); +import * as ttm from 'azure-pipelines-task-lib/mock-test'; +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import { printTaskInputs } from './mock_utils'; + +export class DeploymentCustomImageToStagingSucceeds { + + private static mockTaskInputParameters() { + //Just use this to set the environment variables before any of the pipeline SDK code runs. + //The actual TaskMockRunner instance is irrelevant as inputs are set as environment variables, + //visible to the whole process. If we do this in the L0 file, it doesn't work. + //Otherwise, it doesn't work. + let tr : tmrm.TaskMockRunner = new tmrm.TaskMockRunner('dummypath'); + console.log('Setting mock inputs for DeploymentCustomImageToStagingSucceedsL0'); + tr.setInput('ConnectedServiceName', "AzureRM"); + tr.setInput('Action', 'Deploy'); + tr.setInput('AzureSpringCloud', 'DeploymentCustomImageToStagingSucceedsL0'); + tr.setInput('AppName', 'testcontainerapp'); + tr.setInput('DeploymentType', 'CustomContainer'); + tr.setInput('UseStagingDeployment', "true"); + tr.setInput('RegistryUsername', 'username'); + tr.setInput('RegistryPassword', 'password'); + tr.setInput('ImageName', 'azurespringcloudtesting/byoc-it-springboot:v1'); + tr.setInput('ImageCommand', 'java'); + tr.setInput('ImageArgs', "-jar /app.jar"); + tr.setInput('ImageLanguageFramework', 'springboot'); + tr.setInput('EnvironmentVariables', '-key1 val1 -key2 "val 2"'); + printTaskInputs(); + } + + public static mochaTest = (done: Mocha.Done) => { + + DeploymentCustomImageToStagingSucceeds.mockTaskInputParameters(); + let testPath = path.join(__dirname, 'DeploymentCustomImageToStagingSucceedsL0.js'); + let mockTestRunner: ttm.MockTestRunner = new ttm.MockTestRunner(testPath); + try { + mockTestRunner.run(); + assert.deepEqual(mockTestRunner.errorIssues, [], 'No error output expected in a successful deployment'); + assert(mockTestRunner.succeeded); + done(); + } + catch (error) { + console.error(error); + done(error); + } + }; +} \ No newline at end of file diff --git a/_generated/AzureSpringCloudV0/Tests/DeploymentCustomImageToStagingSucceedsL0.ts b/_generated/AzureSpringCloudV0/Tests/DeploymentCustomImageToStagingSucceedsL0.ts new file mode 100644 index 000000000000..6db17527129a --- /dev/null +++ b/_generated/AzureSpringCloudV0/Tests/DeploymentCustomImageToStagingSucceedsL0.ts @@ -0,0 +1,169 @@ +import * as path from 'path'; +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import { setEndpointData, setAgentsData, mockTaskArgument, nock, MOCK_SUBSCRIPTION_ID, mockAzureSpringAppsExists, mockCommonAzureAPIs, API_VERSION } from './mock_utils'; +import { ASC_RESOURCE_TYPE, MOCK_RESOURCE_GROUP_NAME } from './mock_utils' +import assert = require('assert'); + + +const MOCK_DEPLOYMENT_STATUS_ENDPOINT = `/subscriptions/${MOCK_SUBSCRIPTION_ID}/resourceGroups/${MOCK_RESOURCE_GROUP_NAME}/providers/Microsoft.AppPlatform/locations/eastus2/operationStatus/default/operationId/mockoperationid?api-version=${API_VERSION}` + +export class DeploymentCustomImageToStagingSucceedsL0 { + + static readonly TEST_NAME = 'DeploymentCustomImageToStagingSucceedsL0'; + static readonly MOCK_APP_NAME = 'testcontainerapp'; + + + public static startTest() { + console.log(`running ${this.TEST_NAME}`); + let taskPath = path.join(__dirname, '..', 'azurespringappsdeployment.js'); + let taskMockRunner: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + setEndpointData(); + setAgentsData(); + mockCommonAzureAPIs(); + mockAzureSpringAppsExists(this.TEST_NAME); + this.mockTwoDeployments(); + let nockScope = this.mockDeploymentApis(); + + taskMockRunner.setAnswers(mockTaskArgument()); + taskMockRunner.run(); + } + + /** + * Simulate a deployment list API that returns a production deployment and a staging deployment. + */ + private static mockTwoDeployments() { + nock('https://management.azure.com', { + reqheaders: { + "authorization": "Bearer DUMMY_ACCESS_TOKEN", + "content-type": "application/json; charset=utf-8", + "user-agent": "TFS_useragent" + } + }).get(`/subscriptions/${MOCK_SUBSCRIPTION_ID}/resourceGroups/${encodeURIComponent(MOCK_RESOURCE_GROUP_NAME)}/providers/${ASC_RESOURCE_TYPE}/${this.TEST_NAME}/apps/${this.MOCK_APP_NAME}/deployments?api-version=${API_VERSION}`) + .reply(200, { + "value": [ + { + "id": `/subscriptions/${MOCK_SUBSCRIPTION_ID}/resourceGroups/${encodeURIComponent(MOCK_RESOURCE_GROUP_NAME)}/providers/${ASC_RESOURCE_TYPE}/${this.TEST_NAME}/apps/${this.MOCK_APP_NAME}/deployments/default`, + "name": "default", + "properties": { + "active": true, + "appName": this.MOCK_APP_NAME, + "deploymentSettings": { + "cpu": 1, + "environmentVariables": null, + "memoryInGB": 1, + "runtimeVersion": "Java_8" + }, + "instances": [ + { + "discoveryStatus": "UP", + "name": `${this.MOCK_APP_NAME}-default-7-7b77f5b6f5-fff9t`, + "startTime": "2021-03-13T01:39:20Z", + "status": "Running" + } + ], + "provisioningState": "Succeeded", + "source": { + "relativePath": "", + "type": "Jar" + }, + "status": "Running" + }, + "resourceGroup": MOCK_RESOURCE_GROUP_NAME, + "sku": { + "capacity": 1, + "name": "S0", + "tier": "Standard" + }, + "type": `${ASC_RESOURCE_TYPE}/apps/deployments` + }, + { + "id": `/subscriptions/${MOCK_SUBSCRIPTION_ID}/resourceGroups/${encodeURIComponent(MOCK_RESOURCE_GROUP_NAME)}/providers/${ASC_RESOURCE_TYPE}/${this.TEST_NAME}/apps/${this.MOCK_APP_NAME}/deployments/theOtherOne`, + "name": "theOtherOne", + "properties": { + "active": false, + "appName": this.MOCK_APP_NAME, + "deploymentSettings": { + "cpu": 1, + "environmentVariables": null, + "memoryInGB": 1, + "runtimeVersion": "Java_8" + }, + "instances": [ + { + "discoveryStatus": "UP", + "name": `${this.MOCK_APP_NAME}-theOtherOne-7-7b77f5b6f5-90210`, + "startTime": "2021-03-13T01:39:20Z", + "status": "Running" + } + ], + "provisioningState": "Succeeded", + "source": { + "relativePath": "", + "type": "Jar" + }, + "status": "Running" + }, + "resourceGroup": MOCK_RESOURCE_GROUP_NAME, + "sku": { + "capacity": 1, + "name": "S0", + "tier": "Standard" + }, + "type": `${ASC_RESOURCE_TYPE}/apps/deployments` + }] + + }).persist(); + } + + /** Simulate APIs invoked as part of deployment */ + private static mockDeploymentApis() { + //mock get resource upload URL + nock('https://management.azure.com', { + reqheaders: { + "authorization": "Bearer DUMMY_ACCESS_TOKEN", + "content-type": "application/json; charset=utf-8", + "user-agent": "TFS_useragent" + } + }) + // mock listTestKeys + .post(`/subscriptions/${MOCK_SUBSCRIPTION_ID}/resourceGroups/${MOCK_RESOURCE_GROUP_NAME}/providers/${ASC_RESOURCE_TYPE}/${this.TEST_NAME}/listTestKeys?api-version=${API_VERSION}`) + .once() + .reply(200, + { + "primaryKey": "mockPrimaryKey", + "secondaryKey": "mockSecondaryKey", + "primaryTestEndpoint": `https://primary:mockPrimaryKey@${this.MOCK_APP_NAME}.test.azuremicroservices.io`, + "secondaryTestEndpoint": `https://secondary:mockSecondaryKey@${this.MOCK_APP_NAME}.test.azuremicroservices.io`, + "enabled": true + } + ) + + // Mock the deployment update API: + + .patch(`/subscriptions/${MOCK_SUBSCRIPTION_ID}/resourceGroups/${encodeURIComponent(MOCK_RESOURCE_GROUP_NAME)}/providers/${ASC_RESOURCE_TYPE}/${this.TEST_NAME}/apps/${this.MOCK_APP_NAME}/deployments/theOtherOne?api-version=${API_VERSION}`) + .once() + .reply((uri, serializedRequestBody) => { + let requestBody = JSON.parse(serializedRequestBody); + assert.strictEqual(requestBody.properties.source.type, 'Container'); + assert.strictEqual(requestBody.properties.source.customerContainer.containerImage, 'azurespringcloudtesting/byoc-it-springboot:v1'); + let responseBody = { + "provisioningState": "Updating" + } + let returnHeaders = { + 'azure-asyncoperation': 'https://management.azure.com' + MOCK_DEPLOYMENT_STATUS_ENDPOINT + } + return [202, responseBody, returnHeaders]; + + }) + + // Mock the operation status URL + .get(MOCK_DEPLOYMENT_STATUS_ENDPOINT) + .once() + .reply(200, { + status: "Completed" + }) + + .persist(); + + } +} diff --git a/_generated/AzureSpringCloudV0/Tests/DeploymentFailsWhenBuilderNotExist.ts b/_generated/AzureSpringCloudV0/Tests/DeploymentFailsWhenBuilderNotExist.ts new file mode 100644 index 000000000000..4955b268d9aa --- /dev/null +++ b/_generated/AzureSpringCloudV0/Tests/DeploymentFailsWhenBuilderNotExist.ts @@ -0,0 +1,46 @@ +import * as path from 'path'; +import assert = require('assert'); +import * as ttm from 'azure-pipelines-task-lib/mock-test'; +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import { printTaskInputs } from './mock_utils'; + +export class DeploymentFailsWhenBuilderNotExist { + + private static mockTaskInputParameters() { + //Just use this to set the environment variables before any of the pipeline SDK code runs. + //The actual TaskMockRunner instance is irrelevant as inputs are set as environment variables, + //visible to the whole process. If we do this in the L0 file, it doesn't work. + //Otherwise, it doesn't work. + let tr : tmrm.TaskMockRunner = new tmrm.TaskMockRunner('dummypath'); + console.log('Setting mock inputs for DeploymentFailsWhenBuilderNotExist'); + tr.setInput('ConnectedServiceName', "AzureRM"); + tr.setInput('Action', 'Deploy'); + tr.setInput('AzureSpringCloud', 'DeploymentFailsWhenBuilderNotExistL0'); + tr.setInput('AppName', 'testapp'); + tr.setInput('UseStagingDeployment', "true"); + tr.setInput('Package', 'dummy.jar'); + tr.setInput('RuntimeVersion', 'Java_11'); + tr.setInput('EnvironmentVariables', '-key1 val1 -key2 "val2"'); + tr.setInput('DotNetCoreMainEntryPath', '/foobar.dll'); + tr.setInput('CreateNewDeployment', "false"); + tr.setInput('Builder', 'dummyBuilder'); + printTaskInputs(); + } + + public static mochaTest = (done: Mocha.Done) => { + DeploymentFailsWhenBuilderNotExist.mockTaskInputParameters(); + let testPath = path.join(__dirname, 'DeploymentFailsWhenBuilderNotExistL0.js'); + let mockTestRunner: ttm.MockTestRunner = new ttm.MockTestRunner(testPath); + try { + mockTestRunner.run(); + let expectedError = "KPack builder does not exist"; + assert(mockTestRunner.errorIssues.length > 0 || mockTestRunner.stderr.length > 0, 'should have written to stderr'); + assert(mockTestRunner.stdErrContained(expectedError) || mockTestRunner.createdErrorIssue(expectedError), 'E should have said: ' + expectedError); + done(); + } + catch (error) { + console.error(error); + done(error); + } + } +} \ No newline at end of file diff --git a/_generated/AzureSpringCloudV0/Tests/DeploymentFailsWhenBuilderNotExistL0.ts b/_generated/AzureSpringCloudV0/Tests/DeploymentFailsWhenBuilderNotExistL0.ts new file mode 100644 index 000000000000..df85ee8816ac --- /dev/null +++ b/_generated/AzureSpringCloudV0/Tests/DeploymentFailsWhenBuilderNotExistL0.ts @@ -0,0 +1,185 @@ +import * as path from 'path'; +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import { setEndpointData, setAgentsData, mockTaskArgument, nock, MOCK_SUBSCRIPTION_ID, mockAzureSpringAppsExists, mockCommonAzureAPIs, API_VERSION } from './mock_utils'; +import { ASC_RESOURCE_TYPE, MOCK_RESOURCE_GROUP_NAME } from './mock_utils' +import assert = require('assert'); + +const MOCK_SAS_URL = "https://mockFileShare.file.core.windows.net/mockId/resources/mockId2?sv=2018-03-28&sr=f&sig=%2Bh3X40ta1Oyp0Lar6Fg99MXVmTR%2BHm109ZbuwCCCus0%3D&se=2020-12-03T06%3A06%3A13Z&sp=w"; +const MOCK_RELATIVE_PATH = "resources/c256e6792411d5e86bbe81265a60f62cdf5d7d9eb70fa8f303baf95ec84bb7f7-2020120304-2a3a6867-3a9f-41fd-bef9-e18e52d2e55a"; +const MOCK_TRIGGERED_BUILD_RESULT_ID = `/subscriptions/${MOCK_SUBSCRIPTION_ID}/resourceGroups/${MOCK_RESOURCE_GROUP_NAME}/providers/${ASC_RESOURCE_TYPE}/DeploymentFailsWhenBuilderNotExistL0/buildServices/default/builds/testapp/results/1`; + +export class DeploymentFailsWhenBuilderNotExistL0 { + + static readonly TEST_NAME = 'DeploymentFailsWhenBuilderNotExistL0'; + static readonly MOCK_APP_NAME = 'testapp'; + static readonly MOCK_TRIGGERED_BUILD_RESULT_ID = `/subscriptions/${MOCK_SUBSCRIPTION_ID}/resourceGroups/${MOCK_RESOURCE_GROUP_NAME}/providers/${ASC_RESOURCE_TYPE}/DeploymentFailsWhenBuilderNotExistL0/buildServices/default/builds/testapp/results/1`; + + public static startTest() { + console.log(`running ${this.TEST_NAME}`); + let taskPath = path.join(__dirname, '..', 'azurespringappsdeployment.js'); + let taskMockRunner: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + setEndpointData(); + setAgentsData(); + mockCommonAzureAPIs(); + mockAzureSpringAppsExists(this.TEST_NAME); + this.mockTwoDeployments(); + let nockScope = this.mockDeploymentApis(); + + taskMockRunner.registerMock('./azure-storage', { + uploadFileToSasUrl: async function (sasUrl: string, localPath: string) { + console.log('Executing mock upload to storage'); + assert.strictEqual(sasUrl, MOCK_SAS_URL, "Attempting to upload to unexpected SAS URL"); + assert.strictEqual(localPath, "dummy.jar", "Attempting to upload path other than the one provided"); + } + }); + taskMockRunner.setAnswers(mockTaskArgument()); + taskMockRunner.registerMockExport('getPathInput', (name: string, required?: boolean, check?: boolean) => 'dummy.jar'); + taskMockRunner.run(); + } + + /** + * Simulate a deployment list API that returns a production deployment and a staging deployment. + */ + private static mockTwoDeployments() { + nock('https://management.azure.com', { + reqheaders: { + "authorization": "Bearer DUMMY_ACCESS_TOKEN", + "content-type": "application/json; charset=utf-8", + "user-agent": "TFS_useragent" + } + }).get(`/subscriptions/${MOCK_SUBSCRIPTION_ID}/resourceGroups/${encodeURIComponent(MOCK_RESOURCE_GROUP_NAME)}/providers/${ASC_RESOURCE_TYPE}/${this.TEST_NAME}/apps/${this.MOCK_APP_NAME}/deployments?api-version=${API_VERSION}`) + .reply(200, { + "value": [ + { + "id": `/subscriptions/${MOCK_SUBSCRIPTION_ID}/resourceGroups/${encodeURIComponent(MOCK_RESOURCE_GROUP_NAME)}/providers/${ASC_RESOURCE_TYPE}/${this.TEST_NAME}/apps/${this.MOCK_APP_NAME}/deployments/default`, + "name": "default", + "properties": { + "active": true, + "appName": this.MOCK_APP_NAME, + "deploymentSettings": { + "cpu": 1, + "environmentVariables": null, + "memoryInGB": 1, + "runtimeVersion": "Java_8" + }, + "instances": [ + { + "discoveryStatus": "UP", + "name": `${this.MOCK_APP_NAME}-default-7-7b77f5b6f5-fff9t`, + "startTime": "2021-03-13T01:39:20Z", + "status": "Running" + } + ], + "provisioningState": "Succeeded", + "source": { + "relativePath": "", + "type": "Jar" + }, + "status": "Running" + }, + "resourceGroup": MOCK_RESOURCE_GROUP_NAME, + "sku": { + "capacity": 1, + "name": "E0", + "tier": "Enterprise" + }, + "type": `${ASC_RESOURCE_TYPE}/apps/deployments` + }, + { + "id": `/subscriptions/${MOCK_SUBSCRIPTION_ID}/resourceGroups/${encodeURIComponent(MOCK_RESOURCE_GROUP_NAME)}/providers/${ASC_RESOURCE_TYPE}/${this.TEST_NAME}/apps/${this.MOCK_APP_NAME}/deployments/theOtherOne`, + "name": "theOtherOne", + "properties": { + "active": false, + "appName": this.MOCK_APP_NAME, + "deploymentSettings": { + "cpu": 1, + "environmentVariables": null, + "memoryInGB": 1, + "runtimeVersion": "Java_8" + }, + "instances": [ + { + "discoveryStatus": "UP", + "name": `${this.MOCK_APP_NAME}-theOtherOne-7-7b77f5b6f5-90210`, + "startTime": "2021-03-13T01:39:20Z", + "status": "Running" + } + ], + "provisioningState": "Succeeded", + "source": { + "relativePath": "", + "type": "Jar" + }, + "status": "Running" + }, + "resourceGroup": MOCK_RESOURCE_GROUP_NAME, + "sku": { + "capacity": 1, + "name": "E0", + "tier": "Enterprise" + }, + "type": `${ASC_RESOURCE_TYPE}/apps/deployments` + }] + + }).persist(); + } + + /** + * Simulate APIs invoked as part of deployment. + */ + private static mockDeploymentApis() { + nock('https://management.azure.com', { + reqheaders: { + "authorization": "Bearer DUMMY_ACCESS_TOKEN", + "content-type": "application/json; charset=utf-8", + "user-agent": "TFS_useragent" + } + }) + + // Mock the service information API + .get(`/subscriptions/${MOCK_SUBSCRIPTION_ID}/resourceGroups/${encodeURIComponent(MOCK_RESOURCE_GROUP_NAME)}/providers/${ASC_RESOURCE_TYPE}/${this.TEST_NAME}?api-version=${API_VERSION}`) + .once() + .reply(200,{ + "sku": { + "name": "E0", + "tier": "Enterprise", + "capacity": 1 + } + }) + + // Mock getResourceUploadUrl with build service + .post(`/subscriptions/${MOCK_SUBSCRIPTION_ID}/resourceGroups/${MOCK_RESOURCE_GROUP_NAME}/providers/${ASC_RESOURCE_TYPE}/${this.TEST_NAME}/buildServices/default/getResourceUploadUrl?api-version=${API_VERSION}`) + .once() + .reply(200, { + "relativePath": MOCK_RELATIVE_PATH, + "uploadUrl": MOCK_SAS_URL + }) + + // Mock update KPack build + .put(`/subscriptions/${MOCK_SUBSCRIPTION_ID}/resourceGroups/${MOCK_RESOURCE_GROUP_NAME}/providers/${ASC_RESOURCE_TYPE}/${this.TEST_NAME}/buildServices/default/builds/testapp?api-version=${API_VERSION}`) + .once() + .reply(200, { + "properties": { + "triggeredBuildResult": { + "id": MOCK_TRIGGERED_BUILD_RESULT_ID + } + } + }) + + // Mock KPack build finish + .get(`${MOCK_TRIGGERED_BUILD_RESULT_ID}?api-version=${API_VERSION}`) + .once() + .reply(404, { + "error": { + "code": "NotFound", + "message": "KPack builder does not exist", + "target": "default/dummyBuilder", + "details": null + } + }) + + .persist(); + } +} + +DeploymentFailsWhenBuilderNotExistL0.startTest(); diff --git a/_generated/AzureSpringCloudV0/Tests/DeploymentFailsWithInsufficientDeployments.ts b/_generated/AzureSpringCloudV0/Tests/DeploymentFailsWithInsufficientDeployments.ts new file mode 100644 index 000000000000..860de29cb9c4 --- /dev/null +++ b/_generated/AzureSpringCloudV0/Tests/DeploymentFailsWithInsufficientDeployments.ts @@ -0,0 +1,44 @@ +import * as path from 'path'; +import assert = require('assert'); +import * as ttm from 'azure-pipelines-task-lib/mock-test'; +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import { printTaskInputs } from './mock_utils'; + +export class DeploymentFailsWithInsufficientDeployments { + + private static mockTaskInputParameters() { + //Just use this to set the environment variables before any of the pipeline SDK code runs. + //The actual TaskMockRunner instance is irrelevant as inputs are set as environment variables, + //visible to the whole process. If we do this in the L0 file, it doesn't work. + //Otherwise, it doesn't work. + let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner('dummypath'); + console.log('Setting mock inputs for DeploymentFailsWithInsufficientDeployments'); + tr.setInput('ConnectedServiceName', "AzureRM"); + tr.setInput('Action', 'Deploy'); + tr.setInput('AzureSpringCloud', 'DeploymentFailsWithInsufficientDeploymentL0'); + tr.setInput('AppName', 'testapp'); + tr.setInput('UseStagingDeployment', "true"); + tr.setInput('Package', 'dummy.jar'); + tr.setInput('RuntimeVersion', 'Java_11'); + tr.setInput('CreateNewDeployment', "false"); + printTaskInputs(); + } + + public static mochaTest = (done: Mocha.Done) => { + + DeploymentFailsWithInsufficientDeployments.mockTaskInputParameters(); + let testPath = path.join(__dirname, 'DeploymentFailsWithInsufficientDeploymentsL0.js'); + let mockTestRunner: ttm.MockTestRunner = new ttm.MockTestRunner(testPath); + try { + mockTestRunner.run(); + assert(mockTestRunner.failed); + let expectedError = 'loc_mock_NoStagingDeploymentFound'; + assert(mockTestRunner.errorIssues.length > 0 || mockTestRunner.stderr.length > 0, 'should have written to stderr'); + assert(mockTestRunner.stdErrContained(expectedError) || mockTestRunner.createdErrorIssue(expectedError), 'E should have said: ' + expectedError); + done(); + } + catch (error) { + done(error); + } + }; +} \ No newline at end of file diff --git a/_generated/AzureSpringCloudV0/Tests/DeploymentFailsWithInsufficientDeploymentsL0.ts b/_generated/AzureSpringCloudV0/Tests/DeploymentFailsWithInsufficientDeploymentsL0.ts new file mode 100644 index 000000000000..94b0c7f1cc6b --- /dev/null +++ b/_generated/AzureSpringCloudV0/Tests/DeploymentFailsWithInsufficientDeploymentsL0.ts @@ -0,0 +1,82 @@ +import * as path from 'path'; +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import { setEndpointData, setAgentsData, mockTaskArgument, nock, MOCK_SUBSCRIPTION_ID, mockAzureSpringAppsExists, mockCommonAzureAPIs, API_VERSION } from './mock_utils'; +import { ASC_RESOURCE_TYPE, MOCK_RESOURCE_GROUP_NAME } from './mock_utils' +import { Inputs } from '../operations/taskparameters'; + +export class DeploymentFailsWithInsufficientDeploymentL0 { + + static readonly TEST_NAME = 'DeploymentFailsWithInsufficientDeploymentL0'; + static readonly MOCK_APP_NAME = 'testapp'; + + + public static startTest() { + console.log(`running ${this.TEST_NAME}`); + let taskPath = path.join(__dirname, '..', 'azurespringappsdeployment.js'); + let taskMockRunner: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + setEndpointData(); + setAgentsData(); + mockCommonAzureAPIs(); + mockAzureSpringAppsExists(this.TEST_NAME); + this.mockDeploymentListApiWithSingleDeployment(); + taskMockRunner.setAnswers(mockTaskArgument()); + taskMockRunner.run(); + } + + + /** + * Simulate a deployment list API that returns a single Production deployment. + */ + private static mockDeploymentListApiWithSingleDeployment() { + console.log('mockDeploymentListApiWithSingleDeployment'); + console.log('defining endpoint ' + `/subscriptions/${MOCK_SUBSCRIPTION_ID}/resourceGroups/${encodeURIComponent(MOCK_RESOURCE_GROUP_NAME)}/providers/${ASC_RESOURCE_TYPE}/${this.TEST_NAME}/apps/${this.MOCK_APP_NAME}/deployments?api-version=${API_VERSION}`); + nock('https://management.azure.com', { + reqheaders: { + "authorization": "Bearer DUMMY_ACCESS_TOKEN", + "content-type": "application/json; charset=utf-8", + "user-agent": "TFS_useragent" + } + }).get(`/subscriptions/${MOCK_SUBSCRIPTION_ID}/resourceGroups/${encodeURIComponent(MOCK_RESOURCE_GROUP_NAME)}/providers/${ASC_RESOURCE_TYPE}/${this.TEST_NAME}/apps/${this.MOCK_APP_NAME}/deployments?api-version=${API_VERSION}`) + .reply(200, { + "value": [ + { + "id": `/subscriptions/${MOCK_SUBSCRIPTION_ID}/resourceGroups/${encodeURIComponent(MOCK_RESOURCE_GROUP_NAME)}/providers/${ASC_RESOURCE_TYPE}/${this.TEST_NAME}/apps/${this.MOCK_APP_NAME}/deployments/default`, + "name": "default", + "properties": { + "active": true, + "appName": this.MOCK_APP_NAME, + "deploymentSettings": { + "cpu": 1, + "environmentVariables": null, + "memoryInGB": 1, + "runtimeVersion": "Java_8" + }, + "instances": [ + { + "discoveryStatus": "UP", + "name": `${this.MOCK_APP_NAME}-default-7-7b77f5b6f5-fff9t`, + "startTime": "2021-03-13T01:39:20Z", + "status": "Running" + } + ], + "provisioningState": "Succeeded", + "source": { + "relativePath": "", + "type": "Jar" + }, + "status": "Running" + }, + "resourceGroup": MOCK_RESOURCE_GROUP_NAME, + "sku": { + "capacity": 1, + "name": "S0", + "tier": "Standard" + }, + "type": `${ASC_RESOURCE_TYPE}/apps/deployments` + } + ] + }).persist(); + } +} + +DeploymentFailsWithInsufficientDeploymentL0.startTest(); \ No newline at end of file diff --git a/_generated/AzureSpringCloudV0/Tests/DeploymentToStagingSucceeds.ts b/_generated/AzureSpringCloudV0/Tests/DeploymentToStagingSucceeds.ts new file mode 100644 index 000000000000..bbfe1f73c7fd --- /dev/null +++ b/_generated/AzureSpringCloudV0/Tests/DeploymentToStagingSucceeds.ts @@ -0,0 +1,45 @@ +import * as path from 'path'; +import assert = require('assert'); +import * as ttm from 'azure-pipelines-task-lib/mock-test'; +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import { printTaskInputs } from './mock_utils'; + +export class DeploymentToStagingSucceeds { + + private static mockTaskInputParameters() { + //Just use this to set the environment variables before any of the pipeline SDK code runs. + //The actual TaskMockRunner instance is irrelevant as inputs are set as environment variables, + //visible to the whole process. If we do this in the L0 file, it doesn't work. + //Otherwise, it doesn't work. + let tr : tmrm.TaskMockRunner = new tmrm.TaskMockRunner('dummypath'); + console.log('Setting mock inputs for DeploymentToStagingSucceeds'); + tr.setInput('ConnectedServiceName', "AzureRM"); + tr.setInput('Action', 'Deploy'); + tr.setInput('AzureSpringCloud', 'DeploymentToStagingSucceedsL0'); + tr.setInput('AppName', 'testapp'); + tr.setInput('UseStagingDeployment', "true"); + tr.setInput('Package', 'dummy.jar'); + tr.setInput('RuntimeVersion', 'Java_11'); + tr.setInput('EnvironmentVariables', '-key1 val1 -key2 "val 2"'); + tr.setInput('DotNetCoreMainEntryPath', '/foobar.dll'); + tr.setInput('CreateNewDeployment', "false"); + printTaskInputs(); + } + + public static mochaTest = (done: Mocha.Done) => { + + DeploymentToStagingSucceeds.mockTaskInputParameters(); + let testPath = path.join(__dirname, 'DeploymentToStagingSucceedsL0.js'); + let mockTestRunner: ttm.MockTestRunner = new ttm.MockTestRunner(testPath); + try { + mockTestRunner.run(); + assert.deepEqual(mockTestRunner.errorIssues, [], 'No error output expected in a successful deployment'); + assert(mockTestRunner.succeeded); + done(); + } + catch (error) { + console.error(error); + done(error); + } + }; +} \ No newline at end of file diff --git a/_generated/AzureSpringCloudV0/Tests/DeploymentToStagingSucceedsL0.ts b/_generated/AzureSpringCloudV0/Tests/DeploymentToStagingSucceedsL0.ts new file mode 100644 index 000000000000..428901028994 --- /dev/null +++ b/_generated/AzureSpringCloudV0/Tests/DeploymentToStagingSucceedsL0.ts @@ -0,0 +1,206 @@ +import * as path from 'path'; +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import { setEndpointData, setAgentsData, mockTaskArgument, nock, MOCK_SUBSCRIPTION_ID, mockAzureSpringAppsExists, mockCommonAzureAPIs, API_VERSION } from './mock_utils'; +import { ASC_RESOURCE_TYPE, MOCK_RESOURCE_GROUP_NAME } from './mock_utils' +import assert = require('assert'); + + +const MOCK_SAS_URL = "https://mockFileShare.file.core.windows.net/mockId/resources/mockId2?sv=2018-03-28&sr=f&sig=%2Bh3X40ta1Oyp0Lar6Fg99MXVmTR%2BHm109ZbuwCCCus0%3D&se=2020-12-03T06%3A06%3A13Z&sp=w"; +const MOCK_RELATIVE_PATH = "resources/c256e6792411d5e86bbe81265a60f62cdf5d7d9eb70fa8f303baf95ec84bb7f7-2020120304-2a3a6867-3a9f-41fd-bef9-e18e52d2e55a"; +const MOCK_DEPLOYMENT_STATUS_ENDPOINT = `/subscriptions/${MOCK_SUBSCRIPTION_ID}/resourceGroups/${MOCK_RESOURCE_GROUP_NAME}/providers/Microsoft.AppPlatform/locations/eastus2/operationStatus/default/operationId/mockoperationid?api-version=${API_VERSION}` + +export class DeploymentToStagingSucceedsL0 { + + static readonly TEST_NAME = 'DeploymentToStagingSucceedsL0'; + static readonly MOCK_APP_NAME = 'testapp'; + + + public static startTest() { + console.log(`running ${this.TEST_NAME}`); + let taskPath = path.join(__dirname, '..', 'azurespringappsdeployment.js'); + let taskMockRunner: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + setEndpointData(); + setAgentsData(); + mockCommonAzureAPIs(); + mockAzureSpringAppsExists(this.TEST_NAME); + this.mockTwoDeployments(); + let nockScope = this.mockDeploymentApis(); + + taskMockRunner.registerMock('./azure-storage', { + uploadFileToSasUrl: async function (sasUrl: string, localPath: string) { + console.log('Executing mock upload to storage'); + assert.strictEqual(sasUrl, MOCK_SAS_URL, "Attempting to upload to unexpected SAS URL"); + assert.strictEqual(localPath, "dummy.jar", "Attempting to upload path other than the one provided"); + } + }); + taskMockRunner.setAnswers(mockTaskArgument()); + taskMockRunner.registerMockExport('getPathInput', (name: string, required?: boolean, check?: boolean) => 'dummy.jar'); + taskMockRunner.run(); + } + + /** + * Simulate a deployment list API that returns a production deployment and a staging deployment. + */ + private static mockTwoDeployments() { + nock('https://management.azure.com', { + reqheaders: { + "authorization": "Bearer DUMMY_ACCESS_TOKEN", + "content-type": "application/json; charset=utf-8", + "user-agent": "TFS_useragent" + } + }).get(`/subscriptions/${MOCK_SUBSCRIPTION_ID}/resourceGroups/${encodeURIComponent(MOCK_RESOURCE_GROUP_NAME)}/providers/${ASC_RESOURCE_TYPE}/${this.TEST_NAME}/apps/${this.MOCK_APP_NAME}/deployments?api-version=${API_VERSION}`) + .reply(200, { + "value": [ + { + "id": `/subscriptions/${MOCK_SUBSCRIPTION_ID}/resourceGroups/${encodeURIComponent(MOCK_RESOURCE_GROUP_NAME)}/providers/${ASC_RESOURCE_TYPE}/${this.TEST_NAME}/apps/${this.MOCK_APP_NAME}/deployments/default`, + "name": "default", + "properties": { + "active": true, + "appName": this.MOCK_APP_NAME, + "deploymentSettings": { + "cpu": 1, + "environmentVariables": null, + "memoryInGB": 1, + "runtimeVersion": "Java_8" + }, + "instances": [ + { + "discoveryStatus": "UP", + "name": `${this.MOCK_APP_NAME}-default-7-7b77f5b6f5-fff9t`, + "startTime": "2021-03-13T01:39:20Z", + "status": "Running" + } + ], + "provisioningState": "Succeeded", + "source": { + "relativePath": "", + "type": "Jar" + }, + "status": "Running" + }, + "resourceGroup": MOCK_RESOURCE_GROUP_NAME, + "sku": { + "capacity": 1, + "name": "S0", + "tier": "Standard" + }, + "type": `${ASC_RESOURCE_TYPE}/apps/deployments` + }, + { + "id": `/subscriptions/${MOCK_SUBSCRIPTION_ID}/resourceGroups/${encodeURIComponent(MOCK_RESOURCE_GROUP_NAME)}/providers/${ASC_RESOURCE_TYPE}/${this.TEST_NAME}/apps/${this.MOCK_APP_NAME}/deployments/theOtherOne`, + "name": "theOtherOne", + "properties": { + "active": false, + "appName": this.MOCK_APP_NAME, + "deploymentSettings": { + "cpu": 1, + "environmentVariables": null, + "memoryInGB": 1, + "runtimeVersion": "Java_8" + }, + "instances": [ + { + "discoveryStatus": "UP", + "name": `${this.MOCK_APP_NAME}-theOtherOne-7-7b77f5b6f5-90210`, + "startTime": "2021-03-13T01:39:20Z", + "status": "Running" + } + ], + "provisioningState": "Succeeded", + "source": { + "relativePath": "", + "type": "Jar" + }, + "status": "Running" + }, + "resourceGroup": MOCK_RESOURCE_GROUP_NAME, + "sku": { + "capacity": 1, + "name": "S0", + "tier": "Standard" + }, + "type": `${ASC_RESOURCE_TYPE}/apps/deployments` + }] + + }).persist(); + } + + /** Simulate APIs invoked as part of deployment */ + private static mockDeploymentApis() { + //mock get resource upload URL + nock('https://management.azure.com', { + reqheaders: { + "authorization": "Bearer DUMMY_ACCESS_TOKEN", + "content-type": "application/json; charset=utf-8", + "user-agent": "TFS_useragent" + } + }) + .post(`/subscriptions/${MOCK_SUBSCRIPTION_ID}/resourceGroups/${MOCK_RESOURCE_GROUP_NAME}/providers/${ASC_RESOURCE_TYPE}/${this.TEST_NAME}/apps/${this.MOCK_APP_NAME}/getResourceUploadUrl?api-version=${API_VERSION}`) + .once() + .reply(200, + { + "relativePath": MOCK_RELATIVE_PATH, + "uploadUrl": MOCK_SAS_URL + } + ) + + + // mock listTestKeys + .post(`/subscriptions/${MOCK_SUBSCRIPTION_ID}/resourceGroups/${MOCK_RESOURCE_GROUP_NAME}/providers/${ASC_RESOURCE_TYPE}/${this.TEST_NAME}/listTestKeys?api-version=${API_VERSION}`) + .once() + .reply(200, + { + "primaryKey": "mockPrimaryKey", + "secondaryKey": "mockSecondaryKey", + "primaryTestEndpoint": `https://primary:mockPrimaryKey@${this.MOCK_APP_NAME}.test.azuremicroservices.io`, + "secondaryTestEndpoint": `https://secondary:mockSecondaryKey@${this.MOCK_APP_NAME}.test.azuremicroservices.io`, + "enabled": true + } + ) + + // Mock the deployment update API: + .patch(`/subscriptions/${MOCK_SUBSCRIPTION_ID}/resourceGroups/${encodeURIComponent(MOCK_RESOURCE_GROUP_NAME)}/providers/${ASC_RESOURCE_TYPE}/${this.TEST_NAME}/apps/${this.MOCK_APP_NAME}/deployments/theOtherOne?api-version=${API_VERSION}`) + .once() + .reply((uri, serializedRequestBody) => { + let requestBody = JSON.parse(serializedRequestBody); + assert.strictEqual(requestBody.properties.source.relativePath, MOCK_RELATIVE_PATH); + assert.strictEqual(requestBody.properties.deploymentSettings.runtimeVersion, 'Java_11'); + assert.strictEqual(requestBody.properties.deploymentSettings.environmentVariables.key1, 'val1'); + assert.strictEqual(requestBody.properties.deploymentSettings.environmentVariables.key2, "val 2"); + //We'd never have the .NET entry path parameter in a Java app in the real world, + //but we'll take this opportunity to ensure it's properly propagated when set as a task param. + assert.strictEqual(requestBody.properties.deploymentSettings.netCoreMainEntryPath, '/foobar.dll'); + let responseBody = { + "provisioningState": "Updating" + } + let returnHeaders = { + 'azure-asyncoperation': 'https://management.azure.com' + MOCK_DEPLOYMENT_STATUS_ENDPOINT + } + return [202, responseBody, returnHeaders]; + + }) + + // Mock the operation status URL + .get(MOCK_DEPLOYMENT_STATUS_ENDPOINT) + .once() + .reply(200, { + status: "Completed" + }) + + // Mock the service information API + .get(`/subscriptions/${MOCK_SUBSCRIPTION_ID}/resourceGroups/${encodeURIComponent(MOCK_RESOURCE_GROUP_NAME)}/providers/${ASC_RESOURCE_TYPE}/${this.TEST_NAME}?api-version=${API_VERSION}`) + .once() + .reply(200,{ + "sku": { + "name": "S0", + "tier": "Standard", + "capacity": 0 + } + }) + + .persist(); + + } +} + +DeploymentToStagingSucceedsL0.startTest(); \ No newline at end of file diff --git a/_generated/AzureSpringCloudV0/Tests/DeploymentToStagingSucceedsWithBuildService.ts b/_generated/AzureSpringCloudV0/Tests/DeploymentToStagingSucceedsWithBuildService.ts new file mode 100644 index 000000000000..be2585896c2d --- /dev/null +++ b/_generated/AzureSpringCloudV0/Tests/DeploymentToStagingSucceedsWithBuildService.ts @@ -0,0 +1,45 @@ +import * as path from 'path'; +import assert = require('assert'); +import * as ttm from 'azure-pipelines-task-lib/mock-test'; +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import { printTaskInputs } from './mock_utils'; + +export class DeploymentToStagingSucceedsWithBuildService { + + private static mockTaskInputParameters() { + //Just use this to set the environment variables before any of the pipeline SDK code runs. + //The actual TaskMockRunner instance is irrelevant as inputs are set as environment variables, + //visible to the whole process. If we do this in the L0 file, it doesn't work. + //Otherwise, it doesn't work. + let tr : tmrm.TaskMockRunner = new tmrm.TaskMockRunner('dummypath'); + console.log('Setting mock inputs for DeploymentToStagingSucceedsWithBuildService'); + tr.setInput('ConnectedServiceName', "AzureRM"); + tr.setInput('Action', 'Deploy'); + tr.setInput('AzureSpringCloud', 'DeploymentToStagingSucceedsWithBuildServiceL0'); + tr.setInput('AppName', 'testapp'); + tr.setInput('UseStagingDeployment', "true"); + tr.setInput('Package', 'dummy.jar'); + tr.setInput('RuntimeVersion', 'Java_11'); + tr.setInput('EnvironmentVariables', '-key1 val1 -key2 "val2"'); + tr.setInput('DotNetCoreMainEntryPath', '/foobar.dll'); + tr.setInput('CreateNewDeployment', "false"); + tr.setInput('Builder', 'dummyBuilder'); + printTaskInputs(); + } + + public static mochaTest = (done: Mocha.Done) => { + DeploymentToStagingSucceedsWithBuildService.mockTaskInputParameters(); + let testPath = path.join(__dirname, 'DeploymentToStagingSucceedsWithBuildServiceL0.js'); + let mockTestRunner: ttm.MockTestRunner = new ttm.MockTestRunner(testPath); + try { + mockTestRunner.run(); + assert.deepEqual(mockTestRunner.errorIssues, [], 'No error output expected in a successful deployment'); + assert(mockTestRunner.succeeded); + done(); + } + catch (error) { + console.error(error); + done(error); + } + } +} diff --git a/_generated/AzureSpringCloudV0/Tests/DeploymentToStagingSucceedsWithBuildServiceL0.ts b/_generated/AzureSpringCloudV0/Tests/DeploymentToStagingSucceedsWithBuildServiceL0.ts new file mode 100644 index 000000000000..76f1a861bdc0 --- /dev/null +++ b/_generated/AzureSpringCloudV0/Tests/DeploymentToStagingSucceedsWithBuildServiceL0.ts @@ -0,0 +1,225 @@ +import * as path from 'path'; +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import { setEndpointData, setAgentsData, mockTaskArgument, nock, MOCK_SUBSCRIPTION_ID, mockAzureSpringAppsExists, mockCommonAzureAPIs, API_VERSION } from './mock_utils'; +import { ASC_RESOURCE_TYPE, MOCK_RESOURCE_GROUP_NAME } from './mock_utils' +import assert = require('assert'); + +const MOCK_SAS_URL = "https://mockFileShare.file.core.windows.net/mockId/resources/mockId2?sv=2018-03-28&sr=f&sig=%2Bh3X40ta1Oyp0Lar6Fg99MXVmTR%2BHm109ZbuwCCCus0%3D&se=2020-12-03T06%3A06%3A13Z&sp=w"; +const MOCK_RELATIVE_PATH = "resources/c256e6792411d5e86bbe81265a60f62cdf5d7d9eb70fa8f303baf95ec84bb7f7-2020120304-2a3a6867-3a9f-41fd-bef9-e18e52d2e55a"; +const MOCK_DEPLOYMENT_STATUS_ENDPOINT = `/subscriptions/${MOCK_SUBSCRIPTION_ID}/resourceGroups/${MOCK_RESOURCE_GROUP_NAME}/providers/Microsoft.AppPlatform/locations/eastus2/operationStatus/default/operationId/mockoperationid?api-version=${API_VERSION}`; +const MOCK_TRIGGERED_BUILD_RESULT_ID = `/subscriptions/${MOCK_SUBSCRIPTION_ID}/resourceGroups/${MOCK_RESOURCE_GROUP_NAME}/providers/${ASC_RESOURCE_TYPE}/DeploymentToStagingSucceedsWithBuildServiceL0/buildServices/default/builds/testapp/results/1`; + +export class DeploymentToStagingSucceedsWithBuildServiceL0 { + + static readonly TEST_NAME = 'DeploymentToStagingSucceedsWithBuildServiceL0'; + static readonly MOCK_APP_NAME = 'testapp'; + static readonly MOCK_TRIGGERED_BUILD_RESULT_ID = `/subscriptions/${MOCK_SUBSCRIPTION_ID}/resourceGroups/${MOCK_RESOURCE_GROUP_NAME}/providers/${ASC_RESOURCE_TYPE}/DeploymentToStagingSucceedsWithBuildServiceL0/buildServices/default/builds/testapp/results/1`; + + public static startTest() { + console.log(`running ${this.TEST_NAME}`); + let taskPath = path.join(__dirname, '..', 'azurespringappsdeployment.js'); + let taskMockRunner: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + setEndpointData(); + setAgentsData(); + mockCommonAzureAPIs(); + mockAzureSpringAppsExists(this.TEST_NAME); + this.mockTwoDeployments(); + let nockScope = this.mockDeploymentApis(); + + taskMockRunner.registerMock('./azure-storage', { + uploadFileToSasUrl: async function (sasUrl: string, localPath: string) { + console.log('Executing mock upload to storage'); + assert.strictEqual(sasUrl, MOCK_SAS_URL, "Attempting to upload to unexpected SAS URL"); + assert.strictEqual(localPath, "dummy.jar", "Attempting to upload path other than the one provided"); + } + }); + taskMockRunner.setAnswers(mockTaskArgument()); + taskMockRunner.registerMockExport('getPathInput', (name: string, required?: boolean, check?: boolean) => 'dummy.jar'); + taskMockRunner.run(); + } + + /** + * Simulate a deployment list API that returns a production deployment and a staging deployment. + */ + private static mockTwoDeployments() { + nock('https://management.azure.com', { + reqheaders: { + "authorization": "Bearer DUMMY_ACCESS_TOKEN", + "content-type": "application/json; charset=utf-8", + "user-agent": "TFS_useragent" + } + }).get(`/subscriptions/${MOCK_SUBSCRIPTION_ID}/resourceGroups/${encodeURIComponent(MOCK_RESOURCE_GROUP_NAME)}/providers/${ASC_RESOURCE_TYPE}/${this.TEST_NAME}/apps/${this.MOCK_APP_NAME}/deployments?api-version=${API_VERSION}`) + .reply(200, { + "value": [ + { + "id": `/subscriptions/${MOCK_SUBSCRIPTION_ID}/resourceGroups/${encodeURIComponent(MOCK_RESOURCE_GROUP_NAME)}/providers/${ASC_RESOURCE_TYPE}/${this.TEST_NAME}/apps/${this.MOCK_APP_NAME}/deployments/default`, + "name": "default", + "properties": { + "active": true, + "appName": this.MOCK_APP_NAME, + "deploymentSettings": { + "cpu": 1, + "environmentVariables": null, + "memoryInGB": 1, + "runtimeVersion": "Java_8" + }, + "instances": [ + { + "discoveryStatus": "UP", + "name": `${this.MOCK_APP_NAME}-default-7-7b77f5b6f5-fff9t`, + "startTime": "2021-03-13T01:39:20Z", + "status": "Running" + } + ], + "provisioningState": "Succeeded", + "source": { + "relativePath": "", + "type": "Jar" + }, + "status": "Running" + }, + "resourceGroup": MOCK_RESOURCE_GROUP_NAME, + "sku": { + "capacity": 1, + "name": "E0", + "tier": "Enterprise" + }, + "type": `${ASC_RESOURCE_TYPE}/apps/deployments` + }, + { + "id": `/subscriptions/${MOCK_SUBSCRIPTION_ID}/resourceGroups/${encodeURIComponent(MOCK_RESOURCE_GROUP_NAME)}/providers/${ASC_RESOURCE_TYPE}/${this.TEST_NAME}/apps/${this.MOCK_APP_NAME}/deployments/theOtherOne`, + "name": "theOtherOne", + "properties": { + "active": false, + "appName": this.MOCK_APP_NAME, + "deploymentSettings": { + "cpu": 1, + "environmentVariables": null, + "memoryInGB": 1, + "runtimeVersion": "Java_8" + }, + "instances": [ + { + "discoveryStatus": "UP", + "name": `${this.MOCK_APP_NAME}-theOtherOne-7-7b77f5b6f5-90210`, + "startTime": "2021-03-13T01:39:20Z", + "status": "Running" + } + ], + "provisioningState": "Succeeded", + "source": { + "relativePath": "", + "type": "Jar" + }, + "status": "Running" + }, + "resourceGroup": MOCK_RESOURCE_GROUP_NAME, + "sku": { + "capacity": 1, + "name": "E0", + "tier": "Enterprise" + }, + "type": `${ASC_RESOURCE_TYPE}/apps/deployments` + }] + + }).persist(); + } + + /** + * Simulate APIs invoked as part of deployment. + */ + private static mockDeploymentApis() { + nock('https://management.azure.com', { + reqheaders: { + "authorization": "Bearer DUMMY_ACCESS_TOKEN", + "content-type": "application/json; charset=utf-8", + "user-agent": "TFS_useragent" + } + }) + + // Mock the service information API + .get(`/subscriptions/${MOCK_SUBSCRIPTION_ID}/resourceGroups/${encodeURIComponent(MOCK_RESOURCE_GROUP_NAME)}/providers/${ASC_RESOURCE_TYPE}/${this.TEST_NAME}?api-version=${API_VERSION}`) + .once() + .reply(200,{ + "sku": { + "name": "E0", + "tier": "Enterprise", + "capacity": 1 + } + }) + + // Mock getResourceUploadUrl with build service + .post(`/subscriptions/${MOCK_SUBSCRIPTION_ID}/resourceGroups/${MOCK_RESOURCE_GROUP_NAME}/providers/${ASC_RESOURCE_TYPE}/${this.TEST_NAME}/buildServices/default/getResourceUploadUrl?api-version=${API_VERSION}`) + .once() + .reply(200, { + "relativePath": MOCK_RELATIVE_PATH, + "uploadUrl": MOCK_SAS_URL + }) + + // Mock update KPack build + .put(`/subscriptions/${MOCK_SUBSCRIPTION_ID}/resourceGroups/${MOCK_RESOURCE_GROUP_NAME}/providers/${ASC_RESOURCE_TYPE}/${this.TEST_NAME}/buildServices/default/builds/testapp?api-version=${API_VERSION}`) + .once() + .reply(200, { + "properties": { + "triggeredBuildResult": { + "id": MOCK_TRIGGERED_BUILD_RESULT_ID + } + } + }) + + // Mock KPack build finish + .get(`${MOCK_TRIGGERED_BUILD_RESULT_ID}?api-version=${API_VERSION}`) + .once() + .reply(200,{ + "properties": { + "provisioningState": "Succeeded" + } + }) + + // Mock the deployment update API: + .patch(`/subscriptions/${MOCK_SUBSCRIPTION_ID}/resourceGroups/${encodeURIComponent(MOCK_RESOURCE_GROUP_NAME)}/providers/${ASC_RESOURCE_TYPE}/${this.TEST_NAME}/apps/${this.MOCK_APP_NAME}/deployments/theOtherOne?api-version=${API_VERSION}`) + .once() + .reply((uri, serializedRequestBody) => { + let requestBody = JSON.parse(serializedRequestBody); + // assert.strictEqual(requestBody.properties.source.relativePath, MOCK_RELATIVE_PATH); + assert.strictEqual(requestBody.properties.source.buildResultId, MOCK_TRIGGERED_BUILD_RESULT_ID); + assert.strictEqual(requestBody.properties.deploymentSettings.runtimeVersion, 'Java_11'); + assert.strictEqual(requestBody.properties.deploymentSettings.environmentVariables.key1, 'val1'); + assert.strictEqual(requestBody.properties.deploymentSettings.environmentVariables.key2, "val2"); + //We'd never have the .NET entry path parameter in a Java app in the real world, + //but we'll take this opportunity to ensure it's properly propagated when set as a task param. + assert.strictEqual(requestBody.properties.deploymentSettings.netCoreMainEntryPath, '/foobar.dll'); + let responseBody = { + "provisioningState": "Updating" + } + let returnHeaders = { + 'azure-asyncoperation': 'https://management.azure.com' + MOCK_DEPLOYMENT_STATUS_ENDPOINT + } + return [202, responseBody, returnHeaders]; + }) + + // Mock the operation status URL + .get(MOCK_DEPLOYMENT_STATUS_ENDPOINT) + .once() + .reply(200, { + status: "Completed" + }) + + // Mock listTestKeys + .post(`/subscriptions/${MOCK_SUBSCRIPTION_ID}/resourceGroups/${MOCK_RESOURCE_GROUP_NAME}/providers/${ASC_RESOURCE_TYPE}/${this.TEST_NAME}/listTestKeys?api-version=${API_VERSION}`) + .once() + .reply(200, + { + "primaryKey": "mockPrimaryKey", + "secondaryKey": "mockSecondaryKey", + "primaryTestEndpoint": `https://primary:mockPrimaryKey@${this.MOCK_APP_NAME}.test.azuremicroservices.io`, + "secondaryTestEndpoint": `https://secondary:mockSecondaryKey@${this.MOCK_APP_NAME}.test.azuremicroservices.io`, + "enabled": true + } + ) + + .persist(); + } +} + +DeploymentToStagingSucceedsWithBuildServiceL0.startTest(); \ No newline at end of file diff --git a/_generated/AzureSpringCloudV0/Tests/L0.ts b/_generated/AzureSpringCloudV0/Tests/L0.ts new file mode 100644 index 000000000000..9ef2db067d39 --- /dev/null +++ b/_generated/AzureSpringCloudV0/Tests/L0.ts @@ -0,0 +1,53 @@ +import fs = require('fs'); +import { AzureSpringAppsUnitTests } from './AzureSpringAppsUnitTests'; +import { nock } from './mock_utils'; +import { CreateNamedDeploymentFailsDeploymentDoesNotAlreadyExist } from './CreateNamedDeploymentFailsDeploymentDoesNotAlreadyExist'; +import { CreateNamedDeploymentFailsWhenTwoDeploymentsExist } from './CreateNamedDeploymentFailsWhenTwoDeploymentsExist'; +import { DeploymentFailsWithInsufficientDeployments } from './DeploymentFailsWithInsufficientDeployments'; +import { DeploymentToStagingSucceeds } from './DeploymentToStagingSucceeds'; +import { SetProductionUseStagingFailsWithNoStaging } from './SetProductionUseStagingFailsWithNoStaging'; +import { SetProductionUseStagingSucceeds } from './SetProductionUseStagingSucceeds'; +import { SetNamedDeploymentFailsWhenDeploymentDoesNotExist } from './SetNamedDeploymentFailsWhenDeploymentDoesNotExist'; +import { SetProductionNamedDeploymentSucceeds } from './SetProductionNamedDeploymentSucceeds'; +import { DeleteStagingDeploymentTest } from './DeleteStagingDeploymentTest'; +import { DeploymentToStagingSucceedsWithBuildService } from './DeploymentToStagingSucceedsWithBuildService'; +import { DeploymentFailsWhenBuilderNotExist } from './DeploymentFailsWhenBuilderNotExist'; +import { DeploymentCustomImageToStagingSucceeds } from './DeploymentCustomImageToStagingSucceeds' + +describe('Azure Spring Apps deployment Suite', function () { + afterEach(() => { + nock.cleanAll(); + }); + + this.timeout(900000); + + // /*************** Unit Tests ***************/ + it('Azure Spring Apps wrapper behaves according to expectations', AzureSpringAppsUnitTests.testDeploymentNameRetrieval); + it('Prevents a path traversal attack in the Azure Spring Apps Resource ID', AzureSpringAppsUnitTests.testDeploymentNameRetrieval); + + /*************** Deployment tests ************/ + it('Correctly errors out when attempting to use staging deployment and no staging deployment exists', DeploymentFailsWithInsufficientDeployments.mochaTest); + it('Correctly errors out when attempting to create a new deployment, and two deployments already exist.', CreateNamedDeploymentFailsWhenTwoDeploymentsExist.mochaTest); + it('Correctly errors out deploying to a named deployment with "create new" disabled, and the named deployment does not exist', CreateNamedDeploymentFailsDeploymentDoesNotAlreadyExist.mochaTest); + it('Correctly deploys to a current staging deployment', DeploymentToStagingSucceeds.mochaTest); + + /*************** Deployment with build service tests ***************/ + it('Correctly deploys to a current staging deployment with build service', DeploymentToStagingSucceedsWithBuildService.mochaTest); + it('Correctly errors out when the builder resource does not exist', DeploymentFailsWhenBuilderNotExist.mochaTest); + + /*************** Deployment with Custom image ***************/ + it('Correctly deploys custom image to a current staging deployment', DeploymentCustomImageToStagingSucceeds.mochaTest); + + /*************** Set Production Deployment tests ************/ + it('Correctly errors out when "Use Staging Deployment" is set but no such deployment exists', SetProductionUseStagingFailsWithNoStaging.mochaTest); + it('Deploys correctly to a staging deployment when "Use Staging Deployment is set', SetProductionUseStagingSucceeds.mochaTest); + it('Correctly errors out when setting named deployment as production, but the deployment does not exist', SetNamedDeploymentFailsWhenDeploymentDoesNotExist.mochaTestTargetDeploymentDoesNotExist); + it('Correctly errors out when setting named deployment as production, but the deployment is already production', SetNamedDeploymentFailsWhenDeploymentDoesNotExist.mochaTestTargetDeploymentAlreadyProduction); + it('Correctly sets a named deployment as production', SetProductionNamedDeploymentSucceeds.mochaTest); + + /********** Delete Deployment ****************/ + it('Correctly errors out when attempting to delete the staging deployment and no such deployment exists', DeploymentFailsWithInsufficientDeployments.mochaTest); + it('Correctly deletes the staging deployment', DeleteStagingDeploymentTest.mochaTest); +}); + + diff --git a/_generated/AzureSpringCloudV0/Tests/SetNamedDeploymentFailsWhenDeploymentDoesNotExist.ts b/_generated/AzureSpringCloudV0/Tests/SetNamedDeploymentFailsWhenDeploymentDoesNotExist.ts new file mode 100644 index 000000000000..2062a3c2885c --- /dev/null +++ b/_generated/AzureSpringCloudV0/Tests/SetNamedDeploymentFailsWhenDeploymentDoesNotExist.ts @@ -0,0 +1,61 @@ +import * as path from 'path'; +import assert = require('assert'); +import mocha = require('mocha'); +import * as ttm from 'azure-pipelines-task-lib/mock-test'; +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import { printTaskInputs } from './mock_utils'; + +export class SetNamedDeploymentFailsWhenDeploymentDoesNotExist { + + /** + * @param targetDeploymentName The name of the target deployment + */ + private static mockTaskInputParameters(targetDeploymentName: string) { + //Just use this to set the environment variables before any of the pipeline SDK code runs. + //The actual TaskMockRunner instance is irrelevant as inputs are set as environment variables, + //visible to the whole process. If we do this in the L0 file, it doesn't work. + //Otherwise, it doesn't work. + let tr = new tmrm.TaskMockRunner('dummypath'); + tr.setInput('ConnectedServiceName', "AzureRM"); + tr.setInput('Action', 'Set Production'); + tr.setInput('AppName', 'testapp'); + tr.setInput('AzureSpringCloud', 'SetNamedDeploymentFailsWhenDeploymentDoesNotExistL0'); + tr.setInput('UseStagingDeployment', "false"); + tr.setInput('DeploymentName', targetDeploymentName); + printTaskInputs(); + } + + public static mochaTestTargetDeploymentDoesNotExist = (done: mocha.Done) => { + let taskPath = path.join(__dirname, 'SetNamedDeploymentFailsWhenDeploymentDoesNotExistL0.js'); + let mockTestRunner: ttm.MockTestRunner = new ttm.MockTestRunner(taskPath); + SetNamedDeploymentFailsWhenDeploymentDoesNotExist.mockTaskInputParameters('nonexistingDeployment'); + try { + mockTestRunner.run(); + assert(mockTestRunner.failed); + let expectedError = 'loc_mock_StagingDeploymentWithNameDoesntExist nonexistingDeployment'; + assert(mockTestRunner.errorIssues.length > 0 || mockTestRunner.stderr.length > 0, 'should have written to stderr'); + assert(mockTestRunner.stdErrContained(expectedError) || mockTestRunner.createdErrorIssue(expectedError), 'E should have said: ' + expectedError); + done(); + } + catch (error) { + done(error); + } + }; + + public static mochaTestTargetDeploymentAlreadyProduction = (done: mocha.Done) => { + let taskPath = path.join(__dirname, 'SetNamedDeploymentFailsWhenDeploymentDoesNotExistL0.js'); + let mockTestRunner: ttm.MockTestRunner = new ttm.MockTestRunner(taskPath); + SetNamedDeploymentFailsWhenDeploymentDoesNotExist.mockTaskInputParameters('alreadyProduction'); + try { + mockTestRunner.run(); + assert(mockTestRunner.failed); + let expectedError = 'loc_mock_StagingDeploymentWithNameDoesntExist alreadyProduction'; + assert(mockTestRunner.errorIssues.length > 0 || mockTestRunner.stderr.length > 0, 'should have written to stderr'); + assert(mockTestRunner.stdErrContained(expectedError) || mockTestRunner.createdErrorIssue(expectedError), 'E should have said: ' + expectedError); + done(); + } + catch (error) { + done(error); + } + }; +} \ No newline at end of file diff --git a/_generated/AzureSpringCloudV0/Tests/SetNamedDeploymentFailsWhenDeploymentDoesNotExistL0.ts b/_generated/AzureSpringCloudV0/Tests/SetNamedDeploymentFailsWhenDeploymentDoesNotExistL0.ts new file mode 100644 index 000000000000..3d7e4e60df3d --- /dev/null +++ b/_generated/AzureSpringCloudV0/Tests/SetNamedDeploymentFailsWhenDeploymentDoesNotExistL0.ts @@ -0,0 +1,112 @@ +import * as path from 'path'; +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import { setEndpointData, setAgentsData, mockTaskArgument, mockCommonAzureAPIs, nock, mockAzureSpringAppsExists, API_VERSION } from './mock_utils'; +import { ASC_RESOURCE_TYPE, MOCK_RESOURCE_GROUP_NAME, MOCK_SUBSCRIPTION_ID } from './mock_utils' + +export class SetNamedDeploymentFailsDeploymentDoesNotAlreadyExistL0 { + + private static readonly TEST_NAME = 'SetNamedDeploymentFailsWhenDeploymentDoesNotExistL0'; + + private static readonly MOCK_APP_NAME = 'testapp'; + + public static startTest() { + let taskPath = path.join(__dirname, '..', 'azurespringappsdeployment.js'); + let taskMockRunner: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + setEndpointData(); + setAgentsData(); + mockCommonAzureAPIs(); + mockAzureSpringAppsExists(this.TEST_NAME); + this.mockTwoDeployments(); + taskMockRunner.setAnswers(mockTaskArgument()); + taskMockRunner.run(); + } + + /** + * Simulate a deployment list API that returns a production deployment and a staging deployment. + */ + private static mockTwoDeployments() { + nock('https://management.azure.com', { + reqheaders: { + "authorization": "Bearer DUMMY_ACCESS_TOKEN", + "content-type": "application/json; charset=utf-8", + "user-agent": "TFS_useragent" + } + }).get(`/subscriptions/${MOCK_SUBSCRIPTION_ID}/resourceGroups/${encodeURIComponent(MOCK_RESOURCE_GROUP_NAME)}/providers/${ASC_RESOURCE_TYPE}/${this.TEST_NAME}/apps/${this.MOCK_APP_NAME}/deployments?api-version=${API_VERSION}`) + .reply(200, { + "value": [ + { + "id": `/subscriptions/${MOCK_SUBSCRIPTION_ID}/resourceGroups/${encodeURIComponent(MOCK_RESOURCE_GROUP_NAME)}/providers/${ASC_RESOURCE_TYPE}/${this.TEST_NAME}/apps/${this.MOCK_APP_NAME}/deployments/alreadyProduction`, + "name": "alreadyProduction", + "properties": { + "active": true, + "appName": this.MOCK_APP_NAME, + "deploymentSettings": { + "cpu": 1, + "environmentVariables": null, + "memoryInGB": 1, + "runtimeVersion": "Java_8" + }, + "instances": [ + { + "discoveryStatus": "UP", + "name": `${this.MOCK_APP_NAME}-alreadyProduction-7-7b77f5b6f5-fff9t`, + "startTime": "2021-03-13T01:39:20Z", + "status": "Running" + } + ], + "provisioningState": "Succeeded", + "source": { + "relativePath": "", + "type": "Jar" + }, + "status": "Running" + }, + "resourceGroup": MOCK_RESOURCE_GROUP_NAME, + "sku": { + "capacity": 1, + "name": "S0", + "tier": "Standard" + }, + "type": `${ASC_RESOURCE_TYPE}/apps/deployments` + }, + { + "id": `/subscriptions/${MOCK_SUBSCRIPTION_ID}/resourceGroups/${encodeURIComponent(MOCK_RESOURCE_GROUP_NAME)}/providers/${ASC_RESOURCE_TYPE}/${this.TEST_NAME}/apps/${this.MOCK_APP_NAME}/deployments/theOtherOne`, + "name": "theOtherOne", + "properties": { + "active": false, + "appName": this.MOCK_APP_NAME, + "deploymentSettings": { + "cpu": 1, + "environmentVariables": null, + "memoryInGB": 1, + "runtimeVersion": "Java_8" + }, + "instances": [ + { + "discoveryStatus": "UP", + "name": `${this.MOCK_APP_NAME}-theOtherOne-7-7b77f5b6f5-90210`, + "startTime": "2021-03-13T01:39:20Z", + "status": "Running" + } + ], + "provisioningState": "Succeeded", + "source": { + "relativePath": "", + "type": "Jar" + }, + "status": "Running" + }, + "resourceGroup": MOCK_RESOURCE_GROUP_NAME, + "sku": { + "capacity": 1, + "name": "S0", + "tier": "Standard" + }, + "type": `${ASC_RESOURCE_TYPE}/apps/deployments` + }] + + }).persist(); + } +} + +SetNamedDeploymentFailsDeploymentDoesNotAlreadyExistL0.startTest(); \ No newline at end of file diff --git a/_generated/AzureSpringCloudV0/Tests/SetProductionNamedDeploymentSucceeds.ts b/_generated/AzureSpringCloudV0/Tests/SetProductionNamedDeploymentSucceeds.ts new file mode 100644 index 000000000000..2b0dacc1ad6f --- /dev/null +++ b/_generated/AzureSpringCloudV0/Tests/SetProductionNamedDeploymentSucceeds.ts @@ -0,0 +1,39 @@ +import * as path from 'path'; +import assert = require('assert'); +import * as ttm from 'azure-pipelines-task-lib/mock-test'; +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import { printTaskInputs } from './mock_utils'; + +export class SetProductionNamedDeploymentSucceeds { + + private static mockTaskInputParameters() { + //Just use this to set the environment variables before any of the pipeline SDK code runs. + //The actual TaskMockRunner instance is irrelevant as inputs are set as environment variables, + //visible to the whole process. If we do this in the L0 file, it doesn't work. + //Otherwise, it doesn't work. + let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner('dummypath'); + tr.setInput('ConnectedServiceName', "AzureRM"); + tr.setInput('Action', 'Set Production'); + tr.setInput('AzureSpringCloud', 'SetProductionNamedDeploymentSucceedsL0'); + tr.setInput('AppName', 'testapp'); + tr.setInput('UseStagingDeployment', "false"); + tr.setInput('DeploymentName', 'theOtherOne'); + printTaskInputs(); + } + + public static mochaTest = (done: Mocha.Done) => { + + SetProductionNamedDeploymentSucceeds.mockTaskInputParameters(); + let testPath = path.join(__dirname, 'SetProductionNamedDeploymentSucceedsL0.js'); + let mockTestRunner: ttm.MockTestRunner = new ttm.MockTestRunner(testPath); + try { + mockTestRunner.run(); + assert(mockTestRunner.succeeded); + assert(mockTestRunner.errorIssues.length == 0); + done(); + } + catch (error) { + done(error); + } + }; +} \ No newline at end of file diff --git a/_generated/AzureSpringCloudV0/Tests/SetProductionNamedDeploymentSucceedsL0.ts b/_generated/AzureSpringCloudV0/Tests/SetProductionNamedDeploymentSucceedsL0.ts new file mode 100644 index 000000000000..228572d29049 --- /dev/null +++ b/_generated/AzureSpringCloudV0/Tests/SetProductionNamedDeploymentSucceedsL0.ts @@ -0,0 +1,135 @@ +import * as path from 'path'; +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import { setEndpointData, setAgentsData, mockTaskArgument, nock, MOCK_SUBSCRIPTION_ID, mockAzureSpringAppsExists, mockCommonAzureAPIs, API_VERSION } from './mock_utils'; +import { ASC_RESOURCE_TYPE, MOCK_RESOURCE_GROUP_NAME } from './mock_utils' +import assert = require('assert'); + +export class SetProductionNamedDeploymentSucceedsL0 { + + static readonly TEST_NAME = 'SetProductionNamedDeploymentSucceedsL0'; + static readonly MOCK_APP_NAME = 'testapp'; + + + public static startTest() { + console.log(`running ${this.TEST_NAME}`); + let taskPath = path.join(__dirname, '..', 'azurespringappsdeployment.js'); + let taskMockRunner: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + setEndpointData(); + setAgentsData(); + mockCommonAzureAPIs(); + mockAzureSpringAppsExists(this.TEST_NAME); + this.mockTwoDeployments(); + this.mockSetActiveDeployments(); + taskMockRunner.setAnswers(mockTaskArgument()); + taskMockRunner.run(); + } + + + /** + * Simulate a deployment list API that returns a production deployment and a staging deployment. + */ + private static mockTwoDeployments() { + nock('https://management.azure.com', { + reqheaders: { + "authorization": "Bearer DUMMY_ACCESS_TOKEN", + "content-type": "application/json; charset=utf-8", + "user-agent": "TFS_useragent" + } + }).get(`/subscriptions/${MOCK_SUBSCRIPTION_ID}/resourceGroups/${encodeURIComponent(MOCK_RESOURCE_GROUP_NAME)}/providers/${ASC_RESOURCE_TYPE}/${this.TEST_NAME}/apps/${this.MOCK_APP_NAME}/deployments?api-version=${API_VERSION}`) + .reply(200, { + "value": [ + { + "id": `/subscriptions/${MOCK_SUBSCRIPTION_ID}/resourceGroups/${encodeURIComponent(MOCK_RESOURCE_GROUP_NAME)}/providers/${ASC_RESOURCE_TYPE}/${this.TEST_NAME}/apps/${this.MOCK_APP_NAME}/deployments/default`, + "name": "default", + "properties": { + "active": true, + "appName": this.MOCK_APP_NAME, + "deploymentSettings": { + "cpu": 1, + "environmentVariables": null, + "memoryInGB": 1, + "runtimeVersion": "Java_8" + }, + "instances": [ + { + "discoveryStatus": "UP", + "name": `${this.MOCK_APP_NAME}-default-7-7b77f5b6f5-fff9t`, + "startTime": "2021-03-13T01:39:20Z", + "status": "Running" + } + ], + "provisioningState": "Succeeded", + "source": { + "relativePath": "", + "type": "Jar" + }, + "status": "Running" + }, + "resourceGroup": MOCK_RESOURCE_GROUP_NAME, + "sku": { + "capacity": 1, + "name": "S0", + "tier": "Standard" + }, + "type": `${ASC_RESOURCE_TYPE}/apps/deployments` + }, + { + "id": `/subscriptions/${MOCK_SUBSCRIPTION_ID}/resourceGroups/${encodeURIComponent(MOCK_RESOURCE_GROUP_NAME)}/providers/${ASC_RESOURCE_TYPE}/${this.TEST_NAME}/apps/${this.MOCK_APP_NAME}/deployments/theOtherOne`, + "name": "theOtherOne", + "properties": { + "active": false, + "appName": this.MOCK_APP_NAME, + "deploymentSettings": { + "cpu": 1, + "environmentVariables": null, + "memoryInGB": 1, + "runtimeVersion": "Java_8" + }, + "instances": [ + { + "discoveryStatus": "UP", + "name": `${this.MOCK_APP_NAME}-theOtherOne-7-7b77f5b6f5-90210`, + "startTime": "2021-03-13T01:39:20Z", + "status": "Running" + } + ], + "provisioningState": "Succeeded", + "source": { + "relativePath": "", + "type": "Jar" + }, + "status": "Running" + }, + "resourceGroup": MOCK_RESOURCE_GROUP_NAME, + "sku": { + "capacity": 1, + "name": "S0", + "tier": "Standard" + }, + "type": `${ASC_RESOURCE_TYPE}/apps/deployments` + }] + + }).persist(); + } + + /** + * Simulate set active deployments API + */ + private static mockSetActiveDeployments() { + nock('https://management.azure.com', { + reqheaders: { + "authorization": "Bearer DUMMY_ACCESS_TOKEN", + "content-type": "application/json; charset=utf-8", + "user-agent": "TFS_useragent" + } + }).post(`/subscriptions/${MOCK_SUBSCRIPTION_ID}/resourceGroups/${encodeURIComponent(MOCK_RESOURCE_GROUP_NAME)}/providers/${ASC_RESOURCE_TYPE}/${this.TEST_NAME}/apps/${this.MOCK_APP_NAME}/setActiveDeployments?api-version=${API_VERSION}`) + .once() + .reply(200, { + activeDeploymentNames: [ + 'theOtherOne' + ] + }) + } +} + +SetProductionNamedDeploymentSucceedsL0.startTest(); \ No newline at end of file diff --git a/_generated/AzureSpringCloudV0/Tests/SetProductionUseStagingFailsWithNoStaging.ts b/_generated/AzureSpringCloudV0/Tests/SetProductionUseStagingFailsWithNoStaging.ts new file mode 100644 index 000000000000..03dbda2ca2ab --- /dev/null +++ b/_generated/AzureSpringCloudV0/Tests/SetProductionUseStagingFailsWithNoStaging.ts @@ -0,0 +1,41 @@ +import * as path from 'path'; +import assert = require('assert'); +import * as ttm from 'azure-pipelines-task-lib/mock-test'; +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import { printTaskInputs } from './mock_utils'; + +export class SetProductionUseStagingFailsWithNoStaging { + + private static mockTaskInputParameters() { + //Just use this to set the environment variables before any of the pipeline SDK code runs. + //The actual TaskMockRunner instance is irrelevant as inputs are set as environment variables, + //visible to the whole process. If we do this in the L0 file, it doesn't work. + //Otherwise, it doesn't work. + let tr : tmrm.TaskMockRunner = new tmrm.TaskMockRunner('dummypath'); + console.log('Setting mock inputs for SetProductionUseStagingFailsWithNoStaging'); + tr.setInput('ConnectedServiceName', "AzureRM"); + tr.setInput('Action', 'Set Production'); + tr.setInput('AzureSpringCloud', 'SetProductionUseStagingFailsWithNoStagingL0'); + tr.setInput('AppName', 'testapp'); + tr.setInput('UseStagingDeployment', "true"); + printTaskInputs(); + } + + public static mochaTest = (done: Mocha.Done) => { + + SetProductionUseStagingFailsWithNoStaging.mockTaskInputParameters(); + let testPath = path.join(__dirname, 'SetProductionUseStagingFailsWithNoStagingL0.js'); + let mockTestRunner: ttm.MockTestRunner = new ttm.MockTestRunner(testPath); + try { + mockTestRunner.run(); + assert(mockTestRunner.failed); + let expectedError = 'loc_mock_NoStagingDeploymentFound'; + assert(mockTestRunner.errorIssues.length > 0 || mockTestRunner.stderr.length > 0, 'should have written to stderr'); + assert(mockTestRunner.stdErrContained(expectedError) || mockTestRunner.createdErrorIssue(expectedError), 'E should have said: ' + expectedError); + done(); + } + catch (error) { + done(error); + } + }; +} \ No newline at end of file diff --git a/_generated/AzureSpringCloudV0/Tests/SetProductionUseStagingFailsWithNoStagingL0.ts b/_generated/AzureSpringCloudV0/Tests/SetProductionUseStagingFailsWithNoStagingL0.ts new file mode 100644 index 000000000000..0b0e740ffb0b --- /dev/null +++ b/_generated/AzureSpringCloudV0/Tests/SetProductionUseStagingFailsWithNoStagingL0.ts @@ -0,0 +1,81 @@ +import * as path from 'path'; +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import { setEndpointData, setAgentsData, mockTaskArgument, nock, MOCK_SUBSCRIPTION_ID, mockAzureSpringAppsExists, mockCommonAzureAPIs, API_VERSION } from './mock_utils'; +import { ASC_RESOURCE_TYPE, MOCK_RESOURCE_GROUP_NAME } from './mock_utils' + +export class SetProductionUseStagingFailsWithNoStagingL0 { + + static readonly TEST_NAME = 'SetProductionUseStagingFailsWithNoStagingL0'; + static readonly MOCK_APP_NAME = 'testapp'; + + + public static startTest() { + console.log(`running ${this.TEST_NAME}`); + let taskPath = path.join(__dirname, '..', 'azurespringappsdeployment.js'); + let taskMockRunner: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + setEndpointData(); + setAgentsData(); + mockCommonAzureAPIs(); + mockAzureSpringAppsExists(this.TEST_NAME); + this.mockDeploymentListApiWithSingleDeployment(); + taskMockRunner.setAnswers(mockTaskArgument()); + taskMockRunner.run(); + } + + + /** + * Simulate a deployment list API that returns a single Production deployment. + */ + private static mockDeploymentListApiWithSingleDeployment() { + console.log('mockDeploymentListApiWithSingleDeployment'); + console.log('defining endpoint ' + `/subscriptions/${MOCK_SUBSCRIPTION_ID}/resourceGroups/${encodeURIComponent(MOCK_RESOURCE_GROUP_NAME)}/providers/${ASC_RESOURCE_TYPE}/${this.TEST_NAME}/apps/${this.MOCK_APP_NAME}/deployments?api-version=${API_VERSION}`); + nock('https://management.azure.com', { + reqheaders: { + "authorization": "Bearer DUMMY_ACCESS_TOKEN", + "content-type": "application/json; charset=utf-8", + "user-agent": "TFS_useragent" + } + }).get(`/subscriptions/${MOCK_SUBSCRIPTION_ID}/resourceGroups/${encodeURIComponent(MOCK_RESOURCE_GROUP_NAME)}/providers/${ASC_RESOURCE_TYPE}/${this.TEST_NAME}/apps/${this.MOCK_APP_NAME}/deployments?api-version=${API_VERSION}`) + .reply(200, { + "value": [ + { + "id": `/subscriptions/${MOCK_SUBSCRIPTION_ID}/resourceGroups/${encodeURIComponent(MOCK_RESOURCE_GROUP_NAME)}/providers/${ASC_RESOURCE_TYPE}/${this.TEST_NAME}/apps/${this.MOCK_APP_NAME}/deployments/default`, + "name": "default", + "properties": { + "active": true, + "appName": this.MOCK_APP_NAME, + "deploymentSettings": { + "cpu": 1, + "environmentVariables": null, + "memoryInGB": 1, + "runtimeVersion": "Java_8" + }, + "instances": [ + { + "discoveryStatus": "UP", + "name": `${this.MOCK_APP_NAME}-default-7-7b77f5b6f5-fff9t`, + "startTime": "2021-03-13T01:39:20Z", + "status": "Running" + } + ], + "provisioningState": "Succeeded", + "source": { + "relativePath": "", + "type": "Jar" + }, + "status": "Running" + }, + "resourceGroup": MOCK_RESOURCE_GROUP_NAME, + "sku": { + "capacity": 1, + "name": "S0", + "tier": "Standard" + }, + "type": `${ASC_RESOURCE_TYPE}/apps/deployments` + } + ] + }).persist(); + } +} + +SetProductionUseStagingFailsWithNoStagingL0.startTest(); \ No newline at end of file diff --git a/_generated/AzureSpringCloudV0/Tests/SetProductionUseStagingSucceeds.ts b/_generated/AzureSpringCloudV0/Tests/SetProductionUseStagingSucceeds.ts new file mode 100644 index 000000000000..3e24f38e7b43 --- /dev/null +++ b/_generated/AzureSpringCloudV0/Tests/SetProductionUseStagingSucceeds.ts @@ -0,0 +1,40 @@ +import * as path from 'path'; +import assert = require('assert'); +import * as ttm from 'azure-pipelines-task-lib/mock-test'; +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import { printTaskInputs } from './mock_utils'; + +export class SetProductionUseStagingSucceeds { + + private static mockTaskInputParameters() { + //Just use this to set the environment variables before any of the pipeline SDK code runs. + //The actual TaskMockRunner instance is irrelevant as inputs are set as environment variables, + //visible to the whole process. If we do this in the L0 file, it doesn't work. + //Otherwise, it doesn't work. + let tr : tmrm.TaskMockRunner = new tmrm.TaskMockRunner('dummypath'); + console.log('Setting mock inputs for SetProductionUseStagingSucceeds'); + tr.setInput('ConnectedServiceName', "AzureRM"); + tr.setInput('Action', 'Set Production'); + tr.setInput('AzureSpringCloud', 'SetProductionUseStagingSucceedsL0'); + tr.setInput('AppName', 'testapp'); + tr.setInput('UseStagingDeployment', "true"); + printTaskInputs(); + } + + public static mochaTest = (done: Mocha.Done) => { + + SetProductionUseStagingSucceeds.mockTaskInputParameters(); + let testPath = path.join(__dirname, 'SetProductionUseStagingSucceedsL0.js'); + let mockTestRunner: ttm.MockTestRunner = new ttm.MockTestRunner(testPath); + try { + mockTestRunner.run(); + assert(mockTestRunner.succeeded); + assert(mockTestRunner.errorIssues.length == 0); + + done(); + } + catch (error) { + done(error); + } + }; +} \ No newline at end of file diff --git a/_generated/AzureSpringCloudV0/Tests/SetProductionUseStagingSucceedsL0.ts b/_generated/AzureSpringCloudV0/Tests/SetProductionUseStagingSucceedsL0.ts new file mode 100644 index 000000000000..c127345cdc17 --- /dev/null +++ b/_generated/AzureSpringCloudV0/Tests/SetProductionUseStagingSucceedsL0.ts @@ -0,0 +1,135 @@ +import * as path from 'path'; +import tmrm = require('azure-pipelines-task-lib/mock-run'); +import { setEndpointData, setAgentsData, mockTaskArgument, nock, MOCK_SUBSCRIPTION_ID, mockAzureSpringAppsExists, mockCommonAzureAPIs, API_VERSION } from './mock_utils'; +import { ASC_RESOURCE_TYPE, MOCK_RESOURCE_GROUP_NAME } from './mock_utils' +import assert = require('assert'); + +export class SetProductionUseStagingSucceedsL0 { + + static readonly TEST_NAME = 'SetProductionUseStagingSucceedsL0'; + static readonly MOCK_APP_NAME = 'testapp'; + + + public static startTest() { + console.log(`running ${this.TEST_NAME}`); + let taskPath = path.join(__dirname, '..', 'azurespringappsdeployment.js'); + let taskMockRunner: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + setEndpointData(); + setAgentsData(); + mockCommonAzureAPIs(); + mockAzureSpringAppsExists(this.TEST_NAME); + this.mockTwoDeployments(); + this.mockSetActiveDeployments(); + taskMockRunner.setAnswers(mockTaskArgument()); + taskMockRunner.run(); + } + + + /** + * Simulate a deployment list API that returns a production deployment and a staging deployment. + */ + private static mockTwoDeployments() { + nock('https://management.azure.com', { + reqheaders: { + "authorization": "Bearer DUMMY_ACCESS_TOKEN", + "content-type": "application/json; charset=utf-8", + "user-agent": "TFS_useragent" + } + }).get(`/subscriptions/${MOCK_SUBSCRIPTION_ID}/resourceGroups/${encodeURIComponent(MOCK_RESOURCE_GROUP_NAME)}/providers/${ASC_RESOURCE_TYPE}/${this.TEST_NAME}/apps/${this.MOCK_APP_NAME}/deployments?api-version=${API_VERSION}`) + .reply(200, { + "value": [ + { + "id": `/subscriptions/${MOCK_SUBSCRIPTION_ID}/resourceGroups/${encodeURIComponent(MOCK_RESOURCE_GROUP_NAME)}/providers/${ASC_RESOURCE_TYPE}/${this.TEST_NAME}/apps/${this.MOCK_APP_NAME}/deployments/default`, + "name": "default", + "properties": { + "active": true, + "appName": this.MOCK_APP_NAME, + "deploymentSettings": { + "cpu": 1, + "environmentVariables": null, + "memoryInGB": 1, + "runtimeVersion": "Java_8" + }, + "instances": [ + { + "discoveryStatus": "UP", + "name": `${this.MOCK_APP_NAME}-default-7-7b77f5b6f5-fff9t`, + "startTime": "2021-03-13T01:39:20Z", + "status": "Running" + } + ], + "provisioningState": "Succeeded", + "source": { + "relativePath": "", + "type": "Jar" + }, + "status": "Running" + }, + "resourceGroup": MOCK_RESOURCE_GROUP_NAME, + "sku": { + "capacity": 1, + "name": "S0", + "tier": "Standard" + }, + "type": `${ASC_RESOURCE_TYPE}/apps/deployments` + }, + { + "id": `/subscriptions/${MOCK_SUBSCRIPTION_ID}/resourceGroups/${encodeURIComponent(MOCK_RESOURCE_GROUP_NAME)}/providers/${ASC_RESOURCE_TYPE}/${this.TEST_NAME}/apps/${this.MOCK_APP_NAME}/deployments/theOtherOne`, + "name": "theOtherOne", + "properties": { + "active": false, + "appName": this.MOCK_APP_NAME, + "deploymentSettings": { + "cpu": 1, + "environmentVariables": null, + "memoryInGB": 1, + "runtimeVersion": "Java_8" + }, + "instances": [ + { + "discoveryStatus": "UP", + "name": `${this.MOCK_APP_NAME}-theOtherOne-7-7b77f5b6f5-90210`, + "startTime": "2021-03-13T01:39:20Z", + "status": "Running" + } + ], + "provisioningState": "Succeeded", + "source": { + "relativePath": "", + "type": "Jar" + }, + "status": "Running" + }, + "resourceGroup": MOCK_RESOURCE_GROUP_NAME, + "sku": { + "capacity": 1, + "name": "S0", + "tier": "Standard" + }, + "type": `${ASC_RESOURCE_TYPE}/apps/deployments` + }] + + }).persist(); + } + + /** + * Simulate set active deployments API + */ + private static mockSetActiveDeployments() { + nock('https://management.azure.com', { + reqheaders: { + "authorization": "Bearer DUMMY_ACCESS_TOKEN", + "content-type": "application/json; charset=utf-8", + "user-agent": "TFS_useragent" + } + }).post(`/subscriptions/${MOCK_SUBSCRIPTION_ID}/resourceGroups/${encodeURIComponent(MOCK_RESOURCE_GROUP_NAME)}/providers/${ASC_RESOURCE_TYPE}/${this.TEST_NAME}/apps/${this.MOCK_APP_NAME}/setActiveDeployments?api-version=${API_VERSION}`) + .once() + .reply(200, { + activeDeploymentNames: [ + 'theOtherOne' + ] + }) + } +} + +SetProductionUseStagingSucceedsL0.startTest(); \ No newline at end of file diff --git a/_generated/AzureSpringCloudV0/Tests/mock_utils.ts b/_generated/AzureSpringCloudV0/Tests/mock_utils.ts new file mode 100644 index 000000000000..9a52d7f12326 --- /dev/null +++ b/_generated/AzureSpringCloudV0/Tests/mock_utils.ts @@ -0,0 +1,123 @@ +export var nock = require('nock'); +import ma = require('azure-pipelines-task-lib/mock-answer'); +import querystring = require("querystring"); + +export const MOCK_SUBSCRIPTION_ID = 'mocksub'; +export const MOCK_RESOURCE_GROUP_NAME = 'mockrg'; +export const ASC_RESOURCE_TYPE = 'Microsoft.AppPlatform/Spring'; +export const API_VERSION = '2022-03-01-preview' + + +export function setEndpointData() { + process.env["ENDPOINT_AUTH_AzureRM"] = "{\"parameters\":{\"serviceprincipalid\":\"id\",\"serviceprincipalkey\":\"key\",\"tenantid\":\"MOCK_TENANT_ID\"},\"scheme\":\"ServicePrincipal\"}"; + process.env["ENDPOINT_AUTH_PARAMETER_AzureRM_SERVICEPRINCIPALID"] = "MOCK_SPN_ID"; + process.env["ENDPOINT_AUTH_PARAMETER_AzureRM_SERVICEPRINCIPALKEY"] = "MOCK_SPN_KEY"; + process.env["ENDPOINT_AUTH_PARAMETER_AzureRM_TENANTID"] = "MOCK_TENANT_ID"; + process.env["ENDPOINT_DATA_AzureRM_SUBSCRIPTIONID"] = MOCK_SUBSCRIPTION_ID; + process.env["ENDPOINT_DATA_AzureRM_SUBSCRIPTIONNAME"] = "sName"; + process.env["ENDPOINT_URL_AzureRM"] = "https://management.azure.com/"; + process.env["ENDPOINT_DATA_AzureRM_ENVIRONMENTAUTHORITYURL"] = "https://login.windows.net/"; + process.env["ENDPOINT_DATA_AzureRM_ACTIVEDIRECTORYSERVICEENDPOINTRESOURCEID"] = "https://management.azure.com"; +} + +export function setAgentsData() { + process.env['TASK_TEST_TRACE'] = '1'; + process.env["AZURE_HTTP_USER_AGENT"] = "TFS_useragent"; + process.env["SYSTEM_DEFAULTWORKINGDIRECTORY"] = "DefaultWorkingDirectory"; + process.env["AGENT_NAME"] = "author"; + process.env["AGENT_TEMPDIRECTORY"] = process.cwd(); + process.env["BUILD_BUILDID"] = 'Build.BuildId'; + process.env["USE_MSAL"] = "false"; +} + +export function printTaskInputs() { + console.log('Task inputs:'); + getTaskInputs().forEach(input => console.log(input + ': ' + process.env[input])); +} + +function getTaskInputs() { + var inputNames = []; + for (var variableName in process.env) { + if (variableName.startsWith("INPUT_")) { + inputNames.push(variableName); + } + } + return inputNames; +} + +/** + * Deletes all inputs from prior tests that may have corrupted the environment + */ +export function cleanTaskInputs() { + let inputNames = getTaskInputs(); + inputNames.forEach(variableName => delete process.env[variableName]); + console.log('Deleted input variables: ' + inputNames); +} + +export function mockCommonAzureAPIs() { + console.log('Nock configuration running...'); + + //Authentication + //mock responses for Azure Resource Manager connection type + nock("https://login.windows.net", { + reqheaders: { + "content-type": "application/x-www-form-urlencoded; charset=utf-8" + } + }) + .post('/MOCK_TENANT_ID/oauth2/token/', querystring.stringify({ + resource: "https://management.azure.com/", + client_id: "MOCK_SPN_ID", + grant_type: "client_credentials", + client_secret: "MOCK_SPN_KEY" + })) + .reply(200, { + access_token: "DUMMY_ACCESS_TOKEN" + }).persist(); +} + + +export function mockAzureSpringAppsExists(springAppsName: string) { + + nock('https://management.azure.com', { + reqheaders: { + "authorization": "Bearer DUMMY_ACCESS_TOKEN", + "content-type": "application/json; charset=utf-8", + "user-agent": "TFS_useragent" + } + }).get(`/subscriptions/${MOCK_SUBSCRIPTION_ID}/resources?$filter=resourceType%20EQ%20%27Microsoft.AppPlatform%2FSpring%27%20AND%20name%20EQ%20%27${springAppsName}%27&api-version=2016-07-01`) + .reply(200, { + value: [{ + id: `/subscriptions/${MOCK_SUBSCRIPTION_ID}/resourceGroups/${encodeURIComponent(MOCK_RESOURCE_GROUP_NAME)}/providers/Microsoft.AppPlatform/Spring/${encodeURIComponent(springAppsName)}`, + name: springAppsName, + type: ASC_RESOURCE_TYPE, + tags: {}, + properties: {} + }] + }).persist(); +} + +export function mockTaskArgument(): ma.TaskLibAnswers { + // provide answers for task mock + let mockFileSystem: ma.TaskLibAnswers = { + "which": { + "cmd": "cmd" + }, + "stats": { + "dummy.jar": { + "isFile": true + } + }, + "osType": { + "osType": "Linux" + }, + "checkPath": { + "cmd": true, + "dummy.jar": true + }, + "exist": { + "dummy.jar": true + } + } + + return mockFileSystem; +} diff --git a/_generated/AzureSpringCloudV0/Tests/package-lock.json b/_generated/AzureSpringCloudV0/Tests/package-lock.json new file mode 100644 index 000000000000..cce7afb41c3e --- /dev/null +++ b/_generated/AzureSpringCloudV0/Tests/package-lock.json @@ -0,0 +1,908 @@ +{ + "name": "azure-spring-cloud-deployment-tests", + "version": "1.0.2", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@ungap/promise-all-settled": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", + "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==" + }, + "ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==" + }, + "ansi-regex": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==" + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" + }, + "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" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "requires": { + "fill-range": "^7.0.1" + } + }, + "browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==" + }, + "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" + } + }, + "camelcase": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==" + }, + "chai": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-3.5.0.tgz", + "integrity": "sha1-TQJjewZ/6Vi9v906QOxW/vc3Mkc=", + "requires": { + "assertion-error": "^1.0.1", + "deep-eql": "^0.1.3", + "type-detect": "^1.0.0" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "chokidar": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", + "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.3.1", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.5.0" + } + }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "string-width": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "requires": { + "ansi-regex": "^5.0.0" + } + } + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "requires": { + "ms": "2.1.2" + }, + "dependencies": { + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==" + }, + "deep-eql": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-0.1.3.tgz", + "integrity": "sha1-71WKyrjeJSBs1xOQbXTlaTDrafI=", + "requires": { + "type-detect": "0.1.1" + }, + "dependencies": { + "type-detect": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-0.1.1.tgz", + "integrity": "sha1-C6XsKohWQORw6k6FBZcZANrFiCI=" + } + } + }, + "deep-equal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", + "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", + "requires": { + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.2.0" + } + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "requires": { + "object-keys": "^1.0.12" + } + }, + "diff": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==" + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==" + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" + }, + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, + "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" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "requires": { + "is-glob": "^4.0.1" + } + }, + "growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==" + }, + "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-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==" + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" + }, + "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==" + }, + "is-arguments": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.0.tgz", + "integrity": "sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==", + "requires": { + "call-bind": "^1.0.0" + } + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-date-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==" + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + }, + "is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==" + }, + "is-regex": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.2.tgz", + "integrity": "sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg==", + "requires": { + "call-bind": "^1.0.2", + "has-symbols": "^1.0.1" + } + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "js-yaml": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.0.0.tgz", + "integrity": "sha512-pqon0s+4ScYUvX30wxQi3PogGFAlUyH0awepWvwkj4jD4v+ova3RiYw8bmA6x2rDrEaj8i/oWKoRxpVNW+Re8Q==", + "requires": { + "argparse": "^2.0.1" + } + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "requires": { + "p-locate": "^5.0.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "log-symbols": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", + "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==", + "requires": { + "chalk": "^4.0.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" + } + }, + "minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "requires": { + "minimist": "^1.2.5" + } + }, + "mocha": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.3.2.tgz", + "integrity": "sha512-UdmISwr/5w+uXLPKspgoV7/RXZwKRTiTjJ2/AC5ZiEztIoOYdfKb19+9jNmEInzx5pBsCyJQzarAxqIGBNYJhg==", + "requires": { + "@ungap/promise-all-settled": "1.1.2", + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.5.1", + "debug": "4.3.1", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.1.6", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "4.0.0", + "log-symbols": "4.0.0", + "minimatch": "3.0.4", + "ms": "2.1.3", + "nanoid": "3.1.20", + "serialize-javascript": "5.0.1", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "which": "2.0.2", + "wide-align": "1.1.3", + "workerpool": "6.1.0", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" + }, + "dependencies": { + "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" + } + } + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "nanoid": { + "version": "3.1.20", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.20.tgz", + "integrity": "sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw==" + }, + "nock": { + "version": "9.0.11", + "resolved": "https://registry.npmjs.org/nock/-/nock-9.0.11.tgz", + "integrity": "sha1-EPIC5MwnYQLWDibjGfl9aNoJvpw=", + "requires": { + "chai": ">=1.9.2 <4.0.0", + "debug": "^2.2.0", + "deep-equal": "^1.0.0", + "json-stringify-safe": "^5.0.1", + "lodash": "~4.17.2", + "mkdirp": "^0.5.0", + "propagate": "0.4.0", + "qs": "^6.0.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + }, + "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==" + }, + "object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "requires": { + "p-limit": "^3.0.2" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" + }, + "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=" + }, + "picomatch": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==" + }, + "propagate": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/propagate/-/propagate-0.4.0.tgz", + "integrity": "sha1-8/zKCm/gZzanulcpZgaWF8EwtIE=" + }, + "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" + } + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "readdirp": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", + "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", + "requires": { + "picomatch": "^2.2.1" + } + }, + "regexp.prototype.flags": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz", + "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "serialize-javascript": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", + "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", + "requires": { + "randombytes": "^2.1.0" + } + }, + "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-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "^3.0.0" + } + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==" + }, + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "requires": { + "has-flag": "^4.0.0" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "requires": { + "is-number": "^7.0.0" + } + }, + "type-detect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-1.0.0.tgz", + "integrity": "sha1-diIXzAbbJY7EiQihKY6LlRIejqI=" + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "requires": { + "isexe": "^2.0.0" + } + }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "workerpool": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.1.0.tgz", + "integrity": "sha512-toV7q9rWNYha963Pl/qyeZ6wG+3nnsyvolaNUS8+R5Wtw6qJPTxIlOP1ZSvcGhEJw+l3HMMmtiNo9Gl61G4GVg==" + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "string-width": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "requires": { + "ansi-regex": "^5.0.0" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "y18n": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.5.tgz", + "integrity": "sha512-hsRUr4FFrvhhRH12wOdfs38Gy7k2FFzB9qgN9v3aLykRq0dRcdcpz5C9FxdS2NuhOrI/628b/KSTJ3rwHysYSg==" + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "string-width": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "requires": { + "ansi-regex": "^5.0.0" + } + } + } + }, + "yargs-parser": { + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==" + }, + "yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "requires": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + } + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==" + } + } +} diff --git a/_generated/AzureSpringCloudV0/Tests/package.json b/_generated/AzureSpringCloudV0/Tests/package.json new file mode 100644 index 000000000000..f427a8c433d9 --- /dev/null +++ b/_generated/AzureSpringCloudV0/Tests/package.json @@ -0,0 +1,23 @@ +{ + "name": "azure-spring-cloud-deployment-tests", + "version": "1.0.2", + "description": "Azure Pipelines Azure Spring Cloud Deployment 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": { + "nock": "9.0.11", + "mocha": "8.3.2" + } +} diff --git a/_generated/AzureSpringCloudV0/azurespringappsdeployment.ts b/_generated/AzureSpringCloudV0/azurespringappsdeployment.ts new file mode 100644 index 000000000000..0b8d8c859271 --- /dev/null +++ b/_generated/AzureSpringCloudV0/azurespringappsdeployment.ts @@ -0,0 +1,36 @@ + +import tl = require('azure-pipelines-task-lib/task'); +import { TaskParameters, TaskParametersUtility } from './operations/taskparameters'; + +import { AzureSpringAppsDeploymentProvider } from './deploymentProvider/AzureSpringAppsDeploymentProvider' +import path = require('path'); + +export async function main() { + let isDeploymentSuccess: boolean = true; + + console.log('Starting deployment task execution'); + tl.setResourcePath(path.join(__dirname, 'task.json')); + tl.setResourcePath(path.join(__dirname, 'node_modules/azure-pipelines-tasks-azure-arm-rest/module.json')); + tl.setResourcePath(path.join(__dirname, 'node_modules/azure-pipelines-tasks-webdeployment-common/module.json')); + var taskParams: TaskParameters = TaskParametersUtility.getParameters(); + var deploymentProvider = new AzureSpringAppsDeploymentProvider(taskParams); + + tl.debug("Pre-deployment Step Started"); + await deploymentProvider.PreDeploymentStep(); + + tl.debug("Deployment Step Started"); + await deploymentProvider.DeployAppStep(); + +} + + +process.on('unhandledRejection', ((error: Error) => { + tl.error("Deployment failed with error: " + error); + tl.setResult(tl.TaskResult.Failed, error.message); +})); + + +main().catch((error: Error) => { + tl.error("Deployment Failed with Error: " + JSON.stringify(error)); + tl.setResult(tl.TaskResult.Failed, error.message); +}); diff --git a/_generated/AzureSpringCloudV0/deploymentProvider/AzureSpringAppsDeploymentProvider.ts b/_generated/AzureSpringCloudV0/deploymentProvider/AzureSpringAppsDeploymentProvider.ts new file mode 100644 index 000000000000..0f46202e70c5 --- /dev/null +++ b/_generated/AzureSpringCloudV0/deploymentProvider/AzureSpringAppsDeploymentProvider.ts @@ -0,0 +1,229 @@ +import path = require('path'); +import { v4 as uuidv4 } from 'uuid'; +import { Package, PackageType } from 'azure-pipelines-tasks-webdeployment-common/packageUtility'; +import { Actions, DeploymentType, TaskParameters } from '../operations/taskparameters'; +import { SourceType, AzureSpringApps } from './azure-arm-spring-apps'; +import { AzureRMEndpoint } from 'azure-pipelines-tasks-azure-arm-rest/azure-arm-endpoint'; +import tl = require('azure-pipelines-task-lib/task'); +import tar = require('tar'); +import { AzureResourceFilterUtility } from '../operations/AzureResourceFilterUtility'; + +const OUTPUT_VARIABLE_TEST_ENDPOINT = 'testEndpoint'; + +export class AzureSpringAppsDeploymentProvider { + + defaultInactiveDeploymentName = 'staging'; + + protected taskParameters: TaskParameters; + protected azureSpringApps: AzureSpringApps; + + constructor(taskParameters: TaskParameters) { + this.taskParameters = taskParameters; + } + + public async PreDeploymentStep() { + const azureEndpoint = await new AzureRMEndpoint(this.taskParameters.ConnectedServiceName).getEndpoint(); + + //The Azure Spring Apps parameter can be a resource ID (if selected from the picklist) or + //a name (if entered manually). This is to avoid requiring the user to enter an otherwise unnecessary user + //user group name. If we have a name, we need to look up the resource ID. + var azureSpringAppsResourceId: string; + if (this.taskParameters.AzureSpringApps.startsWith('/')) { + if (this.taskParameters.AzureSpringApps.includes('..')){{ + throw Error(tl.loc('InvalidAzureSpringAppsResourceId', 'this.taskParameters.AzureSpringApps')); + }} + azureSpringAppsResourceId = this.taskParameters.AzureSpringApps; + } else { + azureSpringAppsResourceId = await AzureResourceFilterUtility.getAzureSpringAppsResourceId(azureEndpoint, this.taskParameters.AzureSpringApps); + } + + this.azureSpringApps = new AzureSpringApps(azureEndpoint, azureSpringAppsResourceId); + } + + public async DeployAppStep() { + switch (this.taskParameters.Action) { + + case Actions.deploy: { + if (DeploymentType.isArtifacts(this.taskParameters.DeploymentType)) { + await this.performDeployAction(); + } else if (this.taskParameters.DeploymentType == DeploymentType.customContainer) { + await this.performDeployContainerAction(); + } else { + throw Error(tl.loc('UnsupportedSourceType', this.taskParameters.DeploymentType)); + } + break; + } + + case Actions.setProduction: { + var deploymentName: string | undefined; + await this.performSetProductionAction(); + break; + } + + case Actions.deleteStagingDeployment: { + await this.performDeleteStagingDeploymentAction(); + break; + } + + default: + throw Error(tl.loc('UnknownOrUnsupportedAction', this.taskParameters.Action)); + } + } + + private async performDeleteStagingDeploymentAction() { + tl.debug('Delete staging deployment action'); + const deploymentName = await this.azureSpringApps.getInactiveDeploymentName(this.taskParameters.AppName); + if (deploymentName) { + await this.azureSpringApps.deleteDeployment(this.taskParameters.AppName, deploymentName); + } else { + throw Error(tl.loc('NoStagingDeploymentFound')); + } + return deploymentName; + } + + private async performSetProductionAction() { + tl.debug('Set production action for app ' + this.taskParameters.AppName); + var deploymentName: string; + if (this.taskParameters.UseStagingDeployment) { + tl.debug('Targeting inactive deployment'); + deploymentName = await this.azureSpringApps.getInactiveDeploymentName(this.taskParameters.AppName); + if (!deploymentName) { //If no inactive deployment exists, we cannot continue as instructed. + throw Error(tl.loc('NoStagingDeploymentFound')); + } + } + else { + //Verify that the named deployment actually exists. + deploymentName = this.taskParameters.DeploymentName; + let existingStagingDeploymentName: string = await this.azureSpringApps.getInactiveDeploymentName(this.taskParameters.AppName); + if (deploymentName != existingStagingDeploymentName) { + throw Error(tl.loc('StagingDeploymentWithNameDoesntExist', deploymentName)); + } + } + + await this.azureSpringApps.setActiveDeployment(this.taskParameters.AppName, deploymentName); + } + + private async performDeployAction() { + tl.debug('Deployment action'); + + var sourceType: string = this.determineSourceType(this.taskParameters.Package); + + //If uploading a source folder, compress to tar.gz file. + var fileToUpload: string = sourceType == SourceType.SOURCE_DIRECTORY ? + await this.compressSourceDirectory(this.taskParameters.Package.getPath()) : + this.taskParameters.Package.getPath(); + + const {deploymentName, createDeployment} = await this.chooseDeployment(); + + // Determine the sku of the Azure Spring Apps + const serviceSkuTier = await this.azureSpringApps.getServiceSkuTier(); + try { + if (serviceSkuTier == "Standard" || serviceSkuTier == "Basic") { + await this.azureSpringApps.deploy(fileToUpload, sourceType, this.taskParameters.AppName, + deploymentName, createDeployment, this.taskParameters.RuntimeVersion, this.taskParameters.JvmOptions, + this.taskParameters.EnvironmentVariables, this.taskParameters.DotNetCoreMainEntryPath, this.taskParameters.Version); + } else if (serviceSkuTier == "Enterprise") { + await this.azureSpringApps.deployWithBuildService(fileToUpload, sourceType, this.taskParameters.AppName, + deploymentName, createDeployment, this.taskParameters.RuntimeVersion, this.taskParameters.JvmOptions, + this.taskParameters.EnvironmentVariables, this.taskParameters.DotNetCoreMainEntryPath, this.taskParameters.Version, this.taskParameters.Builder); + } else { + throw Error(tl.loc('ServiceSkuNotRecognizable', serviceSkuTier)); + } + } catch (error) { + throw error; + } + var testEndpoint = await this.azureSpringApps.getTestEndpoint(this.taskParameters.AppName, deploymentName); + tl.setVariable(OUTPUT_VARIABLE_TEST_ENDPOINT, testEndpoint); + return deploymentName; + } + + private async performDeployContainerAction() { + tl.debug('Deployment action'); + + const {deploymentName, createDeployment} = await this.chooseDeployment(); + + try { + await this.azureSpringApps.deployCustomContainer(this.taskParameters.AppName, deploymentName, createDeployment, + this.taskParameters.RegistryServer, this.taskParameters.RegistryUsername, this.taskParameters.RegistryPassword, + this.taskParameters.ImageName, this.taskParameters.ImageCommand, this.taskParameters.ImageArgs, this.taskParameters.ImageLanguageFramework, + this.taskParameters.EnvironmentVariables, this.taskParameters.Version); + } catch (error) { + throw error; + } + var testEndpoint = await this.azureSpringApps.getTestEndpoint(this.taskParameters.AppName, deploymentName); + tl.setVariable(OUTPUT_VARIABLE_TEST_ENDPOINT, testEndpoint); + return deploymentName; + } + + private async chooseDeployment() { + var deploymentName: string; + var createDeployment = false; + if (this.taskParameters.UseStagingDeployment) { + deploymentName = await this.azureSpringApps.getInactiveDeploymentName(this.taskParameters.AppName); + if (!deploymentName) { //If no inactive deployment exists + tl.debug('No inactive deployment exists'); + if (this.taskParameters.CreateNewDeployment) { + tl.debug('New deployment will be created'); + createDeployment = true; + deploymentName = this.defaultInactiveDeploymentName; //Create a new deployment with the default name. + } else + throw Error(tl.loc('NoStagingDeploymentFound')); + } + } else { //Deploy to deployment with specified name + tl.debug('Deploying with specified name.'); + deploymentName = this.taskParameters.DeploymentName; + var deploymentNames = await this.azureSpringApps.getAllDeploymentNames(this.taskParameters.AppName); + if (!deploymentNames || !deploymentNames.includes(deploymentName)) { + tl.debug(`Deployment ${deploymentName} does not exist`); + if (this.taskParameters.CreateNewDeployment) { + if (deploymentNames.length > 1) { + throw Error(tl.loc('TwoDeploymentsAlreadyExistCannotCreate', deploymentName)); + } else { + tl.debug('Deployment will be created.'); + createDeployment = true; + } + } else { + throw Error(tl.loc('DeploymentDoesntExist', deploymentName)); + } + } + } + return { deploymentName, createDeployment }; + } + + /** + * Compresses sourceDirectoryPath into a tar.gz + * @param sourceDirectoryPath + */ + async compressSourceDirectory(sourceDirectoryPath: string): Promise { + const fileName = `${uuidv4()}.tar.gz`; + console.log(tl.loc('CompressingSourceDirectory', sourceDirectoryPath, fileName)); + await tar.c({ + gzip: true, + file: fileName, + sync: true, + cwd: sourceDirectoryPath, + onWarn: warning => { + tl.warning(warning); + } + }, ['.']); + return fileName; + } + + private determineSourceType(pkg: Package): string { + var sourceType: string; + switch (pkg.getPackageType()) { + case PackageType.folder: + sourceType = SourceType.SOURCE_DIRECTORY; + break; + case PackageType.zip: + sourceType = SourceType.DOT_NET_CORE_ZIP; + break; + case PackageType.jar: + sourceType = SourceType.JAR; + break; + default: + throw Error(tl.loc('UnsupportedSourceType', pkg.getPath())); + } + return sourceType; + } +} \ No newline at end of file diff --git a/_generated/AzureSpringCloudV0/deploymentProvider/azure-arm-spring-apps.ts b/_generated/AzureSpringCloudV0/deploymentProvider/azure-arm-spring-apps.ts new file mode 100644 index 000000000000..4e314b37737b --- /dev/null +++ b/_generated/AzureSpringCloudV0/deploymentProvider/azure-arm-spring-apps.ts @@ -0,0 +1,746 @@ +import tl = require('azure-pipelines-task-lib/task'); +import jsonPath = require('JSONPath'); +import webClient = require('azure-pipelines-tasks-azure-arm-rest/webClient'); +import { AzureEndpoint } from 'azure-pipelines-tasks-azure-arm-rest/azureModels'; +import { ServiceClient } from 'azure-pipelines-tasks-azure-arm-rest/AzureServiceClient'; +import { ToError } from 'azure-pipelines-tasks-azure-arm-rest/AzureServiceClientBase'; +import { uploadFileToSasUrl } from './azure-storage'; +import https = require('https'); +import { parse } from 'azure-pipelines-tasks-webdeployment-common/ParameterParserUtility'; + +export const SourceType = { + JAR: "Jar", + SOURCE_DIRECTORY: "Source", + DOT_NET_CORE_ZIP: "NetCoreZip", + CUSTOM_CONTAINER: "Container" +} + +class UploadTarget { + private _sasUrl: string; + private _relativePath: string; + + constructor(sasUrl: string, relativePath: string) { + this._sasUrl = sasUrl; + this._relativePath = relativePath; + } + + public get sasUrl(): string { + return this._sasUrl; + } + + public get relativePath(): string { + return this._relativePath; + } +} + +interface ImageRegistryCredential { + username?: string; + password?: string; +} + +interface CustomContainer { + args?: string[]; + command?: string[]; + containerImage: string; + imageRegistryCredential?: ImageRegistryCredential; + languageFramework?: string; + server?: string; +} + +const ASYNC_OPERATION_HEADER = 'azure-asyncoperation'; +const API_VERSION = '2022-03-01-preview'; +const LOCATION_HEADER = 'location'; + +export class AzureSpringApps { + private _resourceId: string; + private _client: ServiceClient; + + constructor(endpoint: AzureEndpoint, resourceId: string) { + tl.debug('Initializeing service client'); + this._client = new ServiceClient(endpoint.applicationTokenCredentials, endpoint.subscriptionID, 30); + this._resourceId = resourceId; + tl.debug('Finished initializeing service client'); + } + + /** + * Encapsulates sending of Azure API requests. + * @param method + * @param url + * @param body + */ + protected sendRequest(method: string, url: string, body?: any): Promise { + var httpRequest = new webClient.WebRequest(); + httpRequest.method = method; + httpRequest.uri = url; + if (body) + httpRequest.body = body; + tl.debug(`Sending ${method} request to ${url}`); + return this._client.beginRequest(httpRequest); + } + + /** + * send request using webClient.sendRequest + * @param method + * @param url + * @param body + * @param headers + * @returns webClient.WebResponse + */ + protected sendRequestV2(method: string, url: string, body?: any, headers?: any): Promise { + var httpRequest = new webClient.WebRequest(); + httpRequest.method = method; + httpRequest.uri = url; + if (body) + httpRequest.body = body; + if (headers) + httpRequest.headers = headers; + tl.debug(`Sending ${method} request to ${url}`); + return webClient.sendRequest(httpRequest); + } + + /** + * Deploys an artifact to an Azure Spring Cloud deployment + * @param artifactToUpload + * @param appName + * @param deploymentName + * @param createDeployment If true, a new deployment will be created or the prior one will be completely overriden. If false, only the changes to the prior deployment will be applied. + * @param jvmOptions + * @param environmentVariables + */ + public async deploy(artifactToUpload: string, sourceType: string, appName: string, deploymentName: string, createDeployment: boolean, + runtime?: string, jvmOptions?: string, environmentVariables?: string, + dotNetCoreMainEntryPath?: string, version?: string): Promise { + //Get deployment URL + tl.debug('Starting deployment.'); + try { + const deploymentTarget = await this.getUploadTarget(appName); + await uploadFileToSasUrl(deploymentTarget.sasUrl, artifactToUpload); + const deploymentUpdateRequestBody = this.prepareDeploymentUpdateRequestBody(deploymentTarget.relativePath, sourceType, runtime, jvmOptions, environmentVariables, dotNetCoreMainEntryPath, version, null, null); + await this.applyDeploymentModifications(appName, deploymentName, deploymentUpdateRequestBody, createDeployment); + } catch (error) { + throw error; + } + } + + /** + * Deploys a custom image to an Azure Spring Cloud deployment + * @param appName + * @param deploymentName + * @param createDeployment If true, a new deployment will be created or the prior one will be completely overriden. If false, only the changes to the prior deployment will be applied. + * @param environmentVariables + */ + public async deployCustomContainer(appName: string, deploymentName: string, createDeployment: boolean, + registryServer?: string, + registryUsername?: string, + registryPassword?: string, + imageName?: string, + imageCommand?: string, + imageArgs?: string, + imageLanguageFramework?: string, + environmentVariables?: string, + version?: string): Promise { + try { + let customContainer: CustomContainer = { + containerImage: imageName, + }; + if (imageArgs) { + customContainer.args = this.splitCommands(imageArgs); + } + if (imageCommand) { + customContainer.command = this.splitCommands(imageCommand); + } + if (registryUsername || registryPassword) { + customContainer.imageRegistryCredential = { + username: registryUsername, + password: registryPassword, + }; + } + if (imageLanguageFramework) { + customContainer.languageFramework = imageLanguageFramework; + } + if (registryServer) { + customContainer.server = registryServer; + } + tl.debug('Deploying custom container: ' + JSON.stringify(customContainer)); + + const deploymentUpdateRequestBody = this.prepareDeploymentUpdateRequestBody(null, SourceType.CUSTOM_CONTAINER, null, null, environmentVariables, null, version, null, customContainer); + await this.applyDeploymentModifications(appName, deploymentName, deploymentUpdateRequestBody, createDeployment); + } catch (error) { + throw error; + } + } + + private splitCommands(input: string): string[] { + return input.split(' ').filter(s => s != ''); + } + + public async deployWithBuildService(artifactToUpload: string, sourceType: string, appName: string, deploymentName: string, createDeployment: boolean, + runtime?: string, jvmOptions?: string, environmentVariables?: string, + dotNetCoreMainEntryPath?: string, version?: string, builder?: string): Promise { + tl.debug('Starting deployment with build service'); + try { + const deploymentTarget = await this.getUploadTargetWithBuildService(); + await uploadFileToSasUrl(deploymentTarget.sasUrl, artifactToUpload); + + const triggeredBuildResult = await this.updateKPackBuild(appName, deploymentTarget.relativePath, builder); + await this.waitBuildFinish(triggeredBuildResult); + + const deploymentUpdateRequestBody = this.prepareDeploymentUpdateRequestBody(deploymentTarget.relativePath, sourceType, runtime, jvmOptions, environmentVariables, dotNetCoreMainEntryPath, version, triggeredBuildResult, null); + await this.applyDeploymentModifications(appName, deploymentName, deploymentUpdateRequestBody, createDeployment); + } catch (error) { + throw error; + } + } + + protected async getUploadTargetWithBuildService(): Promise { + tl.debug('Obtaining upload target with build service'); + + const buildServiceName = 'default' + const requestUri = this._client.getRequestUri(`${this._resourceId}/buildServices/{buildServiceName}/getResourceUploadUrl`, { + '{buildServiceName}': buildServiceName + }, null, API_VERSION); + + const response = await this.sendRequest('POST', requestUri, null); + + if (response.statusCode != 200) { + console.error('Error code: ' + response.statusCode); + console.error(response.statusMessage); + throw ToError(response); + } + + return new UploadTarget(response.body.uploadUrl, response.body.relativePath); + } + + private async updateKPackBuild(appName: string, relativePath: string, builder?: string) { + tl.debug('Updating KPack build'); + + // Prepare request uri + const buildServiceName = 'default'; + const requestUri = this._client.getRequestUri(`${this._resourceId}/buildServices/{buildServiceName}/builds/{buildName}`, { + '{buildServiceName}': buildServiceName, + '{buildName}': appName + }, null, API_VERSION); + // Prepare request body (parameter name - build) + const requestBody = { + properties: { + relativePath: relativePath, + builder: builder ? builder : `${this._resourceId}/buildServices/${buildServiceName}/builders/default`, + agentPool: `${this._resourceId}/buildServices/default/agentPools/default` + } + }; + + // Send the request + try { + const response = await this.sendRequest('PUT', requestUri, JSON.stringify(requestBody)); + if (response.statusCode == 200 || response.statusCode == 201) { + tl.debug('Found KPack build result id'); + return response.body.properties.triggeredBuildResult.id; + } else { + tl.debug('Error when updating KPack build'); + throw ToError(response); + } + } catch (error) { + tl.debug('Error when sending updating KPack build request'); + throw(error); + } + } + + private async waitBuildFinish(triggeredBuildResult: string) { + tl.debug('Waiting for building docker image to finish'); + + // Build request + const request = "https://management.azure.com" + triggeredBuildResult + "?api-version=" + API_VERSION; + + var provisioningState = 'Building'; + var response: webClient.WebResponse; + + // A potentially infinite loop + while (provisioningState != 'Succeeded') { + // Sleep for a 5 seconds + await new Promise(r => setTimeout(r, 1500)); + // Get build status + try { + response = await this.sendRequest('GET', request); + if (response.statusCode != 200) { + tl.debug('Get KPack build result failed'); + throw ToError(response); + } + provisioningState = response.body.properties.provisioningState; + if (provisioningState == "Failed"){ + tl.debug('KPack build failed'); + throw ToError(response); + } + } catch (error) { + throw error; + } + } + } + + public async setActiveDeployment(appName: string, deploymentName: string) { + console.log(`Setting active deployment on app ${appName} to ${deploymentName}`); + + const requestUri = this._client.getRequestUri(`${this._resourceId}/apps/{appName}/setActiveDeployments`, { + '{appName}': appName, + }, null, API_VERSION); + const requestBody = JSON.stringify( + { + activeDeploymentNames: [ + deploymentName + ] + } + ); + + const response = await this.sendRequest('POST', requestUri, requestBody); + + console.log('Response:'); + console.log(response.body); + + let expectedStatusCodes: number[] = [200, 202]; + if (!expectedStatusCodes.includes(response.statusCode)) { + tl.error('Error code: ' + response.statusCode); + tl.error(response.statusMessage); + throw Error(response.statusCode + ":" + response.statusMessage); + } else { + tl.debug('App update initiated.'); + //If the operation is asynchronous, block pending its conclusion. + var operationStatusUrl = response.headers[LOCATION_HEADER]; + if (operationStatusUrl) { + tl.debug('Awaiting operation completion.'); + try { + await this.awaitOperationCompletion(operationStatusUrl); + } catch (error) { + tl.debug('Error in awaiting operation completion'); + throw error; + } + } else { + tl.debug('Received async status code with no async operation. Headers: '); + tl.debug(JSON.stringify(response.headers)); + } + } + } + + protected async getAllDeploymentInfo(appName: String): Promise { + tl.debug(`Finding deployments for app ${appName}`) + const requestUri = this._client.getRequestUri(`${this._resourceId}/apps/{appName}/deployments`, { + '{appName}': appName + }, null, API_VERSION); + + try { + const response = await this.sendRequest('GET', requestUri); + if (response.statusCode == 404) { + tl.debug('404 when querying deployment names'); + throw Error(tl.loc('NoDeploymentsExist')); + } if (response.statusCode != 200) { + tl.error(`${tl.loc('UnableToGetDeploymentInformation')} ${tl.loc('StatusCode')}: ${response.statusCode}`); + throw ToError(response); + } else { + tl.debug('Found deployments.'); + return response.body; + } + } catch (error) { + throw (error); + } + } + + protected async getDeploymentInfo(appName: String, deploymentName: String): Promise { + tl.debug(`Query deployment ${deploymentName} for app ${appName}`) + const requestUri = this._client.getRequestUri(`${this._resourceId}/apps/{appName}/deployments/{deploymentName}`, { + '{appName}': appName, + '{deploymentName}': deploymentName + }, null, API_VERSION); + + try { + const response = await this.sendRequest('GET', requestUri); + if (response.statusCode == 404) { + tl.debug(`404 when querying deployment ${deploymentName} for app ${appName}`); + throw Error(tl.loc('NoDeploymentsExist')); + } if (response.statusCode != 200) { + tl.error(`${tl.loc('UnableToGetDeploymentInformation')} ${tl.loc('StatusCode')}: ${response.statusCode}`); + throw ToError(response); + } else { + tl.debug('Found deployment ${deploymentName} for app ${appName}.'); + return response.body; + } + } catch (error) { + throw (error); + } + } + + /** + * Returns the currently inactive deployment, or `undefined` if none exists. + * @param appName + */ + public async getInactiveDeploymentName(appName: string): Promise { + const allDeploymentsData = await this.getAllDeploymentInfo(appName); + const inactiveDeploymentName = jsonPath.eval(allDeploymentsData, '$.value[?(@.properties.active == false)].name')[0]; + tl.debug(`Inactive deployment name: ${inactiveDeploymentName}`); + return inactiveDeploymentName; + } + + /** + * Returns all deployment names for an app. + * @param appName + */ + public async getAllDeploymentNames(appName: string): Promise { + const allDeploymentsData = await this.getAllDeploymentInfo(appName); + const deploymentNames = jsonPath.eval(allDeploymentsData, '$.value[*].name') + tl.debug('Found deployment names: ' + deploymentNames); + return deploymentNames; + } + + protected async getServiceInfo(): Promise { + tl.debug('Obtaining the current service and its properties'); + const requestUri = this._client.getRequestUri(`${this._resourceId}`, {}, null, API_VERSION); + + try { + const response = await this.sendRequest('GET', requestUri); + if (response.statusCode == 200) { + tl.debug("Service information obtained"); + return response.body; + } else { + tl.error(`${tl.loc('UnableToGetServiceInformation')} ${tl.loc('StatusCode')}: ${response.statusCode}`); + throw ToError(response); + } + } catch (error) { + throw(error); + } + } + + /** + * Returns the sku of the service + */ + public async getServiceSkuTier(): Promise { + const serviceInfo = await this.getServiceInfo(); + + const getServiceSkuTier = jsonPath.eval(serviceInfo, '$.sku.tier'); + tl.debug("Service sku obtained"); + return getServiceSkuTier; + } + + protected async getUploadTarget(appName: string): Promise { + tl.debug('Obtaining upload target.'); + + const requestUri = this._client.getRequestUri(`${this._resourceId}/apps/{appName}/getResourceUploadUrl`, { + '{appName}': appName + }, null, API_VERSION); + + const response = await this.sendRequest('POST', requestUri, null); + + if (response.statusCode != 200) { + console.error('Error code: ' + response.statusCode); + console.error(response.statusMessage); + throw ToError(response); + } + return new UploadTarget(response.body.uploadUrl, response.body.relativePath); + } + + /** + * Prepares a body for a deployment update request. + */ + private prepareDeploymentUpdateRequestBody(resourcePath: string, sourceType: string, + runtime?: string, jvmOptions?: string, environmentVariables?: string, dotNetCoreMainEntryPath?: string, version?: string, + buildResultId?: string, customContainer?: CustomContainer) { + + //Populate optional deployment settings + var deploymentSettings = {}; + + if (runtime) { + deploymentSettings['runtimeVersion'] = runtime; + } + if (jvmOptions) { + tl.debug("JVM Options modified."); + deploymentSettings['jvmOptions'] = jvmOptions; + } + if (dotNetCoreMainEntryPath) { + tl.debug('.Net Core Entry path specified'); + deploymentSettings['netCoreMainEntryPath'] = dotNetCoreMainEntryPath; + } + if (environmentVariables) { + tl.debug("Environment variables modified."); + const parsedEnvVariables = parse(environmentVariables); + + //Parsed pairs come back as {"key1":{"value":"val1"},"key2":{"value":"val 2"}} + var transformedEnvironmentVariables = {}; + Object.keys(parsedEnvVariables).forEach(key => { + transformedEnvironmentVariables[key] = parsedEnvVariables[key]['value']; + }); + tl.debug('Environment Variables: ' + JSON.stringify(transformedEnvironmentVariables)); + deploymentSettings['environmentVariables'] = transformedEnvironmentVariables; + } + + //Populate source settings + var sourceSettings = {} + if (buildResultId) { + sourceSettings = { + buildResultId: buildResultId, + type: "BuildResult" + }; + } else if (customContainer) { + sourceSettings = { + type: sourceType, + customContainer: customContainer, + }; + } else { + sourceSettings = { + relativePath: resourcePath, + type: sourceType + }; + } + + if (version) { + sourceSettings['version'] = version; + } + + //Build update request body + return { + properties: { + source: sourceSettings, + deploymentSettings: deploymentSettings + } + }; + } + + /** + * Creates/Updates deployment settings. + * @param appName The name of the app to create/update + * @param deploymentName The name of the deployment to create/update + * @param deploymentUpdateRequestBody JSON specifying all deployment properties + * @param createDeployment Whether or not a new deployment should be created. + */ + private async applyDeploymentModifications(appName: string, deploymentName: string, deploymentUpdateRequestBody, createDeployment: boolean) { + console.log(`${createDeployment ? 'Creating' : 'Updating'} ${appName}, deployment ${deploymentName}...`); + + let method = createDeployment ? 'PUT' : 'PATCH'; + let requestUri = this._client.getRequestUri(`${this._resourceId}/apps/{appName}/deployments/{deploymentName}`, { + '{appName}': appName, + '{deploymentName}': deploymentName + }, null, API_VERSION); + + // Send the request + try { + var response = await this.sendRequest(method, requestUri, JSON.stringify(deploymentUpdateRequestBody)); + } catch (error) { + tl.debug('Error when sending app update request'); + await this.printLatestAppInstanceLog(appName, deploymentName); + throw (error); + } + console.log(JSON.stringify(response.body, null, 2)); + + let expectedStatusCodes: number[] = createDeployment ? [200, 201, 202] : [200, 202]; + if (!expectedStatusCodes.includes(response.statusCode)) { + console.error(`${tl.loc('StatusCode')}: ${response.statusCode}`); + console.error(response.statusMessage); + throw ToError(response); + } else { + tl.debug('App update initiated.') + //If the operation is asynchronous, block pending its conclusion. + var operationStatusUrl = response.headers[LOCATION_HEADER]; + if (operationStatusUrl) { + tl.debug('Awaiting operation completion.'); + try { + await this.awaitOperationCompletion(operationStatusUrl); + } catch (error) { + tl.debug('Error in awaiting operation completion'); + await this.printLatestAppInstanceLog(appName, deploymentName); + throw error; + } finally { + //A build log is available on the deployment when uploading a folder. Let's display it. + if (deploymentUpdateRequestBody.properties.source.sourceType == SourceType.SOURCE_DIRECTORY) + await this.printDeploymentLog(appName, deploymentName); + } + } else { + tl.debug('Received async status code with no async operation. Headers: '); + tl.debug(JSON.stringify(response.headers)); + } + } + } + + /** + * Obtains the build/deployment log for a deployment and prints it to the console. + * @param appName + * @param deploymentName + */ + async printDeploymentLog(appName: string, deploymentName: string) { + + let logUrlRequestUri = this._client.getRequestUri(this._resourceId + '/apps/{appName}/deployments/{deploymentName}/getLogFileUrl', { + '{appName}': appName, + '{deploymentName}': deploymentName + }, null, API_VERSION); + + var logUrl: string; + try { + var logUrlResponse = await this.sendRequest('POST', logUrlRequestUri); + var logUrlResponseBody = logUrlResponse.body; + logUrl = logUrlResponseBody.url; + } catch (error) { + tl.warning('Unable to get deployment log URL: ' + error); + return; + } + + //Can't use the regular client as the presence of an Authorization header results in errors. + https.get(logUrl, response => { + var downloadedLog = ''; + //another chunk of data has been received, so append it to `str` + response.on('data', function (chunk) { + downloadedLog += chunk; + }); + + //the whole response has been received, so we just print it out here + response.on('end', function () { + console.log('========================================================'); + console.log(' ' + tl.loc('DeploymentLog')); + console.log('========================================================'); + console.log(downloadedLog); + }); + }).end(); + } + + /** + * Awaits the completion of an operation marked by a return of status code 200 from the status URL. + * @param operationStatusUrl The status URL of the Azure operation + */ + async awaitOperationCompletion(operationStatusUrl: string) { + tl.debug('Checking operation status at ' + operationStatusUrl); + var statusCode = 202; + var message = ''; + var response: webClient.WebResponse; + + //A potentially infinite loop, but tasks can have timeouts.throw (`${response.body.error.code}`) + while (statusCode == 202) { + //Sleep for a 5 seconds + await new Promise(r => setTimeout(r, 5000)); + //Get status + response = await this.sendRequest('GET', operationStatusUrl); + statusCode = response.statusCode; + message = response.statusMessage; + tl.debug(`${statusCode}: ${message}`); + } + + switch (statusCode) { + case 202: { + tl.error(tl.loc(('OperationTimedOut'))); + break; + } + case 200: { + var responseError = response.body.error; + if (responseError) { + throw Error(`${responseError.message} [${responseError.code}]`) + } + break; + } default: { + throw Error(tl.loc('OperationFailed', statusCode, message)); + } + } + + } + + /** + * Deletes a deployment of the app. + * @param appName + * @param deploymentName + */ + public async deleteDeployment(appName: string, deploymentName: string) { + console.log(`Deleting deployment ${deploymentName} from app ${appName}`); + + let requestUri = this._client.getRequestUri(`${this._resourceId}/apps/{appName}/deployments/{deploymentName}`, { + '{appName}': appName, + '{deploymentName}': deploymentName + }, null, API_VERSION); + + // Send the request + try { + var response = await this.sendRequest('DELETE', requestUri); + } catch (error) { + tl.debug('Error when sending deleting deployment request'); + throw (error); + } + + let expectedStatusCodes = [200, 202]; + if (!expectedStatusCodes.includes(response.statusCode)) { + console.error(`${tl.loc('UnableToDeleteDeployment')} ${tl.loc('StatusCode')}: ${response.statusCode}`); + console.error(response.statusMessage); + throw Error(tl.loc('UnableToDeleteDeployment')); + } else { + // If the operation is asynchronous, block pending its conclusion + var operationStatusUrl = response.headers[ASYNC_OPERATION_HEADER]; + if (operationStatusUrl) { + tl.debug("Awaiting deleting operation completion"); + try { + await this.awaitOperationCompletion(operationStatusUrl); + } catch (error) { + tl.debug("Error in awaiting deleting deployment completion"); + } + } + } + } + + /** + * Retrieves the private test endpoint(s) for the deployment. + * Returns null if private endpoint is disabled. + */ + public async getTestEndpoint(appName: string, deploymentName: string): Promise { + tl.debug(`Retrieving private endpoint for deployment ${deploymentName} from app ${appName}`); + + let requestUri = this._client.getRequestUri(`${this._resourceId}/listTestKeys`, {}, null, API_VERSION); + try { + var response: webClient.WebResponse = await this.sendRequest('POST', requestUri); + if (!response.body.enabled) { + tl.warning(tl.loc('PrivateTestEndpointNotEnabled')); + return null; + } else { + tl.debug('Private endpoint returned.'); + return `${response.body.primaryTestEndpoint}/${encodeURIComponent(appName)}/${encodeURIComponent(deploymentName)}` + } + } catch (error) { + tl.error(tl.loc('UnableToRetrieveTestEndpointKeys')); + throw (error); + } + } + + private async printLatestAppInstanceLog(appName: string, deploymentName: string) { + console.info('Some error occured during deployment. Printing latest app instance log:'); + const logStream = await this.logStreamConstructor(); + const deploymentResource = await this.getDeploymentInfo(appName, deploymentName); + const instances = deploymentResource["properties"]["instances"]; + let startTime = instances[0].startTime; + let instanceName = instances[0].name; + + // print the newly created instance log + for (const tempInstance of instances) { + if (tempInstance.startTime > startTime) { + startTime = tempInstance.startTime; + instanceName = tempInstance.name; + } + } + let streamingUrl = `https://${logStream["baseUrl"]}/api/logstream/apps/${appName}/instances/${instanceName}?follow=true`; + const credentials = Buffer.from(`primary:${logStream["primaryKey"]}`).toString('base64'); + const headers = { + "Authorization" : `Basic ${credentials}` + }; + await this.sendRequestV2('GET', streamingUrl, null, headers).then(response => { + console.info(response.body); + }); + } + + public async logStreamConstructor() { + tl.debug("Constructing log stream"); + let ret = {}; + let requestUri = this._client.getRequestUri(`${this._resourceId}/listTestKeys`, {}, null, API_VERSION); + try { + var response: webClient.WebResponse = await this.sendRequest('POST', requestUri); + if (!response.body.enabled) { + tl.warning(tl.loc('PrivateTestEndpointNotEnabled but log stream needs it')); + return null; + } else { + tl.debug('log stream constructed.'); + ret["primaryKey"] = response.body.primaryKey; + } + } catch (error) { + tl.error(tl.loc('UnableToRetrieveTestEndpointKeys')); + throw (error); + } + const serviceResponse = await this.getServiceInfo(); + ret["baseUrl"] = serviceResponse["properties"]["fqdn"]; + return ret; + } +} diff --git a/_generated/AzureSpringCloudV0/deploymentProvider/azure-storage.ts b/_generated/AzureSpringCloudV0/deploymentProvider/azure-storage.ts new file mode 100644 index 000000000000..27b27520ac34 --- /dev/null +++ b/_generated/AzureSpringCloudV0/deploymentProvider/azure-storage.ts @@ -0,0 +1,18 @@ + +import tl = require('azure-pipelines-task-lib/task'); +import { ShareFileClient, AnonymousCredential } from '@azure/storage-file-share'; + +export async function uploadFileToSasUrl(sasUrl: string, localPath: string) { + tl.debug('uploading file to URL: ' + sasUrl); + const shareFileClient = new ShareFileClient(sasUrl, new AnonymousCredential()); + try { + console.info(tl.loc('StartingUploadOf', localPath)); + await shareFileClient.uploadFile(localPath, { + onProgress: (ev) => console.log(ev) + }); + console.info(tl.loc('CompletedUploadOf', localPath)); + } catch (err) { + throw err; + } +} + diff --git a/_generated/AzureSpringCloudV0/icon.png b/_generated/AzureSpringCloudV0/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..91193132b442dc1c82995ee35a58662cbf0f4534 GIT binary patch literal 1907 zcmV-(2aNcMP)9d85Mzlk5Tk&RAc9GO1d5_U{6R4O zuqI+OF%cmwA_O$4iAtdrGy*~kBvagIOShT!y?Z_9zWcU$(_yCk3pV*FNz&fGopg^-`VxYfKChLOlcTu~n)~#6`f#&?? zy!Ketg=(1mzcy^nZ;!-5k`M{T4pf$P)L9OriZns^6=K|8sjk{WV1Q5(4HmG8$WRFz+Xvf}GdHa8{*CkNNS-(8h(p?wm}IuxtkHov(ow;5&7c$Q_CS^a<9 zN*%EN?yO5+heEXg)FGQ%$VDtb12Bsu-Vs+S~0VReZ ze^jGNK6&d%?D&)Szgk;X5{>(MaBjMoi-IQ)%C(Bjo=vOAE*s$%Q4@VCUK3pi9sP;N z01kQ^9S$~Z4Vvj(sW_b+`W&*ZgIgyDizjWC4uT2Krkjlpz+q+V`tNfguxgFX{R|1l)7 zS>spW_cX`{Nxj?FX4Tz2B$rY2f{b4J=FD|gNHeiU>gAMfl%oo$2w(FFnLU0v`qT;- z4ieqx>_t`IRbrA7mRwY#CiAhMpuS}s(=$w1v?%6r3Q7^fC3h;Z&!_Q$-E-MMmN6RS zi8&aJ!$CW0t|OU{{+SP)AX$4(6ly{Qgbu<;GM?&#!M<+M)w3PSMw;8E6%4~6_tkH8 z@Y?h*JoPPCIwADZ0Uj(VWr1Lc5WzymwIHO>+w^xQdXM~!{0>k2=%hlHO^1c9?mKLP z#RVfFU!1z~12iUf!3z(6;A?C9r%(EyCbuu?`+|It{w%l>HAXSsF9Iq^gn@?}{Jwl` z3{+KKfqX&HdhFsy(A2&UUY`1~PxEB%@6V#OxXy%ucbEWODJX&sYf+&z|HI$Gh| zK?vlNO^N*tzJn}kGJUUe=Rs>7z6nw5%kVsR8jIlr=ijrtwWCH`kr;&F(gDKlw|G*4P1pS*+w@dEw&wgvucfRN__FB}u2db3@`>gP4@{PN7g@Z^do z>P7}5VI*kpx1`DTA^a21eYS?B9Dzsw1!aX}Vv*Z*TSZ?jo)tGX{xY?-YIFiB%CAFFVM?}l-6)lx3x8IN z8ISyUXT}>`1~A1TV~~KZd$0645)D1G3Vv#$wIIdynX1GxW<5DZ; z!zA@F)FYoJrGOT=ic4cYhtFZ$Eq{49zJCYvtK~XCt{Q2-~dx